基于LwIP和Modbus TCP协议的网络控制器设计

2023-03-09 07:55史先传许议元
自动化与仪表 2023年2期
关键词:服务端网络通信报文

史先传,殷 帅,许议元

(常州大学 机械与轨道交通学院,常州 213164)

工厂经常需要对继电器、电磁阀等设备或者电压、电流和温度等信号进行远程控制或监测,目前许多工厂都构建了设备的远程控制和监测系统。随着科技的进步,工厂的终端设备分布越来越分散,需要测控的参数越来越多,对通信的实时性要求也越来越高。传统的现场总线通讯方式在数据传输时有许多限制,已经逐渐无法满足工厂的要求。由于以太网传输具有传输速度快、传输距离长和抗干扰能力强等优点,已经被广泛使用在对通信实时性和抗干扰能力要求高的工厂环境中。目前的以太网远程监控系统大多都依赖μC/OS-Ⅱ实时操作系统,而且大多数系统都使用单网口通讯方式[1-2],当工厂需要对不同地点的多路设备进行监测和控制时,需要使用多台上位机,成本高且布线复杂。针对以上问题,使用STM32F107RCT6 单片机和LAN9303 芯片作为硬件平台,使用无操作系统的方式移植LwIP协议并结合Modbus TCP 协议,设计了一款网络控制器。同时,通过LAN9303 芯片拓展2 路网口,需要对不同地点的设备进行监测和控制时,用网线将多个网络控制器串联使用,如图1所示。

图1 双网口工作方式Fig.1 Dual network port working mode

1 系统总体结构设计

网络控制器由电源电路、网络通信电路、A/D 采样电路、网口电路、光耦隔离电路和IO 口电路等电路构成。使用STM32F107RCT6 作为主控芯片,网络芯片使用LAN9303 芯片。由电源电路将输入电源转换为网络控制器所需的各种直流电源,分别提供给STM32F107RCT6 和LAN9303 及其外围电路使用。STM32F107RCT6 通过其内部的MAC(媒体访问控制器)与LAN9303 芯片进行通信。使用LAN9303 芯片拓展2 个网口,形成双网口工作方式。使用网络隔离变压器将网口和LAN9303 芯片隔离,避免外界电磁干扰,提高数据传输的稳定性。STM32 单片机通过IO 口对终端设备进行控制和监测,同时使用SPI 通信读取A/D 采样的值。采用光耦隔离电路将STM32 单片机与外部电路隔离,提高控制系统运行的稳定性。系统总体结构如图2所示。

图2 系统总体结构Fig.2 System overall structure

2 硬件设计

2.1 网络通信电路

STM32F107RCT6 和LAN9303 的网络通信需要连接SMI(站管理接口)和MII(介质无关接口)或RMII (精简MII 接口)。根据IEEE 802.3 标准,MII接口需要连接16 个引脚,RMII 接口需要连接7 个引脚。RMII 接口方式在满足网络通信需求的同时,使用的引脚数目更少,在设计电路时更加简单方便。因此,采用RMII 接口方式实现STM32F107RCT6 与LAN9303 的网络通信。

LAN9303 芯片由STM32F107RCT6 的PA8 引脚输出的25 MHz 时钟驱动,时钟信号从LAN9303的XI 端口输入,XO 端口保持悬空。LAN9303 内部将25 MHz 时钟倍频到50 MHz,并由P0_OUTCLK 引脚输出,驱动STM32F107RCT6 的MAC。MDC 引脚和MDIO 引脚分别是站管理接口的时钟线和数据线,STM32F107RCT6 通过此接口访问LAN9303 的内部寄存器发送控制数据或接收状态信息。LAN9303 的RMII 接口与STM32F107RCT6 内部集成的MAC 的RMII 接口相连,实现网络通信的数据传输。通过配置P0_MODE0、P0_MODE1 和P0_MODE2 选择LAN-9303 的工作模式。LAN9303 采用RMII PHY 模式,对应P0_MODE2=1,P0_MODE1=0,P0_MODE0=0。TXN1,TXP1,RXN1 和RXP1 为网口1 的数据传输引脚。TXN2,TXP2,RXN2 和RXP2 为网口2 的数据传输引脚。STM32F107RCT6 与LAN9303 的网络通信电路如图3所示。

图3 网络通信电路Fig.3 Network communication circuit diagram

2.2 A/D 采样电路

A/D 采样电路使用模数转换器AD7895 芯片。AD7895 具有12 位ADC、双极性输入和高速串行SPI 接口等特点,能采样±10 V 电压。采用AD780 提供+2.5 V 基准电压作为参考。转换电路与STM32 单片机之间的通信在硬件上添加了数字隔离芯片AD uM1402,避免外界电磁对主控芯片STM32 单片机造成干扰。使用STM32 单片机的GPIO 口模拟SPI通信读取A/D 采样的数值。通过拨动拨码开关S1选择采集对象是电压信号还是电流信号。采集电压信号时,拨动开关至2、3 闭合,1、4 断开,采集端并联阻值为100 kΩ 的电阻R24。采集电流信号时,拨动开关至1、4 闭合,2、3 断开,采集端串联阻值为500 Ω的电阻R23,采集电阻R23两端的电压,将电流信号变换为电压信号。采样电路如图4所示。

图4 A/D 采样电路Fig.4 A/D sampling circuit

3 软件设计

软件架构分层模型中的网络接口层、网络层、传输层由LwIP 协议实现[3]。在应用层上使用Modbus TCP 协议规定数据格式,利用网络传输Modbus TCP 协议报文,实现网络通信[4-5]。软件架构分层模型如图5所示。

图5 软件架构分层模型Fig.5 Software architecture hierarchical model

3.1 LwIP 协议栈的移植

STM32F107RCT6 自带的MAC 的接口和LAN9303的接口构成了网络传输的网络接口层,使用LwIP协议栈构成网络传输的网络层和传输层。ST 公司为STM32F107 芯片提供了专门的LwIP 源码,开发人员根据项目需求编写和修改相应的函数。网络接口驱动程序的实现是移植LwIP 协议栈的关键[6],在ethernetif.c 文件中已经为此提供了框架,对此文件进行相应修改以实现网络的初始化、中断处理以及数据的收、发等操作。ethernetif.c 文件中主要函数有:low_level_init()函数——用来初始化并使能MAC和DMA;low_level_input()函数——用于接收数据,在内存池中分配一个pbuf 数据结构体,将从接口进入的数据包的字节传输到pbuf 中,将pbuf 返回;low_level_output()函数——用来发送pbuf 缓冲区中的数据包。

创建虚拟网络接口是实现双网口通讯的基础。网络控制器有2 个网口,给每个网口都分配一个结构体netif,用来描述网口的IP 地址、MAC 地址和接口状态等特性,通过netif_add()函数将网口的各个参数添加到netif_list 链表中,传输数据时根据数据包的信息从netif_list 链表中选择合适的网口进行传输。网络控制器只用于工厂控制和监测设备的局域网中,使用MAC 地址来标识具体用户,根据数据包中的MAC 地址,选择合适的网口发送和接收数据。当2 个网口一起使用时,将数据转发到数据包的目标MAC 地址所连接到的单个网口。

完成以上相关函数的移植后,在程序的主函数中调用LwIP_Init()函数初始化LwIP 协议的各项设置。

3.2 Modbus TCP 协议

根据IANA(互联网编号分配管理机构)规定,Modbus TCP 服务端的端口号是502。Modbus TCP报文由报文头和报文体组成。因为LwIP 协议在传递数据包时已经对数据进行了校验,所以在报文中不再进行校验。Modbus TCP 报文结构如图6所示。

图6 Modbus TCP 报文结构Fig.6 Modbus TCP message structure

Modbus TCP 协议使用主从关系实现请求和响应。通信采用一问一答的形式,由客户端发起请求,然后等待服务端响应。上位机为客户端,网络控制器作为服务端等待上位机发送报文并做出相关回应。如图7所示。

图7 Modbus TCP 主从关系Fig.7 Modbus TCP master-slave relationship

3.3 A/D 采样读数处理

A/D 采样电路测量的电压范围为0~10 V,电流范围为4~20 mA。采样得到的数字量取值范围为0~2047。

若被测信号为电压信号,则电压转换公式为

式中:Xu为A/D 采样得到的数字量;U 为转换后的电压模拟量,单位为伏特(V)。

若被测信号为电流信号,则电流转换公式为

式中:Xi为A/D 采样得到的数字量;I 为转换后的电流模拟量,单位为毫安(mA)。

为了消除A/D 采样时遇到的脉冲干扰和随机误差,提高测量数据的准确性,连续对A/D 转换值进行20 次采样,然后去掉一个最大值和一个最小值,求出剩下的18 个值的平均值作为最终采样读数。

3.4 程序设计

编写程序时直接调用LwIP 协议内部的函数。网络控制器作为网络通信的服务端,远程上位机作为客户端。

服务端收发数据流程如下:服务端始终监听502 端口状态,一旦接收到连接请求,建立连接并接收客户端发送的数据。然后对数据进行处理,按照Modbus TCP 协议的功能码进行相应的控制和监测操作,并向客户端返回相应的应答报文。其中modbus_accept()和modbus_recv()函数分别是连接到客户端和接收到数据后的程序处理。上述流程如图8所示。

图8 服务端收发数据流程Fig.8 Server sending and receiving data flow chart

在完成客户端的连接后调用modbus_accept()函数为接收客户端数据做准备,主要工作是分配空闲内存和传递参数。modbus_accept()函数主要流程如图9所示,图中hs 是数据指针。

图9 Modbus_accept()函数流程Fig.9 Modbus_accept() function flow chart

当服务端接收到数据后调用modbus_recv()函数对数据进行相应的处理,modbus_recv()函数的主要工作为判断接收到的数据前7 个字节是不是Modbus TCP 报文头。若是报文头,则读取功能码,根据功能码对线圈和寄存器进行相应操作,完成输入状态读取、输出状态控制和A/D 采样数据读取等功能,并发送应答报文,完成一次数据的接收与发送。modbus_recv()函数主要流程如图10所示。

图10 Modbus_recv()函数流程Fig.10 Modbus_recv() function flow chart

4 实验测试与结果

上位机为客户端,网络控制器为服务端。设置客户端IP 地址为192.168.0.1,服务端IP 地址为192.168.0.10,服务端端口号为502。进行网络通信测试。

网络控制器支持Modbus TCP 协议中常用的8个功能码(0x01、0x02、0x03、0x04、0x05、0x06、0x0F和0x10),以功能码05(写单个线圈)、功能码02(读输入状态)和功能码03(读输入寄存器)为例进行测试。网络通信测试中上位机发送与接收的报文内容如图11所示。

图11 网络通信测试Fig.11 Network communication test

05(写单个线圈):上位机发送报文00 01 00 00 00 06 01 05 00 02 FF 00,上位机接收到的报文是00 01 00 00 00 06 01 05 00 02 FF 00。地址为2 的输出端口上连接的继电器线圈通电。

02(读输入状态):将地址为0 的输入端口上所接的开关闭合,此时从地址0 开始读5 个输入点状态。上位机发送报文00 01 00 00 00 06 01 02 00 00 00 05,上位机接收到的报文是00 01 00 00 00 04 01 02 01 01,接收的报文与开关的状态一致。

03(读输入寄存器):向A/D 输入引脚施加5 V电压,网络控制器通过A/D 转换电路将5 V 电压转换为数字量,这个数字量被存储在地址为0x20 的寄存器。上位机发送报文00 01 00 00 00 06 01 03 00 20 00 01,上位机接收到的报文是00 01 00 00 00 05 01 03 02 04 00。报文的最后2 个字节为读取的A/D 值,将16 进制数0x0400 转化为10 进制数1024,通过转换公式(1)计算可知测到的电压为5 V,与施加的电压一致。

5 结语

网络控制器接收上位机发送的报文,控制电磁阀、继电器等设备的通断,并且对电流和电压信号进行监测。当工厂需要对多路设备进行监控时只需将多块网络控制器用网线串接,避免复杂的布线。通过实验测试,网络控制器成功地写入了输出端口的通断状态、读取了输入端口状态和A/D 采样的值,可以通过网络稳定地对终端设备进行控制和监测。

猜你喜欢
服务端网络通信报文
基于J1939 协议多包报文的时序研究及应用
CTCS-2级报文数据管理需求分析和实现
浅析反驳类报文要点
基于网络通信的智能照明系统设计
网络通信中信息隐藏技术的应用
新时期《移动Web服务端开发》课程教学改革的研究
基于网络通信的校园智能音箱设计
谈计算机网络通信常见问题及技术发展
在Windows Server 2008上创建应用
ATS与列车通信报文分析