【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:[email protected]】
一、簡介及進展
經過一個多月的努力,目前項目開發已進入最後階段。雖然比預期時間有些延遲,但也收獲不少,邊工作邊開源的效率确實還有待提高。
簡單說下目前的進展吧
1、目前項目已經在Github中開源,大家需要的也可以去這裡https://github.com/armink/FreeModbus_Slaver-Master-RTT-STM32;
2、主機的相關的架構已經修改完成,初始化、配置Modbus主機相關接口與原有從機接口基本相同;
3、移植主機相關硬體配置與原有從機方式一緻,需要修改FreeModbus源碼中port檔案夾中字尾帶_m相關檔案;
4、Modbus主機請求主機請求功能目前實作了所有與保持寄存器、輸入寄存器、線圈及離散輸入相關的功能,并測試通過
5、目前的Modbus主機請求功能是異步模式,後期考慮友善上層調用,可以同時給上層提供同步模式的控制方法;
6、主機的異常處理任務還未添加,隻留了接口,後期考慮給上層提供回調接口,相關異常功能上層也能自動做處理;
7、目前最新代碼同時支援Modbus主機及Modbus從機兩種模式,兩者互不幹涉,使用者可以在/FreeModbus/modbus/mbconfig.h中自行裁剪。
目前的進展就這些吧,實際上我之前想把主機的請求以任務隊列的方式進行實作,FreeModbus主機自動完成任務的排程,上層隻需要關注結果即可,但是這樣也有很多弊端,太多的異步任務會使整個項目變得非常混亂,大家如果有想法也可以留言。
源代碼下載下傳:點選下載下傳
下面介紹一下FreeModbus主機的使用說明
二、使用介紹
1、硬體移植
打開源碼/FreeModbus/port目錄,裡面的檔案有以下内容
因為我這裡主要講的是有關主機的功能的移植,是以大家隻需要關注帶有“_m”字尾名的檔案,修改方式與從機一緻大家可以參考之前移植從機的文章:http://blog.csdn.net/arminkztl/article/details/9745725,網上關于從機的移植介紹非常多,我的不一定是最好的。
注:user_mb_app.c檔案包含了主從機相關回調功能的實作及Modbus實體結構的定義,使用者也可以做适當的修改,裡面的回調方法已經嚴格測試過,盡量不要去碰。
2、測試
做完主機相關硬體移植工作,即可開始驗證工作
測試的流程與測試從機基本類似,先初始化Modbus主機,再使能Modbus主機,通過線程輪訓方式與“Modbus Slave”通信,觀察軟體界面中的數值與要求的是否一緻。詳細說下每個環節吧。
1、增加兩個線程一個起名:SysMonitor(系統監控),另一個起名:ModbusMasterPoll(Modbus主機輪訓);
2、在系統監控線程中增加請求Modbus寄存器相關操作指令、擷取RTT的CPU使用率、閃爍訓示燈和喂狗功能,1S執行一次;
代碼如下:
//***************************系統監控線程***************************
//函數定義: void thread_entry_SysRunLed(void* parameter)
//入口參數:無
//出口參數:無
//備 注:Editor:Armink 2013-08-02 Company: BXXJS
//******************************************************************
void thread_entry_SysMonitor(void* parameter)
{
eMBMasterReqErrCode errorCode = MB_MRE_NO_ERR;
uint16_t errorCount = 0;
while (1)
{
cpu_usage_get(&CpuUsageMajor, &CpuUsageMinor);
usSRegHoldBuf[S_HD_CPU_USAGE_MAJOR] = CpuUsageMajor;
usSRegHoldBuf[S_HD_CPU_USAGE_MINOR] = CpuUsageMinor;
LED_LED1_ON;
LED_LED2_ON;
rt_thread_delay(DELAY_SYS_RUN_LED);
LED_LED1_OFF;
LED_LED2_OFF;
rt_thread_delay(DELAY_SYS_RUN_LED);
IWDG_Feed(); //喂狗
//Test Modbus Master
usModbusUserData[0] = (USHORT)(rt_tick_get()/10);
usModbusUserData[1] = (USHORT)(rt_tick_get()%10);
ucModbusUserData[0] = 0x1F;
// errorCode = eMBMasterReqReadDiscreteInputs(1,3,8,RT_WAITING_FOREVER);
// errorCode = eMBMasterReqWriteMultipleCoils(1,3,5,ucModbusUserData,RT_WAITING_FOREVER);
// errorCode = eMBMasterReqWriteCoil(1,8,0xFF00,RT_WAITING_FOREVER);
// errorCode = eMBMasterReqReadCoils(1,3,8,RT_WAITING_FOREVER);
// errorCode = eMBMasterReqReadInputRegister(1,3,2,RT_WAITING_FOREVER);
// errorCode = eMBMasterReqWriteHoldingRegister(1,3,usModbusUserData[0],RT_WAITING_FOREVER);
errorCode = eMBMasterReqWriteMultipleHoldingRegister(1,3,2,usModbusUserData,RT_WAITING_FOREVER);
// errorCode = eMBMasterReqReadHoldingRegister(1,3,2,RT_WAITING_FOREVER);
// errorCode = eMBMasterReqReadWriteMultipleHoldingRegister(1,3,2,usModbusUserData,5,2,RT_WAITING_FOREVER);
//記錄出錯次數
if (errorCode != MB_MRE_NO_ERR) {
errorCount++;
}
}
}
3、在Modbus主機輪訓線程中增加FreeModbus初始化(波特率115200、偶校驗、RTU、序列槽2),及FreeModbus主機輪訓方法;
代碼如下:
//************************ Modbus主機輪訓線程***************************
//函數定義: void thread_entry_ModbusMasterPoll(void* parameter)
//入口參數:無
//出口參數:無
//備 注:Editor:Armink 2013-08-28 Company: BXXJS
//******************************************************************
void thread_entry_ModbusMasterPoll(void* parameter)
{
eMBMasterInit(MB_RTU, 2, 115200, MB_PAR_EVEN);
eMBMasterEnable();
while (1)
{
eMBMasterPoll();
rt_thread_delay(DELAY_MB_MASTER_POLL);
}
}
4、打開Modbus slave軟體,設定好序列槽資訊及輪訓的功能即可
5、此時在Modbus slave 軟體中即可看到位址為3的保持寄存器值在自動變化,由于系統監控線程是每秒運作一次,是以指令每秒發一次,是以界面每秒變一次,效果如下:
大家有興趣,還可以把系統監控線程中其他寄存器測試指令打開。