概述
void ECAT_Main(void)函数里面
首先检查是否有服务储存在mailbox里面。调用MBX_Main();(This function is called cyclically to check if a received Mailbox service was stored?)
在MBX_Main(void)里面获得mailbox的接受队列里面的邮箱赋予pMbx。
通过函数MailboxServiceInd(*pmbx)来检查邮箱头部给对应的服务,然后调用对应的XXXX_ServiceInd-function函数
根据pMbx->MbxHeader.Flags[MBX_OFFS_TYPE] & MBX_MASK_TYPE) >> MBX_SHIFT_TYPE来判读对应的服务
#define MBX_TYPE_AOE 1
#define MBX_TYPE_EOE 2
#define MBX_TYPE_COE 3
#define MBX_TYPE_FOE 4
#define MBX_TYPE_SOE 5
#define MBX_TYPE_VOE 15
通过判断(pMbx->MbxHeader.Flags[MBX_OFFS_TYPE] & MBX_MASK_TYPE) >> MBX_SHIFT_TYPE 来判断邮箱请求服务的类型。
这里发现郇极、刘艳强书《工业以太网现场总线EtherCAT驱动程序设计及应用》P24页 和图2.26,表2.6 里有个错误
在从站协议V5.10里,它的非周期性邮箱数据通信,邮箱数据单元结构里,邮箱数据头,是由长度(16位)、地址(16位)、通道(6位)、优先级(2位)、计数器(4位)、类型(4位)。
而在书里面,把类型和计数器的位置颠倒了。
长度(16) | 地址(16位) | 通道(6位) | 优先级(2位) | 计数器(4位) | 类型(4位) |
MBX_TYPE_AOE | 1 |
MBX_TYPE_EOE | 2 |
MBX_TYPE_COE | 3 |
MBX_TYPE_FOE | 4 |
MBX_TYPE_SOE | 5 |
MBX_TYPE_VOE | 15 |
当邮箱数据头类型=3(CoE)时,COE_ServiceInd((TCOEMBX MBXMEM *)pMbx)函数
通过强制类型转换,套出CoE数据头
这里注意,大小端模式下,CoE类型的位置是不一样的。
在这里我们采用小端模式
PDO编号(9位) | 保留(3位) | 类型(4位) |
通过判断类型,跳转到对应的类型处理中去
COESERVICE_EMERGENCY | 1 |
COESERVICE_SDOREQUEST | 2 |
COESERVICE_SDORESPONSE | 3 |
COESERVICE_TXPDO | 4 |
COESERVICE_RXPDO | 5 |
COESERVICE_TXPDOREMREQ | 6 |
COESERVICE_RXPDOREMREQ | 7 |
COESERVICE_SDOINFO | 8 |
这里SDO服务,这里SDO数据帧格式
SDO控制(8) | 索引(16) | 子索引(8) | 数据(32) | 可选扩展数据(1~1470) |
SDO通信服务的3种类型
1、快速传输服务:与标准的CANopen协议相同,只使用8个字节,最多传输4个字节有效数据;
2、常规传输服务:使用超过8个字节,可以传输超过4个字节的有效数据,最大可传输有效数据取决于邮箱SM所管理的存储区容量;
3、分段传输服务:对于超过邮箱容量的情况,使用分段的方式进行传输。
在从站代码里面只定义了 SDO请求 的服务程序 和 SDO信息的服务程序;
当接受到SDO-Request 的时候 ,将调用SDOS_SdoInd()函数来处理SDO请求,如果存在SDO协议被使用,则对应的处理函数将被调用。
在这里强行套用套接头(TINITSDOMBX)
这里通过指令
UINT8 sdoHeader = pSdoInd->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] & SDOHEADER_COMMANDMASK;
UINT8 command = (sdoHeader & SDOHEADER_COMMAND);
将CoE的命令码读出来
如果命令码CCS 是0x01:下载请求;0x00:分段下载请求
SDO传输又分为下载和上传两种,下载传输常用于主站设置从站参数,上传传输用于主站读取从站的性能参数。这两种服务在物理上是对称的。
在书《工业以太网现场总线EtherCAT驱动程序设计及应用》P101 表5.5 里面CoE的命令码CCS可以补充
0x00 | 分段下载请求 | |
0x01 | 下载请求 | |
CCS | 0x02 | 上传请求 |
0x03 | 分段上传请求 | |
0x04 | 停止传输 |
通过函数OBJ_GetObjectHandle();获得对象字典的句柄,并判断请求的索引是否在对象字典里面定义
SDO传输又分为下载和上传两种,下载传输常用于主站设置从站参数,上传传输用于主站读取从站的性能参数。
(1)SDO下载传输请求
SDO下载传输请求数据格式。如果要传输的数据小于4个字节,则使用快速SDO传输服务,它完全兼容CANopen协议,使用8个字节数据,其中4个字节为数据区,有效字节为4减去SDO控制字节中的位2和3表示的数值。(表示传输的数据小于4个字节,因为只有两位表示,所以,其中值为0,1,2,3)
如果要传输的数据大于4个字节,则使用常规传输服务。在常规传输时,用快速传输时的4个数据字节表示要传输的数据的完整大小。用扩展数据部分传输有效数据。有效数据的最大容量为邮箱容量减去16。实际大小为邮箱头中长度数据n减去10。SDO下载传输请求服务的数据帧内容如表所示。
(2)SDO分段下载传输
在常规下载传输时,如果传输数据对象的总数量大于本次传输的允许数据数量,则必须使用后续的分段下载传输服务。
(3)SDO下载传输响应
从站收到SDO下载请求之后,执行相应的处理,然后将响应数据写入输入邮箱SM1中,由主站读走。主站只有得到正确的响应之后才能执行下一步SDO操作。正确的SDO下载响应数据格式如图
(4)终止SDO传输
在SDO传输过程中,如果某一方发现有错误,可以发起SDO终止传输请求,对方收到此请求后,停止当前SDO传输。SDO终止传输请求不需要应答。
(5)SDO下载传输过程
主站首先发送SDO下载请求道从站SM0,从站读取邮箱数据后执行相应操作,并将响应数据写入输入邮箱SM1。主站读SM1,读到有效数据后,根据响应数据判断下载请求的执行结果。
2、紧急事件
紧急事件由设备内部得错误事件触发,将诊断信息发送给主站。当诊断事件消失之后,从站应该将诊断事件和错误复位码再发送一次。
SDO数据,1字节(控制字节),位4,完全操作(COMPLETE_ACCESS),0x00:操作由索引号和子索引号检索的参数体;0x01:操作完整的数据对象,子索引应该为0或1(不包括子索引0)
在这里这个完全操作是什么作用?
最后
以上就是谦让大船为你收集整理的往死里写——从站mailbox实现的全部内容,希望文章能够帮你解决往死里写——从站mailbox实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复