1. 程式人生 > >MODBUS協議在STM32上實現 --- 上篇

MODBUS協議在STM32上實現 --- 上篇

主要參考是育靈科技視訊,需要的可以聯絡我

參考資料:

1.Modbus通訊協議.pdf

2.Modbus除錯精靈1.024.rar

3.主機原始碼.rar

第一節 通訊的硬體協議機制 主從模式的建立

目的:實現在modbus的從機實現

1.硬體層協議   解決傳輸問題,相當於路

2.軟體層協議   

舉例:

例如RS232 傳送1是多少V,傳送0是多少V

485協議

這個硬體晶片是廠商做到一起的,一般需要有一根控制線用開判斷是哪種模式   

                          

CAN硬體協議也是類似的

1: 都是2.5V   沒有壓差

0:一個1.5V,一個3.5V    有一個壓差

還有I2C,SPI  都是有自己的硬體協議,大同小異,都是一樣的理解,很簡單的

大致說下單工半雙工

1.單工模式:方向只能朝一個方向去

2.半雙工:通過協調可以實現兩個方向的傳輸

485若想實現半雙工的模式,需要軟體層來指定

最簡單的方式:引入一個主從模式,

--只有一個主機

-- 485的一個規則,任何時候,從機不能主動把資料發回來主機

所以軟體層就是交通規則

第二節 硬體層半雙工通訊方式的實現

--上電後主機和從機都需要一直處於監聽狀態

--任何一次的通訊都需要主機的發起

軟體層比較常見的就是modbus協議

就是一種預先約定的格式,不用自己定義了,移植性好,適配性好

解決通用問題

基本模式

1.轉為傳送狀態

2. ---首先,主機發出一組定址命令幀,找誰,幹什麼

3.立刻轉為接受狀態,等待從機的執行迴應,一定要有迴應,也是按照modbus來回應

所以之後無論設計哪種協議,都是考慮兩方面

硬體協議

軟體協議

第三節 基於485的modbus協議,確定主機取地址幀格式

主要使用與一主多從的模式

modbus可以應用於很多硬體,232,i2c,spi,網線,都是可以的

所以說  基於485的modbus協議,其實是硬體加軟體

                          

網路就是多主機,can通訊也是多主機模式

就是一個通過硬體的技術解決 ,防衝突載波監聽技術

就是每次發都會自己仲裁下,知道仲裁成功才會開始發自己的資料

1.

但是485不具備,所以485只能有一個主機,從機必須有唯一的地址

就是寫程式的人在從機中定義了一個變數,modbus的地址是從0 --- 247號

其中0號地址是廣播地址,是主機保留的,若是包頭是0的話,就是要把包發給所有的從裝置,所以0號地址從機是不予迴應的

從機迴應主機的時候,需要加上自己的地址,不會干擾其他從機

2.資料結構,也就是modbus的主機定址幀的高格式

   ---RTU方式   十六進位制方式

   0x03   00000011

    ---ASC方式 ---都是換算為ASSIC傳送

0x03  分成兩個0x30和0x33,需要傳兩次,所以效率是比較低的

計算機列印ASSIC碼是32到126,所以會出現下邊的方式,所以除錯的時候很方便,可以外接一個顯示器進去

第四節 RTU的機制及資料傳輸實現方式

RTU方式

                       

怎麼知道傳送完畢,就是傳送之後停止3.5個字元,接受資料停止時間超過3.5個位元組,就認為主機定址幀完成,開始停止

怎麼計算:

例如:波特率 9600

每位資料傳輸的時間 :大約是4個微秒

若是停止沒有3.5個位元組時間,又傳送指令,之前的指令是會被放棄的

這是RTU模式唯一的難點

RTU模式是沒有開始與結束標誌的,就是靠時間來約定,所以就需要硬體一個定時器,一個串列埠

第五節 ASC方式

有明確的開始的標誌:先發一個0x3A,就是一個冒號 :

LRC模式

就是相加求和,除以256求餘數(肯定是0到256的數),取反再加一,就是求補碼的過程

結束符號   \r  \n   就是  13   10

從機的反饋問題:

1.迴應包的資料格式是一致的

2.正常的迴應時,功能碼與主機的功能碼一致(1-127)

   異常的迴應:在收到的功能碼加128,這也是程式判斷的依據

從機的實現:

1.具備串列埠

2.具備毫秒級定時器