基于MODBUS协议多机串口通信的雪茄烟叶发酵温湿度监控系统设计实现

上传人:仙*** 文档编号:107394209 上传时间:2022-06-14 格式:DOC 页数:13 大小:94.50KB
收藏 版权申诉 举报 下载
基于MODBUS协议多机串口通信的雪茄烟叶发酵温湿度监控系统设计实现_第1页
第1页 / 共13页
基于MODBUS协议多机串口通信的雪茄烟叶发酵温湿度监控系统设计实现_第2页
第2页 / 共13页
基于MODBUS协议多机串口通信的雪茄烟叶发酵温湿度监控系统设计实现_第3页
第3页 / 共13页
资源描述:

《基于MODBUS协议多机串口通信的雪茄烟叶发酵温湿度监控系统设计实现》由会员分享,可在线阅读,更多相关《基于MODBUS协议多机串口通信的雪茄烟叶发酵温湿度监控系统设计实现(13页珍藏版)》请在装配图网上搜索。

1、.基于MODBUS协议的多机串口通信的雪茄烟叶发酵温湿度监控系统的设计与实现王刚来凤县烟叶分公司摘要:温湿度是雪茄烟叶发酵过程中的重要监测指标。为方便实时采集数据和分析,研制了一套基于RS485总线和MODBUS通讯协议RTU报文格式的温湿度监控系统,该系统通过RS485总线连接多个温湿度采集模块,RS485总线通过RS232隔离转换器与PC机串口相连,实现了以PC机为主机,多个温湿度采集模块为从机的多机通信。PC机通过轮询的方式向从机发送查询请示,从机返回温湿度数据被PC机接收。在通信编程的实现中,通过合理计算RTU帧间隔时间、从机轮询周期,并采用多线程、委托处理等编程机制,不仅有效的解决了

2、多机通信可能引起的通信阻塞和线程冲突,实现了主机与从机的良好通信,同时实现了数据监控、数据显示和保存的并行处理,到达了系统稳定运行和良好交互的目的。关键词:雪茄烟;温湿度;MODBUS;RS485;多机通信0 引言在来凤县生产雪茄烟叶的过程中,烟叶的发酵处理是生产后期一个重要的环节,发酵过程的控制直接影响烟叶质量的上下。温湿度作为发酵过程的一个重要指标,生产人员必须实时跟踪并采取反响措施。烟叶发酵场所要求空间相对封闭,尽量减少外部环境的干扰,且烟叶堆码外和上下温度不同,要实时监测不同堆码和同一堆码不同位置的温湿度,不是一件很方便的事,因此想到了利用可编程温湿度传感器和PC机等硬件设备,通过自主

3、编写监控程序,设计一套雪茄烟叶温湿度监控系统。控制系统中一般分为上位机(主机)和下位机(从机)两大局部。上位机一般是指直接发出操控命令的计算机,同时在屏幕上显示各种信号变化;下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机之类的,下位机读取设备信息,反响给上位机。本文设计的系统中,将PC机作为上位机,下位机采取购置现成的温湿度传感器模块,通过程序二次开发,读取下位机数据。因此本文主要讨论的是硬件系统的装配和上位机系统软件的实现。1 Modbus通信协议和RTU报文格式1.1 Modbus协议简介Modbus是一种工业上开放的现场总线协议,是目前通用的工业标准之一。该协议能够使得各

4、个厂家之间的控制设备能够相互通信和进展数据传输,在工业过程控制中具有广泛地应用。在物理层,Modbus 串行链路系统可以使用不同的物理接口(RS485、RS232)。MODBUS是一个请求/应答协议,并且提供功能码规定的效劳。在同一时刻,只有一个主节点连接于总线,一个或多个子节点(最大编号为247 ) 连接于同一个串行总线。Modbus 通信总是由主节点发起。子节点在没有收到来自主节点的请求时,从不会发送数据。子节点之间从不会互相通信。主节点在同一时刻只会发起一个Modbus 事务处理。主节点可以两种模式对子节点发出Modbus 请求:单播模式和播送模式。单播模式是主节点以特定地址*个子节点,

5、子节点接到并处理完请求后,向主节点返回一个应答报文。在播送模式,主节点向所有的子节点发送请求。对于主节点播送的请求没有应答返回,一般用于写命令。MODBUS协议包含三种传输模式:TCP、RTU和 ASCII 模式。其中RTU模式的主要优点是较高的数据密度,在一样的波特率下有更高的吞吐率,被广泛采用。本系统采用的传感器设备采用的是RTU模式。1.2 RTU报文格式使用RTU模式,每发一串完整的数据信息,称为一个RTU 帧。RTU报文帧格式表如下:表1 RTU报文帧格式表:起始间隔地址码功能码数据区CRC校验完毕间隔3.5个字符1字节1字节N字节2字节3.5个字符当设备使用RTU 模式在Modbu

6、s 串行链路通信,报文中每个8位字节含有两个4 位十六进制字符。其中,地址码指定要请求的从机地址,它所表示的从节点的有效地址围是0247,其中0表示播送地址。功能码指定从节点要执行何种操作,从机响应报文发送的功能码与主机发送来的功能码一致。数据区包含了从节点执行特定功能所需要的数据或者从节点响应请求时采集到的数据。错误校验CRC占用两个字节,包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进展比较,如果这两个值相等,表示传输正常,否则就发生了错误。每帧发送至少要以3.5个字符时间的间隔开场,在最后一个

7、有效数据传输完成后,以一个3.5个字符时间的间隔作为该帧的完毕。整个报文帧必须以连续的字符流发送,如果两个字符之间的空闲间隔大于1.5个字符时间,则报文帧被认为不完整应该被接收节点丢弃。当没有活动的传输的时间间隔达3.5 个字符长时,通信链路被认为在“空闲态。当链路空闲时,在链路上检测到的任何传输的字符被识别为帧起始。链路变为 活动 状态。然后,当链路上没有字符传输的时间间个到达t3.5 后,被识别为帧完毕。检测到帧完毕后,完成CRC 计算和检验。2.系统总体设计2.1 系统可行性分析温湿度传感器可通过购置已封装好的模块,目前国有多个公司有成熟稳定的类似产品,且基于MODBUS-RTU协议及R

8、S485总线技术,不需要自己设计硬件和编写下位机通信程序,只需要依据厂家的通信规约即可使用串口通讯技术来实现传感器数据的查询,方便进展二次开发。采用PC主机作为通信上位机,可采用多种高级编程语言,通过对串口通讯来采集下位机数据,实现在软件界面上显示实时监控数据,并将数据保存至数据库,方便后期的数据查询和分析。作为下位机的温湿度传感器和作为上位机的PC主机都可以方便实现,作为一个小型的监控系统,硬件和软件平台都可轻松实现,具有极高的性价比。2.2 系统硬件构造系统硬件总体构造如图1所示:RS485/RS232隔离转换器PC主机RS485总线温 湿 度 传 感 器图1:系统硬件构造图系统采用PC主

9、机作为上位机,温湿度传感器为下位机,采用RS485总线连接所有温湿度传感器。RS485总线标准具有抑制共模干扰的能力,加上总线收发器具有高灵敏度,能检测低至200mV的电压,传输信号最远可到1200米,且RS485总线布线简单。计算机上的串行接口大多是RS232标准的DB9物理接口,为实现RS485与PC主机的通信,在RS485总线与PC主机之间增加了一个RS485到RS232的转换器。如果PC主机没有DB9串行物理接口,还可增加一个RS232/USB转换线,通过USB接口来连接。2.3 软件功能构造系统软件功能构造图如图2所示温湿度监控系统通信参数设置传感器管理监控主界面数据报表查询温湿度变

10、化曲线图2:系统软件功能构造图软件共设计5个功能模块,其信参数设置是设置连接的串口号、波特率、从机存放器起始地址、存放器数量等信息。图3:参数设置传感器管理是将要通信的传感器信息以列表的形式保存在数据库,前提是传感器已经通过RS485总线进展连接。该功能模块主要是存贮传感器地址信息和该传感器的监控位置,在启动监控主界面时,程序遍历传感器地址,进展轮询请求。图2:监控主界面图图4:传感器列表监控主界面是温湿度监控的主程序,通过读取通信参数设置和传感器地址列表,以固定的时间间隔周期向所有的传感器进展轮询,并返回温湿度数据,进展界面显示和保存入库。图2:监控主界面图图5:监控主界面2.4 数据库设计

11、作为一个轻量级监控系统,数据库采用了SQLite,其优点是占用资源非常的低,且开源免费,可以在任何用途使用它。相关数据实体构造如下表2:通信参数设置列名数据类型长度说明IdINT0IdSerialNumberCHAR10串口号BaudRateINT0波特率ModbusStartAddrINT0存放器起始地址ModbusDataLengthINT0数据长度ModbusSampleRateINT0采样率表3:传感器列表列名数据类型长度说明SlaveIdINT0从机地址MonitorLocationNVARCHAR256监控位置表4:监控数据列表列名数据类型长度说明IdINT0IdSlaveIdIN

12、T0从机地址TmpValueNVARCHAR50温度值HmdValueNVARCHAR50湿度值RecordTimeDATETIME0采集时间SlaveStatusTE*T0监控状态3编程关键技术3.1 软件开发环境和技术介绍软件开发以Windows操作系统为平台,编程环境为.NET Framework 4,开发工具为Visual Studio 2021,编程语言为C*。数据库采用了轻型数据库SQLLite。软件设计采用了三层架构,即数据实体层Entity:数据实体对象、业务逻辑层BLL:操作数据业务逻辑和表示层UI:软件界面和人机交互,以实现清晰的系统构造和方便后期维护。3.2利用Seria

13、lPort 类串口资源微软.NET Framework 类库的System.IO.Ports命名空间下,提供了SerialPort 类。此类用于控制串行端口文件资源。提供同步 I/O 和事件驱动的 I/O、对管脚和中断状态的以及对串行驱动程序属性的。在本系统中,给SerialPort实例类设置相关属性,通过该类的Write()方法和ReadByte()方法来发送查询命令和获得报文回复。SerialPort类的定义与翻开串口连接例如如下:/ 翻开串口连接方法/串口号/波特率/每个字节的标准数据位长度/奇偶校验检查协议/每个字节的标准停顿位数/boolpublicbool Open(string

14、portName, int baudRate, int databits, Parity parity, StopBits stopBits) if (!sp.IsOpen) sp.PortName = portName; sp.BaudRate = baudRate; sp.DataBits = databits; sp.Parity = parity; sp.StopBits = stopBits; sp.ReadTimeout = 1000; sp.WriteTimeout = 1000;try sp.Open(); catch (E*ception err) modbusStatus

15、= 翻开串口连接错误 + portName + : + err.Message;returnfalse; modbusStatus = portName + 连接成功;returntrue; else modbusStatus = portName + 连接已翻开;returnfalse; 3.3 MODUBS通信协议的编程实现根据MODBUS协议描述和本系统采用的传感器通信规约,设计了一个MODBUS通信协议类,通过SerialPort类串口资源,实现温湿度的查询。现将MODBUS类的相关功能介绍如下: CRC校验函数的编程实现 CRC校验值的函数实现如下:/ 函数名称:GetCRC/校验数

16、据/CRC值privatevoid GetCRC(byte message, refbyte CRC) ushort CRCFull = 0*FFFF;byte CRCHigh = 0*FF, CRCLow = 0*FF;char CRCLSB;for (int i = 0; i (message.Length) - 2; i+) CRCFull = (ushort)(CRCFull messagei);for (int j = 0; j 1) & 0*7FFF);if (CRCLSB = 1) CRCFull = (ushort)(CRCFull 0*A001); CRC1 = CRCHig

17、h = (byte)(CRCFull 8) & 0*FF); CRC0 = CRCLow = (byte)(CRCFull & 0*FF); 定义03 (0*03)读保持存放器操作的报文格式变量03功能码的请求报文格式固定为8个字节表5表5:请求报文格式地址码功能代码起始地址存放器数量CRC校验1字节1字节2字节2字节2字节本系统中,温度值和湿度值各保持一个存放器,存放器数量为2数据长度为2个字节。因此我们可以定义一个长度为8的8位字节数组来存储请求报文:byte message = new byte8;。表6:传感器从机响应报文格式地址码功能代码数据长度存放器值CRC校验1字节1字节1字节N

18、2字节2字节响应报文格式的长度为5 + 2 *N个字节,其中N为存放器数量,本系统中N=2,因此可以定义一个长度为9的8位字节数组在存储响应数据:byte response = new byte9;例如查询*1传感器数据:01 03 00 00 00 02 C4 0B传感器回复:01 03 04 05 8D 16 6E E5 58上例查询回复中:01表查询从机地址1,前面一个03为功能码,表示数据查询,后一个04表共有两个数据,第一个数据为05 8D 换算成10进制即为:1421,因传感器分辨率为0.01,该值需除以100,即实际温度值为14.21度,同理:16 6E 为湿度值,十进制数据为:

19、5742,相对湿度值为57.42%。.发送报文的生成和响应报文的获取MODBUS类中的BuildMessage函数,用来生成报文数据,源代码如下/ 生成请求报文/从机地址/功能码/存放器起始地址/存放器数量/报文数组privatevoid BuildMessage(byte address, byte type, ushort start, ushort registers, refbyte message) byte CRC = newbyte2; message0 = address; message1 = type; message2 = (byte)(start 8); message

20、2 = (byte)(Convert.ToUInt16(0) 8); message3 = (byte)(Convert.ToUInt16(0); message3 = (byte)start; message4 = (byte)(registers 8); message5 = (byte)registers; GetCRC(message, ref CRC); messagemessage.Length - 2 = CRC0; messagemessage.Length - 1 = CRC1; 请求报文生成后,通过SerialPort类的Write()方法将报文数据写入串行端口输出缓冲区,

21、然后用ReadByte()方法从输入缓冲区中同步读取字节,获得响应报文。源代码如下:/ 获取响应报文/响应报文存储数组privatevoid GetResponse(refbyte response) for (int i = 0; i response.Length; i+) responsei = (byte)(sp.ReadByte(); sp.Write(message, 0, message.Length);GetResponse(ref response);获取响应报文后,进展CRC校验,调用函数如下:privatebool CheckResponse(byte response)

22、 byte CRC = newbyte2; GetCRC(response, ref CRC);if (CRC0 = responseresponse.Length - 2 & CRC1 = responseresponse.Length - 1)returntrue;elsereturnfalse; 完整的功能码03实现函数如下publicbool ModbusFc3(byte address, ushort start, ushort registers, refshort values) if (sp.IsOpen) /去除串口输入/输出缓冲数据 sp.DiscardOutBuffer(

23、); sp.DiscardInBuffer();/定义请求报文数组byte message = newbyte8;/定义响应报文存储数组byte response = newbyte5 + 2 * registers;/生成请求报文数据 BuildMessage(address, (byte)3, start, registers, ref message);/发送请求报文和获取响应报文try sp.Write(message, 0, message.Length); GetResponse(ref response); catch (E*ception err) modbusStatus =

24、 报文响应失败: + err.Message;returnfalse; /CRC校验if (CheckResponse(response) for (int i = 0; i (response.Length - 5) / 2; i+) valuesi = response2 * i + 3; valuesi = 8; valuesi += response2 * i + 4; modbusStatus = 报文响应成功;returntrue; else modbusStatus = CRC 校验错误;returnfalse; else modbusStatus = 串口连接已关闭;retur

25、nfalse; 3.4RTU帧间隔时间的计算与从机轮询周期的合理设置根据Modbus协议,在同一时刻,主节点只能向特定的从机发起一个数据查询,如果有多个从机,只能采取轮询的方式进展查询。且在RTU传输模式下,每帧发送至少要以3.5个字符时间的间隔开场,在最后一个有效数据传输完成后,以一个3.5个字符时间的间隔作为该帧的完毕。因此必须设置合理的RTU帧间隔时间和从机轮询周期,否则可能导致通信阻塞,造成系统瘫痪。本系统的传感器查询报文格式为:1个地址位、1个功能位、4个数据位、2个CRC校验位,共8个字符,传感器回复报文格式为:1个地址位、1个功能位、5个数据位、2个CRC校验位。每发送一次查询,

26、是发送8个连续的8位字符流,如果传输波特率为9600,一个报文的发送时间为(88)/96006.67毫秒,报文回复响应时间为(98)/9600=7.5ms。3.5个字符时间间隔为3.58/96002.92ms。因此一个完整的报文发送和回复周期最小时间为6.67+7.5+2.924=25.85ms。为留出一定通信旷量,本系统将RTU帧间隔时间设置为50ms,单次查询响应超时周期设置为100ms,从机轮询周期依据从机数量、RTU帧间隔时间、单次查询响应超时周期这三个变量自动计算,如果从机轮询周期计算值小于1秒,则按1秒设置。相关源代码如下:/设置RTU帧间隔时间this.RtuIntervalTi

27、me = 50;/设置单次查询超时响应时间this.OneResponseTimeout = 100;/根据从机数量和RTU帧间隔计算监控轮询周期this.PollingTime = (this.OneResponseTimeout + this.RtuIntervalTime) * SlaveList.Count;if (this.PollingTime 1000)this.PollingTime = 1000;3.5 串口数据采集操作、采集数据的界面显示与保存入库的并行处理要以固定的时间间隔对监控从机进展轮询,程序设计中引入了基于效劳器的Timer(定期事件)来实现。同时还要实现在软件界面

28、上显示实时数据,以及按固定的时间间隔将数据保存入库。如果这三个操作在同一个Timer中执行,可能导致操作执行时间与轮询间隔时间的矛盾,引发程序异常。因此定义了定义了三个基于效劳器的Timer(定期事件)来实现,让这三个操作分别在不同的线程上进展执行,同时在主线程上定义了一个数据实体类型与MonitorData一致的List MonitorDataList对象,作为数据缓存,实现各个程序操作之间的数据通信。监控轮询数据缓存数据显示保存入库数据输出图6:并行处理及数据缓存示意图基于效劳器的 Timer 是为在多线程环境中用于辅助线程而设计的。效劳器计时器可以在线程间移动来处理引发时间间隔事件。源代

29、码如下:/ 从机轮询定时器/ System.Timers.Timer PollingTimer = new System.Timers.Timer();/ 数据采集和界面显示定时器/ System.Timers.Timer CollectTimer = new System.Timers.Timer();/ 数据定时保存定时器/ System.Timers.Timer SaveDataTimer = new System.Timers.Timer();PollingTimer.Elapsed += newElapsedEventHandler(PollingTimer_Elapsed);Col

30、lectTimer.Elapsed += newElapsedEventHandler(CollectTimer_Elapsed);SaveDataTimer.Elapsed+= newElapsedEventHandler(SaveDataTimer_Elapsed);/ 从机轮询时间间隔触发事件/void PollingTimer_Elapsed(object sender, ElapsedEventArgs e) MonitorPolling(); / 数据采集时间间隔触发事件/void CollectTimer_Elapsed(object sender, ElapsedEventAr

31、gs e) CollectMonitorData(); / 数据库保存时间间隔触发事件/void SaveDataTimer_Elapsed(object sender, ElapsedEventArgs e) SaveMonitorData(); PollingTimer为从机轮询定时器,实现按固定的时间间隔对所有的温湿度传感器进展轮询,完成一次轮询后,等待下一次时间间隔再次触发轮询事件。CollectTimer为数据采集与显示定时器,实现按固定的时间间隔对读取监控缓存数据,并显示到软件界面。SaveDataTimer为数据保存定时器,实现按固定的时间间隔将数据保存到数据库。3.6 利用委托

32、跨线程更新监控界面数据上文中提到,程序定义了一个效劳器计时器CollectTimer,用于采集监控数据和更新监控界面。在.NET Framework的编程环境中,对界面层的,必须在此控件的根底窗口句柄的线程上执行,而CollectTimer作为效劳器计时器,并不在界面线程中,因此采用委托处理,调用Form.Invoke()方法来查找具有当前控件的根底窗口句柄,并执行委托。相关源代码如下:/ 定义监控界面更新委托/publicdelegatevoidDisplayMonitorData();/ 监控数据更新委托方法/publicvoid DoDisplayMonitorData() if (th

33、is.InvokeRequired) DisplayMonitorData delegateMethod = newDisplayMonitorData(this.DoDisplayMonitorData);this.Invoke(delegateMethod); else this.monitorDataBindingSource.DataSource = this.MonitorDataList;this.dataGridView1.Refresh(); 4、异常处理4.1 硬件资源的故障处理在系统运行过程中,通信线路与传感器故障可能导致系统运行异常。在传感器管理功能模块中,每增加一个从机

34、地址,先判断从机地址是否重复,再对该从机进展通信检测,如果检测失败,则不允许添加该从机地址。在监控运行中,首先对翻开串口连接进展测试,如果连接成功,则进展与从机的通信操作,否则中断程序运行,抛出异常消息。在与从机的轮询中,如果*个传感器在超时围没有获得响应,则中断对该从机的请求,继续对下一个从机进展请求。4.2 退出监控模块时,释放相关的串口资源和Timer对象在退出监控模块时,释放相关的串口资源,以免在主窗口再次启动监控窗口时,发生串口资源占用。同时释放Timer对象,因为基于效劳器的计时器会在当前窗体关闭后再次引发Elapsed 事件,引起异常。为此在监控窗体程序中,定义了一个重载方法,当

35、监控窗体关闭时,释放相关资源。/ 关闭监控窗口时释放资源/protectedoverridevoid OnClosing(CancelEventArgs e) PollingTimer.Stop(); CollectTimer.Stop(); SaveDataTimer.Stop(); mb.Close();base.OnClosing(e); 5、总结此系统开发完成后,经过了724小时的不连续测试,运行稳定正常。本系统采用MODBUS通信协议RTU报文格式及匹配的硬件设备,实现了以PC机为主机,多个温湿度传感器为从机的多机通信。本系统设计的装置可通过PC机DB9串口连接或USB接口连接,装置安装和布线简单方便,实用性高,可应用于烟叶生产和其它多种场合。通过监控软件的开发,较好的实现了对雪茄烟叶发酵温湿度的实时监控,数据显示和保存,方便科研人员查询和分析相关数据。今后,还可对该系统做进一步开发,如温湿度上下限的报警、温湿度数据的统计与分析。如实际需要,还可采用无线传感器模块,节省布线操作。参考文献1MODBUS通讯协议中文版本1

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!