This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
aPdOutputData数组用来存储主站下发的数据,EtherCAT的数据是小端模式的:
以我现在使用的CSV/CSP模式为例,RxPDO通道绑定关系为:
index6040是状态字对象索引,数据位宽16bit;index607A是TargetPosition对象索引,数据位宽32bit;index60FF是TargetVelocity对象索引,数据位宽32bit;index6060是模式对象索引,数据位宽8bit
按照小端模式,接收到的数据在内存中的顺序应该为:
Byte1 状态字【0】
Byte2 状态字【1】
Byte3 TargetPosition【0】
Byte4 TargetPosition【1】
Byte5 TargetPosition【2】
Byte6 TargetPosition【3】
Byte7 TargetPosition【0】
Byte8 TargetPosition【1】
Byte9 TargetPosition【2】
Byte10 TargetPosition【3】
Byte11 模式 【0】
APPL_OutputMapping函数处理数据时也确实调用了SWAPWORD、SWAPDWORD函数:
SWAPWORD:(函数定义是从网上找的)
SWAPDWORD:(函数定义是从网上找的)
经过SWAP函数的处理,相应的对象可以得到正确的数值。
但是在调试过程中,我看到了如下所示的现象:
我设定的TargetPosition数值是500000,即0x0007 A120
问题1.发现在调用SWAPDWORD函数前,TargetPosition在内存中的顺序已经被排好,这是为什么;
问题2.这个调试界面里,没有使用SWAPDWORD函数,发现TargetPosition对象也能得到500000,即0x0007 A120数值,这是为什么呢?
我理解的经过swap函数处理后,数据在内存中的顺序应该为:
Byte1 状态字【1】
Byte2 状态字【0】
Byte3 TargetPosition【3】
Byte4 TargetPosition【2】
Byte5 TargetPosition【1】
Byte6 TargetPosition【0】
Byte7 TargetPosition【3】
Byte8 TargetPosition【2】
Byte9 TargetPosition【1】
Byte10 TargetPosition【0】
Byte11 模式 【0】
如果将这些数据以Uint16的形式通过进程间通讯传递给C28,我理解的顺序是这样的:
Word1 状态字【1】状态字【0】
Word2 TargetPosition【3】TargetPosition【2】-----> 0x0007
Word3 TargetPosition【1】TargetPosition【0】-----> 0xA120
Word4 TargetPosition【3】TargetPosition【2】
Word5 TargetPosition【1】TargetPosition【0】
但是从调试结果看,C28侧却是这样的数据顺序:
即
Word2 TargetPosition【3】TargetPosition【2】-----> 0xA120
Word3 TargetPosition【1】TargetPosition【0】-----> 0x0007
问题3. 请问这是为什么
我不能很清楚地查看您的图片,所以我不能理解所有的细节。我认为以下的一些事情会让事情明了化。
请标记SWAPWORD宏在ecatslv.h这个文件里只是为了返回同样的值。它实际上似乎并没有做任何事情,见下文:
#ifndef SWAPWORD #define SWAPWORD(x) (x) /**< \brief Macro to swap a WORD*/ #endif
我不能确定这个代码以这种方式被写入。记住这个SW桩和样例代码是由Beckhoff被写入的,不是TI,所以你可以去问他们如果你想进一步了解的话。