• Modbus协议介绍


    Modbus协议介绍

    简介

    Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于 1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus 已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。

    类型

    Modbus协议属于应用层的报文传输协议,Modbus协议本身是个比较泛的说法,它有三种类型,分别是Modbus ASCII,Modbus RTU,Modbus TCP/IP,三者的协议并不相同,但有类似的地方,所以说Modbus协议时,最好说这三种类型中的一种

    在这里插入图片描述

    Modbus数据模型

    数据模型是对可访问数据的一种抽象,Modbus协议的数据模型定义了四种可访问的数据,分别是:
    在这里插入图片描述

    既然数据模型是一种抽象,在实际使用时必须将其映射到真实的物理存储区才能被访问。

    Modbus协议允许设备将四种数据分别映射到不同的存储区块中,各个区块之间相互独立,使用不同的功能码可读取到不同的数值,如下图所示:

    在这里插入图片描述

    Modbus协议也允许设备将四种数据映射到同一存储区块中,这样通过不同的功能码读取数据可能会得到相同的数据(比如:输入寄存器和保持寄存器为同一物理区块),如下图所示:

    在这里插入图片描述

    线圈:因为Modbus最初是为PLC服务的,所以线圈是PLC相关的术语,实际上就可以类比为开关量(继电器状态),每一个bit对应一个信号的开关状态,要么是1,要么是0;所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈和写多个线圈;

    离散输入:如果线圈寄存器理解了这个自然也明白了。离散输入寄存器就相当于线圈的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。

    保持寄存器:这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。一般对应参数设置,比如我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写。

    输入寄存器:这个和保持寄存器类似,但是也是只支持读而不能写,一般是读取各种实时数据。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值。

    规律:

    输入:表示这个存储区只能读,不能写

    其余的则可读可写

    注意:网上的资料对Modbus数据模型这一部分的介绍各不相同,一开始看这部分资料时被搞得乱七八糟,为什么同一种东西会有这么多不同的说法,无奈把说法不同但却是同一种东西汇总一下:

    线圈 = 输出线圈 = 开关量输出 = 位状态

    离散量输入 = 输入线圈 = 开关量输入

    保持寄存器 = 输出寄存器 = 寄存器

    Modbus数据模型 = PLC存储区

    Modbus地址模型

    也就是真实的物理存储区

    存储区范围:分为5位和6位,对应了标准地址和扩展地址;如果使用的是5位标准地址,则4种存储区分别用5位地址中的首位来区分,如线圈是0,离散量是1,输入寄存器是3,保持寄存器是4,剩下的4位就从1 ~ 9999开始编址,表示一片连续的地址

    有些设备是6位的地址,编址方法跟5位的类似,只不过地址最大只能到65536

    数据模型地址前缀标号5位6位访问方式
    线圈000001 ~ 09999000001 ~ 065536读/写
    离散量输入110001 ~ 19999100001 ~ 165536只读
    输入寄存器330001 ~ 39999300001 ~ 365536只读
    保持寄存器440001 ~ 49999400001 ~ 465536读/写

    通讯信息传输过程

    通信的本质其实就是要么我说,你听,要么你说,我听,那应用到主机与从机之间时,就是要么主机往从机写入数据,要么主机往从机读取数据。

    当通讯命令由发送设备(主机)发送至接收设备(从机)时,符合相应地址码的从机接收通讯命令,并根据功能码及相关要求读取信息,如果CRC校验无误,则执行相应的任务,然后把执行结果(数据)返送给主机。返回的信息中包括地址码、功能码、执行后的数据以及CRC校验码。如果CRC校验出错就不返回任何信息。

    地址码

    地址码是每次通讯信息帧的第一字节(8位),从0到247。其中0为广播地址,从机的实际地址范围为 1 ~ 247;这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。当从机回送信息时,回送数据均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。相应的
    地址码表明该信息来自于何处。

    功能码

    对存储区的操作有:读和写,分别有以下的组合,再给这些操作编个号,就是功能码

    功能码是每次通讯信息帧传送的第二个字节。ModBus通讯规约可定义的功能码为1到127。有些PLC器件仅用到其中的一部分功能码。作为主机请求发送,通过功能码告诉从机应执行什么动作。作为从机响应,从机返回的功能码与从主机发送来的功能码一样,就表明从机已响应主机并且已进行相关的操作。

    在这里插入图片描述

    数据区

    数据区包括需要由从机返送何种信息或执行什么动作。这些信息可以是数据(如︰开关量输入/输出、模拟量输入/输出、寄存器、参考地址等。例如,主机通过功能码03告诉从机返回寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度),则返回的数据包括寄存器的数据长度及数据内容。对于不同的从机,地址和数据信息都不相同

    CRC校验

    主机或从机可用校验码进行判别接收信息是否正确。由于电子噪声或一些其它干扰,信息在传输过程中有时会发生错误,错误校验码(CRC)可以检验主机或从机在通讯数据传送过程中的信息是否有误,错误的数据可以放弃(无论是发送还是接收),这样增加了系统的
    安全和效率。

    MODBUS 通讯协议的CRC(冗余循环码)包含2个字节,即16位二进制数。CRC码由发送设备(主机)计算,放置于发送信息帧的尾部。接收信息的设备(从机)再重新计算接收到信息的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错。

    CRC校验码可用一些工具计算出,在软件编程中一般用查数组的方式

    报文格式

    Modbus RTU报文格式:从机地址(设备编号)+ 功能码 + 数据 + 校验 (只要是Modbus协议,都遵循这样的报文格式,其中数据是个泛指,还分为读取和回应两种不同的数据)

    在这里插入图片描述

    读单个或多个线圈(位状态)

    主机发送:从机地址 01 起始地址 读取数据个数 CRC校验

    从机返回:从机地址 01 读取到的数据长度 数据DATA1…DATAN CRC校验

    在这里插入图片描述

    写单个线圈(位状态)

    主机发送:从机地址 05 起始地址 要写入的数据 CRC校验

    从机返回:从机地址 05 起始地址 写入的数据 CRC校验

    写数据时,从机返回的数据与主机发送的数据一样

    在这里插入图片描述

    实际例子

    读单个或多个线圈(开关量)

    例如︰主机要读取地址为01,开关量DO1,DO2的输出状态。从机数据寄存器的地址和数据为︰

    起始位地址D0寄存器数据(16进制)备注
    000002DO2输出状态为1,DO1输出状态为0

    主机发送的报文格式:

    主机发送字节数发送的信息备注
    从机地址101发送至地址为01的从机
    功能码101读开关量输出状态
    起始地址20000起始位地址为0000
    读数据长度20002读取两个开关量状态
    CRC码2BDCB由主机计算得到CRC码

    从机响应返回的报文格式:

    从机响应字节数返回的信息备注
    从机地址101来自从机01
    功能码101读开关量输出状态
    数据长度1011个字节(8个bit位)
    D0状态数据102D0寄存器内容
    CRC码2D049由从机计算得到CRC码

    写单个保持寄存器

    例如∶主机要把数据07D0,保存到地址为002C的从机寄存器中去(从机地址码为01)。

    主机发送的报文格式:

    主机发送字节数发送的信息备注
    从机地址101发送至地址为01的从机
    功能码106写单个保持寄存器
    起始地址2002C要写入的寄存器地址
    写入数据207D0写入的新数据
    CRC码24BAF由主机计算得到的CRC码

    从机响应返回的报文格式:

    与主机发送的报文格式及数据内容完全相同。

    注意:主机发送的报文数据中,寄存器的起始地址是相对地址,像002C是相对40001来说的,00001、10001这些是绝对地址;

    通过相对地址算出绝对地址要先确定数据模型的地址,如读保持寄存器,起始地址是006B,那006B是107,对应的地址就是40108,

    如果是输入寄存器,起始地址也是006B,那对应的地址就是30108

    可挂载的设备数量

    首先在485总线上,MODBUS RTU协议理论是可以挂200+台设备,但实际应用中,由于阻抗等原因,一般是32台,除去自身的话,就是31台。

    ​ RS485总线可以连接256个设备,但测试后发现这个数字有比较大的差异。有一种说法认为专门开发串行嵌入式的RS485总线只能连接32个节点,这由自身的驱动能力决定的。有人说网上的各种485总线产品可以支持128个,也有人说可以支持256个,甚至高达400个,那么RS485转换器到底支持多少个?

    485通信中的一个串行端口能控制多少台设备的问题,由485网络中的电特性和协议特性决定。电特性就是,为了保证485网络中的特征阻抗在允许范围内,应该是120欧姆左右,因为连接的设备越多特征阻抗越小,所以在485网络中一般是120欧姆的终端,同时保证信号的衰减在允许的范围内。因此,有长距离传输和中继的情况。协议特性是在485网络上传输的协议支持的地址范围,Modbus应该是32个,能连接31个设备。

    连接方式

    RS-485连接采用菊花链方式连接,而不能采用星型网络拓扑

    在这里插入图片描述

  • 相关阅读:
    在Windows环境与Linux环境下搭建Zookeeper单机环境与集群环境
    365天挑战LeetCode1000题——Day 089 删除某些元素后的数组均值 设计位集 最大加号标志
    Grafana系列-统一展示-6-Zabbix仪表板
    Redis与分布式-哨兵模式
    4.2冰达机器人:视觉实例-机器人视觉循线、视觉实例-调整循线颜色
    django 商品及购物车逻辑实现
    【Redis】数据结构---String
    【mysql篇-基础篇】通用语法2
    VSCode上手指南
    HMS Core Discovery第13期回顾长文——构建手游中的真实世界
  • 原文地址:https://blog.csdn.net/weixin_46251230/article/details/126682659