千呼万唤始出来的Modbus TCP现已加入肯德基豪华午餐正式发布。
Modbus作为通讯界的万金油,基本上大大小小的品牌都会支持这一通讯协议。只要学会使用Modbus,升职加薪不再是梦。
一、Modbus小科普
Modbus通讯分为主站(Master)和从站(Slave)两种模式。这两种模式,我们的触摸屏都是可以支持的。
与大多数通讯协议不同的是,Modbus的数据是储存在从站中的,主站会访问从站进行数据抓取。一般,变频器、温度表、电能表等设备都是工作在从站模式下。屏与这些设备通讯时,屏是做了主站的角色。
在Modbus通讯中,存在着两个让无数人混淆又迷茫的概念:内存区块与功能代码,下面一个一个来说。
内存区块
所谓的内存区块,与PLC中的内存区域的概念其实是一样的。比如三菱有X区、Y区、M区、D区等,西门子有I区、Q区、M区、V区等。不同的是,在Modbus中,这些内存区域是使用数字来划分的,它分为0区、1区、3区、4区,每个区里面都有65535个地址。
内存区块 | 数据类型 | 主站访问权限 | 从站访问权限 | 地址编号范围 |
---|---|---|---|---|
线圈状态(0区) | 布尔(Bool) | 读/写(R/W) | 读/写(R/W) | 000001~065535 |
离散输入(1区) | 布尔(Bool) | 只读(RO) | 读/写(R/W) | 100001~165535 |
输入寄存器(3区) | 字(Word) | 只读(RO) | 读/写(R/W) | 300001~365535 |
保持寄存器(4区) | 字(Word) | 读/写(R/W) | 读/写(R/W) | 400001~465535 |
功能代码
功能代码,简单的说就是一些命令,从站可以根据主站发出的这些命令,读取或写入相应的数据。
常见的功能代码如下:
内存区块 | 功能代码(读取)(16进制) | 功能代码(写入)(16进制) |
---|---|---|
线圈状态(0区) | 0x01 | 0x05(写入单个线圈)、0x0F(写入多个线圈) |
离散输入(1区) | 0x02 | |
输入寄存器(3区) | 0x04 | |
保持寄存器(4区) | 0x03 | 0x06(写入单个寄存器)、0x10(写入多个寄存器) |
因为写入功能代码中,包含写入单个和写入多个两种功能代码。并不是所有从站设备都支持写入多个寄存器的,具体情况,建议查看从站设备的说明书,再根据实际情况来使用合适的功能代码。
刚刚说到,很多用户会搞混内存区块和功能代码的概念。最主要一个原因是,很多从站设备的说明书里面只会写,地址要使用03功能码来读取,而在触摸屏里面,选择地址时是按内存区块来划分的。那么对modbus协议不熟悉的用户,就会误以为要选3区来进行通讯。