学习任何一门技术,都是在使用过程中不断开拓、不断积累、不断前进的。当我们的工作或者学习没有涉及到某个点时,那么这个点就是我们的盲点。但是我们也没有必要去学习一些我们一辈子都不可能会用到的东西,至少不需要深入去研究。
相信很多人看到数据区块中的离散量、线圈和寄存器,就会很疑惑为什么这么称呼呢。在这里有必要解释一下,ModBus协议早应用在工业控制领域,尤其是PLC使用多,而且涉及的控制对象很多是开关、指示灯、信号灯等等,为了控制和表示这些对象,所以专门抽象出来一些数据类型来进行表示。
离散量输入相当于PLC的数字量输入点DI,只能读取不能写入,属于布尔类型。它可以表示控制现场中的信号灯的状态。
线圈相当于PLC的数字量输出点DO,可读可写,还是布尔类型,它可以表示控制现场的开关,1表示打开,0表示关闭。控制开关的开闭可以这么表示,同样的读取回来的值也可以表示开关的开闭状态。
输入寄存器相当于PLC的模拟量输入AI,占有两个字节的数据量,只能读取,不支持写入。
保持寄存器相当于PLC的内部存储器MW或者数据块DBW,也是占用两个字节的数据量,可读可写。
特别注意:在访问数据的过程中,必须将数据映射到实际的物理存储区中。ModBus协议定义了两种在设备中构造数据的方法。
将四种数据映射到不同的存储区块中
将四种数据映射到同一个的存储区块中
后再说说地址模型。地址模型就是将不同数据区块用编号来表示,进行区分。
ModBus地址模型的编号从1开始。由于每一种数据模型大支持65536个数据,所以理论上对于线圈数据来说,地址范围为:000001-065536;离散量输入地址范围为:100001-165536;输入寄存器数据地址范围为:300001-365536;保持寄存器数据地址范围为:400001-465536.但是由于65536比较大,实际应用一般不会使用到这么大的存储区,所以PLC厂家普遍采用的是10000以内的地址范围,也即是:
线圈地址范围:00001~09999;离散量输入地址范围:10001~19999;输入寄存器地址范围:30001~39999;保持寄存器地址范围:40001~49999。
有了该地址模型,我们就可以从Modbus寄存器的地址判断所要访问的区块的类型。比如我们经常会看到的地址40001就是保持存储器的个值的地址,而10001就是离散量输入的个值的地址。要注意的是,保持寄存器和输入寄存器的每个值的大小为16bits(字),而线圈和离散量输入每个值的大小为1bit(位)。
以下是以西门子1500系列PLC为例,Modbus地址与存储器地址的对应关系:
知道了数据模型和地址模型后,编程过程中就能正确得调用处理数据了