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

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

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

freeModbus移植后,控制點(diǎn)位錯(cuò)位

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

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

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

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

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

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

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

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

本帖子中包含更多資源

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

x
回復(fù)

使用道具

發(fā)表回復(fù)

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

本版積分規(guī)則


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