跟着互联网的迅猛开展,在运用核算机进行网络互联的一起,各种家电设备、仪器仪表以及工业生产中的数据收集和操控设备也在逐渐地走向网络化,以便同享网络资源。所以,在电子设备日趋网络化的今日,使用串口服务器来完结网络通讯具有十分重要的含义。使用根据TCP/IP的串口数据流传输的完结来操控办理设备,无需出资很多的人力、物力即可完结对传统设备的办理、替换或许晋级。
串口服务器的功用
串口服务器是一种通讯协议转化器,它设有两类通讯端口:一类是规范的RS232/422/485格局的串行端口,长途的RTU(长途终端设备)监控模块经过串行操控总线接入串口服务器的此类端口;另一类是以太网口,经过网线将串口服务器接入局域网的交换机等设备中。
串口服务器在作业中可主动将RS232/422/485格局的串行数据与根据TCP/IP协议的以太网数据包进行通明转化。一方面,串口服务器收到来自某一串行端口的现场数据,将其转化为TCP/IP格局的数据,经过以太网口进行网络上传;另一方面,串口服务器在局域网中捕获合法的数据协议包,经过解包来解析出有用的操控信息,经过监控机指定的串行端口将操控指令以串行数据的办法传送给长途RTU.
硬件渠道
此体系的硬件渠道如图1所示,它是以AT91RM9200芯片构建的Multibus-CPU开发板。MultiBus-CPU体系是根据AT91RM9200微操控器的智能化多总线测控体系,该体系可以树立根据Modbus-RTU总线协议的总线通讯,使体系设备可以无缝地接入到根据Modbus-RTU形式的总线体系,以及牢靠、实时并精确地完结工业现场的数据收集和信号输出等功用。体系支撑Modbus-RTU协议,一起,体系还支撑多种总线通讯,包括RS485总线,工业以太网(UDP协议),串口RS232通讯接口和USB通讯接口。
图1:CPU模块原理图。
软件渠道
本规划选用嵌入式Linux作为操作体系。ARM上的Linux的首要优势:可扩展的完好操作体系供给了牢靠的多使命环境,根据开源模型(GPL),使用多种UNIX和开源使用程序以及用于根据ARM技能的多种规划(包括网络和无线范畴)。
Modbus协议
Modbus协议是使用于电子操控器的一种通讯言语。使用这个协议,操控器彼此之间以及操控器经过网络(例如以太网)和其他设备之间进行通讯。
干流的Modbus协议为规范Modbus协议(Modbus RTU协议)和Modbus TCP协议。规范的Modbus通讯协议界说了报文帧的每一字节,界说了怎样将数据打包成报文帧以及怎么解码。报文帧包括一个字节的地址码,一个字节的功用码,数据和两个字节的校验码。其间,校验码选用CRC校验。
Modbus TCP协议是在规范Modbus协议的基础上进一步开展而来的。它是将Modbus协议嵌入到底层TCP/IP协议中构成的,这样就在TCP/IP的以太网上完结了客户机-服务器架构的Modbus报文通讯。二者的数据帧结构如图2所示。
图2:规范Modbus与Modbus_TCP数据帧结构比照。
剖析Modbus TCP协议和RTU协议,可以十分清楚地看出两者的首要差异。与Modbus RTU协议比较,Modbus TCP数据帧里已不再有CRC校验,而这部分校验的使命是由TCP/IP协议和以太网的链路层来完结的。别的,Modbus TCP较规范的Modbus协议还加入了一个MBAP报文头,由它来解说阐明Modbus的参数和功用。其他部分两者可以彼此通用。假如TCP协议转化为RTU协议,那么,只需求把TCP协议MBAP头中的“单元标识域”和后续字节组成一帧,再加上此帧的CRC校验就可以组成RTU协议,而在串行链路上进行发送。假如是RTU协议转化到TCP协议的话,那么要根据实际情况组成一个MBAP头。
获取装备信息GetConfigValue功用的规划与完结
在规划串口服务器之前,首要要装备相应的设备号并给设备装备相应的串口服务器IP地址、TCP通讯端口号和串口参数等,这些装备信息放在一个txt文件傍边。
咱们规划了一个Configinfo.txt文件,当咱们需求向一个设备传递信息时,需求首要从文件中读取装备信息,对相应的串口及工控板的网络进行装备,然后再进行相应的操作。这时,咱们在其间用到了两个自界说函数:GetConfigValue和GetCFGValue.其间GetConfigValue的功用是将Configinfo.txt中的信息装备给串口服务器,它调用GetCFGValue函数,在Configinfo.txt中寻觅相应的装备信息项,并截取相应的装备信息。它们的程序框图如图3(a)和3(b)所示。
图3:GetConfigValue函数程序流程图(a)和GetCFGValue函数程序流程图(b)。
串口操作函数封装的规划与完结
在对串口进行相应的操作时,首要要翻开串口并装备串口的波特率、数据位、中止位和作业形式等。这些关于串口的操作都封装在一个文件傍边,以使结构明晰,便利查看以及修正或增加更多的操作函数。所进行的包括以下几种操作。
串口的翻开和封闭:翻开串口时,需求首要判别串口的类型,然后以必定的办法翻开串口并保存本来的串口装备信息,最终对串口进行波特率、数据位、中止位和奇偶校验位的设置。封闭串口时,需求将本来保存的终端信息康复,使串口回到翻开前的状况。
对串口进行数据读写:串口的读写操作是串口服务器最基本的功用,当稀有据传送过来时,需求经过串口发送。写串口操作会把内存中的数据写入所指的文件,读串口操作会把串口送来的数据写入内存中。分别用writecomport和readcomport来完结。
对串口进行设置:需求设置波特率、数据位、中止位和奇偶校验位。调用界说的封装函数,来完结这些操作。串口的作业形式经过termios函数的装备来操控。
Modbus TCP/RTU彼此转化功用的完结
这一步是串口服务器规划的要害,其转化要点在于CRC校验和MBPA报头的改换。在这里,界说mod2tcp函数来完结Modbus RTU到TCP格局的转化,界说tcp2mod函数来完结Modbus TCP到RTU格局的数据转化。例如,来自Modbus主站的TCP协议恳求,经串口服务器转化成Modbus RTU格局,经485口发送给从站,并将从站相应数据经485接口送入串口服务器,转化成Modbus TCP格局信息回来主站(图4)。
图4:Modbus TCP/RTU彼此转化示例。
程序流程如图5(a)和5(b)所示。
图5:Modbus RTU 到TCP格局数据转化程序流程(a)和Modbus TCP 到RTU格局数据转化程序流程(b)。
由此可见,TCP格局字节数=RTU格局字节数-2+6,获取的可用数据均相同,因而其程序完结就不再是难题了。
CRC校验功用
CRC即循环冗余校验码,它是数据通讯范畴中最常用的一种过失校验码。RTU办法时,CRC校验传送的悉数数据,它疏忽信息中单个字符数据的奇偶校验办法。CRC校验的要害在于数据的匹配,将得到的数据怎么正确的套用到CRC校验傍边是其间的要害。
CRC校验有既定的规矩,其程序完结十分简略,只需求以下几步:CRC字节的初始化;将数据导入进行CRC核算;回来核算出的CRC值。
串口服务器的规划与完结
此部分介绍整个程序的main()函数,它会调用前文介绍的函数来完结串口服务器功用,故其头文件中要包括前文所述的各函数文件。程序流程如图6所示。
main()函数使用Linux C函数编程,其间应特别留意socket的使用,socket要先树立再bind();在信号量中的参数要装备正确;进程的办理方面,要留意进程退出时先退出子进程,在所有进程都完结之后再封闭socket.
图6:串口服务器main()函数程序流程图。
问题及处理
串口服务器测验过程中,有时会呈现TCP到RTU发送时数据包过错,不能正确地将TCP数据转化为RTU数据。
原因在于,测验过程中,Windows下的PC终端向Linux工控板发送数据,可是Windows的实时性并不很好,不能及时地发送数据,有时会呈现一次发送两包数据给串口服务器的现象;别的,工控板中Linux下的TCP/IP协议取舍封装不是很完善,导致其接纳处理数据的才能比较差。
当多帧数据一起抵达时,串口服务器未能正确将后一帧数据发送出去,而把一帧数据分割到两帧,导致数据帧过错。这便是产生上述数据彻底过错的原因。这时,需求给串口服务器增加数据的分帧处理功用,在接纳到数据时,先判别数据帧是否是有用数据帧,保证每次发送的数据都能是完好的一帧,不会呈现数据帧错位,而导致数据的彻底过错。
本文小结
本文的方针是在以AT91RM9200芯片构建的Multibus-CPU开发板上完结串口服务器功用。该串口服务器使用Modbus相关协议,将传统的以RS485/232串口通讯设备接入工业以太网,完结上位机和设备之间的信息交互。本串口服务器程序现已可以在开发板上正确运转。