目录
1.什么是Modbus通信协议?
在讨论什么是Modbus之前,我们需要先了解一下工作学习中经常提到的“通信协议”是什么?
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。这些规则或约定通常用于计算机与计算机之间的连接、网络设备与终端设备的连接,以及两层网络设备之间的连接。想要经过各种通信链路把处于不同位置的设备互连起来就需要一个数据通信系统,而想要实现互相通信,必须有一套彼此都共同遵守的通信约定。这些通信约定就是通信协议,也称为通信规程。通信协议是为网络数据交换而制定的规则、标准或约定。例如,网络中一个微机用户和一个大型计算机的数据交换必须有一定的约定,才能使具有完全不同的数据格式以及数据表示方法的计算机之间实现通信。这种约定就是通信协议。它包含数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题。通信协议通常由底层通信协议(传输层、网络层和数据链路层协议)和高层通信协议(包括会话层、表示层和应用层协议)组成。TCP/IP协议是互联网上广泛使用的通信协议。此外,通信协议还有串行通信协议、并行通信协议、RS-485/232和RS422等。
那么生动一点讲,什么是通信协议呢?
比如,现在有一个小帅和一个小美一见钟情,他们想要互相表达爱意,但是小帅只会中文,小美只会英文,双方说的话对方根本听不懂。最后小美好像感受到中文丰富的词汇量,下定决心跟着小帅苦学中文,互诉衷肠。此时两人达成了“通信协议”,使用中文进行交流。
那么Modbus协议呢,它是一种应用层报文传输协议,可以在各种介质上进行传输,经常应用于RS232/485、以太网口、WIFI无线等各种电气接口,又因为Modbus协议是标准且开放的,用户可以免费、放心地使用,不会侵犯知识产权;也因为Modbus协议设计简单,易于实现和维护,使用简洁的数据结构和指令集,实现读取和写入寄存器的功能,适用于小型系统和简单设备的通信。因此Modbus的应用极其广泛。
1.1.Modbus通信机制
现在知道了什么是通信协议,Modbus有哪些优势。那么具体如何实现Modbus通信呢,就要先了解下设备之间使用这个协议时是如何进行对话的。
在项目应用中,我们经常把Modbus的对话方式称为“一问一答”。
如何理解呢?小帅小美再次粉墨登场。
小帅问:“美,食否?”
小美答:“帅,俺还饿着捏。”
这就完成了一次Modbus读取寄存器通信,“食否”就是主机设备进行“问询”从机设备的寄存器数据的操作,小美回复应答说“还饿着”,此时主机小帅就获取到了从机寄存器的数据也就是“饥饿”信息。
标准的Modbus对话方式,就是严格的遵循,一问一答机制,主机设备问询“吃了么”,从机设备才可以回复“饿着呢”。如果从机设备主动告诉主机设备“我饿着呢”,那么主机设备是听不到的,是无法完成一次寄存器读取通信的。
刚才的举例是读取寄存器的操作,那么写入寄存器的如何实现的呢。(从一片虚无之中,传来两道声音:“我们又回来了”。)
小帅告诉小美:“美,吃个煎饼果子吧!”
小美答:“好的,我已经吃了。”
这就完成了一次Modbus写入从机设备的寄存器通信,主机设备要改写从机设备中寄存器的数据,于是发送了“吃个煎饼果子”命令,从机设备(小美)回答“我已经吃了”,也就是告诉主机我已经完成数据写入。完成“一问一答”或者说“一写一答”的对话方式。
1.2.什么是主机从机设备?
主机设备和从机设备是核心控制器和多个设备之间通讯架构中的两个基本角色。
主机设备通常指控制整个通信系统工作或协调多个设备之间通讯的主要设备。它负责向从机发送指令并接收从机的数据。主机可以是计算机的主机等,是用户存储数据、执行各种操作的硬件设备。主机设备也可以是云端服务器、MCU、边缘网关、物联网控制器等。
从机设备则是在反馈数据给主机,接收主机指令的设备。从机设备可以是传感器、IO开关设备等,而主机设备也可以是一个从机设备。主从关系不由设备类型决定,由进行通信时,设备是问询方还是反馈、接收方的角色决定。
1.3.什么是寄存器?
Modbus寄存器是Modbus通信协议中用于存储数据的一种组件,而从机设备应答给主机的数据就放置在一个个寄存器内,当主机问询是,就会将寄存器的数据封装成Modbus协议回复给主机。
1.3.1.存储区分配
在Modbus协议中,数据模型包含了四种寄存器类型,也叫四种存储区,分别是输出线圈寄存器、输入线圈寄存器、输入寄存器和保持寄存器。每种寄存器都有其特定的用途和特性,这里以常用的5段长度进行说明,如下表所示:
区号 | 名称 | 读写 | 范围 |
0区 | 输出线圈 | 可读可写 | 000001-065536 |
1区 | 输入线圈 | 只读 | 100001-165536 |
3区 | 输入寄存器 | 只读 | 300001-365536 |
4区 | 保持寄存器 | 可读可写 | 400001-465536 |
备注:Modbus协议是16进制格式,范围上限的Modbus地址为0XFF FF,所以对应是65536个地址数量,但一般常用范围只是1-9999。
1.3.2.Modbus功能码
Modbus协议同时规定了二十几种功能码,这些功能码相当于打开各种类型寄存器大门的钥匙,只有主机发送的Modbus报文中包含寄存器对应的功能码,从机的寄存器数据才允许被读取或者写入修改。其中常用的功能码只有8种,用于针对上文存储区的读写,如下表所示:
功能码 | 功能说明 |
01H | 读取输出线圈 |
02H | 读取输入线圈 |
03H | 读取保持寄存器 |
04H | 读取输入寄存器 |
05H | 写入单个输出线圈 |
06H | 写入单个保持寄存器 |
0FH | 写入多个输出线圈 |
10H | 写入多个保持寄存器 |
2.什么是Modbus RTU?Modbus TCP?
Modbus协议的各种类型在工业自动化和控制系统领域具有广泛的应用,能够实现不同设备之间的数据交换和通信。一般不同的场景会使用对应惯用的Modbus协议类型。主要分为Modbus RTU/TCP/Ascii三种常用协议,每种协议有具体的数据帧结构,按照规定的格式就可以组成一条报文。也就是问询和应答都只需要通过一条报文内实现。接下来主要解析下RTU和TCP协议格式。
2.1.Modbus RTU协议
RTU习惯用于RS232/485等串行通信接口,一条报文的数据帧结构包含地址域、功能码、数据域和CRC校验。下表以线圈寄存器和保持寄存器的读写交互进行举例:
其中地址域为从机地址,CRC-16/Modbus校验范围包括CRC之前所有内容,文章篇幅受限,如需全部表格,各位大帅比和大漂亮可以评论留言,小C会尽快发给各位。
2.2.Modbus TCP协议
Modbus TCP是一种基于TCP/IP网络的Modbus协议变体,它将Modbus协议封装在TCP/IP协议栈中,使用以太网作为物理层,通过TCP连接来实现设备之间的通信。在Modbus TCP协议中,数据以报文的形式进行传输,报文由MBAP(Modbus应用协议)标头和协议数据单元(PDU)组成。MBAP标头特定于Modbus TCP,包含有关消息的信息,如事务标识符、协议标识符、长度和单元标识符。而PDU则包含功能代码和数据,对于所有Modbus协议都是通用的。数据帧格式可参考下表:
计数:内容任意,应答帧返回的与问询帧的计数相同,一般每次通信后会被要求加一以作区分。
协议标识符:00 00 代表 Modbus 协议。
数据长度:二个字节,从设备地址开始算起的命令帧长度(RTU 命令帧去掉校验后的长度)。
说明:TCP 和 RTU 协议类似,把 RTU 协议的CRC校验码去掉,然后在 RTU 协议的开始前加上相应内容即Modbus TCP报文格式。
3.什么是RS485/232/422?
RS485、RS232和RS422都是串行通信接口标准,是承载这些通信报文的物理接口,每种串口类型都具有特定的特性和应用领域。
RS485:具有传输距离远、支持多节点连接等特点。采用差分传输方式,可以在较长距离范围内进行可靠的数据传输,最长可达一公里以上,但需注意长距离通信下环境干扰问题。RS485支持两线制和四线制两种接线方式,但多采用的是两线制接线方式(A对A,B对B接线),这种接线方式为总线式拓扑结构,在同一总线上最多可以挂接32个节点。在RS485通信网络中,一般采用的是主从通信方式,即一个主机带多个从机。
RS232:一种点对点、异步、串行、全双工的串口标准。它具有数据传输稳定可靠、使用方便等优点,但传输距离较短,最长约15米。
RS422:具有传输距离远、抗干扰能力强、接口简单等优点。由于采用平衡驱动方式,RS422接口可以有效抵抗电磁干扰,保证数据传输的稳定性。
这三种接口标准各有其特点和应用领域,选择哪种接口取决于具体的通信需求和环境条件。
4.Modbus错误码表
当使用正常功能码进行问询和应答时,使用的都是下发第一列功能码,如果遇到从机寄存器地址不包含主机问询地址等问题时,就会回复异常功能码。
功能码 | 功能说明 | 异常功能码 |
01H | 读取输出线圈 | 81H |
02H | 读取输入线圈 | 82H |
03H | 读取保持寄存器 | 83H |
04H | 读取输入寄存器 | 84H |
05H | 写入单个输出线圈 | 85H |
06H | 写入单个保持寄存器 | 86H |
0FH | 写入多个输出线圈 | 8FH |
10H | 写入多个保持寄存器 | 90H |
5.如何在物联网项目中实际应用?
根据前面的了解,可以知道Modbus在工业工控等各个领域都有广泛的应用。Modbus协议应用在物联网控制器,可以用来监听控制传感器、电机、电表、变频器等设备;同时也可以将这些感知层设备的数据处理完成并上传至工控机或者云端平台进行展示。小C处于物联网行业,接下来以物联网行业的逻辑进行阐述。
根据上图,一般物联网项目可以大致分为三层:感知层、传输层、云端展示层。
感知层:一般代表能够感知和测量各种物理量的设备,如温度、湿度、光照、压力等。此类设备可以是水质传感器、土壤PH传感器、温湿度传感器等。
传输层:负责将感知层的设备数据获取、处理并通过各种网络形式上传给云端。如有人物联网可以提供以太网 、Wi-Fi、蓝牙、LoRa、NB-IoT、4G、5G、Cat-1等各种网络制式的物联网网关控制进行数据处理传输。
云端展示层:物联网网关上传的数据进行集中处理显示,统一监控全国各地的设备情况(如在离线、报警)。一般云端支持的功能可参考下图。
传输层和感知层之间一般通过485/232/422串口或者网口进行采集通信。传输层和云端层可以通过以太网、4/5G、WIFI等网络进行传输。
5.1.物联网实战演示项目
现在用有人物联网的USR-M300图形化编程物联网控制器用于实际项目演示。需要准备:M300数量1台、网线 2根、电源适配器一个。
下图为M300应用拓扑:
首先进行M300和感知层的链接,这里使用Modbus Slave软件进行模拟感知层从机设备,此时M300为主机设备通过RS485串口线传输Mobus RTU协议进行数据监控。RS485接线需要A接A,B接B。从机设备和主机设备的串口参数保持一致。
然后输入Modbus协议要求从机地址、功能码、寄存器地址。下图中我选择了对保持寄存器的0X00 00地址进行了读取,读取后的数据作为16位无符号数据保存。
寄存器地址计算方法:
寄存器的填写(需要知道从机设备的寄存器起始地址)(不清楚的需要联系终端设备的厂家)
功能码03H或06H,起始地址0000H,则填:40001;
功能码04H,起始地址000AH,则填:30011;
功能码01H或05H,起始地址0002H,则填:00003;
功能码02H,起始地址0003H,则填:10004。
格式为:功能码+寄存器地址(16进制地址转为10进制)+1
计算举例:功能码03H或06H,起始地址0000H,则填:40001;
操作为只读就是功能码为03,可以确认是对保持寄存器操作,对应存储区就是4,寄存器地址16进制转换为10进制就是0000,然后+1;所以十进制地址就是40001;
最后将M300链接有人物联网的云平台,就可以将数据上传展示。
数据集中起来,就可以为实现数字化工业中的远程维保、实时报警、大数据计算、AI人工智能等重要功能的数据基石。
这次用到的有人物联网M300简单演示了Modbus边缘采集并上报云端的功能,那么此物联网控制还可以做什么呢。直接调用官网介绍~www.usr.cn
从路由VPN到二次开发数据处理,从串口总线到可拓展的DO/DI/AO/AI模块,功能可以说非常齐全了。
话不多说,一起学习,一起进步!欢迎大帅比和大漂亮随时交流!