? ? ? ? 在学习Modbus协议时,如果没有相关的基础知识,每次看到线圈相关的概念时,可能会特别困惑,线圈到底是个啥东西,这段文字表达的是啥意思?那么本篇博客,就带大家 一起浅浅的了解一下线圈相关的知识。
? ? ? ? 第一次在Modbus接触线圈的概念,应该是在介绍功能码的时候,因为其中有一个功能码是“读线圈状态”。我们可以把“线圈状态”理解为一种寄存器,类似于计算机中的寄存器概念,所以读线圈状态就是读某个寄存器,而这个特殊的寄存器其实就是一个bit,也就是要么是on/1,要么是off/0。
? ? ? ? 为了更好的理解线圈的概念,我们就以功能码01(读线圈状态)作为例子来展开说明一下线圈的概念。
? ? ? ? 01功能码:用于读取设备或离散量输出的状态,即on/off。主设备发出的请求消息帧中指定了需要读取的线圈的起始地址和线圈数目。
? ? ? ? 现在假设我们的主设备发送了一个请求报文,具体内容如下表,该报文中,从设备的地址为0x03,表明从3号从设备读取线圈状态,起始地址的值为0x0013,转为十进制是19,寄存器数的值为0x0025,转为十进制是37,即本请求需要读3号从设备的线圈状态,不是读这个设备所有的线圈状态,而是读线圈起始地址为20(Modbus为19,而根据规定线圈地址应该+1,所以是20)到结束地址为56,共计37个线圈状态的值,每个状态需要1bit数据来表示。
? ? ? ? ?那么,在正常的情况下,我们的主设备,应该收到来自设备3返回来的这样一条报文,如下图所示:它的从设备地址和功能码与请求报文保持一致(从设备地址用于告知主设备这条响应报文是来自哪个具体的从设备),数据域字节数表示返回的报文中,数据的空间大小。因为在请求报文中,我们需要知道这个设备的37个“线圈状态”的值,每个线圈状态占用一个bit位,而每个数据大小占用一个字节,所以我们的数据域需要5个字节(37 / 8 + 1)。而从设备的线圈地址20-37的状态为:OFF-ON-OFF-ON-OFF-OFF-ON-ON,对应二进制数为:01010011,所以数据1的值为:0x53。对于数据5,因为37 mod 8 = 5,不足8位,则用0填充,所以数据5为0x1B,对应的状态为:OFF-OFF-OFF-ON-ON-OFF-ON-ON。
? ? ? ? 把线圈状态理解成只能存一个bit信息的寄存器,就会很好理解线圈这个概念了。?
(免责声明:本博文仅供参考,因为博主也是初学者)