微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 电源设计 > 基于DeviceNet 的嵌入式I/O模块设计

基于DeviceNet 的嵌入式I/O模块设计

时间:12-09 来源:互联网 点击:

文的收发及转换。本系统主要包括系统初始化,主处理程序和收发数据三部分。整体结构如图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主

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top