一、简介及进展

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

简单说下目前的进展吧

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)
{
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软件,设置好串口信息及轮训的功能即可

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

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

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

移植FreeModbus+ModbusMaster+STM32至RT-Thread(3、4阶段)的更多相关文章

  1. 移植FreeModbus+ModbusMaster+STM32至RT-Thread(初步)

    一.项目描述 目前操作系统在嵌入式软件行业非常流行,在工控组网方面,以后可能会经常使用到Modbus主机+操作系统.Modbus从机+操作系统甚至Modbus主机+Modbus从机+操作系统.但是操作 ...

  2. FreeModbus for stm32(Keil工程)——精简Modbus slave协议【worlsing笔记】

    FreeModbus For stm32:点击下载源码 1.测试环境Keil MDK 4.7a  stm32f103c8, PB12为输出线圈,    可以通过Modbus Poll来控制线圈的输出状 ...

  3. Port of FreeModbus to STM32

    /********************************************************************************* * Port of FreeMod ...

  4. RT Thread 通过ENV来配置SFUD,操作SPI Flash

    本实验基于正点原子stm32f4探索者板子 请移步我的RT Thread论坛帖子. https://www.rt-thread.org/qa/forum.php?mod=viewthread& ...

  5. STM32 + RT Thread OS 学习笔记[二]

    串口通讯例程 通过上面的练习,对STM32项目开发有了一个直观印象,接下来尝试对串口RS232进行操作. 1.   目标需求: 开机打开串口1,侦听上位机(使用电脑串口测试软件)发送的信息,然后原样输 ...

  6. STM32 + RT Thread OS 串口通讯

    1.   创建项目 a)   禁用Finsh和console b)   默认情况下,项目文件包含了finsh,它使用COM1来通讯,另外,console输出(rt_kprintf)也使用了COM1.因 ...

  7. STM32 + RT Thread OS 学习笔记[三]

    RTGUI 据说RTGUI是多线程的,因此与RT-Thread OS的耦合度较高,有可能要访问RT-Thread的线程控制块.如果要移植到其它OS,估计难度较大.目前还处于Alpha状态,最终将会包含 ...

  8. STM32 + RT Thread OS 学习笔记[四]

    1.  补注 a)      硬件,打通通讯通道 若学习者购买了学习板,通常可以在学习板提供的示例代码中找到LCD的相关驱动代码,基本上,这里的驱动的所有代码都可以从里面找到. 从上面的示意图可见,M ...

  9. 移植mavlink到stm32详细教程,后面附快速移植方法

    一:准备材料: mavlink源码 stm32串口程序    1.mavlink源码:        a.进入mavlink官网(http://qgroundcontrol.org/mavlink/s ...

随机推荐

  1. git将本地项目添加到github远程仓库

    1.首先准备好你的github 账号密码,注册就不说了.. 2.由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以要在本地生成一个私钥和一个密钥 命令: $ ssh-keygen ...

  2. ELK(ElasticSearch, Logstash, Log4j)系统日志搭建

    1.elk平台介绍 Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等. Logsta ...

  3. [Jobdu] 题目1283:第一个只出现一次的字符

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...

  4. Lowest Common Ancestor of a Binary Search Tree (BST)

    Given a binary search tree(BST), find the lowest common ancestor of two given nodes in the BST. Node ...

  5. UVa 10806 Dijkstra,Dijkstra(最小费用最大流)

    裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...

  6. C++对象模型2--指针cout结果

    在开始之前,首先科普一下cout指针的知识,这样才能在测试程序中很好的理解: 看下面的代码: void main(void) { int a = 10; int *p = &a; cout & ...

  7. Symfony命令行

    Available commands:  help                                  显示命令的帮助信息  list                           ...

  8. python中3个帮助函数help、dir、type的使用

    1.help函数:查看模块.函数.变量的详细说明: 查看模块 help("modules") 查看包  help("json") 查看类 help(json.J ...

  9. 从基因组可视化工具——circos说起,circos安装

      这是博客改版的第一篇博文,选择最近使用的生物信息学软件——circos开始写起.circos是用perl写的生物软件,从发表的文章来看 学习circos主要是熟悉配置文件的编辑方法,搞清楚其中的标 ...

  10. 帝国cms7.0忘记后台管理账户用户名密码

    最近刚登陆以前的网站,但是发现自己的后台管理用户名密码已经忘记,于是到帝国cms论坛里面找了一下解决方案,成功解决问题.特此分享一下解决成功经验. 原帖地址:http://bbs.phome.net/ ...