一.Modebus协议构成
Modbus TCP 通信协议包括3部分:报文头,功能码,数据。
Modbus TCP/IP协议最大数据帧为260个字节。
二.MBAP报文头构成
报文头一共占7个字节,他们分别是有事务处理标识符(2个字节),协议标识符(2个字节),长度(2个字节),单元标识符(1个字节)构成。
三.功能代码
功能代码占1个字节,主机给从机发送Modbus协议,从机根据功能码的不同完成不同的操作。
再讲解功能码之前,先要了解一下寄存器。
1.寄存器
寄存器一共可以分成4种,分别是离散量输入,线圈,输入寄存器,保持寄存器。四种寄存器中又可以划分成两大类分别是:
1)位寄存器(每个寄存器占1个字节):离散量输入 线圈
工业上主要用于控制IO设备。
线圈寄存器,类比为开关量,每一个bit都对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。
离散输入寄存器,离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。
2)字寄存器(每个寄存器占2个字节):输入寄存器 保持寄存器
工业上主要用于存储工业设备的值。
保持寄存器,这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。比如我我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写
输入寄存器,这个和保持寄存器类似,但是也是只支持读而不能写。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值。
2.功能代码
根据四种不同的寄存器,一共可以分为8种功能代码。
【1】读线圈状态:01H
【2】读离散量输入线圈:02H
【3】读保持寄存器:03H
【4】读输入寄存器:04H
总结:读线圈(寄存器)询问报文模版:报文头 功能码 起始地址 读取个数
应答报文模版:报文头 功能码 字节计数 数据
【5】写单个线圈:05H
从机回复的报文形式和主机发送的一模一样,只是为了告诉主机已经收到,所以这里不再赘述。
【6】写单个保持寄存器:06H
从机回复的报文形式和主机发送的一模一样,只是为了告诉主机已经收到,所以这里不再赘述。
【7】写多个线圈:0FH
【8】写多个保持寄存器:10H
总结:1)写单个线圈或保持寄存器
模版:报文头 功能码 地址 写入的状态或数据(线圈就是改变通断状态,保持寄存器是写入数据)
2)写多个线圈或保持寄存器
模版:报文头 功能码 地址 个数 字节计数 数据