内容摘要:CAN-Ethernet通信模块,是一种直接连接以太网和CAN现场总线的设备,有效解决了控制系统中现场总线和上层信息管理层的互联问题,使自动化系统中的信息交换可以深入到现场设备一级。
CAN 总线报文到UDP 报文的转换过程是:
①接收到的CAN 总线报文装入UDP 报文的数据段,计算校验和,完成UDP报文封装;
②加上IP 报文头部,计算校验和,完成IP报文封装;
③加上以太网报文的头部,报文尾部的校验和不需要软件完成,RTL8019AS在发送时会自动添加。
为了减少在转换过程中的数据拷贝,定义了如下数据结构。从CAN总线上收到的报文直接放在Frame结构体的can[ ]成员中,并记录长度,封装为UDP报文的过程就是填充Frame结构体中其他成员的过程;从以太网上收到的报文逐字节放入Frame结构体中,CAN 报文就包含在can[ ]成员中。
struct EthHead {
unsigned char DstPhyAddr[6 ] ; / / 以太网目的地址
unsigned char SrcPhyAddr[6 ] ; / / 以太网源地址
unsigned short Prt ; / / 协议标识
} ;
struct IPHead {
unsigned char VerLen ; / / 版本号和头长度
unsigned char ServType ; / / 服务类型
unsigned short Len ; / / 长度
unsigned short ID; / / 报文ID
unsigned short FlagAndFrag ; / / 标记和分段
unsigned char TTL ;
unsigned char Prt ; / / 协议标识
unsigned short HdChksum; / / 头校验和
unsigned char srcIP[4 ] ; / / 源IP 地址
unsigned char dstIP[4 ] ; / / 目的IP 地址
} ;
struct UDPHead {
unsigned short srcPort ; / / 源端口号
unsigned short srcPort ; / / 目的端口号
unsigned short Len ; / / 长度
unsigned short Chksum; / / 校验和
} ;
struct Frame {
struct EthHead ethhd ;
struct IPHead iphd ;
struct UDPHead udphd ;
unsigned char can [ 10 ] ; / / 放置CAN 报文
short canlen ; / / 记录收到的CAN 报文长度
} ;
3. 3 通信程序的实现
处理器对SJA1000T和RTL8019AS 的操作都使用了中断方式,通信模块的软件程序可以分成SJA1000T 中断服务程序、RTL8019AS中断服务程序和主程序3 个部分,是典型的前、后台处理结构。在中断服务程序中,将收到的CAN 总线报文和以太网报文读入内存中的缓冲区,并累加缓冲区内还未处理的报文计数。在主程序循环中,轮流处理两个缓冲区中的报文,并减小报文计数值。图6 是SJA1000T的中断服务流程、RTL8019AS中断服务流程、主程序的流程。由于SJA1000T内部的接收缓冲区只有64B ,所以在程序中定义了容纳32个Frame结构体数组can- rbuf [ ]并组成环形缓冲区。同时也定义了相同大小的数组eth- rbuf [ ]组成以太网接收的环形缓冲区。

图6 通信模块软件流程图
在调试过程中发现,如果转发过程被特定的中断程序打断,可能发生报文计数错误;如果向RTL8019AS写入待发送报文的过程被以太网接收中断打断,就无法恢复写入过程了。因此在转发过程中应屏蔽相应的中断。
4 结束语
采用上述方法实现的CAN-Ethernet 通信模块,解决了以太网和现场总线CAN 总线之间互联问题,可以根据应用的需求,进行灵活的配置和改进,提高系统的性能和可靠性。实际证明,在局域网环境下模块工作可靠,在以太网负载适中时,只有很小的通信延迟。它为CAN-Ethernet 的互联提供了低成本、高性能及灵活的解决方案。
来源:电子设计信息网 作者:夏继强 袁骏 满庆丰 责编:豆豆技术应用