電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 64|回復: 0
收起左側(cè)

freeModbus移植后,控制點位錯位

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
匿名  發(fā)表于 2024-12-9 18:14:00 回帖獎勵 |正序瀏覽 |閱讀模式
本位基于modbus_RTU模式在modbus協(xié)議標準文件“GBT 19582.1-2008 基于Modbus協(xié)議的工業(yè)自動化網(wǎng)絡規(guī)范  第1部分:Modbus應用協(xié)議”中描述了有關地址部分。為了兼容人類世界和計算機世界的區(qū)別做了說明:

明確表示人類世界的1號位,對應機器世界中的0號地址。文件下面還進行了舉例說明

接下來實際使用中考察一下你對這個理解夠不夠深刻1,我們以05號指令來舉例

首先在應答函數(shù)指針數(shù)組中定義了寫單個線圈的函數(shù),接收到對應指令時,自動調(diào)用對應的函數(shù),我們具體來看下這個寫單個線圈函數(shù)。

實現(xiàn)函數(shù)定義在mbfunccoils.c文件中,函數(shù)我做了備注其中上位機發(fā)來的地址經(jīng)過這個函數(shù)做了+1處理,對應上了我們?nèi)祟愂澜绲木幪栆?guī)則。然后調(diào)用eMBRegCoilsCB()函數(shù),寫入對應的緩沖區(qū)加下來看看eMBRegCoilsCB()函數(shù)

根據(jù)提示,這個函數(shù)需要我們自己來實現(xiàn)。到這個函數(shù)傳入的編碼就是從1開始的編碼了。而這個函數(shù)在demo中沒有實現(xiàn)。如果你很走運從網(wǎng)上找到一個下面這樣的實現(xiàn):

這個函數(shù)的功能我做了相應的備注。其他我不多做介紹,重點看下和地址有關的部分。這個實現(xiàn)就使用了官方備注里的xMBUtilSetBits()函數(shù),這個函數(shù)就是把一個字節(jié)的數(shù)據(jù)轉(zhuǎn)化成一位數(shù)據(jù),寫入緩沖區(qū)。我們來看下這個函數(shù)

這個函數(shù)的說明很明顯,傳入的參數(shù)偏移地址從0開始下面總結(jié)一下調(diào)用關系:eMBFuncWriteCoil()->eMBFuncWriteCoil()->xMBUtilSetBits()。還記得一開始eMBFuncWriteCoil()函數(shù)中freeModbus已經(jīng)對這個地址進行了+1。而xMBUtilSetBits()又需要從0偏移地址開始。這就需要在eMBRegCoilsCB()這個我們自實現(xiàn)的函數(shù)中對這個地址進行-1,即REG_COILS_START不能從0開始,應該從1開始。然后再調(diào)用xMBUtilSetBits()函數(shù)。如果這里沒有-1,會導致緩存區(qū)數(shù)據(jù)和實際要控制的位發(fā)生移位。本來是要控制1號位的,變成了控制2號位。高級語音的世界里采用各種規(guī)則方便程序的打包和移植,而在低級語音里,想移植一套系統(tǒng)真不是那么容易的事,有時候不得不深入研究源碼。個人總結(jié):freeModbus也是為了遵循協(xié)議,對機器地址進行了+1轉(zhuǎn)換成了正常人類(非程序員)習慣的編碼規(guī)則。而如果不需要人機交互,在純代碼的世界里,這個+1顯得十分的沒有必要,一不小心就帶了一個比較隱蔽的bug。僅此拋磚引玉。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有賬號?立即注冊

x
回復

使用道具

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表