一、文章背景
1個master,30個slaver,485 RTU通信。
master主動讀取slaver的寄存器信息,下面用來做啥就省略了,本文只介紹如何處理通信邏輯。
關於協議的基本信息省略。
由於計算機加密,文字都是在博客編輯框中現寫的。
二、注意點
1、 master不可同時與30個從站通信,必須挨個輪詢,而且一問一答,串口的半雙工特性就決定了這種通信方式,同一時刻只允許一個人占用這個信道。
2、 廣播模式不適用該項目,廣播模式通常用於寫入slaver,而且slaver不回應數據。
3、 slaver回應時,可能會分幾次回應,這一點與tcp類似。
4、 一個機器接30個串口設備,用的擴展板卡,光線纜就一捆,前面說了需要挨個輪詢,通常一次通信大約在100ms,30個設備輪詢完了就需要3秒鍾了,特別要注意這一點,如果對實時性要求很高,則必須將slaver分組,比如用三個串口,每個串口接10個slaver,本文就介紹這種方法。
三、實現方法
1、 使用三個串口、每個串口接10個slaver。相當於三個master,每個master與10個slaver通信。
2、 建立slaverid的映射關系,master編號1、2、3,每組slaver編號1、2、3、4…10,主站獲取slaver數據后,往業務層反饋數據時加上master編號,用兩個字節表示,第一個字節是主站編號,第二個字節是slaver編號。這樣業務層根據id映射就能區分出哪一個slaver設備反饋的數據。
3、 業務層與通信層交互時引入一個轉換回調層。
業務層---->回調層(業務數據結構轉換成adu)---->通信層
通信層---->回調層(adu轉換成業務數據結構)---->業務層
4、 master向slaver發送請求后,需要等到回應后,才能執行下一步操作,前面說了回應可能分幾次進行,處理回應數據方式如下:
(1) 根據發送的請求,我們可以知道期望的回應是什么,比如讀一個線圈(slaveID=1線圈地址2),則發送adu為01 01 0002 0001 CRC,期望返回是01 01 01 XX,異常則是01 80 XX CRC,因此可以讀取功能碼判斷后面期望的adu的總長度到底是多少。
(2) 回應獲取以后crc校驗,然后將數據轉發給回調層處理,一個slaver的通信邏輯就算完成了,然后執行下一個。
(3) 異常情況,等回應需要加上超時(500ms),把超時的slaver信息回調給上一業務層。
四、總結
要擴展的話,就創建多個master對象就行了,上層業務處理映射關系就行。把啟用多少個master及slaver映射放到配置文件,這樣 擴展就很方便了。