打印
[应用相关]

CANopen学习笔记

[复制链接]
2826|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
goodluck09876|  楼主 | 2018-9-18 12:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在学习EtherCat,用的是德国BeckoffET1100,主要使用CANOPEN协议,
由于是刚接触CANopen协议,开始有点头大,不知何去何从。
仔细研究了找到的参考代码研究了2天,发现,其实CANopen协议的本质就是维护一堆变量,不过这堆变量的数目很庞大,需要一一搞明白。

沙发
goodluck09876|  楼主 | 2018-9-18 12:44 | 只看该作者
下面一一道来。
一、EtherCat与MCU通讯
本质就是SPI通讯,切记。
1.首先要初始化SPI,如我用的是stm32f407,用的是PA4,5,6,7
PA4----CS
PA5----CLK
PA6----MISO
PA7----MOSI
对应的ET1100使用管脚如下:
PD10---CLK
PDI1----CS
PDI2----MISO
PDI3----MOSI
如果想使用ET1100的中断管脚,再增加一个IO口,并设置该IO口外部中断即可。
SPI初始化完成后要对ET1100进行一次写和读操作,确认SPI通讯正常,同时也检测EtherCat可以正常工作。向0x0204地址中写入0x93,然后读取。反复进行,直到写入与读取的值相同为止。然后清除0x0204地址的值。
同步时钟的输入输出中断可用,可不用。
同时要启动一个定时器。

使用特权

评论回复
板凳
goodluck09876|  楼主 | 2018-9-18 12:44 | 只看该作者
淘宝的 开发板 也有很多!

使用特权

评论回复
地板
goodluck09876|  楼主 | 2018-9-18 12:44 | 只看该作者
2.ECAT初始化
调用ECAT_Init()函数。
详细如下:
2.1读取0x0004地址的值,确定maximum number of Sync Manager channels,
2.2读取0x0006地址的值,然后get max address
2.3读取0x0502地址的值,Get EEPROM loaded information
2.4disables all Sync Manager channels
2.5initialize the mailbox handler 主要初始化mailbox相关的变量
2.5.1接收和发送大小及地址(选用Process Data RAM)
2.5.2接收和发送队列的相关变量
2.5.3Pointer to write mailbox buffer
2.5.4Pointer to repeat mailbox buffer
2.5.5Pointer to read mailbox buffer
2.5.6Pointer to store mailbox buffer
2.5.7Mailbox repeat toggle的flag
2.5.8Reset Repeat acknowledge bit of SyncManager1
2.5.9mbx是否running,full,islocked
2.5.10mbx发送请求store,读写counter


2.6初始化一些相关变量
2.7initialize the AL Status register
2.8initialize the COE
初始化COE相关的发送标志,与发送数量

使用特权

评论回复
5
goodluck09876|  楼主 | 2018-9-18 12:45 | 只看该作者
3.CANopen初始化
调用COE_ObjInit()
详细如下:
3.1initialize the Sync Manager Output and input parameter object
3.2initialize the object dictionary
加入初始object到堆栈中
3.3其他相关变量初始化
3.4timer相关变量初始化

使用特权

评论回复
6
goodluck09876|  楼主 | 2018-9-18 12:45 | 只看该作者
4.Main loop
4.1首先是几个模式的判断:FreeRun-Mode,Synchron-Mode,DC-Mode
通过判断ESC中断,输出接收标志,时钟同步激活3个标志
4.2如果是FreeRun-Mode,first we have to check, if outputs were received,
关所有中断,启动SPI通讯,读取0x0220的值,开启所有中断。然后判断是否为输出进程。
首先通过HW_GetALEventRegister()读取中断事件,详细流程如下:
HW_GetALEventRegister()-------------------GetInterruptRegister()------------0x220地址的内容
如果是输出事件,调用PDO_OutputMapping()函数,发送 the address of the Sync Manager Channel 2中的内容。
如果输出大小为0,启动看门狗,复位。
关闭ECAT中断。
ECAT_Application()---------APPL_Application()调用
判断 the SAFEOP or OP state状态,把发送的数据通过APPL_InputMapping()更新从适合发送的格式,然后发送出去。
使能ECAT中断。
判断是否使能timer。
调用ECAT_Main()函数,首先调用MBX_Main(),检查邮箱是否有新数据存储,然后读取邮箱的数据。如果邮箱被锁,读取邮箱接收地址的值,检测有没有充足的memory,如果没有,报错。如果有memory,把邮箱的长度更新为读取的大小加上邮箱head大小。判断是否发送MBX是否仍为full或发送是否完成,如果是,继续lock mbx,如果完成,解锁,同时,判断接收数据大小是否会产生溢出,分配空间。把接收数据存储到memory,随后,读取0x0804内的状态,判断mbx的buffer是否full,解锁邮箱。调用MBX_MailboxWriteInd(),判断mbxsize,超过最大值,报错,正常情况,如果mbx数据为0或与要写的数据大小不等,把要写的数据改成当前值,同时把发送的数据压入队列。如没完成压入操作,报错。如果以上都不满足,释放mbx的buffer,并把指针复位。

使用特权

评论回复
7
goodluck09876|  楼主 | 2018-9-18 12:46 | 只看该作者

一、CANopen协议中SYNC功能和使用


SYNC是CANopen管理各节点同步数据收发的一种方法,相当于网络节拍,基于同步的PDO按照这个网络节拍来执行实时数据的收发。SYNC属于生产/消费型通讯方式,网络中有且只有一个SYNC生产者,一般有多个消费者,其网络标识符优先级很高,一般设置为0x80,基本上除了NMT优先级最高。SYNC生产者按照固定频率发送SYNC报文,需要SYNC的节点(消费者)将其接收并计数,当计数值达到节点相应TPDO要求时,该TPDO映射的数据被发送(根据PDO传输类型也可能是映射数据更新),此过程中SYNC生产者提供网络节拍,各消费者以节拍周期的倍数执行数据传输功能。
在CANopen网络中应用SYNC要注意以下几点:
1. SYNC并不是主节点必须的功能,不一定要和NMT放在同一节点上,实际网络应用中可以在网络中找一个任务较少、实时性好的节点来作为SYNC生产者,SYNC消费者可以有多个,但是生产者同时只能有一个存在。
2. SYNC是不带数据的,以使报文尽可能短,目的是为了加快其传输,减少网络占用。
3. SYNC发出后,需要发送数据的PDO要在规定时间段内发送数据,这个时间段叫做时间窗口(对象1006H指定),要小于SYNC节拍周期,以便每个周期留一定时间来进行其他类型的网络通讯

使用特权

评论回复
8
goodluck09876|  楼主 | 2018-9-18 12:46 | 只看该作者
二、CANopen协议PDO的几种传输方式
由于PDO所传输的数据内容是无协议的且分配的标识符范围较SDO靠前,因此,其效率和优先级都是较高的,通常用于实时过程数据的传输.
PDO是生产/消费类型的通讯方式,数据只有一个生产者(发送),但是消费者(接收)可以有多个,生产者和消费者事先都已知道数据的类型和内容(通过设置PDO映射来管理).
对PDO通讯参数的设置可以实现四种通讯方式:
1. 同步传输.在收到SYNC消息后触发PDO发送,可以定义收到几个SYNC后触发一次TPDO,在有SYNC的CANopen网络中,SYNC就相当于一个网络节拍,数据根据节拍来进行固定周期的过程数据传输.比如网络中有一个压力传感器,一个温度传感器,一个物位传感器,网络中有一个HMI监控终端来实时监控三个传感器采集的数据,压力传感器可能检测的是一个快速的压力变化,那可以每隔200mS更新一次数据,温度可能需要1S更新一次数据,物位可能5S更新一次数据,(假设各传感器的数据采集周期都比数据更新周期小,如果大的话数据更新快可能没有意义,呵呵)现在我可以设置一个200mS周期的SYNC消息,压力传感器每收到一个SYNC就向HMI传输一次数据,温度传感器可以每隔5个SYNC传输一次数据,同样物位传感器就是每收到25个SYNC发送一次数据.这种通讯方式显得比较规矩,好管理,系统运行效率高,适合周期性数据更新的应用.
2. 远程请求.在需要网络上某个节点的数据的时候,我发一个远程数据请求过去,对方在接收到请求后,把我要的数据给发过来,这种方式是在我需要的时候去主动获取.
3. 定时发送.这个有别于SYNC,它是在本节点实现周期发送,通过设置PDO参数,定一个周期,每隔固定的时间向网络上发送一次PDO,它与SYNC无关,在网络设计中主要按照传感器的数据采集速度和数据更新要求来设定定时周期.
4. 事件触发.当节点的某个时间发生触发的一次数据发送,例如当某个接着报警开关的开关量采集节点的报警状态发生变化时,触发一次PDO将报警状态发送到网络上,使系统能够及时获得该报警状态信息.该方式是实时性最好的一种传输方式,特别适合系统运行出错报警和重大事件的及时处理上.
上面的几种传输方式各有所长,在CANopen网络的设计中,按照不同的应用灵活配合使用才能构建一个优秀的解决方案.

使用特权

评论回复
9
goodluck09876|  楼主 | 2018-9-18 12:46 | 只看该作者
三、SDO服务
SDO是服务数据对象接口(Service Data Obiect)的缩写,顾名思义提供服务数据的访问接口,服务数据就是一些实时性要求不高的数据,一般是指节点配置参数,因此,SDO一般用来配置和获得节点的配置参数。其优先级只比心跳(Heartbeat)高。
SDO既然称之为服务,那就要有服务的提供者和使用者,提供者就是SDO server,使用者就是SDO client,在CANopen网络中每个节点都要有一个SDO server,因为每个节点的对象字典大部分对象都是通过SDO来访问的,对象字典的被访问,提供所请求的服务当然要有个SDO server。
SDO请求和应答报文都是8个字节的数据,其中包括对象字典的索引、子索引、SDO命令和数据。这里要注意和我们熟知的以太网FTP不同,SDO的上传和下载正好与之相反,FTP是从client的角度出发去理解上传和下载,SDO是以server的角度去理解的,从服务器上获得数据即对对象字典进行读操作叫做上传,往服务器上写数据即对对象字典进行写操作叫做下载。

使用特权

评论回复
10
goodluck09876|  楼主 | 2018-9-18 12:47 | 只看该作者
四、怎样实现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链接的属性并提供私有通讯数据的存储。

使用特权

评论回复
11
goodluck09876|  楼主 | 2018-9-18 12:47 | 只看该作者
一次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服务都得到实现而互不干扰,相当于双向多线铁路,可比单线爽多了。

使用特权

评论回复
12
磨砂| | 2018-10-9 09:45 | 只看该作者
感谢分享 最近头大 搞不出来啊

使用特权

评论回复
13
wowu| | 2018-10-9 13:02 | 只看该作者
感谢分享 写的很详细啊

使用特权

评论回复
14
zhushigao01| | 2020-6-2 17:00 | 只看该作者
感谢 写的很详细啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

5843

帖子

24

粉丝