ethercat一拖多驅動控制
ethercat主站開發之-----一拖多驅動控制
ethercat伺服電機驅動器使用過很多品牌vx18820959358,從最早起的松下、臺達、韓國Ls,到后續國產的匯川、清能德創、英威騰、高創、禾川、伊萊斯、睿能、新時達、摩通等。這些年幾乎是一步步見證國內ethercat驅動的蓬勃發展。早期一拖一的驅動是主流,隨著機器人行業的成本競爭的白熱化,一拖多驅動驅動由于成本優勢,逐漸成為機器人行業的主流應用選擇。
ethercat伺服驅動基本遵循CIA402協議,約束0x6000范圍的對象字典的定義和功能。
比如:匯川一拖一驅動,常用的對象字典和PDO映射如下
ec_pdo_entry_info_t inovance_entries[] = {
//write
{0x6040, 0x00, 16}, //控制字( 這個必須寫在開頭 )
{0x607A, 0x00, 32}, //目標位置
{0x6060, 0x00, 8}, //控制模式
{0x60B1, 0x00, 32},// 速度漂移
{0x60B2, 0x00, 16},//扭矩漂移
// read
{0x6041, 0x00, 16},//狀態字
{0x6064, 0x00, 32},//實際位置(編碼器值)
{0x606C, 0x00, 32}, //實際速度
{0x6077, 0x00, 16}, //實際扭矩
{0x60F4, 0x00, 32}, // 實際跟隨誤差
{0x603F, 0x00, 16},//錯誤碼
};
ec_pdo_info_t inovance_pdos[] = {
{0x1600, 5, inovance_entries + 0},
{0x1a00, 6, inovance_entries + 5}
};
ec_sync_info_t inovance_syncs[] = {
{0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},
{1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},
{2, EC_DIR_OUTPUT, 1, inovance_pdos + 0, EC_WD_ENABLE},
{3, EC_DIR_INPUT, 1, inovance_pdos + 1, EC_WD_DISABLE},
{0xff}
};
通過讀寫這些對象字典,就可以實現對伺服電機單個軸的控制。
清能德創一拖多的驅動器,實際控制上面和一拖一的驅動器是一樣的。因為它驅動器內部一個電機仍然存在一個獨立的ethercat節點。只是外觀上用大鐵盒封在了一起而已。
其它品牌一拖多的驅動器,比如:摩通、新時達等,一個ethercat節點可以控制2個以上的驅動器。那控制上面怎么處理呢?
下面是新時達一拖四驅動器,使用的PDO映射。
ec_pdo_entry_info_t step4channel_pdo_entries[] = {
{0x6040, 0x00, 16}, /* Control Word */
{0x6060, 0x00, 8}, /* Modes of Operation */
{0x6098, 0x00, 8}, /* Homing method */
{0x607a, 0x00, 32}, /* Target Position */
{0x6840, 0x00, 16}, /* Control Word */
{0x6860, 0x00, 8}, /* Modes of Operation */
{0x6898, 0x00, 8}, /* Homing method */
{0x687a, 0x00, 32}, /* Target Position */
{0x7040, 0x00, 16}, /* Control Word */
{0x7060, 0x00, 8}, /* Modes of Operation */
{0x7098, 0x00, 8}, /* Homing method */
{0x707a, 0x00, 32}, /* Target Position */
{0x7840, 0x00, 16}, /* Control Word */
{0x7860, 0x00, 8}, /* Modes of Operation */
{0x7898, 0x00, 8}, /* Homing method */
{0x787a, 0x00, 32}, /* Target Position */
{0x6041, 0x00, 16}, /* Status Word */
{0x603f, 0x00, 16}, /* Error Code */
{0x6061, 0x00, 8}, /* Modes of Operation Display */
{0x6064, 0x00, 32}, /* Position Actual Value */
{0x606c, 0x00, 32}, /* Velocity Actual Value */
{0x6841, 0x00, 16}, /* Status Word */
{0x683f, 0x00, 16}, /* Error Code */
{0x6861, 0x00, 8}, /* Modes of Operation Display */
{0x6864, 0x00, 32}, /* Position Actual Value */
{0x686c, 0x00, 32}, /* Velocity Actual Value */
{0x7041, 0x00, 16}, /* Status Word */
{0x703f, 0x00, 16}, /* Error Code */
{0x7061, 0x00, 8}, /* Modes of Operation Display */
{0x7064, 0x00, 32}, /* Position Actual Value */
{0x706c, 0x00, 32}, /* Velocity Actual Value */
{0x7841, 0x00, 16}, /* Status Word */
{0x783f, 0x00, 16}, /* Error Code */
{0x7861, 0x00, 8}, /* Modes of Operation Display */
{0x7864, 0x00, 32}, /* Position Actual Value */
{0x786c, 0x00, 32}, /* Velocity Actual Value */
};
ec_pdo_info_t step4channel_pdos[] = {
{0x1600, 4, step4channel_pdo_entries + 0}, /* RxPDO0 */
{0x1601, 4, step4channel_pdo_entries + 4}, /* RxPDO1 */
{0x1602, 4, step4channel_pdo_entries + 8}, /* RxPDO2 */
{0x1603, 4, step4channel_pdo_entries + 12}, /* RxPDO3 */
{0x1a00, 5, step4channel_pdo_entries + 16}, /* TxPDO0 */
{0x1a01, 5, step4channel_pdo_entries + 21}, /* TxPDO1 */
{0x1a02, 5, step4channel_pdo_entries + 26}, /* TxPDO2 */
{0x1a03, 5, step4channel_pdo_entries + 31}, /* TxPDO3 */
};
ec_sync_info_t step4channel_syncs[] = {
{0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},
{1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},
{2, EC_DIR_OUTPUT, 4, step4channel_pdos + 0, EC_WD_ENABLE},
{3, EC_DIR_INPUT, 4, step4channel_pdos + 4, EC_WD_DISABLE},
{0xff}
};
我們可以看到規律,它基于標準CIA402的規定:
第二個軸的對象字典地址+0x800
第三個軸的對象字典地址+0x1000
第四個軸的對象字典地址+0x1800
通過這樣的擴展,實現通過一個ethercat節點,控制多個獨立電機。從控制邏輯上和一拖一的驅動器是一樣的,只是映射地址有偏移而已。
在比如摩通一托二驅動器PDO映射如下:
ec_pdo_entry_info_t motong2ch_pdo_entries[] = {
{0x6040, 0x00, 16}, /* 0#Control Word */
{0x607a, 0x00, 32}, /* Target Position */
{0x6840, 0x00, 16}, /* 1#Control Word */
{0x687a, 0x00, 32}, /* Target Position */
{0x6041, 0x00, 16}, /* 0#Status Word */
{0x603f, 0x00, 16}, /* Error Code */
{0x6064, 0x00, 32}, /* Position Actual Value */
{0x60f4, 0x00, 32}, /* Following Error Actual Value */
{0x606c, 0x00, 32}, /* Velocity Actual Value */
{0x6077, 0x00, 16}, /* Torque Actual Value */
{0x6841, 0x00, 16}, /* 1#Status Word */
{0x683f, 0x00, 16}, /* Error Code */
{0x6864, 0x00, 32}, /* Position Actual Value */
{0x68f4, 0x00, 32}, /* Following Error Actual Value */
{0x686c, 0x00, 32}, /* Velocity Actual Value */
{0x6877, 0x00, 16}, /* Torque Actual Value */
};
ec_pdo_info_t motong2ch_pdos[] = {
{0x1603, 2, motong2ch_pdo_entries + 0}, /* csp RxPDO */
{0x1613, 2, motong2ch_pdo_entries + 2}, /* csp RxPDO */
{0x1a03, 6, motong2ch_pdo_entries + 4}, /* csp TxPDO */
{0x1a13, 6, motong2ch_pdo_entries + 10}, /* csp TxPDO */
};
ec_sync_info_t motong2ch_syncs[] = {
{0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},
{1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE},
{2, EC_DIR_OUTPUT, 2, motong2ch_pdos + 0, EC_WD_ENABLE},
{3, EC_DIR_INPUT, 2, motong2ch_pdos + 2, EC_WD_DISABLE},
{0xff}
};
仍然第二個軸的對象字典地址+0x800
代碼實現:
在代碼實現上面,做算法控制的人是不想關心底層驅動到底是一托一還是一托多的驅動,所以在軟件構架實現上面要實現分層隔離。我們構建了邏輯軸和物理軸的概念:
邏輯軸:控制算法的控制對象和控制接口是邏輯軸。比如目標位置數據等。
物理軸:是實現控制數據和物理電機的傳達交互。比如將目標位置執行到電機的實際角度上。
我們首先利用robotInfo.xml配置文件定義邏輯軸和物理軸的映射關系:
這樣一個xml格式的節點代表邏輯軸1對應ethercat協議的別名80的驅動器的通道0的電機。
創建邏輯軸類:
class LogicMotor
{
public:
LogicMotor(E_DEVICE_PROTOCOL protocolIn, int aliasIn,int busIdIn,E_VIRTUAL_CTRL virtualCtrlFlagIn);
}
再創建物理軸類:
class EcatMotor
{
public:
EcatMotor(E_DEVICE_PROTOCOL protocolIn, int aliasIn,int busIdIn,int maxChannelIn,
E_VIRTUAL_CTRL virtualCtrlFlagIn);
LogicMotor* logicMotors[D_MAX_MOTOR_CHANNEL];
}
物理軸類有邏輯軸的成員變量。
程序首先初始化邏輯軸類,然后根據映射關系創建物理軸類。
整個控制流程:定時周期線程,算法計算一步控制邏輯軸,物理軸類實現一次數據交互,將電機反饋數據寫入邏輯軸,將邏輯軸的數據寫入單個電機vx18820959358。

提交