我是靠谱客的博主 谦让大船,最近开发中收集的这篇文章主要介绍往死里写——从站mailbox实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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_AOE1
MBX_TYPE_EOE   2
MBX_TYPE_COE 3
MBX_TYPE_FOE 4
MBX_TYPE_SOE5
MBX_TYPE_VOE15


当邮箱数据头类型=3(CoE)时,COE_ServiceInd((TCOEMBX MBXMEM *)pMbx)函数

通过强制类型转换,套出CoE数据头

这里注意,大小端模式下,CoE类型的位置是不一样的。

在这里我们采用小端模式

PDO编号(9位)保留(3位)类型(4位)
                CoE数据头

通过判断类型,跳转到对应的类型处理中去

COESERVICE_EMERGENCY1
COESERVICE_SDOREQUEST2
COESERVICE_SDORESPONSE3
COESERVICE_TXPDO4
COESERVICE_RXPDO5
COESERVICE_TXPDOREMREQ6
COESERVICE_RXPDOREMREQ7
COESERVICE_SDOINFO8
                  CoE命令定义


这里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下载请求
CCS0x02上传请求
 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实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部