首页
搜索
历史搜索
首页 > 新闻中心 > 技术应用

ModbusRTU通信协议在智能仪表应用

2022-01-10 16:34:25| 来源:网络| | 0

        随着时代的进步,越来越多的企业开始向生产和管理自动化转变,各种智能仪表不断地应用到生产生活的各个领域。在工业控制方面,RS一485总线由于平衡差分传输特性具有的抗干扰性强、传输距离远、有较大级联能力等特点,非常适合组成工业级的多机通信系统。ModbusRTU通信协议是目前国际智能化仪表普遍采用的主流通信协议之一。在各种工业仪器仪表大量使用的今天,ModbusRTu通信协议和RS一485总线得到了广泛的应用。本文主要从应用角度介绍在工业控制系统中实现该技术的具体方案。

        

        1、Modbus RTU通信协议

        Modbus RTU是Modicon公司开发的一种通信协议。它采用主从应答方式工作,其规范已在互联网上公布,是一种在工业领域被广为应用的真正开放的标准网络通信协议。由于它具有免收许可费用,易于集成不同的设备,简单易用,开发成本低,有着广泛的知识资源支持等特点,已经成为一种公认的通用工业标准。有了这个标准,不同厂商生产的控制设备可以连成工业网络,进行集中监控。目前,国内许多生产商已在其产品和系统中遵循该协议标准。Modbus明U协议有两种传输模式,即RTU模式和ASCII模式。其中RTU模式信息帧中的8bit数据包括两个4 bit十六进制字符。相对于ASCII模式,RTU模式表达相同的信息需要较少的位数,且在相同通信速率下具有更大的数据流量。因此通常情况下,一般工业智能仪表仪器都是采用RTU模式的Modbus规约。

        

        2、通信信息传输过程

        信息传输为异步方式,并以字节为单位¨J。在主站和从站之间传递的通信信息是11 bit的字格式,如表1所示。

        通信数据的信息帧格式

        通信数据的信息帧格式Ⅲ如表2所示。

        表2数据格式

        通信数据的信息帧格式

        当发送设备(主机)发送通信命令至接收设备(从机)时,符合相应地址码的从机接收通信命令,并根据功能码及相关要求读取信息。如果CRC校验无误,则执行相应的任务,然后把执行结果返送给主机。返回的信息中包括地址码、功能码、执行后的数据以及CRC校验码。如果CRC校验出错,就不返回任何信息。地址码是每次通信信息帧的第一个字节(8 bit:0~255)。这个字节表明由用户设置地址的从机将接收主机发来的信息。每个从机都必须有惟一的地址码,并且只有符合地址码的从机才能响应回送信息。当从机返回信息时,返回数据均以各自的地址码开始。功能码是每次通信信息帧传送的第二个字

        节。Modbus通信规约可定义的功能码为1~127。

        作为主机请求发送,通过功能码告诉从机应该执行什么动作。作为从机响应,从机返回的功能码与主机发送来的功能码一样,表明从机已响应主机并且已进行相关的操作。Modbus部分功能码如表3所示。

        Modbus部分功能码

        表3 Modbus部分功能码

        数据区包括需要由从机返送何种信息或执行什么动作。这些信息可以是数据、参考地址等。例如,主机通过功能码03告诉从机返回寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度),则返回的数据包括寄存器的数据长度及数据内容。智能仪表一般使用固化好通信协议及工作指令的单片机。测控系统多采用的是单发多收的通信机制,因此在智能仪表中需允许用户预先设定本机的地址码,并且保证不能重复。此外,要注意通信波特率必须与上位机的通信波特率相匹配。在智能仪表的软件开发中,遵循Modbus规约的通信帧结构需对上位机传输的命令进行解析,非呼叫对象应能及时重新恢复,等待接收状态,响应呼叫的仪表要解析命令代码,并进行相应的功能处理,对非法的命令操作要能回送报错信息。

        

        3、上位机软件设计

        上位机的通信软件采用VB6.0开发。在VB6.0中可以使用MSComm控件对串口进行编程。该控件主要为RS一232的通用串口而设计。因此为了利用PC上现有的RS一232接口,通常使用RS一232/485转换器。该转换器一般通过逻辑门电路控制RxD、TxD和GND信号,从而自动对半双工的RS一485串口进行控制。通过该转换器,就可以像开发通用的RS一232串口一样来快速开发基于RS一485串口的上位机通信软件。上位机通信软件主要包括初始化程序、命令字发送程序、上位机数据接收处理程序3部分。

        3.1初始化程序

        在初始化程序中,主要是设定好整个帧结构

        的命令数组、传输波特率以及一些必须的串口初

        始设定。具体的代码如下:

        ctrMSComm.InBufferSize=1024//开辟数据缓冲区

        ctrMSComm.InBufferCount=0 //清除接收缓冲区中的字符

        ctrMSComm.OutBufferSize=512 //设置传输缓冲区的大小

        ctrMSComm.InputMode=1 //设定为二进制的数据流方式

        ctrMSComm.InputLen=0 //一次读人全部的数据

        ctrMSComm.RThreshold=51 //接收到所需的字符个数后触发OnComm事件

        ctrMSComm.CommPort=1 //设定需要

        的串口

        etrMSComm.Settings=”9 600,n,8,1”//设定波特率和校验方式

        ctrMSComm.PortOpen=True //打开通信端口

        上面的代码一般都是串口初始化必须进行设定的几个部分。根据个人需要可以在VB6.0中做一个初始化界面,对各个参数(如串口号、波特率等)进行自由设定,以提高初始化的灵活性和通用性。

        3.2命令字发送程序

        命令字发送应严格按照Modbus规约所设计的帧格式和上下位机在该规约基础上所定义的通信协议。发送该指令的目的智能化配电监控单元返回三相相电流和线电压的有效值、频率、有功功率、无功功率、功率因数等参数。

        3.3上位机数据接收和处理程序

        MSComm控件提供了两种处理通信的方式:事件驱动方式和查询方式。本文采用的是事件驱动方式。该方式是处理串行端口交互作用的一种非常有效的方法。在许多情况下,当事件发生时需要得到通知,例如在串口接收缓冲区中有字符时可以利用MSComm控件的OnComm事件捕获并处理这些通信事件;OnComm事件还可以检查和处理通信错误,开发者可以在OnComm事件处理函数中加入自己的处理代码。事件驱动方式的优点是程序响应及时,可靠性高。一般从下位机发送的数据都有一定的帧度,特别是对于一些固化好的智能仪表。因此好的方法是按照通信回送的帧长度,在上位机序中分别开辟两个同样长度的数组。一个作为收数组,用来一次性接收串口缓冲区中的数据;一个为安全数组,用来复制接收数组中的数据进行解析。这样可以提高整个系统的容错能力具体的代码如下:

        Private Sub

        ctrMSComm—OnComm()

        Dim

        bytInput()As Byte

        Dim

        bytInSafe()As Byte

        Dim

        intlnputlen

        As

        Integer

        Select CasectrMSComm.COmmEvent

        Case comEvReceive //收到ctrM—

        SComm.RThreshold个字符后触发该事件

        in

        tlnputlen=ctrMSComm.InBuffer-

        Count

        bytInput=ctrMSComm.Input

        //读取接收缓冲区中的数据

        ReDimPreserve

        bytlnput(intlnputlen)

        Fori=0to

        intInputlen

        bytlnSafe(i)=bytInput(i)

        Nexti

        End Select

        End Sub

        代码中的bytInput()为接收数组,而bytIn—Safe()就是另外开辟的安全数组。在接收数组中,bytlnput(0)为从机地址“&H01”,bytlnput(1)为功能码“&H03”,bytlnput(2)为返回的数据长度,bytlnput(3)和bytlnput(4)分别为寄存器地址是0103的高8位和低8位。在PDM一810PLM智能化配电监控单元中该寄存器存储的是AB线电压的有效值H』。通过下面的程序可将AB线电压的有效值以十进制的形式表示

        出来。

        DimValuel As

        Single

        DimValue2 As

        Single

        Valuel=bytInput(3) //将二进制数转

        换成十迸制数

        Value2=bytlnput(4)

        Text.Text=Format(fValuel木256+Val-ue2)木0.1,“000.0”) //将高位和低位合成一个十进制数并保留一位小数,小数点的位置可根据实际需要灵活设置(对应“0X06”功能码)

        3.4 CRC校验码的实现方法

        CRC(Cyclic Redundancy Check)即循环冗余码校验,它利用生成多项式产生校验位进行编码。目前在智能仪表中普遍使用的是CRC16(美国标准)校验码,其计算方法如下:

        (1)预置1个16bit的寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器。

        (2)把第一个8bit二进制数据与16bit的CRC寄存器的8bit相异或,把结果放于CRC寄存熙内门明;

        (3)把cRc寄存器的内容右移一位,用0填补最高位,并检查右移后的移出位。

        (4)如果移出位为0,则重复第(3)步;如果移出位为1,则CRC寄存器与多项式&HA001进行异或。

        (5)重复步骤(3)和(4),直到右移8次,这样整个8bit数据就全部进行了处理。

        (6)重复步骤(2)~(5),进行通信信息帧下一个字节的处理。

        (7)将该通信信息帧所有字节按上述步骤计算完成后,得到的16bit CRC寄存器的高、低字节进行交换。最后得到的CRC寄存器内容即为CRC校验码。

        

        4 结 语

        在实际的测控系统项目开发中,通过VB6.0结合SQL数据库编程,开发了基于Modbus规约的上位机测控管理软件,并利用RS一485总线实现了对下位机的监控和数据处理。充分利用现有的、成熟而规范的通信协议能最大限度地节约开发成本,降低开发风险,提高系统的兼容性和可移植性。ModbusRTU规约作为智能仪器仪表领域大量使用的国际化通信协议,必将得到更加广泛的应用。

        

联系销售
销售王经理微信 销售王经理
微信公众号 微信公众号
服务热线
400-6688-400