基于DeviceNet 的嵌入式I/O模块设计
文的收发及转换。本系统主要包括系统初始化,主处理程序和收发数据三部分。整体结构如图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主
DeviceNet嵌入式IO模块设 相关文章:
- 电源设计小贴士 1:为您的电源选择正确的工作频率(12-25)
- 用于电压或电流调节的新调节器架构(07-19)
- 超低静态电流电源管理IC延长便携应用工作时间(04-14)
- 电源设计小贴士 2:驾驭噪声电源(01-01)
- 负载点降压稳压器及其稳定性检查方法(07-19)
- 电源设计小贴士 3:阻尼输入滤波器(第一部分)(01-16)