在大家通读Modbus协议时,总是会碰到一些容易混淆的名词,从而导致对于协议的解读出现问题,在本文中,我们对于Modbus协议中可能会给大家造成困惑的名词作Related的解释。

1.function code:
function code在modbus协议用于表示信息帧的Function,常用的function code有03,04,06,16等,其中03function code的作用是读保持register内容,04function code的作用是读输入register内容(输入register和保持register的区别看下文),06function code的内容是预置单个保持register,16function code的内容则是预置多个保持register。
2.输入register和保持register:
04function code的作用就是读输入register,而03function code的作用则是读保持register,很多人在看到这两个function code的时候总是希望找到这两个function code的区别,保持register和输入register到底是什么区别,modbus协议最开始是用来解决PLC的通信协议问题的,主要用于输入输出数字量信号以及模拟量信号,所谓的输入register就是从模拟量信号输入引申出来的,即输入register只能从模拟量信号输入端改变register,而主机则不能通过下发指令改变输入register的data,而保持register则是用于输出模拟量信号的,主机是可以改变register data,也就是说对于主机而言,输入register是只读的,而保持register是可以读写的,当主机用06,16function code的指令去预置输入register的时候,设备会返回一个代码为0x81的Error代码,即企图写只读register。
3.Modbus中的dataaddressformat:
在Modbus协议中,经常会出现类似于3xxxx,4xxxxregister,这个表示的是register支持的data type。我们用列表来说明,还有Modbusdataaddressformat是从0开始,比如以下一个register40009,即表示保持register,register address为00 08,类似的dataaddressformat经常在configuration软件以及PLCsystem中用到。
| 映射address | 使用的function code | addressType | 存取方式 | 描述 |
| 0XXXX | 01,05,15 | 离散输出 | 读写 | 每个卷表示单个switch位 |
| 1XXXX | 02 | 离散输入 | 只读 | 每个卷表示单个switch位 |
| 2XXXX | 03,04,06,16 | 浮点register | 只读/读写 | 两个连续16位register表示一个浮点数 |
| 3XXXX | 04 | 输入register | 只读 | 每个register表示一个16位无符号整数 |
| 4XXXX | 03,06,16 | 保持register | 读写 | 每个register表示一个16位无符号整数 |
| 5XXXX | 03,04,06,16 | ASCII字符 | 读写 | 每个register表示两个ASCII码 |
4.Modbus RTU/ASCII/TCP:
Modbus协议最开始是用于可编程逻辑控制器(PLC)之间的通讯,由于其具有的开放性,大量的用于现场智能仪表。Modbus协议有多个变种,其中最著名的是Modbus RTU/Modbus ASCII和Modbus TCP通信协议。其中RTU/ASCII协议是基于串行口通信,而TCP协议则是基于以太网通信。
5.ModbusError代码表:
Modbus有function code、校验码、异常function code和Error代码,其中异常function code和Error代码非常容易混淆。一般来说异常function code指的是某个function code执行的时候出现的相应异常function code,一般都是在function code的基础上加上0x80,比如03function code出现的Exception Code是0x83异常function code,16function code对应出现的异常function code则是0x90,而Error代码则是表示出现Error的具体情况,比如register addressdoes not exist,不管是读还是写,如果该register addressdoes not exist的话,Error代码为02。
发表回复