分享

CANopen原理

 myallmy 2022-05-10 发布于北京

本文介绍CANopen中的SDO(upload)原理,以及在CanFestival中的实现过程。

一、SDO upload

当需要读取一个CANopen节点中对象字典的值时,使用SDO upload协议,根据对象字典的数据类型,又分为SDO upload expedited和SDO upload normal 两种:
(1)当数据字典的长度小于或等于4个字节时,使用SDO upload expedited。
(2)当数据字典的长度超过4个字节,一帧数据传输不完时,使用SDO upload normal。

二、SDO upload expedited帧格式

客户端请求:
这里写图片描述

服务器正常响应:
这里写图片描述

其中n与对象字典的数据长度有关:
这里写图片描述

三、SDO upload normal帧格式

SDO upload normal中,初始化以后传输的帧称为upload segment帧。
客户端请求:
这里写图片描述
服务器响应:
这里写图片描述
其中,
t:翻转位,每传输一次segment翻转一次,请求和响应中的t必须相等。
n:代表数据d0~d6中无效数据的长度,n=0表示7个字节数据均有效。
c:等于0表示还有更多数据等待传输,等于1表示传输完毕。

四、错误响应

当发生错误时,服务器返回错误响应:
这里写图片描述
常见的错误码在def.h中定义:

/** definitions used for object dictionary access. ie SDO Abort codes . (See DS 301 v.4.02 p.48)
 */
#define OD_SUCCESSFUL                0x00000000
#define OD_READ_NOT_ALLOWED          0x06010001
#define OD_WRITE_NOT_ALLOWED         0x06010002
#define OD_NO_SUCH_OBJECT            0x06020000
#define OD_NOT_MAPPABLE              0x06040041
#define OD_LENGTH_DATA_INVALID       0x06070010
#define OD_NO_SUCH_SUBINDEX          0x06090011
#define OD_VALUE_TOO_LOW             0x06090031 /* Value range test result */
#define OD_VALUE_TOO_HIGH            0x06090032 /* Value range test result */
/* Others SDO abort codes 
 */
#define SDOABT_TOGGLE_NOT_ALTERNED   0x05030000
#define SDOABT_TIMED_OUT             0x05040000
#define SDOABT_OUT_OF_MEMORY         0x05040005 /* Size data exceed SDO_MAX_LENGTH_TRANSFERT */
#define SDOABT_GENERAL_ERROR         0x08000000 /* Error size of SDO message */
#define SDOABT_LOCAL_CTRL_ERROR      0x08000021 

四、CanFestival中的实现

以CanFestival作为服务器为例,收到一个客户端SDO请求后的处理流程如下:
这里写图片描述

五、实例

以读取从节点1的对象字典0x1018和0x1008为例,总线上监控到CAN帧如下:
这里写图片描述

其中0x1008为Manufacturer device name,数据类型为VISIBLE_STRING,以ASCII码的形式传输。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多