BACRouter:
BACRouter-S
从Modbus标准文本可知,Modbus一共支持四种数据类型:输出线圈,离散输入、输入寄存器,保持寄存器。每种数据类型最多可以有65536个元素。
1、在Modbus标准文本中,元素地址在PDU(协议数据单元,太拗口了)中,地址从0~65535,在数据模型中地址从1~65536。这真是太令人混淆了。造成现在一些组态软件及程序库,采用从1开始的地址,而另一些从0开始。
2、在蛮荒时代,为了便于表达四种数据类型,PLC厂家(Modicon®?)用0xxxx, 1xxxx, 3xxxx, 4xxxx来替代。xxxx表示地址,在当时也许设计者可能觉得四位数1~9999就算最复杂的应用也足够了(想想比尔盖茨的640kb内存的预言吧),因此早期很多的MODBUS实现都只支持址址1~9999。
3、当然现代的实现基本不会这么弱智了。但不幸的是在中国使用非常广的西门子S7-200(新出的S7-1200也是如此)自带Modbus主站库还有这个Bug。当然扔掉自带库自已实现Modbus master也不是什么难事,或者可以试试第三方的库,比如这个
后记:为避免各种头疼,我们新版本的开利CCN/Modbus网关的固件已重写,地址均映射到前9999。
以下资料供工作中经常与Modbus打交道的朋友参考:
Modbus应用协议 v1.1b 功能码、数据模型、地址模型在这里
Modbus tcp实现指导 v1.0b
Modbus串行协议规格与实现指导 v1.0 常用的Modbus RTU/ASCII在这里