Soem配置汇川SV660N

本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star​​​​​​​

目录

1. ETherCAT 状态机

2. SOEM配置过程

2.1 IP初始态转预运行

2.2 预运行转安全运行

2.3 安全运行转运行

2.4 运行状态


1. ETherCAT 状态机

Soem配置汇川SV660N_第1张图片

EtherCAT 设备必须支持4 种状态,负责协调主站和从站应用程序在初始化和运行时的状态
关系。
● Init:初始化,简写为 I;
● Pre‑Operational:预运行,简写为 P;
● Safe‑ Operational:安全运行,简写为 S;
● Operational:运行,简写为 O。
从初始化状态向运行状态转化时,必须按照“初始化→预运行→安全运行→运行”的顺序
转化,不可以越级。 从运行状态返回时可以越级转化。

状态的转化操作和初始化过程如下表:

Soem配置汇川SV660N_第2张图片Soem配置汇川SV660N_第3张图片

2. SOEM配置过程

2.1 IP初始态转预运行

调用ec_config_init(0),配置地址、SM等。函数结束后,应该已经进入预运行状态

2.2 预运行转安全运行

自定义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)该函数会请求进入安全运行状态

2.3 安全运行转运行

 驱动器必须按照标准 402 协议规定的流程引导伺服驱动器,伺服驱动器才可运行于指定的状态。下图为CiA402 状态机切换图:

Soem配置汇川SV660N_第4张图片

 Soem配置汇川SV660N_第5张图片

 Soem配置汇川SV660N_第6张图片

Soem配置汇川SV660N_第7张图片

启动的流程为:向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));

2.4 运行状态

进行运行态后就是通过

ec_send_processdata();
ec_receive_processdata(EC_TIMEOUTRET);

循环收发过程数据了。

你可能感兴趣的:(RT-Thread,嵌入式硬件)