CANopen伺服控制-服务数据对象(SDO)详细解析

CANopen服务数据对象(SDO)详细解析

SDO“服务数据对象”允许对对象字典进行读或写访问。数据服务对象,以下简称SDO

在下文中,对象字典的所有者称为“服务器/主机”; 想要请求或写入数据的CAN节点称为“客户端/从机”。 “上载”是指从对象字典中读取对象的值。 “下载”是指在对象字典中写入值。 此外,图中使用以下缩写:

  • <IDX>:要在对象字典中读取或写入的对象的索引;索引的LSB在这里的字节1中。示例:控制器的statusword有索引6041h;然后用41h写入字节1,用60h写入字节2。通过快速传输,SDO应答包含与请求相同的索引

 

  • <SUBIDX>:对象字典中从00h到FFh的对象的子索引。对于快速传输,控制器的SDO消息的应答也包含请求的子索引。

用于配置控制器。如果在运行过程中需要周期性地交换数据,使用PDO类型的CANopen消息更有意义(参见Process Data Object小节)。

SDO传输分为三种类型的访问:

  • “快速传输”用于传输最多四个字节的对象。
  • “正常传输”用于传输任意数量的字节,从而确认每个CAN消息
  • 个别地。
  • “块传输”也适用于任何字节数;这里,一个给定的CAN票据块被立即确认。

向CAN-ID 600h+节点ID发送SDO消息,答案来自CAN-ID 580h+节点ID。

Expedited Transfer 快速转移

此方法用于在对象字典中写入(下载)或读取(上载)类型为(UN)SIGNED8、INTEGER16或INTEGER32的对象中的值。此服务已确认,即每个访问都用数据、确认或错误消息进行应答。

 SDO下载(SDO写)
用于在服务器的对象字典中写入数据的快速SDO消息的结构如下:

在此,<CMD>字节取决于要写入的数据的长度。 <CMD>可以是以下值之一:
■1字节数据长度:2Fh
■2字节数据长度:2Bh
■3字节数据长度:27h
■4字节数据长度:23h

<Data>字段是用要写入的数据写入的;数据的LSB是在字节4中输入的。服务器的回答是确认写入操作或错误消息(消息结构:参见下图)。在后一种情况下,错误原因也会随数据一起发送(请参见SDO错误消息一节中的SDO错误消息列表)。

示例:使用以下命令将控制器的对象607Ah:00h(目标位置,SIGNED32)设置为值3E8h(= 1000d)
节点ID 3:
603 | 23 7A 60 00 E8 03 00 00
哪里
■字节1(23h):SDO加速下载,4字节数据(SIGNED32)
■字节2和3(7Ah 60h):对象的索引为607Ah
■字节4(00h):对象的子索引为00h
■字节5至8(E8h 03h 00h 00h):对象的值:000003E8h
如果成功,则控制器以以下消息响应:
583 | 60 7A 60 00 00 00 00 00

SDO upload(SDO读)

用于从对象字典中读取对象的CAN消息具有以下结构:

服务器用以下消息之一响应:

数据的长度在返回的<CMD>中:
■1字节数据长度:4Fh
■2字节数据长度:4Bh
■3字节数据长度:47h
■4字节数据长度:43h

数据的LSB再次位于此处的字节4中。
发生错误时,还会在数据中指定错误原因(请参见SDO错误消息中的SDO错误消息列表)。
示例:要从对象字典中读取“状态字”对象(6041h:00),只需发送以下消息(始终为8个字节)即可:
603 | 40 41 60 00 00 00 00 00
控制器通常会响应以下消息:
583 | 4B 41 60 00 40 02 00 00

 

解析?

字节1(4Bh):SDO加速上传,2字节数据(无符号16)
字节2和3(41h 60h):对象索引为6041h
字节4(00h):对象的子索引为00h
字节5到6(40h 02h):对象值:0240h
字节7至8(00h 2h h h):空。SDO消息总是由8个字节组成。

 正常传输

CANopen“快速”传输限制为最多4个字节;若要超过此限制,必须支持所谓的“正常传输”。在这种类型的传输中,多个消息的内容根据内容分组在一起;这样的消息块在下文中称为“传输”。传输中的每个消息都在这里单独确认。

在生成文档时,这仅对“String”类型的对象是必需的。由于字符串具有“只读”访问限制,因此不需要下载SDO;因此本文档仅讨论SDO上载。

缺乏对主机的“正常调动”的支持
如果控制器由不支持“正常传送”的主站操作,则使用
String数据类型也可以用另一种方式处理:每个字符串可以一个字符一个字符地读出
将SDO上传到子索引1和后续的子索引。

示例:要读取对象6505h(http驱动器目录地址)。如果主机支持“正常传输”,那么就可以开始上传子索引为00的对象;控制器会自动切换转到“正常传输”。如果主机只支持“快速传输”,则可以使用对象6505h:01、6505h:02、6505h:03等逐字符读取字符串

 

SDO上传

下图显示了“SDO上载”的过程(客户机请求将对象的内容发送给它)。传输分为两个阶段:初始化阶段和传输阶段。

与“快速传输”一样,上传从客户端向服务器发送“ Init SDO Update”开始
(请参见下图)。

正常传输”的答案不包含以<CMD>编码的要接收的字节数。 而是在数据范围中输入它,如下图在<DATA LENGTH>区域中所示。

初始化由此结束。 剩下的就是数据的上传。 使用以下SDO请求来请求数据包:

 命令<CMD>的字节0的结构如下:

名称为t的位与每个请求交替(“切换位”)。 即使先前的传输已中止,它也会从0开始每次传输。 控制器用数据响应上述消息,消息结构如下:

 

这些位在这里具有以下含义:
t(切换位)
该位与每个消息序列交替; 它在“请求”和“响应”之间的顺序内不变。
n(字节数)
这三个位指定不包含数据的字节数。 示例:如果位2和1设置为0,位3设置为1,则011b = 03d字节无效。 反过来,这意味着字节1到字节4包含
允许的值和字节5至字节7应该被忽略。
c(更多细分)
如果没有进一步的SDO段发送,并且这是最后一个段,则该位设置为1。

示例:在本示例中,将读取“制造商软件版本”对象(100Ah)。 在此示例中,该节点的节点ID为3。下表列出了相应的SDO消息序列。 待读取的字符串因控制器而异。

46 49 52 2D 76 31 37 34 38 2D 42 35 33 38 36 36 32
这对应于字符串:“ FIR-v1748-B538662

服务器和客户端都有权随时中止当前传输。为此,必须发送“Abort SDO Transfer”;如下所示。

收到消息后,SDO传输被视为结束; 服务未确认。 然后必须从头开始新的SDO传输。 <ERROR CODE>的传送是可选的; 控制器不评估代码。

SDO错误消息

如果出现错误,则还会在数据区中发送一个指定错误原因的错误编号。

 

 
错误代码说明
05030000h切换位未更改:仅对“正常传输”或“块传输”有效。每次传输后将交替显示的位未更改其状态。
05040001h命令说明符未知:数据块的字节0包含不允许的命令。
06010000h不支持的访问:如果通过EtherCAT(CoE)上的CAN请求“完全访问”(不支持。)
06010002h只读条目:试图写入常量或只读对象。
06020000h对象不存在:试图访问不存在的对象(索引不正确)。
06040041h无法对pdo进行对象映射:试图在PDO中映射不允许的对象。
06040042h映射的pdo超出pdo:如果将所需对象附加到PDO映射,则将超出PDO映射的8个字节。
06070012h参数长度太长:试图写入数据过多的对象;例如,对于类型为Unsigned8的对象,<CMD> = 23h(4个字节),
<CMD> = 2Fh将是正确的。
06070013h参数长度太短:试图写入数据太少的对象;例如,对于类型为Unsigned32的对象,<CMD> = 2Fh(1个字节),
<CMD> = 23h是正确的。
06090011h子索引不存在:试图访问对象的无效子索引;另一方面,索引将存在。
06090031h值太大:某些对象的值大小受到限制;在这种情况下,尝试将一个太大的值写入该对象。
例如,1003h:00的“预定义错误字段:错误数量”对象只能设置为值“ 0”;所有其他数值都会导致此错误。
06090032h值太小:某些对象的值大小受到限制。在这种情况下,试图写一个对对象来说太小的值。
08000000h一般错误:不属于任何其他类别的一般错误。
08000022h在这种状态下不能读取或存储数据:PDO的参数只能在“已停止”或“运行前”状态下更改。写入权限
在“运行”状态下,不允许对象1400h至1407h,1600h至1607h,1800h至1807h和1A00h至1A07h。

posted @ 2022-07-19 17:31  麦壳饼  阅读(4961)  评论(0编辑  收藏  举报