linux modbus工具,基于ARM-Linux的Modbus串口服务器设计

随着互联网的迅猛发展,在使用计算机进行网络互联的同时,各种家电设备、仪器仪表以及工业生产中的数据采集和控制设备也在逐步地走向网络化,以便共享网络资源。所以,在电子设备日趋网络化的今天,利用串口服务器来实现网络通信具有十分重要的意义。利用基于TCP/IP的串口数据流传输的实现来控制管理设备,无需投资大量的人力、物力即可完成对传统设备的管理、更换或者升级。本文引用地址:http://www.eepw.com.cn/article/201706/348353.htm

串口服务器是一种通信协议转换器,它设有两类通信端口:一类是标准的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通信接口。

401d650feec9d0e612aa64aa18ad8a07.png

图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所示。

a4be31cbdcaf190df353f913eb67edac.png

图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)所示。

af5fdc57a5b2496a9c24f46a87135b93.png

图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)。

e1a339b928f6fd852894316ff62e3e31.png

图4:Modbus TCP/RTU相互转换示例。

程序流程如图5(a)和5(b)所示。

72ddaa9dc128217ed233a1b4b7a5d56d.png

图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.

2b06151b25d19fe9f787280e630c5c60.png

图6:串口服务器main()函数程序流程图。

问题及解决

串口服务器测试过程中,有时会出现TCP到RTU发送时数据包错误,不能正确地将TCP数据转换为RTU数据。

原因在于,测试过程中,Windows下的PC终端向Linux工控板发送数据,但是Windows的实时性并不很好,不能及时地发送数据,有时会出现一次发送两包数据给串口服务器的现象;另外,工控板中Linux下的TCP/IP协议剪裁封装不是很完善,导致其接收处理数据的能力比较差。

当多帧数据同时到达时,串口服务器未能正确将后一帧数据发送出去,而把一帧数据分割到两帧,导致数据帧错误。这就是发生上述数据完全错误的原因。这时,需要给串口服务器添加数据的分帧处理功能,在接收到数据时,先判断数据帧是否是有效数据帧,确保每次发送的数据都能是完整的一帧,不会出现数据帧错位,而导致数据的完全错误。

本文小结

本文的目标是在以AT91RM9200芯片构建的Multibus-CPU开发板上实现串口服务器功能。该串口服务器应用Modbus相关协议,将传统的以RS485/232串口通信设备接入工业以太网,实现上位机和设备之间的信息交互。本串口服务器程序已经能够在开发板上正确运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10右键没有新建选项,无法新建文件夹

按下winr打开运行窗口,输入 regedit回车,如下图所示: 定位到HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers,如下图所示 鼠标右键ContextMenuHandlers,新建-》项(K)-》…

Service Mesh 是新瓶装旧酒吗?

戳蓝字“CSDN云计算”关注我们哦!文章来源:阿里巴巴云原生,点击查看原文。Service Mesh 是新瓶装旧酒吗?新技术出现时所主张的价值一定会引发相应的探讨,Service Mesh 也不例外。以往,怀疑 Service Mesh 价…

Mars 算法实践——人脸识别

Mars 是一个基于矩阵的统一分布式计算框架,在之前的文章中已经介绍了 Mars 是什么, 以及 Mars 分布式执行 ,而且 Mars 已经在 GitHub 中开源。当你看完 Mars 的介绍可能会问它能做什么,这几乎取决于你想做什么,因为 Ma…

电脑中linux系统在哪里设置密码,linux添加一个root级别账户并设置密码linux操作系统 -电脑资料...

在linux中我们增加用户会用到useradd了,但这个过程个人感觉比较复杂很用户再加权限,我这里介绍的useradd只要一条命令可以快速增加一个root超级管理员并设置密码命令,希望对大家有帮助,内网机器提权添加账户,无回显&am…

主机ssh升级到6.7以上版本后,使用jsch jar包ssh连接不上报Algorithm negotiation fail问题的解决办法

文章目录一. 解决方案1. 添加加密算法2. 升级版本3. 回退版本4. j2ssh.jar方式替代jsch5. jsch版本下载列表一. 解决方案 1. 添加加密算法 ssh连接问题是由于主机ssh中缺少与jsch jar包匹配的加密算法导致,jsch jar包的默认加密算法貌似是diffie-hellman-group-ex…

2018年自然语言处理最值得关注的研究、论文和代码

2018年对于自然语言处理(NPL)是很有意义的一年,见证了许多新的研究方向和尖端成果。Elvis Saravia 是计算语言学专家,也是2019 计算语言学会年度大会北美分部的项目委员之一。他总结了2018年 NLP 的重要进展,包括增强学…

【惊天】京东任命周伯文担任京东云与AI事业部负责人 全面负责AI、云计算、IoT三大技术领域!

昨日,京东集团爆出大消息,宣布设立京东云与AI事业部,整合原京东云、人工智能、IoT三大事业部的架构与职责,由京东集团副总裁周伯文博士担任负责人,直接向京东集团董事局主席兼CEO刘强东先生汇报。 对此周伯文博士表示…

如何基于OceanBase构建应用和数据库的异地多活

如何基于OceanBase构建应用和数据库的异地多活 前言 OceanBase是一个通用的分布式的关系型数据库,有很多独特的特点。比如数据库的多租户、高可用、极致弹性伸缩能力。如果把OceanBase当作单库使用,就没有把OceanBase的分布式优势发挥到极致。 本文主要…

linux文件属主,ubuntu linux修改文件所属用户(owner属主)和组(groud属组、用户组)

linux下select/poll/epoll机制的比较select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSI ...SPOJ DQUERY D-query(主席树)题目 Source http://www.spoj.com/pro…

Perhaps you are running on a JRE rather than a JDK?

解决方案 https://gblfy.blog.csdn.net/article/details/102893885

12亿行代码,阿里巴巴这一年的技术报告和梦想报告

78年前,图灵用代码编译出的情报破解系统,让二战至少提前2年结束,挽救了2000万人的生命;50年前,登月科学家敲下的一行关键代码,启动了阿波罗号的着陆,成就了人类的一大步;30年前&…

为什么鲜有炫富的程序员?看看中国各阶级收入统计表

网上那些口口声声随随便便就能年入百万的,听听就行。作为开发者,可以不参加双11,但是花钱最多的地方就是买电子产品和“买课”。他们的炫富就是:你根本不知道有多贵的机械键盘,为了赚钱和幸福,又买了多少大…

linux下进程调度模拟程序,linux认证辅导:linux进程调度模拟怎么做?

/*模拟实现LINUX进程调度的静态优先级算法和时间片轮转算法引入LINUX调度  */  #include   #include   #include#include   #include   #define RUN 1  #define SLEEP 0  #define READY 2  #define DEG_SCHEDULE  #define NUM 6  struct OSPCB  {  i…

4种常用线程池

文章目录一.、线程池简介1. 线程池的概念:2. 线程池的工作机制3. 使用线程池的原因:二、四种常见的线程池详解1. 线程池的返回值ExecutorService简介2. 具体的4种常用的线程池案例三、 缓冲队列BlockingQueue和自定义线程池ThreadPoolExecutor一.、线程池…

路径规划之 A* 算法

算法介绍 A*(念做:A Star)算法是一种很常用的路径查找和图形遍历算法。它有较好的性能和准确度。本文在讲解算法的同时也会提供Python语言的代码实现,并会借助matplotlib库动态的展示算法的运算过程。 A*算法最初发表于1968年&a…

王思聪究竟上了多少次热搜?

戳蓝字“CSDN云计算”关注我们哦!作者 | 朱小五责编 | 阿秃王思聪又又又上了微博热搜——然而这次却不是关于娱乐圈。最近几天,王思聪与他的“限消令”接连登上热搜榜,引发吃瓜群众们广泛热议。知乎的段子手们也纷纷发挥自己的想象力。小五本…

2018年,自然语言处理很全的应用与合作

2018年见证了 NLP 许多新的应用发展。Elvis Saravia 是计算语言学专家,也是2019 计算语言学会年度大会北美分部的项目委员之一。他在一份报告中总结出,NLP 不仅在聊天机器人和机器学习中有所突破,也在医疗健康、金融、法律和广告等行业中有崭…

如何把springboot项目部署到tomcat上

文章目录一、 企业发布场景1. 首次发布2. 非首次发布3. 全量发布和增量发布概念和区别二、springboot部署tomcat2.1. 创建Web初始化类2.2. 修改打包方式2.3. 项目发布目录2.4. 启动tomcat2.5. 浏览器验证一、 企业发布场景 1. 首次发布 项目上线第一次会采用全量发布 【编译】…

OceanBase迁移服务:向分布式架构升级的直接路径

2019年1月4日,OceanBase迁移服务解决方案在ATEC城市峰会中正式发布。蚂蚁金服资深技术专家师文汇和技术专家韩谷悦共同分享了OceanBase迁移服务的重要特性和业务实践。 蚂蚁数据库架构的三代升级史 在过去的十多年时间里,蚂蚁在整个基础数据库架构上一…

linux中fdisk的参数,Linux fdisk命令参数及用法详解--Linux磁盘分区管理命令fdisk

fdisk 命令 linux磁盘分区管理用途:观察硬盘之实体使用情形与分割硬盘用。使用方法:一、在 console 上输入 fdisk -l /dev/sda ,观察硬盘之实体使用情形。二、在 console 上输入 fdisk /dev/sda,可进入分割硬盘模式。1. 输入 m 显…