ModBus是Modicon公司为其PLC通讯而开发的一种通讯协议。如今Modicon公司已经被施耐德收购成为了施耐德旗下品牌。从1979年问世至今,已经成为工业通讯领域的业界标准。
协议分类
ModBus具有两种串行传输模式,ASCII 和 RTU。它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持 RTU 格式。通信双方必须同时支持上述模式中的一种

Modbus RTU:
这是一种基于串行通信的Modbus协议,数据以二进制形式传输,使用RS-232或RS-485等串行通信方式。Modbus RTU协议具有数据传输速度快、传输距离较远等优点,因此在工业现场中应用广泛。
Modbus ASCII:
这是一种基于串行通信的Modbus协议,数据以ASCII码形式传输,同样使用RS-232或RS-485等串行通信方式。Modbus ASCII协议具有数据传输的可读性较好、误码率低等优点,但是传输速度较慢。
Modbus TCP:
这是一种基于以太网通信的Modbus协议,使用TCP/IP协议栈进行数据传输。Modbus TCP协议具有数据传输速度快、传输距离较远、可实现多点通信等优点,因此在工业控制系统中应用越来越广泛
需要注意的是,不同的Modbus协议之间不能直接通信,需要使用相应的协议转换器或网关进行转换。同时,在使用Modbus协议进行通信时,需要考虑数据传输的可靠性和安全性等因素,采用合适的通信方式和安全措施来保护Modbus数据的传输和使用。
寄存器
一共8种功能码。这其中有涉及到线圈、离散输入、保持、输入四种寄存器。
0x01: 读线圈寄存器
0x02: 读离散输入寄存器
0x03: 读保持寄存器
0x04: 读输入寄存器
0x05: 写单个线圈寄存器
0x06: 写单个保持寄存器
0x0f: 写多个线圈寄存器
0x10: 写多个保持寄存器
线圈寄存器:
实际上就可以类比为开关量(继电器状态),每一个bit对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。对应上面的功能码也就是:0x01 0x05 0x0f
离散输入寄存器:
如果线圈寄存器理解了这个自然也明白了。离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。所以功能码也简单就一个读的 0x02
保持寄存器:
这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。一般对应参数设置,比如我我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写,所以功能码有对应的三个:0x03 0x06 0x10
输入寄存器:
这个和保持寄存器类似,但是也是只支持读而不能写,一般是读取各种实时数据。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值。对应的功能码也就一个 0x04
