天天看點

Modbus的通信參數存在flash中,如果改亂了,該怎麼辦--FreeModbus從站設計(12)

FreeModbus從站設計(12)-Modbus的通信參數存在flash中,如果改亂了,該怎麼辦

關鍵詞:FreeModbus 複位預設參數 HAL庫 flash STM32

在上一篇文章中,介紹了如何将Modbus的通信參數存儲在單片機STM32F103C8T6的flash中,這樣可以簡化硬體電路設計,功能擴充也更加靈活。但孔丙火(微信公衆号:孔丙火)認為,這種方法也有副作用,因為是用通信的方法修改參數,如果使用者把上次修改的參數忘記了,豈不是無法建立序列槽連接配接了?要麼一個一個參數地試,費時費力,要麼重新刷單片機的程式,但這需要開發工程師的參與。公衆号之前有一篇文章,是講PLC的上電停止功能的,這裡可以做一個借鑒,來解決這個問題。大體的意思,就是為使用者保留一個資料指令,當單片機上電的時候,收到這個指令,就采用預設的通信參數運作,這時使用者是可以通過序列槽連接配接單片機的,然後再把通信參數改成自己需要的就可以了。

下面來講一下具體方法。

(1)設定預設通信參數,孔丙火(微信公衆号:孔丙火)這裡稱之為“複位預設參數”,就是說單片機複位後,每次都是按照這個參數來運作Modbus,經過一定的時間後,再切換到使用者設定的參數。

如圖1所示,在程式的初始化階段,先設定預設通信參數,這裡設為:從站位址為1,波特率19200bps,偶校驗,停止位1位。

(2)用定時器做一個定時,定時500ms(這個根據自己的實際情況來定),在這個時間内如果收到按預設參數運作的資料指令,則不切換通信參數,否則切換到使用者設定的Modbus參數。

如圖2所示,在回調函數eMBRegHoldingCB()中,這個函數在之前的章節中講過的,當收到寫保持寄存器指令後,先對相應的數組進行處理,然後判斷ucUsrInitBaud這個變量,這個變量的初始化值為0定時500ms後再定時器的中斷中将其置位1,在500ms以内,如果收到按預設參數運作的資料指令,則響應,過了500ms,則不響應這個指令。

Modbus的通信參數存在flash中,如果改亂了,該怎麼辦--FreeModbus從站設計(12)

圖1

Modbus的通信參數存在flash中,如果改亂了,該怎麼辦--FreeModbus從站設計(12)

圖2

如果從站位址為1,從位址0開始寫寄存器的數量為2,分别為0xff55,和0xaaff,則一直按預設參數運作Modbus。也就是說,如果收到主站發來的資料為:01 10 00 00 00 02 04 FF 55 AA FF ED 4B,則一直按預設參數運作Modbus。用變量ucUsrTurnonStop來标記。

(3)切換使用者設定的Modbus參數。如圖3所示,在定時器溢出中斷回調函數中,在第一次500ms定時時間到時,對ucUsrComReset變量指派,為0xff表示一直按預設參數運作Modbus,為0x55表示切換使用者設定的Modbus參數。

Modbus的通信參數存在flash中,如果改亂了,該怎麼辦--FreeModbus從站設計(12)

圖3

如圖4所示,在程式主循環中,如果ucUsrComReset==0x55,則先停止停止協定棧,然後重新進行初始化,并将ucUsrComReset置為0xff,保證隻進行一次重新初始化。

Modbus的通信參數存在flash中,如果改亂了,該怎麼辦--FreeModbus從站設計(12)

圖4

孔丙火(微信公衆号:孔丙火)這裡展示的是我的實作方法,主要是講思路,朋友們也可以有自己的實作邏輯和方法,而且我這個方法并不是最好的。

至此,就實作了上電500ms内按照“複位預設參數”運作Modbus,然後根據主站傳輸來的資料,判斷下一步怎麼運作。如果需要按“複位預設參數”運作,則需要在500ms内,向從站發送:01 10 00 00 00 02 04 FF 55 AA FF ED 4B。通常的做法是:在單片機上電前,不停的向其發送這個資料,然後再給單片機上電。

如果使用者忘記了之前修改的Modbus通信參數,則可以在“複位預設參數”狀态,按照上一節講的線上修改通信參數的方法,改成自己需要的參數,然後再把單片機重新開機就可以正常的通信了。

文章在公衆号(孔丙火)同步推出,歡迎檢視更多系列文章。

單片機、ARM、現場總線、PLC、嵌入式軟硬體的設計經驗分享,秉承“點點滴滴皆智慧”的理念,以實際項目為單元闡述知識點,一起分享,共同交流。

Modbus的通信參數存在flash中,如果改亂了,該怎麼辦--FreeModbus從站設計(12)

繼續閱讀