zhiyaormb 2022-09-09 17:37 采纳率: 23.1%
浏览 309
已结题

SOEM操作汇川SV660,ec_receive_processdata函数失败

WIN10,SOEM1.4,Win10Pcap,PDO映射配置如下:

int size = 2;
 uint8_t     b;
 uint16_t w;
 uint8_t  ind;
 uint32_t dw;

 //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);

打开网口,启动协议栈,能够找到目标驱动器,经初始化后(就是SOEM协议栈的simpletest几乎一样的过程),LED面板上面显示_88ry,按照官方的说明书,应该表示运行状态,周期同步位置模式,伺服就绪,能通过PDO数据控制字操作马达上使能,此时LED面板显示_99rn,也就是电机已经上使能。还能进行SDO读写操作。
为检验PDO映射设置是否正确,读部分SDO,结果如下:
index subindex size Value
1c13 1 2 1a00
1c13 0 1 1
1c12 0 1 1
1c12 1 2 1600
1a00 1 4 603f0010
1a00 2 4 60410010
1a00 3 4 60640020
1a00 0 1 3
1600 0 1 3
1600 1 4 60400010
1600 2 4 607a0020
1600 3 4 607c0020
可以看到PDO的映射配置已经写进去了。但是,实际发现,ec_receive_processdata(EC_TIMEOUTRET);的时候,LRW并没有读回来返回数据。其中一包返回数据如图所示(wireshark):

img

可以看到,LRW的WKC=2,也就是写成功,但是读没有成功。请问这是怎么回事?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 9月17日
    • 创建了问题 9月9日

    悬赏问题

    • ¥50 AI大模型精调(百度千帆、飞浆)
    • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
    • ¥15 非科班怎么跑代码?如何导数据和调参
    • ¥15 福州市的全人群死因监测点死亡原因报表
    • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
    • ¥15 系统2008r2 装机配置推荐一下
    • ¥500 服务器搭建cisco AnyConnect vpn
    • ¥15 悬赏Python-playwright部署在centos7上
    • ¥15 psoc creator软件有没有人能远程安装啊
    • ¥15 快速扫描算法求解Eikonal方程咨询