關於modbus rtu一個主站與多個從站通信的一點總結


一、文章背景

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映射放到配置文件,這樣 擴展就很方便了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM