Ethercat是倍福公司提出的一種工業現場總線協議,具備很好的實時性,IGH是一種開源的Ethercat主站實現協議,本文總結了一下使用IGH_Master驅動伺服電機和變頻器的經驗算法
安裝好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
;
注意:必須有從站鏈接才能使用此命令。app
命令:ethercat config [ OPTIONS ]
參數:dom
* --alias -a <alias>:匹配從站的別名; * --position -p <pos>:匹配從站的絕對位置; * --verbose -v:顯示詳細信息;
例子:
sudo ethercat config -v
解析:顯示全部從站的詳細配置信息。
注意:必須啓動應用程序才能使用此命令查看。svg
說明:生成的PDO信息能夠直接被應用層的ecrt_slave_config_pdos()
函數調用。
命令:ethercat cstruct [ OPTIONS ]
參數:函數
* --alias -a <alias>:匹配從站的別名; * --position -p <pos>:匹配從站的絕對位置;
例子:
sudo ethercat cstruct -a 100
解析:輸出別名爲100的從站的PDO信息。
注意:必須有從站鏈接才能使用此命令。工具
說明:輸出二進制的過程數據。
命令:ethercat data [ OPTIONS ]
參數:oop
* --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和過程數據的信息)。
注意:必須啓動應用程序才能使用此命令查看。
說明:向從站寫一條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、int八、int1六、int3二、int6四、uint八、uint1六、uint3二、uint6四、float、double、string、octet_string、unicode_string 對於sign-and-magnitude coding有: sm八、sm1六、sm3二、sm64
例子:
sudo ethercat download -t int16 -p 0 0x6060 00 08 解析:向從站0的索引號爲0x6060(16位),子索引號爲00(8位)的地址寫入PDO條目值」0x08「;
說明:向從站讀取一個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、int八、int1六、int3二、int6四、uint八、uint1六、uint3二、uint6四、float、double、string、octet_string、unicode_string 對於sign-and-magnitude coding有: sm八、sm1六、sm3二、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
解析:顯示全部主機的設備信息(發送幀、接收幀、參考時鐘、應用時間)。
注意:欲想顯示應用時間需啓動應用程序。
說明:顯示出同步管理器的參數和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、int八、int1六、int3二、int6四、uint八、uint1六、uint3二、uint6四、float、double、string、octet_string、unicode_string 對於sign-and-magnitude coding有: sm八、sm1六、sm3二、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條目信息)。
命令: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解析(十二)之命令行工具的使用這篇文章,這裏只列出了配置伺服和變頻須要用到的工具,更多工具請移步該做者原文,感謝識荒者的分享
應用程序是用戶針對自身控制系統的控制要求編寫的控制程序模塊,運行於內核層。包括對主站和從站的配置以及週期性實時運行的任務。在實時任務程序中實現主從站間通信以及各類數控算法。主要包括兩塊:
先上圖:
請求用於實時操做的 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
主站從設備獲取數據幀而且處理報文
// 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軟件代碼說明》,未找到出處,在此致謝!
本次咱們使用的是臺達的伺服電機,型號爲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 時,電機旋轉。驅動器參數屬性爲「運行更改」的能夠設置,其餘不可。 |
快速停機 | 快速停機功能被激活,驅動器正在執行快速停機功能。驅動器參數屬性爲「運行更改」的能夠設置,其餘不可。 |
故障停機 | 驅動器發生故障,正在執行故障停機過程當中。驅動器參數屬性爲「運行更改」的能夠設置,其餘不可。 |
故障 | 故障停機完成,全部驅動功能均被禁止,同時容許更改驅動器參數以便排除故障。 |
啓動的流程爲:向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控制字寄存器各個位描述
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"); }
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:電機啓動、正反轉、復位
5010h: 頻率給定,直接給一個hex值
5100h:變頻器狀態反饋
5110h:變頻器頻率反饋->hex值
4.注意!!
就是說,必須先給命令字置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應用程序驅動伺服和變頻器的操做步驟和可能遇到的問題,在進行工業領域的設計操做時,設備的手冊必定是重中之重,仍是要多看手冊。
本文參考了不少網上資料,對主要參考資料都進行了標註,還有一些可能未進行標註,在此一併感謝!