以前本身给设备写的通讯协议,一到工做环境就不停通讯错误。思前想后,以为缘由是本身瞎写的协议很差,没法适应有噪音的环境。下定决定移植一个成熟的协议。查了资料,发现Modbus协议简单(容易学),稳定(不出错),应用普遍(轮子多)。就是它了。input
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。协议
定下来之后,就能够开始移植了。db