首页 理论教育 ModbusRTU协议介绍

ModbusRTU协议介绍

时间:2023-06-21 理论教育 版权反馈
【摘要】:Modbus通信协议是Modicon公司提出的一种报文传输协议,Modbus协议在工业控制中得到了广泛的应用,例如PLC、变频器、人机界面、DCS和自动化仪表等,它已经成为一种通用的工业标准。根据传输网络类型的不同,分为串行链路上的Modbus和基于TCP/IP的Modbus。Modbus协议有ASCII和RTU这两种报文传输模式,S7-1200采用RTU模式。STEP 7 Basic为Modbus RTU通信设计了专用的指令。表7-5 S7-1200 MB_SLAVE Modbus的诊断功能S7-1200 MB_SLAVE Modbus的诊断功能见表7-5。MB_SLAVE支持来自其他Modbus主站的广播写入请求。

ModbusRTU协议介绍

Modbus通信协议是Modicon公司提出的一种报文传输协议,Modbus协议在工业控制中得到了广泛的应用,例如PLC、变频器、人机界面、DCS和自动化仪表等,它已经成为一种通用的工业标准。

Modbus串行链路协议是一个主-从协议,采用请求-响应方式,总线上只有一个主站,主站发送带有从站地址的请求帧,具有该地址的从站接收到后发出响应帧进行应答。子站没有收到来自主站的请求时,不会发送数据,子站之间也不会互相通信。

根据传输网络类型的不同,分为串行链路上的Modbus和基于TCP/IP的Modbus。

Modbus串行通信可以使用RS 485接口,短距离点对点通信也可以使用RS 232接口。

Modbus协议有ASCII和RTU(远程终端单元)这两种报文传输模式,S7-1200采用RTU模式。报文以字节为单位进行传输,采用循环冗余校验(CRC)进行错误检查,报文最长为256B。STEP 7 Basic为Modbus RTU通信设计了专用的指令。

使用Modbus通信功能代码1、2、4、5和15,主站可以读写PLC输入/输出过程映像中的位和字(见表7-3)。

表7-3 MODBUS地址与CPU的过程映像的映射关系

978-7-111-47789-1-Chapter07-31.jpg

使用Modbus通信功能代码3、6和16,主站可以读写Modbus保持寄存器(即数据块)中的字(见表7-4)。

表7-4 MODBUS保持寄存器与PLC的保持寄存器DB地址的映射关系

978-7-111-47789-1-Chapter07-32.jpg

S7-1200 MB_SLAVE Modbus的诊断功能见表7-5。

表7-5 S7-1200 MB_SLAVE Modbus的诊断功能

978-7-111-47789-1-Chapter07-33.jpg

MB_SLAVE支持来自其他Modbus主站的广播写入请求。不管请求是否有效,MBSLAVE都不对Modbus主站的广播请求做出任何响应。

在本次实例中,计算机作主站,S7-1200作从站,使用CM 1241 RS 232通信模块通信,硬件接线如图7-29所示。

1.组态通信模块

在STEP 7 Basic的项目视图中生成一个名为“计算机作主站的Modbus通信”的新项目(见随书光盘中的同名例程),CPU的型号为CPU 1214C。

978-7-111-47789-1-Chapter07-34.jpg

图7-29 硬件接线图

打开设备视图,将右边的硬件目录窗口的文件夹“\通信模块\RS232”中的模块拖放到CPU左边的101号槽。选中该模块后,选中下面的巡视窗口的“属性”选项卡左边窗口中的“端口组态”(见图7-30),在右边的窗口设置通信接口的波特率为19.2 kbit/s、无奇偶校验、数据位为8位、停止位为1位,不使用流控制,等待时间为0。

978-7-111-47789-1-Chapter07-35.jpg

图7-30 组态通信模块

2.指令参数

(1)MB_COMM_LOAD指令

用于Modbus通信的每个通信模块的通信接口,都必须在初始化组织块OB100中调用一次MB_COMM_LOAD指令(FB1080),来对通信接口组态。必须为每个接口分配一个唯一的背景数据块。应在CPU进入RUN模式时调用一次该指令来初始化通信接口(见图7-31)。

执行该指令后,就可以调用MB_SLAVE或MB_MASTER指令来进行Modbus通信。只有在需要修改参数时,才再次调用该指令。

输入参数PORT是通信端口标识符,可以在PLC变量表的“常数”选项卡中查找到数据类型为Port的该常数。

BAUD(波特率)可选300~115200 bit/s。

PARITY(奇偶校验位)为0、1、2时,分别为不使用校验、奇校验和偶校验。

FLOW CTRL(流控制)为0、1、2时,分别为无流控制、RTS始终为ON的硬件流控制和或带R/S切换的硬件流控制,硬件流控制仅适用于RS 232接口。

978-7-111-47789-1-Chapter07-36.jpg

图7-31 MB_COMM_LOAD指令

RTS_ON_DLY是从RTS激活直到传送报文的第一个字符之前的延迟时间,RTS_OFF_DLY是从传送最后一个字符直到RTS转入非活动状态之前的延迟时间,默认值为0(无延迟),RS 485接口不使用这两个参数。非零时(1~65535ms)将使用上述的RTS延迟,而与FLOW_CTRL的值无关。

RESP_TO是响应超时时间(5~65535ms,默认值为1000ms),如果从站在这一时间段内未响应,主站将在发送指定次数的重试请求后终止请求,并提示错误。

MB_DB是调用MB_MASTER或MB_SLAVE指令时分配的背景数据块。

ERROR为0表示未检测到错误,为1表示检测到错误,并且参数STATUS的错误代码有效。

(2)MB_SLAVE指令

MB_SLAVE(FB1082,见图7-32)指令用于为Modbus主设备发出的请求服务,Modb-usRTU主站发出请求后,从站通过执行MB-SLAVE来响应。应先执行MB_COMM_LOAD指令来初始化通信接口,MB_SLAVE指令才能通过该接口通信。某个通信接口同时只能作Modbus主站或作Modbus从站。

978-7-111-47789-1-Chapter07-37.jpg

图7-32 MB_SLAVE指令

Modbus指令不是通过中断事件来控制通信过程,用户程序必须通过轮询MB_SLAVE指令来控制通信过程。

MB_SLAVE必须以一定的速率周期地执行,以便能及时响应来自Modbus主站的请求。

MB_SLAVE的执行频率取决于Modbus主站的响应超时时间。响应超时时间是Modbus主站等待Modbus从站开始响应的时间,它是Modbus主站的参数。在该时间内至少应执行两次MB_SLAVE。

1)MB_SLAVE指令的输入参数。

MB_ADDR是Modbus RTU从站的地址(1~247),如图7-32所示。

MB_HOLD_REG是指向Modbus保持寄存器数据块的指针,该数据块是全局数据块,用来保存供主站读写的数据值。生成数据块时,不能激活“仅符号地址”属性。保持寄存器可以使用下面的数据结构:标准的字数组、指定的字结构和指定的复杂结构。

2)MB_SLAVE指令的输出参数

NDR为1表示Modbus主站已写入新数据,反之没有新数据。

DR为1表示Modbus主站已读取数据,反之没有读取。

ERROR为1表示检测到错误,参数STATUS中的错误代码有效。

3.RTU通信帧的基本结构

如图7-33是Modbus RTU通信帧的基本结构,从站地址为1~16,它和功能码均占一个字节,主站发出的命令帧中,PLC地址区的起始地址和CRC各占一个字,数据以字或字节为单位(与功能码有关),以字为单位时高字节在前,低字节在后(与S7-1200的规定相同)。但是值得注意的是发送时CRC的低字节在前,高字节在后(见图7-33)。(www.xing528.com)

978-7-111-47789-1-Chapter07-38.jpg

图7-33 RTU通信帧的基本结构

帧中的数据均为十六进制数,在下面的叙述中,帧内各字节的十六进制数据前面未加16#。

4.通信实验

(1)功能15

功能15用来改写多个数字量输出点。8位输出组成一个字节,请求帧(见图7-33)的起始位写入第一个数据字节的最低位。起始的输出位必须是一个字节的最低位(例如Q2.0),所写的输出点数(即位数)必须为8的整倍数。位数占一个字,字节数占一个字节。

【例7-1】用功能15改写1号站从Q0.0开始的8点输出值。15对应的十六进制数为16#0F,Q0.0的Modbus地址为16#0000,改写的点数为16#0008,如果写入的数据为16#38,请求帧为十六进制数010F 000000080138(不包括CRC,可以不输入右边的无效0)。

打开串口通信调试软件后(见图7-34),执行菜单命令“串口设置”→“串口属性”,设置计算机串口的波特率为19200 bit/s、8位数据位、无奇偶校验和1位停止位。执行菜单命令“串口设置”→“打开/关闭串口”命令,打开串口。

978-7-111-47789-1-Chapter07-39.jpg

图7-34 串口通信调试软件

将010F 000000080138输入“发送帧”文本框,用空格分隔各字节。

单击“计算校验码按钮,在出现的对话框(见图7-34中的当前对话框)的“校验内容”中,将自动显示出“发送帧”文本框中的数据。单击“CRC”按钮,生成的校验字为16#47FF。在“发送帧”文本框中,将CRC校验字添加到发送帧的末尾(低字节在前)。这样就生成了完整的十六进制数请求帧“010F 000000080138 FF 47”。

单击“发送”按钮,数据被发送到PLC。响应帧(见图7-33和图7-34)为十六进制数1 F 000854 D。可以用“清空”按钮清除“通信记录”文本框中的数据。

(2)功能1与功能2

功能1用来读单个或多个数字量输出点的ON/OFF状态,图7-35是请求帧的格式。响应帧(见图7-36)中PLC返回的输出位按每8位一个字节打包,第一位在返回的起始数据字节的最低位(第0位),如果请求读取的输出点数不能被8整除,返回的最后一个数据字节的高位用0填充。

978-7-111-47789-1-Chapter07-40.jpg

图7-35 功能1的请求帧

978-7-111-47789-1-Chapter07-41.jpg

图7-36 功能1的响应帧

【例7-2】用功能1读取1号站中Q0.0开始的8点输出值,Q0.0对应的Modbus地址为16#0000(占一个字),读取的点数为16#0008,CRC为16#CC3D,则请求帧为十六进制数1 10 0 0 8 3D CC,注意CRC的低字节在前。假设读出的QB0为16#38,则响应帧为十六进制数11 1 38 50 5A。

功能2用来读单个或多个数字量输入点的ON/OFF状态,帧格式和返回的输入位的数。

(3)功能5

功能5将某一个数字量输出点(Q)置位或复位。数据字16#FF00表示将输出置位为1,数据字16#0000表示令输出为0,其他的数据无效,响应帧与请求帧(见图7-37)相同。

【例7-3】用功能5将1号站的Q1.0置为1,Q1.0的Modbus地址为16#0008,请求帧与响应帧均为十六进制数1508 FF 0 D F8。

978-7-111-47789-1-Chapter07-42.jpg

图7-37 功能5的请求帧与响应帧

用功能5将1号站的Q1.0复位为0,请求帧与响应帧均为十六进制数1508004C 8。

(4)功能16

双击“程序块”文件夹中的“添加新的块”,单击打开的对话框中的“数据块”按钮,生成一个全局数据块(DB3),名称为“Data block 1”,不要选中“仅符号访问”多选框。双击打开DB3,生成一个名为Aray的数组,数据类型为“Aray[0..9]of WORD”。Modbus功能3、6、16中的Modb us地址与该数组中的元素方括号中的下标相同。

功能16写多个保持寄存器字,一个请求帧(见图7-38)最多可写120个字。字数占一个字,字节数占一个字节。

978-7-111-47789-1-Chapter07-43.jpg

图7-38 功能16的请求帧

978-7-111-47789-1-Chapter07-44.jpg

图7-39 功能16的响应帧

【例7-4】用功能16将数据16#1234、16#5678、16#ABCD和16#EEFF写入1号站中的Aray[2]~Aray[5],16对应的十六进制数为16#10,Aray[2]对应的Modbus地址为16#0002,请求帧为十六进制数1100204812345678 AB CD EF AA AC(见图7-40),响应帧(见图7-38和图7-39)为十六进制数110020460 A。

978-7-111-47789-1-Chapter07-45.jpg

图7-40 串口通信调试软件

打开数据块Data block 1(见图7-41),单击978-7-111-47789-1-Chapter07-46.jpg按钮,打开数组Array。单击978-7-111-47789-1-Chapter07-47.jpg按钮,启动程序状态功能。在“监视值”列,可以看到被主站写入的数据。

(5)功能3

功能3读取单个或多个保持寄存器的内容,最多可以读120个字。

【例7-5】用功能3读取1号站的DB3中的数组元素Aray[2]~Aray[3],Aray[2]对应的Modbus地址为16#0002,请求帧(见图7-42)为十六进制数13020265 CB,Aray[2]~N Aray[3]的值如果为16#1234和16#5678,响应帧(见图7-43)为十六进制数13 412345678817。

978-7-111-47789-1-Chapter07-48.jpg

图7-41 数据块中主站写入的数据

978-7-111-47789-1-Chapter07-49.jpg

图7-42 功能3的请求帧

978-7-111-47789-1-Chapter07-50.jpg

图7-43 功能3的响应帧

(6)功能6

功能6将一个数据字写入保持寄存器,响应帧与请求帧相同(见图7-44)。

978-7-111-47789-1-Chapter07-51.jpg

图7-44 功能6的请求帧与响应帧

【例7-6】用功能6将数据16#AA55写入1号站中的DB3中的数组元素Aray[4],其Modbus地址为16#0004,请求帧和响应帧均为十六进制数1604 AA 557694。用程序状态功能监视DB3,可以观察写入是否成功。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈