本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star
目录
1. ETherCAT 状态机
2. SOEM配置过程
2.1 IP初始态转预运行
2.2 预运行转安全运行
2.3 安全运行转运行
2.4 运行状态
EtherCAT 设备必须支持4 种状态,负责协调主站和从站应用程序在初始化和运行时的状态
关系。
● Init:初始化,简写为 I;
● Pre‑Operational:预运行,简写为 P;
● Safe‑ Operational:安全运行,简写为 S;
● Operational:运行,简写为 O。
从初始化状态向运行状态转化时,必须按照“初始化→预运行→安全运行→运行”的顺序
转化,不可以越级。 从运行状态返回时可以越级转化。
状态的转化操作和初始化过程如下表:
调用ec_config_init(0),配置地址、SM等。函数结束后,应该已经进入预运行状态
自定义PDO映射
/*
● SV660N 的 PDO 配置遵循流程:
PDO 的映射配置遵循特定的流程,具体按如下步骤执行:
1. PDO配置映射组。1C12h(或1C13h)的00h子索引写入0;
a. 清除原有的映射组。对1C12h(或1C13h)的00h子索引写入“0”即可清除该PDO配
置组;
b. 写入PDO映射组。按场景需求写入映射配置组,1C12h中预写入1600h/
1701h~1705h的值;1C13h中预写入1A00h/1B01h~1B04h的值。注意:只有
1600h和1A00h是可配置映射组,其他是固定映射配置;
c. 写入该PDO映射组总个数到1C12h(或0x1C13h)对象子索引0;
2. 配置PDO映射对象。1600h(或1A00h)的00h子索引写入0。
a. 清除原有的映射对象。对1600h(或1A00h)的00h子索引写入“0”即可清除该PDO
映射配置;
b. 写入PDO映射内容。按XML文件中的对象参数定义,分别写入到映射参数子索引
1~10中;只有支持映射的对象才能配置为PDO映射内容。
c. 写入PDO映射对象总个数,将步骤b中写入的映射个数写入到子索引0中。
说明
● PDO配置仅可以在EtherCAT通讯状态机处于预运行(Pro‑Operation,面板显示2)的时候
进行设置,否则报错。
● PDO配置参数不可存储在e2prom中,因此,每次上电后,请务必重新配置映射对象,
否则,映射对象为伺服驱动器默认参数。
*/
void process_data_config()
{
int size = 2;
u8_t b;
uint16_t w,ind;
uint32_t dw;
for(int slave = 1; slave <= *ecx_context.slavecount; slave++)
{
//rpdo------------
//1c12.0
b = 0;
ec_SDOwrite(slave, 0x1c12, 0x00, FALSE, sizeof(b), &b, EC_TIMEOUTRXM);
w = htoes(0x1600);
ec_SDOwrite(slave, 0x1c12, 0x01, FALSE, sizeof(w), &w, EC_TIMEOUTRXM);
//1600
ind = 0;
b = 0;
ec_SDOwrite(slave, 0x1600, 0, FALSE, sizeof(b), &b, EC_TIMEOUTRXM);
dw = htoel(0x60400010);//6040h(控制字)
ec_SDOwrite(slave, 0x1600, ++ind, FALSE, sizeof(dw), &dw, EC_TIMEOUTRXM);
dw = htoel(0x607a0020);//607Ah(目标位置)
ec_SDOwrite(slave, 0x1600, ++ind, FALSE, sizeof(dw), &dw, EC_TIMEOUTRXM);
dw = htoel(0x607c0020);//607Ch(原点偏移量)
ec_SDOwrite(slave, 0x1600, ++ind, FALSE, sizeof(dw), &dw, EC_TIMEOUTRXM);
b = ind;
ec_SDOwrite(slave, 0x1600, 0, FALSE, sizeof(b), &b, EC_TIMEOUTRXM);
//1c12.0
b = 1;
ec_SDOwrite(slave, 0x1c12, 0x00, FALSE, sizeof(b), &b, EC_TIMEOUTRXM);
//tpdo-------------
//1c13.0
b = 0;
ec_SDOwrite(slave, 0x1c13, 0x00, FALSE, sizeof(b), &b, EC_TIMEOUTRXM);
w = htoes(0x1a00);
ec_SDOwrite(slave, 0x1c13, 0x01, FALSE, sizeof(w), &w, EC_TIMEOUTRXM);
//1a00
ind = 0;
b = 0;
ec_SDOwrite(slave, 0x1a00, 0, FALSE, sizeof(b), &b, EC_TIMEOUTRXM);
dw = htoel(0x603F0010);//603Fh(错误码)
ec_SDOwrite(slave, 0x1a00, ++ind, FALSE, sizeof(dw), &dw, EC_TIMEOUTRXM);
dw = htoel(0x60410010);//6041h(状态字)
ec_SDOwrite(slave, 0x1a00, ++ind, FALSE, sizeof(dw), &dw, EC_TIMEOUTRXM);
dw = htoel(0x60640020);//6064h(位置反馈)
ec_SDOwrite(slave, 0x1a00, ++ind, FALSE, sizeof(dw), &dw, EC_TIMEOUTRXM);
b = ind;
ec_SDOwrite(slave, 0x1a00, 0, FALSE, sizeof(b), &b, EC_TIMEOUTRXM);
//1c13.0
b = 1;
ec_SDOwrite(slave, 0x1c13, 0x00, FALSE, sizeof(b), &b, EC_TIMEOUTRXM);
}
}
定义FMMU
ec_config_map(IOmap)该函数会请求进入安全运行状态
驱动器必须按照标准 402 协议规定的流程引导伺服驱动器,伺服驱动器才可运行于指定的状态。下图为CiA402 状态机切换图:
启动的流程为:向6040PDO中依次写入0x6, 0x7, 0xF。如果有故障,向 6040PDO中写入0x80。
然后通过下列代码发送命令进入运行状态。需要注意的是,如果RPDO中映射了6040,对应的IOMAP中必须写入正确的配置命令(0xf)。
ec_slave[0].state = EC_STATE_OPERATIONAL;
/* send one valid process data to make outputs in slaves happy*/
ec_send_processdata();
ec_receive_processdata(EC_TIMEOUTRET);
/* request OP state for all slaves */
ec_writestate(0);
chk = 200;
/* wait for all slaves to reach OP state */
do
{
ec_send_processdata();
ec_receive_processdata(EC_TIMEOUTRET);
ec_statecheck(0, EC_STATE_OPERATIONAL, 50000);
}
while (chk-- && (ec_slave[0].state != EC_STATE_OPERATIONAL));
进行运行态后就是通过
ec_send_processdata();
ec_receive_processdata(EC_TIMEOUTRET);
循环收发过程数据了。