马上注册,享受更多特权
您需要 登录 才可以下载或查看,没有帐号?立即注册 ![](source/plugin/zhanmishu_wechat/template/static/img/wechat_login.png)
x
SOEM1.4协议栈,win10 64,vs2019。周期2ms.
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的映射配置已经写进去了。
另外,用FPRD命令读FMMU(0x600~0x6ff),有如下结果:
0x600:0
0x610:0x14
0x604:0xA
0x614:0x8
0x606:0
0x616:0
0x607:7
0x617:7
0x608:0x1800
0x618:0x1C00
0x60A:0
0x61A:0
0x60B:2
0x61B:1
0x60C:1
0x61C:1
好像fmmu也是正确的。
但是,实际发现,ec_receive_processdata(EC_TIMEOUTRET);的时候,LRW并没有读回来返回数据。其中一包返回数据如图所示(wireshark):
可以看到,LRW的WKC=2,也就是写成功,但是读没有成功。请问这是怎么回事?
|