怎样实现SDO服务

SDO是CANopen协议中最复杂的一部分,带有应答机制,有多种传输方式,并且完整的SDO功能节点需提供1个SDO server和多个SDO client,因此SDO的实现异常困难,协议多种传输方式的解析处理还有迹可循,多个SDO client服务和多个对SDO server的访问的协调就不容易了,这里介绍一种方法——SDO线程来解决。

注意,这里的线程可不是操作系统提供的多线程技术,况且为保证协议栈良好的移植性,在CANopen协议栈核心代码里中也不好去调与操作系统相关的库函数。我们这里的SDO线程只是借鉴了操作系统多线程机制的一套SDO服务处理方法,每个SDO线程表示的是与网络上其他节点建立的一个SDO链接,相当于在两个节点间建立一个SDO通讯路径,其中每个节点都拥有一个对这个路径的描述,在该节点看来好像建立了一个线程来负责这个路径(但决不会真的创建一个系统线程),在通讯过程中双方通过这个路径来交流,SDO通讯结束则释放该线程,每个节点可以同时与多个节点建立多个这样的路径和互不影响,就如同操作系统的线程机制一样的效果。我们知道每建立一个线程都会生成一个描述线程属性的参数表和一些私有数据,类似的,SDO线程的建立也会初始化一个对应的参数和数据结构体——SDO线程参数表,以之来描述这个SDO链接的属性并提供私有通讯数据的存储。

SDO线程参数表可以说是SDO线程的核心,所有SDO线程的建立、删除和SDO通讯都要涉及到这个参数表。参数表内容包括能够描述一个SDO访问过程的所有参数,这里不详述。

一次SDO访问是这样完成的。首先SDO发起节点(SDO client)收集足够的信息,建立一个SDO线程,说白了就是初始化SDO线程参数表,将收集的信息以特定格式放入参数表,形成一帧SDO请求,发送出去。SDO服务节点(SDO server)收到这帧请求,为它建立一个SDO线程,将这帧请求分析分解以获得足够信息来初始化这个SDO线程对应的参数表,然后程序就会按照参数表的描述去执行server的功能收集数据来满足这个SDO请求,然后将收集到的数据形成SDO应答帧返回给SDO client,如果此次请求结束则释放该线程,否则等待下一帧请求到来;SDO client在收到应答后判断该请求是否还有后续请求,无则释放此SDO线程。如果在这个过程中,SDO server 和SDO client所在节点有收到其他节点的SDO请求或需要通过SDO请求其它节点,则新建SDO线程来实现,跟上面的步骤一样,这样就可以实现多个SDO server和SDO client服务都得到实现而互不干扰,相当于双向多线铁路,可比单线爽多了。

该方法已在单片机下实现,效果还不错。

时间: 2024-08-29 12:51:53

怎样实现SDO服务的相关文章

旧文备份: 怎样实现SDO服务

SDO是CANopen协议中最复杂的一部分,带有应答机制,有多种传输方式,并且完整的SDO功能节点需提供1个SDO server和多个SDO client,因此SDO的实现异常困难,协议多种传输方式的解析处理还有迹可循,多个SDO client服务和多个对SDO server的访问的协调就不容易了,这里介绍一种方法——SDO线程来解决. 注意,这里的线程可不是操作系统提供的多线程技术,况且为保证协议栈良好的移植性,在CANopen协议栈核心代码里中也不好去调与操作系统相关的库函数.我们这里的SD

EtherCAT Slave 入门教程 - SDO服务(1)

邮箱服务数据帧 帧结构 EtherCAT子报文: 子报文头 数据 WKC 数据: 邮箱协议数据 邮箱协议数据: Mailbox Header Mailbox Data Mailbox Data: CoE Header SDO SDO: SDO Header SDO Data 描述 Mailbox Header: 6 octets Length:2 octets, 指定Mailbox Data的字节数 Address: 2 octets, 主从通信时,为从站地址:从站间通信,为目的从站地址 Fla

旧文备份:CANopen协议中SDO服务

SDO是服务数据对象接口(Service Data Obiect)的缩写,顾名思义提供服务数据的访问接口,服务数据就是一些实时性要求不高的数据,一般是指节点配置参数,因此,SDO一般用来配置和获得节点的配置参数.其优先级只比心跳(Heartbeat)高. SDO既然称之为服务,那就要有服务的提供者和使用者,提供者就是SDO server,使用者就是SDO client,在CANopen网络中每个节点都要有一个SDO server,因为每个节点的对象字典大部分对象都是通过SDO来访问的,对象字典的

CANopenNode drvTemplate/CO_driver.h hacking

/************************************************************************ * CANopenNode drvTemplate/CO_driver.h hacking * 说明: * 使用CANopenNode,drvTemplate/CO_driver.h说明了一些驱动编写相关的 * 注意事项. * * 2017-3-24 深圳 南山平山村 曾剑锋 *************************************

倍福提供的EtherCAT从站代码包解析

用倍福的从站配置工具得到的源代码有以下 1 主要代码 ecatappl.c ecatappl.h Ecatappl:  EtherCAT从站应用层接口,整个协议栈运行的核心模块, EtherCAT从站状态机和过程数据接口.Main()函数的定义,输入输出程数据 对象的映射处理,ESC与处理器本地内存的输入输出过程数据的交换等; ecatslv.c ecatslv.h Ecatslv:处理EtherCAT状态机模块.状态机转换请求由主站发起,主 站将请求状态写入A1Control寄存器中,从站采用

Beckoff的EtherCAT从站代码架构解析

用倍福的从站配置工具得到的源代码有以下 2014/12/26  11:24             1,021 1.TXT 2014/12/26  11:24                 0 2.txt 2012/04/11  20:43            22,131 aoeappl.c 2012/04/11  20:43             1,578 aoeappl.h 2012/04/11  20:43             1,757 bootmode.c 2012/04

ESB概述

ESB概念的提出: 企业有大量的异构的业务系统,这些系统之间需要通过web service来交互数据,这样的话可以想象系统直接的交互关系是蜘蛛网状的,是难以维护的.这时候提出了ESB,每个业务系统只需要将自己提供的服务注册到ESB上,而对于调用一方来说,其只跟ESB打交道,而对于是谁提供的对其来说是透明的.而且,应用程序内部的具体实现对调用者也是隔离的. ESB的主要职责: 数据映射 智能路由 以上为最基本的两项职责,另外其也可以  处理安全.处理可靠性.服务管理.监测和日志.业务活动监测. E

CANopen的相关学习

CANopen是一种架构在控制局域网路(Controller Area Network, CAN)上的高层通讯协定,包括通讯子协定及设备子协定常在嵌入式系统中使用,也是工业控制常用到的一种现场总线. 由于CAN总线只定义了物理层和数据链路层,并没有定义应用层,因此需要CANopen通信协议来统一度量,把各种设备标准化.CANopen 实现了OSI模型中的网络层以上(包括网络层)的协定. 标准的 CANopen 页框: CANopen 将 CANbus 的 11 位元 ID 称为通讯对象 ID (

构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介

构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介 熟悉将用于 Apache Tuscany SCA for C++ 的 API.您将通过本文了解该 API 的主要组成部分,以便快速入门. 查看本系列更多内容 | 0 评论: Ed Slattery ([email protected]), 软件工程师, IBM UK Pete Robbins ([email protected]), 软件工程师, IBM UK Andrew Borley ([email pro