

在CANopen协议的通信体系中,PDO(过程数据对象)负责实时数据的快速传输,而SDO(Service Data Object,服务数据对象)则承担着更为基础且关键的任务——提供可靠的、面向服务的参数访问机制。SDO提供了一种可靠的、面向服务的通信机制,用于在CANopen网络中访问和修改对象字典条目,遵循客户端-服务器模型,SDO客户端(通常是NMT主站)向SDO服务器(CANopen从站)请求服务。
SDO是CANopen设备对象字典的"标准接口",通过这一机制,工程师可以读取设备信息、修改运行参数、甚至进行固件更新,是实现设备配置、调试和维护的核心技术手段。
本文将深入解析SDO的客户端-服务器架构、三种传输类型及其适用场景,并通过实际通信示例帮助读者掌握这一关键技术的实现细节。
SDO通信遵循经典的客户端-服务器模型,这种设计明确划分了通信双方的角色和职责。在这种架构中,SDO客户端通常由NMT主站担任,例如PLC、工控机或上位机软件,它负责发起服务请求;而SDO服务器则是CANopen网络中的各个从站设备,它们接收并处理客户端的请求,返回相应的数据或执行指定的操作。
这种架构的优势在于通信过程的确定性和可控性。客户端完全掌控通信的发起时机和请求内容,服务器则专注于响应处理,双方通过明确的协议规范进行交互,确保了数据传输的可靠性。同时,这种设计也支持多个客户端同时访问不同的服务器,实现了网络资源的灵活利用。
CANopen协议为SDO通信定义了三种传输类型,分别针对不同数据量的应用场景进行优化。工程师需要根据实际数据大小和实时性要求,选择最合适的传输方式。
• 特点:Expedited传输是SDO中最简单高效的传输方式,用于传输数据量小于等于4字节的简单读写请求,是小数据量的高效方案;
• 机制:整个读写操作在单个CAN帧内完成请求和响应,无需额外的分段或确认,非常高效;
• 应用:在实际应用中,Expedited传输广泛用于读取单个参数、设置布尔值或小整数值等场景。例如,读取设备的厂商ID、设置节点的波特率、修改某个控制标志位等操作,都可以通过Expedited传输快速完成。由于其简单高效的特点,Expedited传输是SDO通信中最常使用的传输类型。
• 特点:用于传输数据量大于4字节,但通常小于几十到几百字节的数据,Expedited传输已无法满足需求,此时应采用Segmented分段传输,是中等数据量的可靠选择。
• 机制:传输方式将完整的数据被分成多个段进行传输,每个段传输后都需要接收方发送一个确认帧,形成典型的握手机制,确保每一段数据都被可靠传输接收。
• 应用:Segmented传输的握手机制虽然增加了通信开销,但显著提升了数据传输的可靠性。这种传输方式适用于读取或写入长字符串、大型数组、较长的配置参数等场景。例如,读取设备的序列号、写入多轴运动控制的位置数组、修改较长的设备描述字符串等操作,都适合采用Segmented传输。
• 特点:用于传输大批量数据的优化方案,如固件更新、配置表下载等场景,Segmented传输的逐段确认机制会导致效率低下。为此,CANopen协议定义了Block块传输机制,专门用于处理这类大数据量传输任务。
• 机制:Block传输采用批量确认策略,发送方将数据分成多个块,每个块包含多个数据段。发送方连续发送完一个块的所有数据后,接收方才发送一次确认帧。这种设计大幅减少了握手次数,显著提高了传输效率。
• 支持CRC校验:Block传输通常支持可选的CRC校验功能,在传输完成后进行数据完整性验证,确保大批量数据的准确完整无误。
• 应用:Block传输的典型应用场景包括固件下载更新、批量参数的上传和下载、大型配置表的传输等。在工业现场,当需要对数十台设备进行统一的参数配置更新时,Block传输能够大幅缩短配置时间,提高维护效率。

假设在一个自动化控制系统中,NMT主站(Node-ID为0x0A,作为SDO客户端)需要读取Node-ID为0x10的设备(作为SDO服务器)的对象字典中索引0x1000子索引00的参数值。这个参数代表设备类型,是设备识别和兼容性检查的重要信息。
• COB-ID:0x60A (0x600 + 客户端 Node-ID 0x0A);
◦ 0x600 是SDO Tx(客户端发送给服务器)的基地址
• Data:[0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00] ;
◦ 0x40:SDO 命令字节,表示一个 expedited read request;
◦ 0x00, 0x10:索引 0x1000 (小端序);
◦ 0x00:子索引 0x00;
◦ 0x00, 0x00, 0x00, 0x00:响应中将包含读取到的值。
• COB-ID:0x590 (0x580 + 服务器 Node-ID 0x10);
◦ 0x580 是 SDO Rx(服务器发送给客户端)的基地址。
• Data:[0x4B, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00];
◦ 0x4B:SDO 命令字节,表示一个expedited read response;
◦ 0x00, 0x10:索引 0x1000 (回显请求的索引);
◦ 0x00:子索引 0x00 (回显请求的子索引);
◦ 0x00, 0x00, 0x00, 0x00:读取到的 0x1000:00 的实际值。
在实际通信过程中,SDO请求可能因各种原因失败,例如请求的索引或子索引在对象字典中不存在、客户端没有足够的权限访问该参数、参数当前处于只读状态无法写入等。当服务器无法成功处理请求时,不会返回正常的响应数据,而是发送一个SDO Abort消息。
SDO Abort消息的命令字节固定为0x80,数据场中包含详细的Abort Code中止代码,用于指示具体的错误原因。常见的中止代码包括0x06020000表示对象字典中不存在该索引、0x06090011表示子索引不存在、0x06010002表示尝试写入只读参数等。客户端通过解析这些中止代码,可以精确定位问题所在,并采取相应的处理措施。
SDO是CANopen设备配置的主要手段。在系统调试阶段,工程师通过SDO读取设备的默认参数,根据实际应用需求进行修改优化,例如调整PDO映射关系、设置通信参数、校准传感器系数等。这些配置信息最终可以保存到设备的非易失性存储器中,成为设备的永久设置。
通过SDO读取对象字典中的状态参数,工程师可以获取设备的详细运行信息,包括当前温度、电压、错误计数、运行时间等。这些信息对于设备的健康状态评估和预防性维护具有重要价值。结合心跳机制,可以构建完整的设备监控体系。
利用SDO的Block传输功能,可以实现设备的在线固件更新。这一功能对于现场部署后的功能升级和漏洞修复尤为重要。通过CAN总线批量更新多台设备的固件,大幅降低了维护成本,提升了系统的可维护性。
熟练掌握对象字典的结构和常用索引是高效使用SDO的基础。建议工程师熟记常用索引,如0x1000-0x1FFF范围的通讯协议参数、0x6000-0x9FFF范围的应用参数等。使用专业的CANopen配置工具可以直观地浏览和编辑对象字典,提高开发效率。
在使用CAN分析仪捕获SDO通信时,注意观察请求帧和响应帧的时间间隔。正常情况下,响应应在数毫秒内返回。如果响应时间过长,可能表明服务器负载过重或存在处理异常。同时,检查命令字节的编码是否正确,这是排查通信故障的常见切入点。
当收到SDO Abort消息时,首先记录完整的中止代码,然后对照CiA 301标准文档中的错误代码表进行查询。理解错误代码的具体含义,能够快速定位是索引错误、权限问题还是数据格式不匹配,从而采取针对性的解决措施。
SDO服务数据对象是CANopen协议中不可或缺的参数访问机制,其客户端-服务器架构和三种灵活的传输类型,满足了从简单参数读取到大批量数据传输的多样化需求。Expedited传输的高效性适用于日常参数访问,Segmented传输的可靠性保障了中等数据量的准确传输,Block传输的优化设计则支撑了固件更新等大数据量应用场景。
在实际工程应用中,深入理解SDO的协议细节,熟练掌握请求帧和响应帧的构造方法,正确处理各种异常情况,是开发稳定可靠的CANopen系统的关键能力。随着工业设备的智能化程度不断提升,SDO将继续在设备配置、诊断维护和远程管理等领域发挥核心作用,成为工业通信技术的重要基石。
今天的分享就到这里啦,EBYTE每一天都致力于更好的助力物联化、智能化、自动化的发展,提升资源利用率,更多CAN总线模块和CAN总线网关产品的更多资料,感兴趣的小伙伴可以登录我们的亿佰特官网进行了解,也可以直接拨打400电话咨询技术专员!
相关阅读:
7 X 24 销售服务热线
4000-330-990©© 成都亿佰特电子科技有限公司【版权所有】 蜀ICP备13019384号


