基于ARM-Linux的Modbus串口服务器设计

发布者:堕落的猫最新更新时间:2021-04-21 来源: eefocus关键字:ARM-Linux  Modbus  串口服务器 手机看文章 扫描二维码
随时随地手机看文章

串口服务器的功能


串口服务器是一种通信协议转换器,它设有两类通信端口:一类是标准的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:ModbusRTU到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串口通信设备接入工业以太网,实现上位机和设备之间的信息交互。本串口服务器程序已经能够在开发板上正确运行。


关键字:ARM-Linux  Modbus  串口服务器 引用地址:基于ARM-Linux的Modbus串口服务器设计

上一篇:基于ARM平台的MP3软解码算法研究与实现
下一篇:ARM-Linux开发与MCU开发比较

推荐阅读最新更新时间:2024-11-13 10:22

基于MODBUS无线总线测控系统
引言     目前无线通讯不但在通讯行业得到广泛的应用,而且在检测与控制领域也正在不断地得到应用与推广。工业现场总线作为现代工业控制系统的主流通讯网络,其通讯介质为光纤或通讯电缆。针对很多检测点和控制装置分布较为分散或距离较远,且应用通讯电缆连接成本高的场所,目前可以采用点对点的无线通讯方式,且各公司生产的测控系统所采用的通讯标准不尽相同,不同公司的测控装置不能够相互通讯,甚至同一公司的测控装置也可能不能够相互通讯。为了使得测控装置系统既满足无线通讯的要求,又达到总线测控的目的,在测控装置系统中将工业现场总线通讯标准引入到无线通讯中。本文将ModBus通讯标准引入到nRF无线通讯技术中,组成ModBus无线总线测控系统,对系统
[嵌入式]
Modbus通讯协议在原油输送系统中的应用
  1、 引言   原油输送站控系统是原油输送中不可缺少的环节,其主要是实现原油的汇集与转输,同时要对来油进行加热、加压和含水分析等,其站内主要分为加热炉系统、加压泵系统、罐区系统、流量计系统等。为了实现生产数据的集中管理、保存和打印,就需要将各个系统中的数据进行集中采集和保存,而多个系统都是采用专用的和不同厂家的控制系统,如加热炉系统、流量计系统等。因此,对中心站控系统就必须解决各个系统之间的通讯问题。   作者在对中国石油长庆油田XX管道沿河湾SCADA系统的设计中,就遇到此类问题,即加热炉系统采用的是北京亚控自动化公司的组态王软件进行监控,而中心SCADA系统则采用Siemens公司的S7 400 PLC和Wincc软件进行监
[嵌入式]
基于MODBUS现场总线的大型设备监控系统的研究
  现场总线技术是对自动化领域的一场变革。由于现场总线简单、可靠、经济实用,已成为当今自动化领域发展的热点之-.目前,新建的连铸机已经开始使用现场总线技术.   现场总线是连接智能现场设备和自动化系统的数字式、双向传输、多分支结构的通信网络.它主要解决工业现场的智能化仪器仪表、控制器、执行机构等现场设备间的数字通信以及这些现场控制设备和高级控制系统之间的信息传递问题。主要应用于工业现场可以在微机集控设备之间实现双向串行多节点数字通讯。   为了更大程度地提高矿井安全、迎合未来无人化工作面发展趋势,煤矿井下综采工作面大型设备远程监测监控功能的实现至关重要。目前综采工作面的大型设备如采煤机、刮板输送机、破碎机、转载机等大都采用
[嵌入式]
基于MODBUS协议的智能控制系统设计
  引言   现场总线作为生产过程自动化发展的重点,对推动自动化技术起到巨大的推动作用,是现代化工业的标志。MODBUS作为现场总线的一种通信协议,它实现了PLC控制器、工控仪表与设备间的通讯和信息交换。具有MODBUS功能的工控仪表虽然应用比较广泛,但是工控仪表和PLC控制器价格较高并且没有形成自主知识产权的产品,阻碍了它的进一步发展。本文从这个问题着手,设计基于MODBUS协议的单片机控制系统,设计合理,价格低廉,自主性强,在工业控制领域具有广泛的应用前景。   1 系统总体设计   系统中计算机PC作为主机,AVR单片机作为从机,采用RS-485工业现场总线通信。由于计算机的串口采用RS232总线标准,因此在主机的串行
[单片机]
基于<font color='red'>MODBUS</font>协议的智能控制系统设计
ARM-Linux s3c2440 之I2C分析
内核版本linux-2.6.30.4 I2C在Linux中是Bus下的一个子系统. 它由客户驱动(client driver),i2c-core核心,i2c适配器驱动(adapter driver) ,算法aglorithm组成。s3c2440中有两个i2c现适配器.作为platform_device设备在系统启动先时被注册和添加。下面我们分析i2c(设备,驱动,总线)的实现过程. //填充设备资源 //struct resource结构体描述了挂接在cpu总线上的设备实体资源 //.start:i2c寄存器起始地址; .end:i2c寄存器结束地址; .flag:描述设备实体的共性和特性标志 static struct
[单片机]
MODBUS转PROFIBUS网关在北京恒东热电公司的应用
北京恒东热电有限公司位于北京市酒仙桥路4号,798艺术区内,负责整个辖区的供热任务。由于北京市规定,市区内不能采用燃煤方式,因此该厂选用了两台75吨燃气锅炉进行供热。 锅炉房距离中控室约200米。DCS控制系统采用ABB Freelance控制系统,控制器型号为AC800F。由于控制的各个分站比较分散,应用现场总线比单纯的DCS要更加方便和节省成本。因此整个系统大量应用了目前最为流行并且通讯稳定PROFIBUS现场总线。在AC800F的控制器上,ABB公司已经集成了PROFIBUS主站通讯接口,应用800F Control Builder F系统可以方便的配置各种PROFIBUS从站。   由于该厂两台锅炉是燃气锅炉,因
[嵌入式]
CANopen转modbus的实现方式有哪些
在工业项目里,很多时候我们需要进行数据转换。如果是常见的数据类型还好,对应的数据转换工具一找大堆。但如果这些数据被添加了高层协议呢?那就不好玩了,需要专门的东西了。这些实现高层协议转换的设备,往往不具备普遍使用的意义。什么意思呢?就是你用得上不见得别人也用得上,你需要专门找厂家定制,把你的需要一股脑的都说了。不用怎么想也知道,找人定制肯定花费不低,而且核心技术还不在自己手里。倘若过几天你又有了个新需求,恰好这个需求不在第一次的约定里,你猜对方会不会跟你继续要钱? 所以,如果我们自己能够实现对应的目的,省下钱来干点别的事不好吗?但正所谓巧妇难为无米之炊,你没有工具也是白扯。基于这个情况,我们这个PLC公司做出了一款PLC设备的衍
[嵌入式]
PLC通过Profibus转Modbus网关接LED大屏通讯
一、背景 Modbus协议和Profibus协议是两种常用于工业控制系统的通信协议,它们在自动化领域中起着重要的作用。Modbus是一种串行通信协议,被广泛应用于各种设备之间的通信,如传感器、执行器、PLC等。而Profibus则是一种现场总线通信协议,通过集线器连接多个设备,实现数据传输 二、Modbus和Profibus各有其特点和适用场景 Modbus适合于小型控制系统,易于实现,成本低廉,具有良好的兼容性和稳定性,广泛应用于工业自动化领域。而Profibus则更适合大型控制系统,可以连接更多的设备,支持更复杂的控制和监测功能,适用于对通信速度和稳定性有较高要求的场合 三、方案 本文将深入探讨如何利用PLC通过Pro
[嵌入式]
PLC通过Profibus转<font color='red'>Modbus</font>网关接LED大屏通讯
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved