主頁 > 後端開發 > IGH_Master主站配置驅動伺服電機和變頻器總結

IGH_Master主站配置驅動伺服電機和變頻器總結

2020-11-22 21:47:42 後端開發

IGH_Master主站配置驅動伺服電機和變頻器總結

Ethercat是倍福公司提出的一種工業現場總線協議,具有很好的實時性,IGH是一種開源的Ethercat主站實作協議,本文總結了一下使用IGH_Master驅動伺服電機和變頻器的經驗

1、Ethercat_Tools的使用

安裝好IGH_Master后,在/ethercat/igh/out/bin檔案夾下,使用./ethercat --help命令可以查看Ethercat的工具,這些工具可以查看連接至主站的從站的各種資訊,極大方便主站驅動程式的撰寫,下面具體的介紹了一下各引數及命令的使用,其中[ ]中為必選引數,< >為可選引數,

設定別名地址

命令:ethercat alias [ OPTIONS ] < ALIAS >
引數:

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對位置;
* --force -f:匹配所有從站;

例子:
sudo ethercat alias --position 0 0x2000
決議:將在bus總線上對應的從站0的別名(默認為0)為0x2000
注意:必須有從站連接才能使用此命令,

顯示總線配置

命令:ethercat config [ OPTIONS ]
引數:

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對位置;
* --verbose -v:顯示詳細資訊;

例子:
sudo ethercat config -v
決議:顯示所有從站的詳細配置資訊,
注意:必須啟動應用程式才能使用此命令查看,

以C語言的形式輸出PDO資訊

說明:生成的PDO資訊可以直接被應用層的ecrt_slave_config_pdos()函式呼叫,
命令:ethercat cstruct [ OPTIONS ]
引數:

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對位置;

例子:
sudo ethercat cstruct -a 100
決議:輸出別名為100的從站的PDO資訊,
注意:必須有從站連接才能使用此命令,

顯示程序資料

說明:輸出二進制的程序資料,
命令:ethercat data [ OPTIONS ]
引數:

* --domain -d <index> <index>:域的索引值,假如不填寫引數則顯示所有程序資料,

例子:
sudo ethercat data
決議:顯示所有PDO程序資料,
注意:必須啟動應用程式才能使用此命令查看,

設定主站除錯級別

說明:設定主站的除錯級別,除錯資訊將輸出在/var/log/syslog檔案中,
命令:ethercat debug <LEVEL>

其中可有以下情況:

    * 0 : 無任何除錯資訊輸出
    * 1 : 輸出部分除錯資訊
    * 2 : 輸出所有的幀的內容(由于輸出資訊較多,請謹慎使用)

例子:
sudo ethercat debug 1
決議:打開部分除錯資訊輸出

配置域

說明:顯示域的資訊,
命令:ethercat domains [ OPTIONS ]
引數:

* --domain -d <index> <index>:根據索引號,匹配域;
* --verbose -v:顯示域的詳細資訊(FMMU和程序資料的資訊);

例子:
sudo ethercat domains執行后顯示

Domain0:LogBaseAddr 0x00000000, Size 12, WorkingCounter 0/3

以上各欄位的含義:

* LogBaseAddr:邏輯尋址的邏輯基地址;
* Size:域交換資料的位元組數;
* WorkingCounter:第一個數字是WKC的當前值,第二個數字是WKC的期望值;

決議:顯示域的基本資訊,

sudo ethercat domains -v執行后顯示

Domain0:LogBaseAddr 0x00000000, Size 12, WorkingCounter 3/3
    SlaveConfig 0:0, SM2 (Output), LogAddr 0x00000000, Size 6 06 00 9d aa 00 00
    SlaveConfig 0:0, SM3 (Input), LogAddr 0x00000000, Size 6 31 0a 9d aa 00 00

以上各欄位的含義:
* SlaveConfig:從機配置資訊,主要包含別名和地址(絕對地址或相對地址);
* SM2:同步管理器2;
* LogAddr:FMMU映射的地址;
* Size:映射地址的大小;
* 資料位:十六進制顯示的程序資料;

決議:顯示域的詳細資訊(FMMU和程序資料的資訊),
注意:必須啟動應用程式才能使用此命令查看,

寫入SDO

說明:向從站寫一條PDO條目,
命令:ethercat download [ OPTIONS ] <INDEX> <SUBINDEX> <VALUE>

引數:
⑴ 可選引數:

* INDEX:16位無符整型的SDO索引;
* SUBINDEX:8位無符整型的SDO子索引;
* VALUE:需寫入的SDO的值

⑵ [ OPTIONS ]引數:

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對位置;
* --type -t <type>:SDO條目的資料型別;

type可使用的型別有:

bool、int8、int16、int32、int64、uint8、uint16、uint32、uint64、float、double、string、octet_string、unicode_string

對于sign-and-magnitude coding有:
sm8、sm16、sm32、sm64

例子:

sudo ethercat download -t int16 -p 0 0x6060 00 08
決議:向從站0的索引號為0x6060(16位),子索引號為00(8位)的地址寫入PDO條目值”0x08“;

讀取SDO

說明:向從站讀取一個SDO條目,
命令:ethercat upload [ OPTIONS ] <INDEX> <SUBINDEX>
引數:
⑴ 可選引數:

* INDEX:16位無符整型的SDO索引;
* SUBINDEX:8位無符整型的SDO子索引;

⑵ [ OPTIONS ]引數:

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對位置;
* --type -t <type>:SDO條目的資料型別;

type可使用的型別有:

bool、int8、int16、int32、int64、uint8、uint16、uint32、uint64、float、double、string、octet_string、unicode_string

對于sign-and-magnitude coding有:
sm8、sm16、sm32、sm64

例子:

sudo ethercat upload -t int16 -p 0 0x6060 00
決議:讀取從站0中索引號為0x6060(16位),子索引號為00(8位)的SDO條目,

注意:必須有從站連接才能使用此命令,

創建一個拓撲圖形

說明:輸出總線拓撲圖,
命令:ethercat graph [ OPTIONS ]

例子:
sudo ethercat graph | dot -Tsvg > ~/Desktop/bus.svg
決議:將總線拓撲圖輸出到桌面,

主站和以太網設備

說明:顯示主站和以太網設備資訊,
命令:ethercat master [ OPTIONS ]
引數:

* --master -m <indices>:indices為主站的索引,默認顯示所有的設備資訊;

例子:

sudo ethercat master

決議:顯示所有主機的設備資訊(發送幀、接收幀、參考時鐘、應用時間),

注意:欲想顯示應用時間需啟動應用程式,

同步管理,PDOs,PDO條目

說明:顯示出同步管理器的引數和PDO任務和映射資訊,
命令:ethercat pdos [OPTIONS]
引數:

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對位置;
* --skin -s <skin>:”skin”可選擇”default“和”etherlab“;

例子:

sudo ethercat pdos -p 0 -s default執行后顯示:

SM2:PhysAddr 0x1400, DefaultSize 64, ControlRegister 0x34, Enable 1
    RxPDO 0x1600 "Receive PDO1 Mapping"
        PDO entry 0x6040:00, 16 bit, " "
        PDO entry 0x607a:00, 32 bit, " "

以上各欄位的含義:
⑴ 同步管理器資訊
* SM2:同步管理器2;
* PhysAddr:物理地址開始地址;
* DefaultSize:默認資料大小;
* ControlRegister:控制暫存器;
* Enable:使能字

⑵ 顯示PDO方向,索引值,PDO名字
* RxPDO:代表從站發送資料的方向(從站接收資料);
* 0x1600:PDO的索引值;
* “Receive PDO1 Mapping”:PDO的名字;

⑶ 顯示PDO條目的索引和子索引(都是以16進制的形式現實的),顯示位寬和描述
* 0x6040:00 : 表示索引和子索引;
* 16bit:表示該條目的位寬;
* ” “:表示該位的描述;

暫存器訪問

獲取對應從站暫存器的內容

命令:ethercat reg_read [ OPTIONS ] <ADDRESS> [ SIZE ]
引數:
① 可選引數

* ADDRESS:16位無符號的暫存器地址;
* SIZE:要讀取的對應暫存器位元組數(16位無符號值);[ SIZE ] + ADDRESS不能超過64K,假如type引數隱含要讀取的位元組數,則可以忽略掉[ SIZE ]引數;

② [ OPTIONS ]引數

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對位置;
* --type -t <type>:匹配資料型別;

type可使用的型別有:

bool、int8、int16、int32、int64、uint8、uint16、uint32、uint64、float、double、string、octet_string、unicode_string

對于sign-and-magnitude coding有:
sm8、sm16、sm32、sm64

例子:

sudo ethercat reg_read -p 6 -t sm32 0x092c

決議:獲取從站6的0x092C暫存器所存盤的值,

將內容寫入指定從站暫存器

命令:ethercat reg_write [ OPTIONS ] <ADDRESS> <DATA>
引數:
① 可選引數

* ADDRESS:16位無符號的暫存器地址;
* DATA:要寫入暫存器的資料;假如制定了”type”資料型別,那么”DATA”根據指定的資料型別對資料進行決議;假如未指定”type”資料型別,則”DATA”可以為指定的檔案或將”DATA”設定為” - “,表示從標準輸入中獲得資料;

② [ OPTIONS ]引數

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對地址;
* --type -t <type>:匹配資料型別;
* --emergency -e:以緊急的方式請求寫入檔案;

例子:

sudo ethercat reg_write -p 5 -t sm32 0x092c 200

決議:向從站5的暫存器0x092c寫入資料200,

SDO字典

說明:列出SDO字典(SDO資訊和SDO條目資訊),
命令:ethercat sdos [ OPTIONS ]
引數:

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對位置;
* --quiet -q:只輸出PDOs,不輸出PDO條目資訊;

例子:

sudo ethercat sdos執行后顯示

SDO 0x1000,"Device type"
    0x1000:0, r-r-r-, uint32, 32 bit, "Device type"

SDOs:SDO 0x1000,”Device type”
* 0x1000:SDO索引值;
* “Device type”:SDO名字;

SDO條目:0x1000:0, r-r-r-, uint32, 32 bit, “Device type”
* 0x1000:0:索引值及子索引值;
* r-r-r-:表示訪問權限;
* uint32:表示該條目的資料型別;
* 32bit:表示該條目的位寬;
* “Device type”:對該條目的描述;

顯示從站的資訊

說明:顯示總線上的從站的資訊,
命令:ethercat slaves [ OPTIONS ]
引數:

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對地址;
* --verbose -v:顯示從站的詳細資訊;

例子:

sudo ethercat slaves -v

決議:顯示所有從站的詳細資訊,

生成從站配置描述

說明:生成從站資訊描述檔案,
命令:ethercat xml [ OPTIONS ]
引數:

* --alias -a <alias>:匹配從站的別名;
* --position -p <pos>:匹配從站的絕對地址;

例子:

sudo ethercat xml -p 0

決議:生成從站0的從站資訊描述檔案并顯示出來,

這一節的內容我參考了識荒者的Ethercat決議(十二)之命令列工具的使用這篇文章,這里只列出了配置伺服和變頻需要用到的工具,更多工具請移步該作者原文,感謝識荒者的分享

2、主站配置要點

應用程式是用戶針對自身控制系統的控制要求撰寫的控制程式模塊,運行于內核層,包括對主站和從站的配置以及周期性實時運行的任務,在實時任務程式中實作主從站間通訊以及各種數控演算法,主要包括兩塊:

  • 主站和從站的配置;
  • 周期任務的實作 cyclic operation;

先上圖:
主站配置流程

主站、從站以及資料域的配置程序如下

  • 請求用于實時操作的 EtherCAT 主站,呼叫 ecrt_request_master(),獲取主站的指標 ec_master_t *;

      master = ecrt_request_master(0)
    
  • 創建新的程序資料域,呼叫 ecrt_master_create_domain(),獲取主站的一個資料域指標 ec_domain_t *;

      domain1 = ecrt_master_create_domain(master)
    
  • 獲取從站配置,呼叫 ecrt_master_slave_config(),通過輸入主站指標,從站化名,從站位置,從站廠商 ID 和從站產品號從而產生從站配置資訊 sc_ana_in,并獲得從站配置指標 ec_slave_config_t *;

      sc_ana_in = ecrt_master_slave_config('主站指標', '配置資訊','從站資訊')
    
  • 呼叫 ecrt_slave_config_pdos(),通過輸入從站配置資訊、從站同步管理資訊,定義一個完整 PDO 配置;

      ecrt_slave_config_pdos('從站配置指標', EC_END, '從站同步管理資訊')
    
  • *呼叫 ecrt_slave_config_create_sdo_request(),通過輸入從站配置資訊、SDO 索引號、子索引號和資料長度,獲得 SDO 請求指標,從而創造一個完整 SDO 請求用于實時操作的交換 SDO 資料;

      sdo = ecrt_slave_config_create_sdo_request(sc_ana_in, 0x3102, 2, 2)
    
  • *呼叫 ecrt_sdo_request_timeout(),設定 SDO 請求最大超時時間

      ecrt_sdo_request_timeout(sdo, 500); // ms
    
  • 呼叫 ecrt_domain_reg_pdo_entry_list(),通過輸入資料域指標和從站 PDO 入口注冊資訊,為資料域注冊一系列 PDO 入口

      ecrt_domain_reg_pdo_entry_list(domain1, domain1_regs)
    
  • 呼叫 ecrt_master_activate(),完成本次配置階段,準備進入實時周期任務回圈:

      ecrt_master_activate(master)
    
  • 呼叫 ecrt_domain_data(),回傳資料域的程序資料指標,為資料域指標分配地址,準備實時訪問資料域

      domain1_pd = ecrt_domain_data(domain1)
    
  • 結束配置,創建一個實時的 timer,執行周期性任務函式 cyclic_task

周期性任務函式 cyclic_task

  • 主站從設備獲取資料幀并且處理報文

      // receive process data
      ecrt_master_receive(master);
    
  • 判斷資料域報文的狀態

      ecrt_domain_process(domain1);
    
  • 判斷資料域、主站、從站狀態是否發生變化,有變化就提示資訊

      // check process data state (optional)
      check_domain1_state();
    
      // check for master state (optional)
      check_master_state();
      // check for islave configuration state(s) (optional)
      check_slave_config_states();
    
  • 讀寫程序資料相關函式

      EC_READ_U16("資料域指標 + 地址偏移量")
      EC_WRITE_U16("資料域指標 + 地址偏移量")
    
  • 將資料域的所有報文插入到主站的報文序列

      // send process data
      ecrt_domain_queue(domain1);
    
  • 將主站所有報文發送到傳輸序列

      ecrt_master_send(master)
    

本小節主要參考了《IGH軟體代碼說明》,未找到出處,在此致謝!

3、伺服電機配置要點

本次我們使用的是臺達的伺服電機,型號為ASDA-A2-E,使用 CANopen 基于 DS402 協議控制伺服電機,具體程序如下:

1.使用ethercat slaves [ OPTIONS ]命令讀取從站的串列,確保從站已經正常連接至主站

0  15:0  PREOP  +  Delta ASDA-A2-E EtherCAT(CoE) Drive Rev4
1   1:0  PREOP  +  EK1100 EtherCAT Coupler (2A E-Bus)
2   2:0  PREOP  +  EL1809 16K. Dig. Eingang 24V, 3ms

決議:
    第一列為從站相對于主站的絕對位置,可以用這個絕對位置來讀取從站配置,在一些命令的選項后可加上' -p 1'這樣的選項來讀取1號從站的資訊,當然也可以使用  
    ethercat alias [ OPTIONS ] < ALIAS >  
    給從站設定別名,然后使用' -a <別名>'這樣的方式來訪問指定的從站;
    
    后面會有從站設備的型號,幫助確定是不是我們期望的主站連接成功;

2.使用sudo ethercat slaves -v -p 0可以輸出 0 號從站目前的所有資訊

=== Master 0, Slave 0 ===           //主站和從站編號
Alias: 15                           //別名
Device: Main
State: PREOP                        //狀態
Flag: +
Identity:
Vendor Id:       0x000001dd
Product code:    0x10305070         //產品ID和編號
Revision number: 0x02040608
Serial number:   0x00000000
DL information:
FMMU bit operation: no
Distributed clocks: yes, 32 bit
DC system time transmission delay: 0 ns
Port  Type  Link  Loop    Signal  NextSlave  RxTime [ns]  Diff [ns]   NextDc [ns]
0  MII   up    open    yes             -    488154000           0           0
1  MII   up    open    yes             1    488158324        4324         641
2  N/A   down  closed  no              -            -           -           -
3  N/A   down  closed  no              -            -           -           -
Mailboxes:
Bootstrap RX: 0x0000/0, TX: 0x0000/0
Standard  RX: 0x1000/128, TX: 0x10c0/128
Supported protocols: CoE
General:
Group: ServoDrive
Image name: 
Order number: 
Device name: Delta ASDA-A2-E EtherCAT(CoE) Drive Rev4       //設備型號
CoE details:                    //設定資訊
    Enable SDO: yes
    Enable SDO Info: yes
    Enable PDO Assign: yes
    Enable PDO Configuration: yes
    Enable Upload at startup: no
    Enable SDO complete access: no
Flags:                          //狀態資訊
    Enable SafeOp: no
    Enable notLRW: no
Current consumption: 0 mA


通過這些資訊我們就可以判斷從站目前的狀態,可操作性等;

Vendor Id:       0x000001dd
Product code:    0x10305070
這是從站的資訊,可以用它確定目標從站,所以可以先建立一個設備:

    #define asda_Pos0 0, 0
    #define asda 0x000001dd, 0x10305070

3.現在我們需要在程式里建立從站配置指標:

static ec_slave_config_t *sc_asda;
static ec_slave_config_state_t sc_asda_state;

并且,使用ethercat xml -p 0命令,我們可以查看設備的描述檔案:

<?xml version="1.0" ?>
<EtherCATInfo>
<!-- Slave 0 -->                //從站0
<Vendor>
    <Id>477</Id>
</Vendor>
<Descriptions>
    <Devices>
    <Device>
        <Type ProductCode="#x10305070" RevisionNo="#x02040608"></Type>
        <Name><![CDATA[Delta ASDA-A2-E EtherCAT(CoE) Drive Rev4]]></Name>
        <Sm Enable="1" StartAddress="#x1000" ControlByte="#x36" DefaultSize="128" />
        <Sm Enable="1" StartAddress="#x10c0" ControlByte="#x32" DefaultSize="128" />
        <Sm Enable="1" StartAddress="#x1180" ControlByte="#x24" DefaultSize="6" />
        <Sm Enable="1" StartAddress="#x1480" ControlByte="#x0" DefaultSize="6" />
        /*
            該設備擁有四個同步管理通道:
                ·前兩個為郵箱 MBox 傳輸方式,用于 COE 協議的通訊,負責對 SDO 的傳輸;
                ·后兩個為程序資料傳輸方式,負責對 PDO 的傳輸;
            其中:
            StartAddress 引數為物理起始地址,即該同步管理通道在雙口 RAM 上的起始地址;
            ControlByte 引數為控制字,包含了該通道的傳輸方式、傳輸方向等資訊;
            MinSize、MaxSize 和 DefaultSize 三個引數規定了該通道的大小,  
        */
        
        <RxPdo Sm="2" Fixed="1" Mandatory="1">
        <Index>#x1600</Index>           //RXPDO地址
        <Name>RxPDO</Name>              //接收(從主站)PDO
        <Entry>
            <Index>#x6040</Index>
            <SubIndex>0</SubIndex>  //索引號為0
            <BitLen>16</BitLen>   //位元組大小,決定了你要用EC_WRITE_U16寫入
            <Name></Name>
            <DataType>UINT16</DataType>
        </Entry>
        <Entry>
            <Index>#x607a</Index>
            <SubIndex>0</SubIndex>
            <BitLen>32</BitLen>
            <Name></Name>
            <DataType>UINT32</DataType>
        </Entry>
        <Entry>
            <Index>#x6060</Index>
            <SubIndex>0</SubIndex>
            <BitLen>8</BitLen>
            <Name></Name>
            <DataType>UINT8</DataType>
        </Entry>
        </RxPdo>
        <TxPdo Sm="3" Fixed="1" Mandatory="1">
        <Index>#x1a00</Index>           //TXPDO地址
        <Name>TxPDO</Name>              //發送(向主站)PDO
        <Entry>
            <Index>#x6041</Index>
            <SubIndex>0</SubIndex>
            <BitLen>16</BitLen>   //位元組大小,決定了你要用EC_READ_U16讀取
            <Name></Name>
            <DataType>UINT16</DataType>
        </Entry>
        <Entry>
            <Index>#x6064</Index>
            <SubIndex>0</SubIndex>
            <BitLen>32</BitLen>
            <Name></Name>
            <DataType>UINT32</DataType>
        </Entry>
        <Entry>
            <Index>#x6061</Index>
            <SubIndex>0</SubIndex>
            <BitLen>8</BitLen>
            <Name></Name>
            <DataType>UINT8</DataType>
        </Entry>
        <Entry>
            <Index>#x603f</Index>
            <SubIndex>0</SubIndex>
            <BitLen>16</BitLen>
            <Name></Name>
            <DataType>UINT16</DataType>
        </Entry>
        </TxPdo>
    </Device>
    </Devices>
</Descriptions>
</EtherCATInfo>

4.使用ethercat cstruct -p 0命令得到Ethercat主站自動生成的C語言PDO資訊,這個資訊可以直接粘貼到程式里;

/* Master 0, Slave 0
* Vendor ID:       0x000001dd
* Product code:    0x10305070
* Revision number: 0x02040608
*/

ec_pdo_entry_info_t slave_0_pdo_entries[] = {
    {0x6040, 0x00, 16},         //DS402操作字
    {0x607a, 0x00, 32},
    {0x6060, 0x00, 8},
    {0x6041, 0x00, 16},         //DS402狀態字
    {0x6064, 0x00, 32},
    {0x6061, 0x00, 8},
    {0x603f, 0x00, 16},
};

ec_pdo_info_t slave_0_pdos[] = {
    {0x1600, 3, slave_0_pdo_entries + 0}, /* RxPDO */
    {0x1a00, 4, slave_0_pdo_entries + 3}, /* TxPDO */
};

ec_sync_info_t slave_0_syncs[] = {
    {0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},
    {1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},
    {2, EC_DIR_OUTPUT, 1, slave_0_pdos + 0, EC_WD_DISABLE},
    {3, EC_DIR_INPUT, 1, slave_0_pdos + 1, EC_WD_DISABLE},
    {0xff}
};

仔細觀察生成的PDO資訊我發現:
第一步:slave_0_pdo_entries[]建立了一個操作陣列;
第二步:在slave_0_pdos[]中,根據前面得到的XML資訊,將slave_0_pdo_entries[]中從0號位置(slave_0_pdo_entries + 0)開始的3個地址對應到伺服驅動器RxPDO地址->0x1600;
slave_0_pdo_entries[]中從3號位置(slave_0_pdo_entries + 3)開始的4個地址對應到伺服驅動器TxPDO地址->0x1a00;
第三步:將PDO資訊 slave_0_pdos[] 對應到同步資訊 slave_0_syncs[] 中:
slave_0_pdos + 0 是 {0x1600, 3, slave_0_pdo_entries + 0}, /* RxPDO */,方向為OUTPUT
slave_0_pdos + 1 是 {0x1a00, 4, slave_0_pdo_entries + 3}, /* TxPDO */,方向為INPUT

    應用程式將以上同步管理資訊寫入資料結構 ec_sync_info_t 中,作為
ecrt_slave_config_pdos()的引數,通過呼叫該函式最終完成完整的 PDO 配置,

    這是我的個人理解,有問題歡迎指出;

5.獲取從站配置,呼叫 ecrt_master_slave_config(),通過輸入主站指標, 從站化名 / 從站位置 / 從站廠商 ID 和從站產品號從而產生從站配置資訊 sc_ana_in,并獲得從站配置指標ec_slave_config_t *;

ecrt_master_slave_config(master, asda_Pos0, asda);

6.呼叫 ecrt_slave_config_pdos(),通過輸入從站配置指標、從站同步管理資訊,定義一個完整 PDO 配置;

ecrt_slave_config_pdos(sc_asda, EC_END, asda_syncs);

引數:
1->從站指標;
2->EC_END(查看庫檔案發現 -> #define EC_END ~0U,注釋里面說:/**End of list marker(串列結束標記),是一個固定格式,應該還有其他引數,不過沒有用到,目前就沒有深究);
3->同步資訊

7.呼叫 ecrt_domain_reg_pdo_entry_list(),通過輸入資料域指標和從站 PDO 入口注冊資訊,為資料域注冊一系列 PDO 入口

domainServoOutput = ecrt_master_create_domain(master);
domainServoInput = ecrt_master_create_domain(master);
//通過ecrt_master_create_domain("主站指標”)創建新的資料域

static unsigned int cntlwd;                     //控制字
static unsigned int ipData;                     //目標位置
static unsigned int status|;                     //狀態字
static unsigned int actpos|;                     //當前回授位置
static unsigned int modes_of_operation|;         //6060
static unsigned int modes_of_operation_display|; //6061
static unsigned int errcode;                    //錯誤代碼
//定義從站資訊接收變數

ec_pdo_entry_reg_t domainServoOutput_regs[] = {
{asda_Pos0, asda, 0x6040, 0x00, &cntlwd, NULL},
{asda_Pos0, asda, 0x607a, 0x00, &ipData, NULL},
{asda_Pos0, asda, 0x6060, 0x00, &modes_of_operation[0], NULL},
{}};
//寫操作狀態字注冊,以第一條為例,每一條都需要提供的引數有:
    asda_Pos0 主從站編號
    asda 從站資訊
    0x6040 PDO 地址
    0x00 偏移地址
    &cntlwd 從站資訊變數
    NULL 

    
ec_pdo_entry_reg_t domainServoInput_regs[] = {
{asda_Pos0, asda, 0x6064, 0x00, &actpos, NULL},
{asda_Pos0, asda, 0x6041, 0x00, &status, NULL},
{asda_Pos0, asda, 0x6061, 0x00, &modes_of_operation_display[0], NULL},
{asda_Pos0, asda, 0x603f, 0x00, &errcode, NULL},
{}};
                    //讀操作狀態字注冊

ecrt_domain_reg_pdo_entry_list(domainServoOutput, domainServoOutput_regs)
ecrt_domain_reg_pdo_entry_list(domainServoInput, domainServoInput_regs)
//引數為:資料域指標,PDO入口注冊資訊串列

//這里將 OUTPUT PDO 和 INPUT PDO 分開成了兩個域,分別注冊成domainServoOutput和domainServoInput兩個域,方便讀寫操作;

static uint8_t *domainOutput_pd = NULL;
static uint8_t *domainInput_pd = NULL;      //定義資料域指標

domainOutput_pd = ecrt_domain_data(domainServoOutput)
domainInput_pd = ecrt_domain_data(domainServoInput)
//呼叫 ecrt_domain_data(),得到資料域的程序資料指標,為資料域指標分配地址,準備實時訪問資料域

//資料域是 EtherCAT 程序資料(PDO)向程式中的資料結構的映射,它提供了用戶程式對總線上各個從站進行資料訪問的入口,當從站 PDO 入口注冊成功后,不同從站都將獲得一個屬于自己的地址偏移量,用戶可通過“資料域程序資料指標 + 地址偏移量”的方法對所需 PDO 進行讀寫操作,

//在讀取寫入的時候使用各自的資料域程序資料指標+偏移地址(例如cntlwd,errcode)對PDO進行操作

例:
    EC_READ_U16(domainInput_pd + status);

8.到這里,PDO的配置就完成了,接下來是根據伺服電機的說明手冊對PDO映射表中對應的位元組進行讀寫

對PDO中的地址進行讀寫操作使用的函式為:

EC_READ_U16("資料域指標 + 地址偏移量")
EC_WRITE_U16("資料域指標 + 地址偏移量")

U32,U16,U8為要讀取的位元組寬度,EC_READ_U8()則是讀取8 bite寬度的資料
例:
    EC_READ_U16(domainInput_pd + Status)
    domainInput_pd為資料域程序資料指標,Status為地址偏移量

查閱手冊得知驅動器必須按照標準 DS402 協議規定的流程引導伺服驅動器,伺服驅動器才可運行于指定的狀態,具體流程如下:

臺達伺服驅動流程

各個狀態的說明:

初始化 驅動器初始化、內部自檢已經完成,驅動器的引數不能設定,也不能執行驅動功能,
伺服無故障 伺服驅動器無故障或錯誤已排除,驅動器引數可以設定
伺服準備好 伺服驅動器已準備好,驅動器引數可以設定,
等待打開伺服使能 伺服驅動器等待打開伺服使能,驅動器引數可以設定,
伺服運行 驅動器正常運行,已使能某一伺服運行模式,電機已通電,指令不為0 時,電機旋轉,驅動器引數屬性為“運行更改”的可以設定,其他不可,
快速停機 快速停機功能被激活,驅動器正在執行快速停機功能,驅動器引數屬性為“運行更改”的可以設定,其他不可,
故障停機 驅動器發生故障,正在執行故障停機程序中,驅動器引數屬性為“運行更改”的可以設定,其他不可,
故障 故障停機完成,所有驅動功能均被禁止,同時允許更改驅動器引數以便排除故障,

6040狀態字

啟動的流程為:向6040PDO中依次寫入6-7-15(要根據6041狀態字反饋信號依次寫入,經過實踐表明不建議直接按位元組校驗狀態,簡易按位校驗狀態,因為可能其他位出現正常變化會導致位元組不同,建議直接判斷位的狀態)

(EC_READ_U16(domainInput_pd + status[i]) & 0x031) == 49
序號 描述 6040控制字 6041位狀態
2 伺服無故障 伺服準備好 0x0006 0010 0011 0001(b)
3 伺服準備好 等待打開伺服使能 0x0007 0010 0011 0011(b)
4 等待打開伺服使能 伺服運行 0x000F 0100 0011 0011(b)

示例程式如下:

if ((cur_status[i] & 0x0250) == 592)
{
    printf("*********************Servo Power on*********************\n");
    EC_WRITE_U16(domainOutput_pd + cntlwd[i], 0x06);
}
if ((cur_status[i] & 0x031) == 49)
            {
                if ((cur_status[i] & 0x033) == 51)
                {
                    if ((cur_status[i] & 0x0433) == 1075)
                    {
                        EC_WRITE_U16(domainOutput_pd + cntlwd[i], 0x1f);

                    }
                    else
                    {
                        printf("*********************Servo Waitting*********************\n");
                        EC_WRITE_U16(domainOutput_pd + cntlwd[i], 0x0f);
                    }

                }
                else
                {
                    printf("*********************Servo Enable*********************\n");
                    EC_WRITE_U16(domainOutput_pd + cntlwd[i], 0x07);
                }    
            }
        }

6040控制字暫存器各個位描述

6040操作字

6041狀態字暫存器各個位描述
6041操作字

這一小節的內容參考了燕駿博客的匯川IS620N伺服CIA402狀態機切換步驟-6040控制字及6041狀態字描述這篇文章,在此致謝!

9.到這里對于伺服電機的配置就基本完成了,但是在實際測驗的時候我們發現:

  • 當程式沒有正常結束(手動Ctrl+c關閉),或者程式結束后沒有使電機進入等待狀態,后面再進行操作的時候電機就會沒有反應(除非斷電對伺服電機重新上電),這種情況是因為電機產生了fault,也就是6041h狀態字的3號位會為1,這種情況下電機是不會作業的,這時我們就需要清除故障,也就是對6040h的7號位置1,然后重新使能,這樣電機就會進入正常的作業;

      cur_status = EC_READ_U16(domainInput_pd + status);
      if (EC_READ_U16(domainInput_pd + errcode) != 0 || (cur_status & 0x0008))
      {
          printf("Error Capture:servo %d error\n", i);
    
          for (int i = 0; i < drive_count; i++)
          {
              if (EC_READ_U16(domainInput_pd + errcode[i]) != 0 || (cur_status[i] & 0x0008))
              {
                  EC_WRITE_U16(domainOutput_pd + cntlwd[i], (EC_READ_U16(domainOutput_pd + cntlwd[i]) | 0x0080));
              }
              else
              {
                  EC_WRITE_U16(domainOutput_pd + cntlwd[i], (EC_READ_U16(domainOutput_pd + cntlwd[i]) & 0xff7f));
              }
          }
    
          if ((cur_status[i] & 0x031) == 49)
          {
              if ((cur_status[i] & 0x033) == 51)
              {
                  if ((cur_status[i] & 0x0433) == 1075)
                  {
                      EC_WRITE_U16(domainOutput_pd + cntlwd[i], 0x1f);
    
                  }
                  else
                  {
                      printf("33\n");
                      EC_WRITE_U16(domainOutput_pd + cntlwd[i], 0x0f);
                  }
              }
              else
              {
                  printf("31\n");
                  EC_WRITE_U16(domainOutput_pd + cntlwd[i], 0x07);
              }
          }
          printf("Error Solved!!!!\n");
      }
    

4、變頻器驅動配置要點

這次我們使用的是歐姆龍的3G3MX2型變頻器搭配ECT型Ethercat選配件作為從站

變頻器配置

1.硬體上的設定:在硬體上需要對A001和A002進行設定,以保證正常通信,具體內容如下:

A001 = 04 頻率給定選擇,04 = 選配件
A002 = 04 運行指令選擇,04 = 選配件
A003 = 50 基準頻率 = 50Hz,電機額定頻率
A004 = 60Hz 最大頻率 = 60Hz
A044 = 00 控制方式,00 = 恒轉矩
A061 = 60Hz 頻率上限
A062 = 0Hz 頻率下限
F002 = 2 加速時間,2s
F003 = 2 減速時間,2s
F004 = 00 運轉方向,00 = 正向,01 = 反向
H003 = 0.55 電機容量 = 0.55kW

2.PDO配置:

Command(5000h) 控制啟停及正反轉
Frequency Reference(5010h) 運行頻率給定

Status(5100h) 變頻器運行狀態
Output frequency monitor(5110h) 變頻器頻率輸出監控

3.操作字及狀態字位含義

5000h:電機啟動、正反轉、復位
5000h

5010h: 頻率給定,直接給一個hex值

5100h:變頻器狀態反饋
5100h

5110h:變頻器頻率反饋->hex值

4.注意!!

  • 變頻器操作順序:5000h = 0x0 -> 5010h = '頻率16進制' -> 5000h = 0x1

就是說,必須先給命令字置0,然后給頻率,最后命令字置1啟動

EC_WRITE_U16(domainOutput_pd + ECT_Command, 0);
EC_WRITE_U16(domainOutput_pd + ECT_Frequency, ECTFrequency);
EC_WRITE_U16(domainOutput_pd + ECT_Command, 0x1);
  • 變頻器和伺服器一樣,在程式沒有正常運行完就關閉,會產生fault,5100h的第三位會為 1,這時候同樣需要清除錯誤,相比來說變頻器清楚錯誤就簡單一些,只需要將變頻器的第 7 位置 1 就可以,然后再操作便可以正常;

      if (EC_READ_U16(domainInput_pd + ECT_Status) & 0x8)
      {
          EC_WRITE_U16(domainOutput_pd + ECT_Command, 0x80);
      }
    

以上就是IGH_Master應用程式驅動伺服和變頻器的操作步驟和可能遇到的問題,在進行工業領域的設計操作時,設備的手冊一定是重中之重,還是要多看手冊,

本文參考了很多網上資料,對主要參考資料都進行了標注,還有一些可能未進行標注,在此一并感謝!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/226453.html

標籤:其他

上一篇:Linux 環境變數配置全攻略

下一篇:hibernate - 查詢操作

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more