軟件調(diào)試總結(jié)之FreeModbus移植

? ? ? ? 在研發(fā)某個(gè)電子產(chǎn)品時(shí),由于需要用到FreeModbus協(xié)議,所以對FreeModbus協(xié)議進(jìn)行了系統(tǒng)的自我學(xué)習(xí),包括FreeModbus協(xié)議,移植方法等內(nèi)容。前段時(shí)間一直在忙于該產(chǎn)品開發(fā),所以未及時(shí)的對其進(jìn)行總結(jié)和歸納,現(xiàn)占用自我的一點(diǎn)休息時(shí)間將FreeModbus的移植方法、移植時(shí)遇到的一些問題及解決方法總結(jié)、歸納一下并分享給大家,借用魯迅的“拿來主義”思想。希望大家通過閱讀這篇文章,能夠達(dá)到對FreeModbus協(xié)議“拿來就能用”的狀態(tài),與此同時(shí)也希望能夠解答大家的一些疑惑。

一、為何采用Modbus協(xié)議,而不是自己定義協(xié)議?

????????Modbus是非常適合嵌入式系統(tǒng)應(yīng)用的一個(gè)通用協(xié)議,既簡潔又完善。而自己定義的嵌入式協(xié)議,一般來說擴(kuò)展性不好,軟件Bug也比較多。本人始終認(rèn)為站在巨人的肩膀上,我們不但可以走的更遠(yuǎn),也會走的更快(即移植成熟的代碼可以減少調(diào)試時(shí)間、提高工作效率)。另外強(qiáng)烈建議在進(jìn)行FreeModbus協(xié)議移植前,最好對FreeModbus協(xié)議有一個(gè)全面的了解,可通過查看或閱讀Modbus協(xié)議說明文檔了解。

二、modbus協(xié)議

????????為了更好的理解、移植和應(yīng)用FreeModbus協(xié)議,個(gè)人覺得至少應(yīng)該了解以下幾點(diǎn):

????????1、FreeModbus協(xié)議采用主從通訊方式,支持一個(gè)主機(jī)多個(gè)從機(jī),并且遵從一發(fā)一回,不發(fā)不回的通訊原則。

????????2、FreeModbus協(xié)議傳輸方式采用“大頭字節(jié)”傳輸方式,即是先傳輸高字節(jié)數(shù)據(jù)再傳輸?shù)妥止?jié)數(shù)據(jù)。

????????3、FreeModbus協(xié)議有RTU和ASCII兩種通訊方式,由于RTU通訊模式的數(shù)據(jù)吞吐量比較大,所以一般會優(yōu)先考慮采用RTU通訊傳輸模式。

????????4、RTU傳輸幀的格式是:1位起始位、8位數(shù)據(jù)位、1位校驗(yàn)位、1位停止位,總共11位。

????????5、FreeModbus協(xié)議中沒有明顯的開始符和結(jié)束符,而是通過幀與幀之間的間隔時(shí)間來判斷的。如果在指定的時(shí)間內(nèi)沒有接收到新的字符數(shù)據(jù),那么就認(rèn)為收到了新的幀。

????????6、FreeModbus寄存器的地址分為PLC地址協(xié)議地址,PLC地址為5位十進(jìn)制數(shù),比如40001等。協(xié)議地址是去掉PLC地址的最高位,然后減去1,比如PLC地址為40001,那么對于的協(xié)議地址為0x0000(40001為保持寄存器的地址)。同一個(gè)協(xié)議地址不同PLC寄存器地址的訪問是通過功能碼來區(qū)分的,所以不會存在訪問沖突的問題。

????????7、FreeModbus協(xié)議中有線圈寄存器、離散量寄存器、保持寄存器和輸入寄存器,注意:線圈和離散量寄存器是位寄存器,保持寄存器為無符號16位數(shù)據(jù)。

? ??????8、FreeModbus是一種通用的軟件協(xié)議,所有不用擔(dān)心是否能在帶操作系統(tǒng)的嵌入式軟件中移植使用,當(dāng)然裸機(jī)的嵌入式軟件也支持。

三、FreeModbus移植方法

????????下面將以實(shí)際項(xiàng)目中在STM32F4處理器上成功移植的FreeModbus協(xié)議為例分步驟介紹FreeModbus協(xié)議的移植方法:

????????1、首先去官網(wǎng)下載最新的FreeModbus協(xié)議源碼,本人移植的是FreeModbus-V1.5版本。這樣做的好處一方面保證源碼的正確性,另一方面技術(shù)更新?lián)Q代比較快,最新的源碼應(yīng)該是經(jīng)過多次老版本源碼優(yōu)化的結(jié)果。

????????2、FreeModbus-V1.5解壓后的情況如圖1所示,主要有demo、modbus、tools、doc四個(gè)文件夾。其中tools為上位機(jī)測試modbus程序,doc為一些說明文件。有用的是demo以及modbus。打開demo,沒有看到stm32的工程文件,有一個(gè)叫BARE的文件夾,打開BARE文件后的情況如圖2所示,是一些不包括任何處理器的部分源代碼,我們只需將modbus中的文件,BARE中port文件中的文件移植到已建的工程中即可。

圖1 FreeModbus-V1.5解壓后情況
圖2 BARE中文件

????????3、FreeModbus協(xié)議的底層移植主要包括串口和定時(shí)器的移植。定時(shí)器的移植主要有定時(shí)器初始化和35uS定時(shí)中斷函數(shù)等。串口的移植工作主要包括串口的初始化、發(fā)送和接收中斷函數(shù),RS485的發(fā)送和接收選擇管腳的初始化和使能函數(shù)等。

圖3 RS485發(fā)送接收管腳初始化
圖4 RS485發(fā)送和接收使能函數(shù)

????????4、FreeModbus協(xié)議的頂層函數(shù)移植主要是線圈的讀寫函數(shù)、離散量的讀函數(shù)、輸入寄存器的度函數(shù)和保持寄存器的讀寫函數(shù)等,當(dāng)然還有一些自己編寫的解析FreeModbus協(xié)議的函數(shù)。

圖5 線圈寄存器操作函數(shù)
圖6 離散量寄存器操作函數(shù)1

四、常見問題及解決方法

1、最后一個(gè)字節(jié)發(fā)送不出去的問題

(1)問題現(xiàn)象:

? ? ? ? FreeModbus移植完成后,首先利用串口調(diào)試助手對移植的串口通訊情況進(jìn)行了檢查,通過觀察串口調(diào)試助手上接收到的數(shù)據(jù)發(fā)現(xiàn)沒有最后一個(gè)字節(jié)數(shù)據(jù)(測試程序知道自己要發(fā)送的數(shù)據(jù)內(nèi)容)。

(2)解決方法:

????????出現(xiàn)該問題后,首先對串口的初始化、RS485的發(fā)送和接收使能管腳的初始化進(jìn)行了排查,發(fā)現(xiàn)的問題點(diǎn)1是RS485的發(fā)送接收使能管腳時(shí)鐘沒有配置正確,由于采用的是STM32F4系列處理器,GPIO是掛在AHB1總線上的,所以調(diào)用APB1相關(guān)的處理來初始化時(shí)鐘是不對的。出現(xiàn)的問題點(diǎn)2是本人使用的是發(fā)送寄存器空中斷導(dǎo)致最后一個(gè)字節(jié)沒有發(fā)送成功,由于當(dāng)時(shí)項(xiàng)目比較急,只是在FreeModbus 協(xié)議的源碼中稍微作了修改,實(shí)現(xiàn)最后一個(gè)字節(jié)的數(shù)據(jù)成功發(fā)送。修改地方如圖23所示。不過在這里個(gè)人強(qiáng)烈建議使用串口發(fā)送和接收中斷,一方面可以充分利用MCU的資源,也可以減少等待時(shí)間;發(fā)送中斷最好用發(fā)送完成中斷,如果使用發(fā)送寄存器空中斷,還需要判斷最后一個(gè)字節(jié)數(shù)據(jù)發(fā)送完成與否,否則導(dǎo)致最后一個(gè)字節(jié)數(shù)據(jù)發(fā)送不出去。

圖7 不推薦解決方法

2、PLC地址和協(xié)議地址的問題

(1)問題現(xiàn)象:

????????FreeModbus移植完成后,利用modbus-poll軟件對其進(jìn)行調(diào)試時(shí)發(fā)現(xiàn),利用自己編寫的FreeModbus協(xié)議解析函數(shù)操作0x0001地址時(shí),而對應(yīng)變化的地址是0x0000,當(dāng)時(shí)是直接把自己定義的PLC地址的高位給去掉了。

(2)解決方法:

????????如果您知道FreeModbus協(xié)議有PLC地址和協(xié)議地址之分,并且協(xié)議地址是PLC地址的高位去掉后再減去1的話,那么這個(gè)問題就不是個(gè)什么問題。

3、assert()函數(shù)未定義報(bào)錯(cuò)的問題

(1)問題現(xiàn)象:

????????FreeModbus移植完成后,就直接在Keil軟件中對整個(gè)工程文件進(jìn)行編譯,編譯后提示assert()未定義。

(2)解決方法:

? ? ? ? 由于之前未遇到過此類問題,所以去百度上搜索了一下,最后經(jīng)過驗(yàn)證出現(xiàn)此類問題的原因是MicroLib不支assert()函數(shù),即是工程文件使用了微庫,在target中鉤掉USE MicroLIB后再次編譯通過。

五、總結(jié)

????????通過此次移植FreeModbus協(xié)議,并完成對其的調(diào)試,經(jīng)過反思覺得自己還有不足的地方,現(xiàn)就反思的解決問題思路進(jìn)行一下歸納和總結(jié),希望對大家有所幫助。解決問題的思路是:采用先發(fā)散后收斂的問題解決思維方式,發(fā)散就是頭腦風(fēng)暴進(jìn)行各種假設(shè),收斂即是對出現(xiàn)該問題的各種假設(shè)進(jìn)行驗(yàn)證,逐一排查,驗(yàn)證方法是采用剝洋蔥式思維。利用Keil的在線調(diào)試技術(shù)進(jìn)行在線實(shí)時(shí)調(diào)試,根據(jù)調(diào)試中各個(gè)函數(shù)返回的錯(cuò)誤碼進(jìn)行問題排查,進(jìn)而找到問題的根源,最后把問題解決掉。此次移植FreeModbus協(xié)議的解決問題心得是:不要一味的假設(shè),還需要進(jìn)行驗(yàn)證,而驗(yàn)證最好的助手就是儀器儀表,另外能用示波器的地方盡量不用萬用表,因?yàn)橥ㄟ^示波器能夠觀看到信號變化的整個(gè)過程,而萬用表做不到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 認(rèn)識中控板:華北工控 EMB-3550 基于Coretex-A17 ARM架構(gòu)嵌入式All In One主板 EM...
    仕明同學(xué)閱讀 7,637評論 5 11
  • 姓名:周崇杰 學(xué)號:16040120059 專業(yè):機(jī)械設(shè)計(jì)制造及其自動化 轉(zhuǎn)載自:http://blog.csd...
    CJbaby閱讀 1,595評論 0 6
  • 城里的風(fēng)拼命地吹動 一個(gè)人無動于衷 看著城市的霓虹 半夜醒來彷徨捂著心痛 怎么想你都沒用 一個(gè)人就這樣走得無影無蹤...
    koko空空閱讀 302評論 0 2
  • 《那些回不去的年少時(shí)光》桐華 這本書的具體內(nèi)容我已經(jīng)模糊。我記得最清也是感悟最深的一點(diǎn)是羅琦琦和關(guān)荷之間摻雜著羨慕...
    青山居士行閱讀 384評論 0 0
  • 第一卷 陸商音系列 一. A大,會計(jì)一班 海音筆直地坐在椅子上,聚精會神地盯著面前的筆記本,上面布滿了一排排黑色的...
    滄海一訴聽心說閱讀 408評論 0 1

友情鏈接更多精彩內(nèi)容