摘要:DeviceNet与ModBus协议转换系统由DeviceNet主站,嵌入式I/O模块,ModBus从站三部分组成,实现DeviceNet与ModBus之间的数据交互。嵌入式I/O模块采用ARM7控制器LPC2129实现DeviceNet与ModBus之间的通信,同时以软件的形式实现了一个仅限组2的DeviceNet从站和一个ModBus主站。DeviceNet从站用来解码从DeviceNet主站端接收到的数据,解码后的数据由MCU通过另一个UART接口发送给ModBus从站。UART接口旨在向ModBus从站发送读/写指令。结果表明,基于DeviceNet总线的嵌入式I/O模块可以很好地与基于ModBus总线的设备进行通信。
0 引言
DeviceNet是一种基于CAN总线技术的符合工业标准的开放型现场总线通信网络,它用于控制,配置和数据采集等方面。CAN 总线具有布线简单、典型的总线型结构、稳定可靠、实时、抗干扰能力强、传输距离远、布线成本低等特点。由于具备了这些特点,Devi-ceNet总线被广泛应用于工业自动化控制,它不仅可以接入更多,更复杂的设备,还可以为上层提供更多的信息和服务。在很多欧美国家,越来越多的系统方案设计采用DeviceNet来实现。
ModBus协议是应用于电子控制器上的一种通用语言,是个真正用于工业现场的总线协议,由于该协议的产生,使控制器之间、控制器经由网络和其他设备之间实现相互通信。ModBus协议现在已经成为一种通用的工业标准,应用该协议技术可以使不同厂商生产的控制设备连成一个工业网络,进行集中监控管理。此协议定义了一个控制器能认识使用的消息结构体,从而使用户不需要关心它们使用哪种网络进行通信。它描述了一个控制器请求访问其他设备的过程,如何回应来自其他设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。
本文主要解决DeviceNet 与ModBus 之间的协议转换问题。标准的ModBus口是使用RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem 组网。基于DeviceNet 的嵌入式I/O 模块通过I/O 口发送和接收数据,ModBus通过串口与嵌入式I/O模块进行通信。通过此过程完成DeviceNet与ModBus之间的协议转换问题。
1 嵌入式I/O模块的设计与实现
DeviceNet是一种上层的应用层协议,其物理层和数据链路层采用CAN总线技术,ModBus协议只是用于数据链路层上的协议[1].这两种现场总线是异构的,因此要实现两种协议之间的通信,必须要进行协议转换。协议转换的转换过程是分层次进行的。首先把总线设备发送过来的设备逐层解包,得到需要的数据,然后再把数据按另一协议所需的方式打包,发送到相应的设备上。
DeviceNet与ModBus协议都采用主从通信模式,所以它们之间的通信只能是单向的,主站发送命令报文而从站被动接收命令报文。本设计中的嵌入式I/O模块既是De-viceNet从站,又是ModBus的主站。通过该模块可以实现DeviceNet主站的数据与ModBus从站的数据进行传输。
嵌入式I/O模块的功能是把DeviceNet格式的报文转换为ModBus的报文命令,再传给底层的ModBus设备,设备在接收到ModBus命令之后,会向报文转换模块发送ModBus格式的响应报文,经协议转换模块将报文转换为DeviceNet格式的报文传输给DeviceNet主站。本嵌入式I/O模块既是DeviceNet的从站实现接收主站报文并做出响应的功能,同时又可以作为ModBus的主站向其他ModBus设备发送报文并接收响应报文。
本设计采用的处理器为LPC2129,硬件结构如图1所示。它是NXP 公司的32 位工业级ARM7 处理器,其内部集成了两个CAN 控制器,在一片处理器内首先将主站端的DeviceNet协议数据转换成中间协议数据,之后转换成ModBus可以识别的协议数据。
拨码开关用来设置DeviceNet 端的波特率及MAC地址,其中波特率的开关为3 位,分别代表125 Kb/s,250 Kb/s,500 Kb/s;MAC地址的开关为6位,地址为0~63.
RS 232 既可作为程序接口,也可作为通用的RS 232串口实现与上位机的通信。系统的供电电源采用24 V的直流供电,并在内部将24 V电源转化为模块需要的5 V,3.3 V及1.8 V电压电源。
2 DeviceNet 和ModBus 协议介绍
2.1 DeviceNet协议规范
DeviceNetTM规范由Rockwell 公司开发,并将其作为一个基于CAN协议的开放式现场总线标准而公布。与其他现场总线相比,它具有突出的高可靠性、实时性和灵活性。其主要技术特点可归纳为:
(1)采用CAN物理层和数据链路层规约,使用CAN规约芯片,从而有强大的支持。
(2)可以容纳64个节点地址,每个节点支持无限个的I/O口;
(3)网络拓扑结构,节点设备配电方式灵活,可网络统一配电或自行供电;
(4)网络速度可选125 Kb/s,250 Kb/s 和500 Kb/s;有误接线保护功能;
(5)数据传送方式多样,支持选通、轮询、循环、状态变化等方式;
(6)采用逐位仲裁机制实现按优先级发送信息;
(7)支持轮询或状态改变(基于事件),多主站和主从,支持从设备的即用即拔,无需网络断电。
DeviceNet是面向连接服务的网络,任意两个节点的通信必须建立在逻辑连接的基础上。建立连接时与连接相关的传送会分配一个11位连接标识符(Connec-tion ID,CID),连接标识符由设备媒体访问控制标识符(MAC ID)和信息标识符(Message ID)两部分组成。连接建立后设备可通过发送释放连接或删除连接请求服务来断开连接。在某个特定的连接上长时间没有进行通信,这个通信将自动断开以释放资源。其中,MAC ID可通过硬件设定,也可通过软件来配置。标识符分为四组,如图2所示。DeviceNet连接分为显式信息连接和I/O连接。
2.2 DeviceNet与CAN
DeviceNet总线协议是基于CAN总线技术的。它的数据链路层完全遵循CAN 规范的定义,并通过CAN 控制器芯片实现。它只使用CAN 2.0A 中的定义,不支持CAN 2.0B中的扩展报文格式。DeviceNet只用125 Kb/s,250 Kb/s,500 Kb/s 三种可选速率,达不到CAN 的通信速率1 Mb/s.DeviceNet 只使用数据帧,错误帧和超载帧三种帧表示和控制,并未使用CAN 中定义的远程帧。
DeviceNet 在CAN 总线的基础上又增加了面向对象、基于连接的现代通信技术理念,并开发了应用层。
其应用层规定了CAN 数据帧的使用方法、重复节点地址检测机制、对象模型及设备的标准化。使DeviceNet的应用更广泛,安全性更好。
2.3 ModBus协议介绍
ModBus 是一种应用于工业控制器的网络通信协议,它是由Modicon 公司开发的,主要应用于电子控制器方面,现已成为一种通用工业标准。该协议支持传统的RS 232,RS 422,RS 485和以太网设备。它定义了一个控制器能认识使用的消息结构,使用者不需要关心它们内部的网络通信方式。控制器与控制器,控制器与其他设备之间(通过网络)的通信都要通过ModBus协议来实现。ModBus 协议制定了消息域格局和内容的公共格式,并详细描述了一个控制器请求访问其他设备的过程以及如何回应其他设备的请求,以及侦测错误并记录的过程。当使用ModBus网络进行通信时,按照此协议的规定,每个控制器需要知道它们的设备地址,并能识别按地址发来的消息,根据这些信息决定要产生的动作。
ModBus协议的消息也能在其他网络上进行传输,只需要将消息转换为适用于其他网络上使用的帧或包结构即可。
ModBus分为两种传输模式,ASCII和RTU模式。本文采用RTU模式进行说明。控制器使用主/从技术进行通信,能直接或经由调制解调器(Modem)组网。网络上的每个从站必须有惟一的地址。地址范围为1~247.
从站地址用于寻址从站设备。ModBus通信由主节点发起,即仅主设备能发起数据传输(即查询),从设备根据主设备查询提供的数据做出回应信息或响应动作。主设备以单播或广播模式与从设备通信。在单播模式下,从设备返回消息作为回应,在广播模式下,不作任何回应(地址0作为广播地址)。ModBus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、错误检测域,具体的ModBus 协议通信过程如图3所示。
从设备回应消息也由ModBus协议构成,包括确认要行动的域、要返回的数据、和错误检测域。如果在消息接收过程中发生错误,或从设备不能执行其命令,从设备将建立错误消息并把它作为回应发送出去。
对于ModBus通信协议,信息传输为异步方式,以字节为单位传送。报文的信息帧格式分为独立的信息头和发送的编码数据两部分,其报文结构如图4所示,下面分别介绍。
地址码为通信传送的个字节。每个从机都有具有惟一的地址码,响应回送以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。
功能码为通信传送的第二个字节。ModBus通信规约定义功能号为1~127.作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。
数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。CRC码为字节的错误检测码。
当通信命令发送给接收设备时,符合相应地址码的设备接通信命令,将地址码去掉,获取真正的命令内容,判断是否有误,无误则执行相应的任务并把执行结果返送给发送者。回送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码,如果出错就不发送任何信息。
3 嵌入式I/O模块的设计与实现
协议转换模块的功能是把DeviceNet格式的命令报文转换为ModBus的报文命令,再传给底层的ModBus设备,设备在接收到ModBus命令之后,会向报文转换模块发送ModBus格式的响应报文,经协议转换模块将报文转换为Devicenet 格式的报文传输给DeviceNet 主站。本I/O 模块既是DeviceNet的从站实现接收主站报文并做出响应的功能,同时又可以作为ModBus的主站向其他ModBus设备发送报文并接收响应报文。
3.1 架构设计
本程序采用中断的方法来实现两种报文的收发及转换。本系统主要包括系统初始化,主处理程序和收发数据三部分。整体结构如图5所示。
3.2 DeviceNet从站协议代码
为了实现DeviceNet 通信模块与ModBus 模块通过DeviceNet 现场总线进行数据传输,需要开发一个Devi-ceNet 从站节点。一个仅限组2 的DeviceNet 从站在通信模块中以软件的形式实现,从站确保通信模块能够通过DeviceNet 接口接收到主站的数据。DeviceNet 从站代码组成一套可以移植到其他DeviceNet从站产品上的DeviceNet协议栈,该协议栈的主要特点如下:
(1)支持DeviceNet预定义主/从连接模式;
(2)支持报文类型:Poll,Strobe,Change of State/Cyclic.
通过DeviceNet协议栈,嵌入式I/O模块可以与主站建立显式信息连接以及I/O 连接。DeviceNet主/从站连接的过程,当主站发送一个请求命令时,DeviceNet必须对其进行响应。本嵌入式I/O 模块属于仅限组2设备,一个DeviceNet的组2 服务器在通过重复MAC ID 检测上线后,需等待客户机分配预定义主/从连接组并建立显式信息连接,通过客户机的配置和验证后建立轮询的I/O连接。
根据DeviceNet主/从站的连接过程,DeviceNet从站必须对主站的请求进行响应,具体的通信过程如图6所示。
4 嵌入式I/O模块的应用层软件设计
应用层程序调用协议栈相关函数接收DeviceNet主站端的DeviceNet数据,然后转换为ModBus的通信规约格式,送入UART 口后传送到ModBus 从站。反之,当ModBus从站发送读命令后,若收到DeviceNet主站的响应数据,则将该UART 口的数据转换为DeviceNet 规约格式并打包发返回到DeviceNet 主站。终实现Devi-ceNet 和ModBus 之间的双向数据交换。如图7 所示为主程序流程图。
上电后,嵌入式I/O模块启动,首先进行自检,检测它的MAC ID,波特率,E2PROM.自检通过后,对LPC2129进行初始化,打开CAN收发中断。在主循环里首先查看是否有新的DeviceNet主站数据,若有则将它转换为UART 的格式写到ModBus 内部。若无新数据,则直接进入下一步,发送读ModBus主站命令,每发一条等待响应,若在等待周期内收到响应,则在接收中断内将接收到的ModBus从站数据转换为DeviceNet数据。
在嵌入式I/O模块自检过程中可以根据指示灯的情况判断自检是否成功,只有在自检成功后才进行CAN总线初始化。
void SelfCheck(void)是I/O 模块自检函数。在自检过程中需要调用控制灯初始化函数和控制函数,voidinit_led(void),void net_led_ctrl(_U08 ctrl_para)。控制灯一共有6个,端口号分别为P0.8~P1.3.通过这6个灯的亮灭分别验证波特率,MAC ID,网络,E2PROM 是否正确。
在本工程中添加uart.h 和uart.c 文件,其中INT8UUART0_Ini(INT32U baud,UARTMODE set)(void)是串口初始化程序,在该程序中主要实现参数过滤,设置串口波特率,设置串口模式的功能。
void SendBytes(INT8U *data,INT8U len)(void)按字节发送数据函数。
void IRQ_UART0(void)(void)串口UART0 接收中断。在该函数中比较是否有新数据产生,在有新数据的情况下进行中断处理。
void uart0_oper()是串口数据处理函数。
void init_uart0(INT32U bandrate_uart)(void)初始化中断启动函数,在该函数中进行设置I/O 连接到UART0,设置中断允许等操作。
部分程序如下:
其中的中断通道号是可以修改的,但是在一个工程中不能重复。VICVectAddr6中的6即为通道号,0×26和(1《6)中的6为中断向量,各种中断向量是确定的,不可随意更改。
void DnsPollRequestUpdate(void)是DeviceNet协议栈部分DeviceNet数据的处理函数,它在嵌入式I/O模块接收到一个完整的轮询请求后被调用。该函数首先对本次接收到的数据和上次接收到的数据进行比较,只有当不同时才将接收到的新数据赋给aubAppOldConsData[i]以便被串口通过中断方式读取后写到ModBus主站。
这样不仅减轻了MCU的处理负担,还避免了ModBus主站寄存器的不断写入。
void DnsPollResponseUpdate(void)也是DeviceNet协议栈部分DeviceNet数据的处理函数,它在通信模块进行轮询响应前被调用。该函数将读ModBus从站命令获得的数据_U08 aubAppNewProdData[i]赋给aubApp-PollProdData[ubCntByte]作为轮询响应。
5 结论
本设计采用NXP公司的ARM7处理器LPC2129,实现了基于DeviceNet总线的PCI5010-D主站与基于Mod-Bus 总线的设备之间的通信。充分利用了LPC2129 的CAN控制器设计和UART接口,一个接PCI5010-D主站端的DeviceNet总线,另一个接ModBus端。主站,从站和I/O模块同时上电后,PCI5010-D主站与I/O模块间的DeviceNet总线先建立连接后进行I/O 轮询,PCI5010-D主站的输出通过I/O模块的转换后通过UART接口被写入ModBus相应的寄存器。然后I/O 模块发出读命令并将ModBus 的返回值转换为DeviceNet总线格式作为轮询输入返回到PCI5010-D 主站。这样便完成了一个完整的信息交换过程。
嵌入式I/O在实际的工作环境下经过严格的测试,能够满足模块化、数字化、网络化要求。DeviceNet从站代码经过了ODVA 的一致性测试,可移植到其他的产品上。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。