1.引言

  Modbus是工業(yè)領域重要的協(xié)議,物理層有常見的RS485雙絞線和TCP,所以又常說Modbus 485開發(fā)和Modbus TCP開發(fā)。

  前者就是串口通信,比較簡單。后者涉及到網(wǎng)絡協(xié)議,復雜度高出好幾個層次。

  但是如果有穩(wěn)定的TCP通信做鋪墊,這兩種Modbus的區(qū)別就不大了,都是數(shù)據(jù)包的解析而已,能共用大部分代碼。

  本文不討論Modbus協(xié)議如何讀寫一個Register或Coil之類的,這些東西看看文檔或者網(wǎng)上搜下博客教程就知道了。

  本文目標是討論如何寫一個穩(wěn)定的Modbus通信驅動,由于Modbus TCP對Modbus的操作除了有個特殊的7字節(jié)包頭和無CRC外,其他部分和Modbus 485沒有區(qū)別,因此本文對Modbus TCP同樣有參考意義。

 

2. RS485通信

  部分應用場景下并沒有使用Modbus協(xié)議,而是簡單的串口通信,然后加上和校驗等檢查,傳輸層使用RS485,這類應用可以歸為RS485通信的范疇。

  其實個人感覺,都做到這個份上,還不如直接用Modbus來做,復雜度高不出多少,好處卻有很多。比如可以借助Modbus大量的流行測試工具做系統(tǒng)測試??梢园严到y(tǒng)做成一個標準品,也利于客戶使用和測試。另外有現(xiàn)成的通用協(xié)議,總比自己定的協(xié)議穩(wěn)定度高。

  比如我曾見到過的幾個公司的產品:

  這是一個電機控制器,使用RS485通信,但本質就是串口通信,加上了頭0x4A,和結束符0D,0A,以及和校驗。

大學生就業(yè)培訓,高中生培訓,在職人員轉行培訓,企業(yè)團訓

  這是一家BMS產商的說明書,RS485通信,和上面一樣,就是基于RS485的串口通信而已。

大學生就業(yè)培訓,高中生培訓,在職人員轉行培訓,企業(yè)團訓

 

  這類驅動程序,需要從穩(wěn)定性和易讀性來考慮,如果穩(wěn)定性較差會造成系統(tǒng)控制故障,如果易讀性差就會造成難以維護,這些控制指令之間差別很小,如果一個一個單獨寫命令,非常容易出錯。對應舉措如下:

  1)避免每個指令寫一部分代碼,需要統(tǒng)一處理,比如校驗函數(shù),發(fā)送函數(shù),接收函數(shù)等。

  通信協(xié)議已知,從中可以知道通信的實際數(shù)據(jù)長度(不包含包頭包尾和校驗的部分),所以可以控制讀寫多少個字節(jié),并且可以知道什么時候啟動校驗,那些數(shù)據(jù)參與校驗計算。

  2)為指令建立指令列表,這樣后來需要添加功能,就可以直接把指令字加入列表即可。

  3)適當抽象。為每個指令的動作寫回調函數(shù),這樣就可以在應用層,用一句簡單的回調函數(shù)指針直接操作具體的動作函數(shù),而不是應用邏輯層操作具體的驅動層面的接口。

  4)超時,必須有超時機制。通信失敗怎么處理?通信了一般線斷了怎么處理?不能讓系統(tǒng)死等后面的幾個字節(jié)發(fā)過來。

  5)新手和一些小公司經常會不注意的出現(xiàn)一個問題——不關閉通信端口。

  如果通信都是由你發(fā)起的,那么無論此次通信是完成還是超時或失敗,都應該關閉通信端口。

  因為從合理的邏輯上來說,此刻之后都不應該再有數(shù)據(jù)過來打擾系統(tǒng)的工作。

大學生就業(yè)培訓,高中生培訓,在職人員轉行培訓,企業(yè)團訓

        		

網(wǎng)友評論