之前自己给设备写的通信协议,一到工作环境就不停通信错误。思前想后,觉得原因是自己瞎写的协议不好,无法适应有噪音的环境,所以决定移植一个成熟的协议。查了资料,发现Modbus协议简单(容易学),稳定(不出错),应用广泛(轮子多)。所以,就是它了。
Modbus通信协议定义了四种常用的寄存器,分别为:线圈状态(coil),离散输入状态(discrete),保持寄存器(holding)和输入寄存器(input)。
这四种寄存器的分类有其历史原因。因为Modbus起源于PLC通信,而PLC是基于非易失性存储介质的,所以使用了coil和holding来表示PLC内部的非易失性变量,使用了discrete和input来表示PLC外界的信号。但现在的系统,其寄存器基本都是掉电丢失的,无论使用哪个来称呼这些寄存器,都会感到有些困惑。
保守的做法,是利用自定义命令来读写这些易失性寄存器,但是这样做会丧失通用性,而且很多现成的移植也失效了。更方便的方法还是按读写能力来分类,单纯地将coil和holding理解为可读写寄存器,而把discrete和input理解为协议里的只读寄存器。
Modbus协议的coil和discrete,针对的是位寄存器;holding和input,针对的是16位寄存器。但这两者也是模糊的。光靠coil和discrete,或者光靠holding和input,其实都已足够。两套方法都可以用,让我这种选择困难患者感觉很难取舍。我最后的方案是,不管什么寄存器,全用holding和input。
定下来以后,就可以开始移植了。