以前本身給設備寫的通訊協議,一到工做環境就不停通訊錯誤。思前想後,以爲緣由是本身瞎寫的協議很差,沒法適應有噪音的環境。下定決定移植一個成熟的協議。查了資料,發現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