【开源】自己重构的FreeModbus主机+从机协议栈
本帖最后由 sunnydragon 于 2013-10-27 10:30 编辑Modbus协议在工控领域运用广泛,网上也有一些开源的协议栈,例如FreeModbus,但是都是从机的,支持主机的免费协议栈基本没有发现。
同时网上也没有关于FreeModbus在RTT上的移植文章,由于自己之前做过在Ucos上移植FreeModbus,所以也想把FreeModbus移植到RTT上,正好自己最近的项目要用到Modbus主机功能,所以直接重构了FreeModbus的源码,使其即支持从机同时也支持主机,也可以选择其中一种。
简单介绍下目前项目进展
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中自行裁剪。
8、修改后的源码完全参照FreeModbus源码的编码规范,保证其源码格式的统一性
该项目软件将采用Keil+IAR+Eclipse三大IDE同步开发,Keil方便调试,IAR作为Eclipse的编译工具,Eclipse作为最主要的编码调试平台,方便灵活快捷。更重要的是Eclipse支持强大的版本管理插件,在该项目中将采用GIT作为默认的版本管理软件。
另外我的博客http://blog.csdn.net/arminkztl/article/details/11738395上还有详细的移植介绍及测试方法,希望大家多提意见。
备注:该协议栈已经在STM32F103+RT-Thread操作系统平台测试通过,附件里为:RTT+FreeModbus 主机+从机协议栈 STM32工程源码
大家注意下,代码以在Github,OSChina上是最新的。建议使用最新代码,最新代码在稳定性及功能上都有增加。
Github: https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32
OSChina: http://git.oschina.net/armink/FreeModbus_Slave-Master-RTT-STM32 顶一下! 下个看看 {:victory:} 支持,谢谢。 很好很强大{:lol:} wzda_gundam 发表于 2013-10-27 10:59 static/image/common/back.gif
下个看看
要是有问题,及时反馈哈~ 这个可以有,下个研究一下 一直在找开源的Modbus Master ,没找到
正准备自己下手做这个,就看到楼主发布的这个好东西{:titter:}
第一时间跟进啊~~以后就跟楼主混了 能和 PLC、、HMI 、之类的通信用么? {:shocked:} STM32_Study 发表于 2013-10-27 17:36 static/image/common/back.gif
一直在找开源的Modbus Master ,没找到
正准备自己下手做这个,就看到楼主发布的这个好东西
呵呵~~欢迎测评哈~ jetli 发表于 2013-10-27 18:28 static/image/common/back.gif
能和 PLC、、HMI 、之类的通信用么?
必须没问题哈~我10年时候就用过FreeModbus来和台达的HMI通信,HMI做主机,STM32做从机~ 支持,下载代码试用…… 好东西,谢谢lz了 非常不错,先顶再看! sunnydragon 发表于 2013-10-27 18:42 static/image/common/back.gif
必须没问题哈~我10年时候就用过FreeModbus来和台达的HMI通信,HMI做主机,STM32做从机~ ...
我反倒是希望,mcu做主机,hmi做从机,,{:sweat:} jetli 发表于 2013-10-27 19:38 static/image/common/back.gif
我反倒是希望,mcu做主机,hmi做从机,,
原理是一样的,只要协议一致,再定义好HMI与MCU的各个寄存器、线圈等地址映射,即可搭建好测试平台 sunnydragon 发表于 2013-10-27 20:17 static/image/common/back.gif
原理是一样的,只要协议一致,再定义好HMI与MCU的各个寄存器、线圈等地址映射,即可搭建好测试平台 ...
3Q 你的热情回复。{:handshake:}
因为boss要求把以前的 单色屏 换成彩屏or HMI,这样就有个主从之分的 问题。
主mcu已经带了 3~5个小mcu当作从机,再来个HMI 只能屈就原来的系统方案做 从机、了。
jetli 发表于 2013-10-27 20:27 static/image/common/back.gif
3Q 你的热情回复。
因为boss要求把以前的 单色屏 换成彩屏or HMI,这样就有个主从之分的...
恩~那MCU必须得有Modbus主机功能了。那你可以试下我的软件,欢迎反馈哈~ 支持一下楼主!
个人拙见:FreeModbus过于追求软件的架构,一定程序上损失了性能,用于监控类的应用还好,对于实时性要求高的应用可能会出现问题;
另外,在读写线圈和寄存器时,协议栈没有提供事件触发的机制,应用时可能需要不断地查询线圈和寄存器,随着线圈和寄存器等数量的不断增大,这无疑会不断地增大系统的开销… 我也来顶起! hadio 发表于 2013-10-27 21:38 static/image/common/back.gif
支持一下楼主!
个人拙见:FreeModbus过于追求软件的架构,一定程序上损失了性能,用于监控类的应用还好, ...
1、我觉得485总线及Modbus协议自身的限制,导致过高FreeModbus通信速度受到限制。但是这样能降低软件复杂度,缩短开发周期,如果选用实时性高、速度快的总线,协议就会复杂。总之要看用户是什么样的需求了;
2、你说的这种事件触发机制,我觉得修改寄存器、线圈等在FreeModbus中相应的回调函数,增加Value判断,并把Change回传给应用,即可以实现valueChange通知~ xukai871105 发表于 2013-10-27 22:01 static/image/common/back.gif
我也来顶起!
别只是顶哦{:3_52:} 多提建议哈~ 支持一下…
来自:amoBBS 阿莫电子论坛 Windows Phone 7 客户端 有实现ModBus-TCP吗?正在学习freeModBus中,先虚心向楼主学习 谢谢楼主 顶 sun_sky 发表于 2013-10-28 00:06 static/image/common/back.gif
有实现ModBus-TCP吗?正在学习freeModBus中,先虚心向楼主学习
Modbus TCP 从机协议栈自身是支持的,主机协议栈后期考虑加进去~ Modbus Master确实很少有开源的,谢谢LZ 重量级的帖子。建议加精。 虽然还没看楼主的代码,但是觉得应该非常不错,曾经我自己也写过主机!支持 支持楼主,感谢共享! luxinsun 发表于 2013-10-28 08:18 static/image/common/back.gif
重量级的帖子。建议加精。
呵呵~多谢支持,有了大家的支持我才更有动力去为坛子开源软件做更多的贡献~ source.ant 发表于 2013-10-28 08:20 static/image/common/back.gif
虽然还没看楼主的代码,但是觉得应该非常不错,曾经我自己也写过主机!支持 ...
欢迎下载试用,正好结合你之前的经验,多给提宝贵建议哈~ 本帖最后由 luxinsun 于 2013-10-28 08:50 编辑
没有看到主机轮询多台从机,如何同步的功能。 楼主强大采用Keil+IAR+Eclipse三大IDE同步开发 luxinsun 发表于 2013-10-28 08:47 static/image/common/back.gif
没有看到主机轮询多台从机的功能。
在测试代码中目前只和一个从机通信,位于app_task.c的系统监控线程。协议栈是支持多个从机的,默认开启16个从机,轮训多个只要在主机请求从机接口中设置不同的从机ID即可(做好主机忙等待处理),非常容易 主机读从机数据,读到的数据是放哪个地方? gamep 发表于 2013-10-28 08:53 static/image/common/back.gif
楼主强大采用Keil+IAR+Eclipse三大IDE同步开发
迫不得已啊,以前单片机一直使用Keil的,但是别的软件都用Eclipse开发,Eclipse上编程和版本控制都很轻松,这样能降低很多开发周期。IAR主要是因为我用做个在Eclipse上编译ARM软件,所以。。。不过现在我基本脱离的Keil,在Eclipse上调试也是非常便捷的,强烈建议大家可以试试Eclipse+IAR插件开发STM32 luxinsun 发表于 2013-10-28 08:58 static/image/common/back.gif
主机读从机数据,读到的数据是放哪个地方?
所有节点数据位于/FreeModbus/port/user_mb_app.c下,在最顶部,你会看到相关数据结构定义 顶。MODUSBUS... 收藏了,留着以后用! 顶一下,谢谢楼主分享。 大家要是还有别的需求也可以提出来,我在后期还会做很多升级~ 最近确实要用到........非常感谢! 对楼主只能膜拜 哈哈 真的是好东西 顶起来的了 支持…… 我也顶起来。 顶楼主,这个以后一定用得着。。。{:victory:}{:victory:}{:victory:} 好东西,谢谢楼主 标记!!!! 貌似现在主流的PLC是在做PROFINET了哇
支持一下,谢谢! 顶,有空学习一下 感觉超级牛逼啊 记号,收藏 portevent.c最好也改用RTT的通信机制吧。如果我主机通讯时间小于DELAY_MB_SLAVE_POLL,从机就丢数据了。 本帖最后由 sunnydragon 于 2013-11-5 16:29 编辑
waterx3 发表于 2013-11-5 15:12 static/image/common/back.gif
portevent.c最好也改用RTT的通信机制吧。如果我主机通讯时间小于DELAY_MB_SLAVE_POLL,从机就丢数据了。 ...
首先感谢你的反馈。
另外,你说的这个问题,我有点不明白,主机的命名请求只有等主机空闲时才会发送,而主机空闲需要等待主机把当前任务处理完成,你说的“我主机通讯时间小于DELAY_MB_SLAVE_POLL,从机就丢数据”能具体举个例子吗?
定时器也是用两个,感觉这一个需要改进一下。实际上增加几个变量判断是没有问题的。至于字节间隔与帧间隔的时间并要求那么严格,所谓的1.5T或3.5T是一个大概即可。再者主从机的速度一般来讲也会一样的。 huike 发表于 2013-11-6 14:20 static/image/common/back.gif
定时器也是用两个,感觉这一个需要改进一下。实际上增加几个变量判断是没有问题的。至于字节间隔与帧间隔的 ...
感谢你的反馈
我觉得如果由两个定时器改为一个定时器确实也能实现,但是改完之后的代码复杂度及时间复杂度会增加,实时性也会降低。
毕竟STM32有很多定时器,同时使用2个定时器给Modbus主机和从机,不会占用系统很多资源。另外,/port中的源码用户可以根据自己需求相应调整,如果系统中确实定时器资源比较少,也可以根据自己系统的需求,重新移植底层,我的上层源码是不需要改动的。 顶一下,支持开源 标记一下,准备开始研究! 你这个支持多从机吗? 楼主很强,支持啊!!! 本帖最后由 worldsing 于 2013-11-25 22:14 编辑
还没有细看代码,总体上来说还不错的,
Modbus Master主要考虑的问题主要有:
1、重入保护;
2、发送和接收数据对接;
3、超时和等待处理;
有待我细看代码再发表言论。{:smile:}{:smile:} 好东西,顶一下 标记,明天细看,谢谢 怎么动态修改串口波特率? 记得 读书时mcs51课本上最后附录有个1主多从系统设计 {:sweat:} RTT收藏 zzz 还真没看到过主机MODEBUS的 正在学习,长知识。 worldsing 发表于 2013-11-25 22:11
还没有细看代码,总体上来说还不错的,
Modbus Master主要考虑的问题主要有:
恩~说的没错,期待你的测试结果,另外建议从Github下载最新源码,我会定期更新 waterx3 发表于 2013-12-2 14:41
怎么动态修改串口波特率?
你可以这样试试,理论上可行的,我没有测试
/*功能:波特率由115200切换到19200*/
eMBInit(MB_RTU, 0x01, 1, 115200,MB_PAR_EVEN);
eMBEnable();
/*...
...
在此期间,modbus的波特率是115200
...
...*/
eMBDisable();
eMBInit(MB_RTU, 0x01, 1, 19200,MB_PAR_EVEN);
eMBEnable();
/*...
...
在此期间,modbus的波特率是19200
...
...*/ 这几天时间比较忙,还没实际跑过,看了一下楼主的代码,有几个想法:
1、应用层调用Master的某一个接口时,返回的并不是接收成功或失败,
而是数据已经填到buf,或是总线被占用,从机有没有回复就是功能
码的解析,但是发起者并不知道从机返回,需要额外判断数据?
2、Msater 和Slaver回调用一个缓冲区不太好吧,主从共用时缓冲区会不
会被冲掉?
3、代码可以在有化一下,从机回复如果有错没有必要遍历功码表吧?
好东西,学习学习,modbus在工控太广泛了 本帖最后由 sunnydragon 于 2013-12-4 12:10 编辑
worldsing 发表于 2013-12-4 11:07
这几天时间比较忙,还没实际跑过,看了一下楼主的代码,有几个想法:
1、应用层调用Master的某一个接口时 ...
1、由于目前提供的主机请求接口都是异步方法,这样有利有弊,每个人需求的场合不一样,在这种情况下,主机需要通过判断主机忙等待信号及异常处理情况来得知请求的结果。后期我会提供同步方法。
2、Modbus主机和从机没有使用相同的缓冲区,以前的代码只是使用相同的回调函数罢了,回调函数内部有主从判断的。现在最新源码已经做了优化,主从回调被分离。
3、你说的没错,我一会优化一下
感谢你的反馈,如果还有建议随时可以提 本帖最后由 yx枫叶 于 2013-12-22 12:17 编辑
楼主 你好 本人菜鸟 我在使用您的代码 可是测试的时候一直为CRC ERROR 可否为我解答一下 yx枫叶 发表于 2013-12-22 12:16
楼主 你好 本人菜鸟 我在使用您的代码 可是测试的时候一直为CRC ERROR 可否为我解答一下 ...
你的通信有问题,请打开modbuspoll->Display->Communication,观察数据回复,检查硬件连接及串口配置,直至数据回复正常即可~
另外,你使用的是485还是232,如果使用485还需要在发送完成后稍微延迟一下会,再关闭发送使能。我这个例程目前针对是232接口。 好贴,一定要顶楼主 异步的优点是:不会因为等从机回应阻塞CPU,缺点是不能从函数立即返回从机数据; 同步的方法正好相反,优点是可以直接从函数接口返回数据,符合常规编程习惯,缺点是从机若长时间不回应,主机会阻塞; 使用操作系统的延时API可以解决同步的阻塞问题,但这样又使得modbus主机代码离不开操作系统,不适用于裸机的应用; 折中的办法是:将主机的发送和接收分成两个函数,而等待从机回应则交给用户在应用层自己做超时判断。 hadio 发表于 2013-12-23 13:26
异步的优点是:不会因为等从机回应阻塞CPU,缺点是不能从函数立即返回从机数据; 同步的方法正好相反,优点 ...
恩~不错,关于异步与同步你解释的非常形象。
在操作系统方面,我更加鼓励用去使用,它会让我们的应用程序开发难度大大降低,提高开发效率,所以我的软件中使用了RT-Thread这个实时操作系统。
最新的软件,我已经集成了数据管理、值改变通知、线程池等功能,采用面向对象的开发方式,再次提高了用户应用开发的便捷程度。
从机方面就无需定时或不定时刷新需要的数据,有数据发生改变会自动通过线程池生成一个任务,调用数据对应的值改变回调函数。用户只需在自己的值改变回调函数中加入相应的处理即可。这个已经在我的产品中开始使用了。
主机方面支持定时、按照一定频率及优先级自动刷新需要的数据,如果获取数据成功并发生变化则自动通知相应的值改变回调函数,失败则会触发错误对应的回调函数。这个还正在开发。
由于以上所说都是基于面向对象思想开发的,所以即便是异步方式去实现,但是面向数据的协议栈会让用户更加容易理解,方便上层应用使用。
另外,你说的同步方式我也有考虑,这个要看我这版本(面向数据版)真正在项目中的使用情况,如果使用起来非常方便,稳定性高,那么这种面向数据协议栈就是成功的,值得推广的。否则再去开发同步方式的协议栈。
感谢分享! 顶,+10W个赞 学习了。 sunnydragon 发表于 2013-12-22 16:52
你的通信有问题,请打开modbuspoll->Display->Communication,观察数据回复,检查硬件连接及串口配置,直 ...
我用的是485接口232接口我测试过没有问题了 能在麻烦您指明延时应放在何处吗 我试过放在此处 没有用 变成了timeout error 本帖最后由 sunnydragon 于 2013-12-24 11:40 编辑
yx枫叶 发表于 2013-12-24 10:48
我用的是485接口232接口我测试过没有问题了 能在麻烦您指明延时应放在何处吗 我试过放在此处 没有用 变 ...
请看截图,修改/port/portserial.c,另附Delay源码
void Delay(vu32 nCount)
{
for(; nCount > 0;nCount--);
} sunnydragon 发表于 2013-12-24 11:39
请看截图,修改/port/portserial.c,另附Delay源码
万分感谢楼主成功了 yx枫叶 发表于 2013-12-24 14:23
万分感谢楼主成功了
恭喜你~~
再多试试吧,欢迎反馈~ mark一下,,谢谢, 这个要顶。牛叉。 厉害 佩服! 希望有机会试试 想学学modbus,感谢分享 sunnydragon 发表于 2013-12-24 17:17
恭喜你~~
再多试试吧,欢迎反馈~
另外在请问下楼主如果把您的代码移植到不带有操作系统的平台上协议本身不需要修改吧? yx枫叶 发表于 2013-12-27 10:54
另外在请问下楼主如果把您的代码移植到不带有操作系统的平台上协议本身不需要修改吧? ...
不需要修改的。保证eMBPoll()能够及时轮训即可! 支持开源 定了 非常不错,支持 关注~ 支持~ ucmodbus的多主多从最方便,可惜没主机代码.