1.引言

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

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

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

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

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

 

2. RS485通信

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

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

  比如我曾見(jiàn)到過(guò)的幾個(gè)公司的產(chǎn)品:

  這是一個(gè)電機(jī)控制器,使用RS485通信,但本質(zhì)就是串口通信,加上了頭0x4A,和結(jié)束符0D,0A,以及和校驗(yàn)。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

  這是一家BMS產(chǎn)商的說(shuō)明書(shū),RS485通信,和上面一樣,就是基于RS485的串口通信而已。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 

  這類(lèi)驅(qū)動(dòng)程序,需要從穩(wěn)定性和易讀性來(lái)考慮,如果穩(wěn)定性較差會(huì)造成系統(tǒng)控制故障,如果易讀性差就會(huì)造成難以維護(hù),這些控制指令之間差別很小,如果一個(gè)一個(gè)單獨(dú)寫(xiě)命令,非常容易出錯(cuò)。對(duì)應(yīng)舉措如下:

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

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

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

  3)適當(dāng)抽象。為每個(gè)指令的動(dòng)作寫(xiě)回調(diào)函數(shù),這樣就可以在應(yīng)用層,用一句簡(jiǎn)單的回調(diào)函數(shù)指針直接操作具體的動(dòng)作函數(shù),而不是應(yīng)用邏輯層操作具體的驅(qū)動(dòng)層面的接口。

  4)超時(shí),必須有超時(shí)機(jī)制。通信失敗怎么處理?通信了一般線(xiàn)斷了怎么處理?不能讓系統(tǒng)死等后面的幾個(gè)字節(jié)發(fā)過(guò)來(lái)。

  5)新手和一些小公司經(jīng)常會(huì)不注意的出現(xiàn)一個(gè)問(wèn)題——不關(guān)閉通信端口。

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

  因?yàn)閺暮侠淼倪壿嬌蟻?lái)說(shuō),此刻之后都不應(yīng)該再有數(shù)據(jù)過(guò)來(lái)打擾系統(tǒng)的工作。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

        		

網(wǎng)友評(píng)論