天天看點

移植FreeModbus+ModbusMaster(主機)+STM32至RT-Thread(3、4階段)一、簡介及進展二、使用介紹

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。  聯系信箱:[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目錄,裡面的檔案有以下内容

移植FreeModbus+ModbusMaster(主機)+STM32至RT-Thread(3、4階段)一、簡介及進展二、使用介紹

因為我這裡主要講的是有關主機的功能的移植,是以大家隻需要關注帶有“_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軟體,設定好序列槽資訊及輪訓的功能即可

移植FreeModbus+ModbusMaster(主機)+STM32至RT-Thread(3、4階段)一、簡介及進展二、使用介紹
移植FreeModbus+ModbusMaster(主機)+STM32至RT-Thread(3、4階段)一、簡介及進展二、使用介紹

5、此時在Modbus slave 軟體中即可看到位址為3的保持寄存器值在自動變化,由于系統監控線程是每秒運作一次,是以指令每秒發一次,是以界面每秒變一次,效果如下:

移植FreeModbus+ModbusMaster(主機)+STM32至RT-Thread(3、4階段)一、簡介及進展二、使用介紹

大家有興趣,還可以把系統監控線程中其他寄存器測試指令打開。

繼續閱讀