移植FreeModbus+ModbusMaster+STM32至RT-Thread(3、4阶段)

摘要:
以下是FreeModbus主机的说明。2.引言。1.打开源代码/FreeModbus/port目录进行硬件迁移。目录中的文件包含以下内容。因为我主要讨论的是主机函数的迁移,所以只需要注意后缀为“_m”的文件。修改方法与从机相同。您可以参考上一篇关于从机迁移的文章:http://blog.csdn.net/arminkztl/article/details/9745725网上有很多关于奴隶迁移的介绍,但我的不一定是最好的。
一、简介及进展

经过一个多月的努力,目前项目开发已进入最后阶段。虽然比预期时间有些延迟,但也收获不少,边工作边开源的效率确实还有待提高。

简单说下目前的进展吧

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阶段)第1张

因为我这里主要讲的是有关主机的功能的移植,所以大家只需要关注带有“_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)
{
	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);
		eMBMasterReqWriteHoldingRegister(1,usModbusUserData,3);
//		eMBMasterReqWriteMultipleHoldingRegister(1,usModbusUserData,3,2);
//		eMBMasterReqReadHoldingRegister(1,3,2);
//		eMBMasterReqReadWriteMultipleHoldingRegister(1,usModbusUserData,3,2,5,2);
	}
}


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阶段)第2张移植FreeModbus+ModbusMaster+STM32至RT-Thread(3、4阶段)第3张

5、此时在Modbus slave 软件中即可看到地址为3的保持寄存器值在自动变化,由于系统监控线程是每秒运行一次,所以命令每秒发一次,所以界面每秒变一次,效果如下:

移植FreeModbus+ModbusMaster+STM32至RT-Thread(3、4阶段)第4张

大家有兴趣,还可以把系统监控线程中其他寄存器测试命令打开。

至此测试完毕,代码等过两天再上传到CSDN。


免责声明:文章转载自《移植FreeModbus+ModbusMaster+STM32至RT-Thread(3、4阶段)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇qt之窗口换肤干货|浅谈iOS端短视频SDK技术实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

建设DevOps统一运维监控平台,全面的系统监控 Zabbix VS Nagios VS Open-Falcon OR Prometheus

前言 随着Devops、云计算、微服务、容器等理念的逐步落地和大力发展,机器越来越多,应用越来越多,服务越来越微,应用运行基础环境越来多样化,容器、虚拟机、物理机不一而足。面对动辄几百上千个虚拟机、容器,数十种要监控的对象,现有的监控系统还能否支撑的住?来自于容器、虚拟机、物理机、网络设备、中间件的指标数据如何采用同一套方案快速、完整的收集和分析告警?怎样...