2016-04-28 177 views
-1

我正試圖通過使用STM32F4-Discovery Board的UART外設實現ModBus RTU協議。如何使用C/C++映射Modbus寄存器地址

我打算使用Modbus RTU實現主站和從站功能。

這裏是我的問題

我怎麼能在UART動我接收到的數據MODBUS和傳輸來自MODBUS層數據到UART,用C/C++,請提供一些代碼片斷,可以幫助我理解你的解釋。 (截至目前我正在考慮想出一些API的,請建議一些模式)

其次我怎麼能實現Modbus寄存器和線圈。我的意思是我如何定義ModBus應用手冊中指定的地址。請用代碼片段解釋我。下面我試圖實現。

/*Global Array, Structure and Variable Declarations*/ 
/* So to access Discrete_Output_Coils[2345] 
    the valid address to include in the protocol would be 
    so we have to access address 0x929 to read the 
    data.*/ 
const unsigned short int Discrete_Output_Coils[4999]; 
const unsigned short int Discrete_Input_Contacts[4999]; 
const unsigned short int Analog_Input_Register[4999]; 
const unsigned short int Anlog_output_Holding_Register[4999]; 
+2

你的問題太寬泛。首先,從master *或* slave開始,但不能同時使用兩者。其次,閱讀Modbus規範。第三,從非常簡單的非常簡單的實現開始,您可以發送或接收幀,而不需要其他任何東西。如果您沒有基本的傳輸分揀機,嘗試考慮註冊實施毫無意義。 – user694733

回答

0

我同意user694733。你應該一步一步來。例如,您應該定義您的硬件規格(即,它們的信號和類型是什麼?有多少?這些問題的答案會告訴您有多少個寄存器以及哪種類型對您的「設備」有意義。 ,將每個信號映射到一個寄存器,然後嘗試執行單個寄存器的讀/寫操作,並對線圈或模擬信號進行CRC校驗(編程),調整協議直至達到您的預期,然後覆蓋剩下的一個寄存器類型(線圈,模擬),然後將實現擴展到多個寄存器的讀/寫操作 順便說一下,放陣列聲明並沒有顯示解決問題的努力,你要求社區做所有的努力。如果你想要一些更多的代碼,以谷歌開始多一點。這是一個鏈接到一個庫,你可以研究,看看它是否符合你的要求:http://libmodbus.org/download/