搜索
bottom↓
回复: 59

[重构开源]*uModbusMaster*|modbus主机||STM32|RTOS支持|单MCU多主机

  [复制链接]

出0入0汤圆

发表于 2017-8-13 14:02:12 | 显示全部楼层 |阅读模式
本帖最后由 FlandreUNX 于 2017-8-14 12:03 编辑

uModbusMaster


  1. /**
  2. *        __  __         _ _            __  __         _           
  3. *   _  _|  \/  |___  __| | |__ _  _ __|  \/  |__ _ __| |_ ___ _ _
  4. *  | || | |\/| / _ \/ _` | '_ \ || (_-< |\/| / _` (_-<  _/ -_) '_|
  5. *   \_,_|_|  |_\___/\__,_|_.__/\_,_/__/_|  |_\__,_/__/\__\___|_|  
  6. *
  7. *  This program is free software: you can redistribute it and/or modify
  8. *  it under the terms of the GNU Affero General Public License as
  9. *  published by the Free Software Foundation, either version 3 of the
  10. *  License, or (at your option) any later version.
  11. *
  12. *  This program is distributed in the hope that it will be useful,
  13. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. *  GNU Affero General Public License for more details.
  16. *
  17. *  You should have received a copy of the GNU Affero General Public License
  18. *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  19. */
复制代码

Modbus协议都出现好多年,也有不少开源的从机协议,但是开源的主机协议实在太少了.
本文在一个项目中需要用到modbus主机,在此论坛下找到了https://github.com/armink/FreeModbus_Slaver-Master-RTT-STM32的开源主机代码.
但是觉得他的主机查询方式有点累赘,只能固定从1开始的从机ID,浪费了很多空间,而且基于freemodbus的代码风格实在不好看.所以本人花了2天时间二次重构了该作者的代码.

该项目有以下特点

- 主机接口与Freemodbus接口基本一致;
- 采用通用请求包,简化入口变量的复杂;
- 过程与对象全隔离,单系统多主机的实现;
- 支持实时系统(本版本基于MDK RTX4)与裸机的移植;
- 请求采用线程安全的堵塞方式,不会同时访问会出错的情况;
- 仅支持RTU模式的Master
- 几乎全中文注释,一行指令一个注释,非常适合新手学习

注:本程序的例程移植是以STM32F072C8t6+KIEL5+RTX_OS环境下的移植,裸奔请根据实际情况来配置;

项目上面有直接能用的例程,如果需要移植请根据例程来移植

另外我的项目地址是https://github.com/FlandreUNX/uModbusMaster

如果各位看官喜欢该程序,可以给我点个赞star或者Fork;本程序无偿使用
但是请标明程序出处,谢谢合作;感谢armink作者的源码的贡献!

出0入0汤圆

发表于 2017-8-13 14:23:04 | 显示全部楼层
本帖最后由 kinsno 于 2017-8-13 14:25 编辑

只要是开源的,都是可喜的,可攒的。
下面我也准备要折腾,能配置多从多主的freemodbus,大约在3年前,已经完成3主1从的freemodbus。
PS:说实话,我先下手fork为先,感谢楼主。
PS:进去看了一下描述,可能还是不太合适吧,暂且放弃了,只能自己来改植了。







出0入4汤圆

发表于 2017-8-13 14:44:59 | 显示全部楼层
Dude, good job! Just stared.
正好要在 STM32 上用到 Modbus Master, 昨晚还在读 armink 的 Master 代码,写得很通用。

出0入0汤圆

 楼主| 发表于 2017-8-13 14:48:07 | 显示全部楼层
kinsno 发表于 2017-8-13 14:23
只要是开源的,都是可喜的,可攒的。
下面我也准备要折腾,能配置多从多主的freemodbus,大约在3年前,已经 ...

因为主从合体,有浪费空间的嫌疑,所以将他分离了.
我这个程序当然不是FreeModbus的风格,所以可能有点不适,
里面代码都是全注释的.所以用于学习modbus主机还是不错的

出0入0汤圆

发表于 2017-8-13 14:58:34 | 显示全部楼层
不给赞好像说不过去。

出0入4汤圆

发表于 2017-8-13 15:10:52 | 显示全部楼层
本帖最后由 atommann 于 2017-8-13 15:13 编辑

pMBM_SerialRXNE_ISR
上面这个 ISR 需要自己写吗?

Sorry, 我看到代码了,是调用的 void mbm_RTURxProcess(uMBM_Device_t *dev)

出0入0汤圆

 楼主| 发表于 2017-8-13 15:13:52 | 显示全部楼层
atommann 发表于 2017-8-13 15:10
pMBM_SerialRXNE_ISR
上面这个 ISR 需要自己写吗?

不需要 根据例程 stm32直接按照我这个改USART都没问题的了
  1. void USART1_IRQHandler(void) {
  2.   if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) {
  3.     pMBM_SerialRXNE_ISR(&mbm_Serial);
  4.   }
  5. }
复制代码

USART1改为其他串口

出0入0汤圆

发表于 2017-8-13 16:16:08 | 显示全部楼层
这个必须顶
支持一下

出10入18汤圆

发表于 2017-8-13 16:44:44 | 显示全部楼层
不错 支持一下,刚好在做modbus ,用最原始的办法,

出0入0汤圆

发表于 2017-8-13 16:53:28 | 显示全部楼层
不错学习一下

出0入0汤圆

发表于 2017-8-13 18:38:34 来自手机 | 显示全部楼层
不错,modbus主站协议

出0入198汤圆

发表于 2017-8-13 19:55:31 | 显示全部楼层
本帖最后由 sunnydragon 于 2017-8-13 19:57 编辑

很不错啊~非常感谢楼主的开源。终于看到期盼已久的 多主 Modbus 协议栈。

多主多从的嵌入式 Modbus 协议的需求量还是挺多的,经常会有网友问我如何改造 FreeModbus Master 的问题,但苦于精力有限,一直没有对该功能进行支持。再次感谢楼主的分享!

另外,澄清下你说的 ( https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32 ) 两个问题:
1、主机协议栈与从机协议栈是 开启/关闭 可以配置的,所以如果只使用一种,是可以灵活定制的;
2、从机的起始地址也并不一定非要从 1 开始,这点取决于用户对于 port 文件夹中 user_mb_app_m.c 中 Modbus 主机回调接口的实现。例如:我的一些产品中,该文件在 Modbus 数据存储方式并不是使用默认的数组这类顺序存储的方式,而是使用链表,降低了非连续型数据的内存占用。

出0入0汤圆

发表于 2017-8-13 19:57:33 | 显示全部楼层
多谢楼主共享,十分感谢,正需要主机的程序,目前从机也是使用freemodbus

出0入0汤圆

 楼主| 发表于 2017-8-13 20:03:15 | 显示全部楼层
sunnydragon 发表于 2017-8-13 19:55
很不错啊~非常感谢楼主的开源。终于看到期盼已久的 多主 Modbus 协议栈。

多主多从的嵌入式 Modbus 协议的 ...

对的改为链表+结构体的方式很好.
将主机获取数据到储存的过程进行分离,如由用户来决定如何储存这样更好,不仅仅局限于强耦合的数组
还是感谢作者对MBM的源码贡献!

出0入198汤圆

发表于 2017-8-13 22:44:49 | 显示全部楼层
本帖最后由 sunnydragon 于 2017-8-13 22:45 编辑
FlandreUNX 发表于 2017-8-13 20:03
对的改为链表+结构体的方式很好.
将主机获取数据到储存的过程进行分离,如由用户来决定如何储存这样更好, ...


不仅仅是链表,用户通过 Modbus 数据回调接口还能做很多事。

再比如我之前有做过一个专门针对 Modbus 数据结构设计的开源项目 EasyDataManager: https://github.com/armink/EasyDataManager ,把这个里面的 Cache data 数据结构与 Modbus 寄存器关联还能实现,寄存器内容变化的通知及对应的异步事件处理,完完全全事件驱动模式编程,效率大增。

这样再也不需要为了获取一个寄存器变化做些事情,而单独开辟线程轮训了。

出0入0汤圆

发表于 2017-8-13 23:14:07 | 显示全部楼层
这个必须要赞一下,学习了

出0入13汤圆

发表于 2017-8-14 10:47:33 | 显示全部楼层
不错,支持一个

出0入0汤圆

发表于 2017-8-14 11:23:07 | 显示全部楼层
dingyige!!!!!

出0入4汤圆

发表于 2017-8-14 11:43:17 | 显示全部楼层
支持一下

出40入42汤圆

发表于 2017-8-14 11:49:08 | 显示全部楼层
支持开源精神

出0入0汤圆

发表于 2017-8-14 11:52:47 | 显示全部楼层
这是主机模式开源,支持~

出0入0汤圆

发表于 2017-8-14 14:29:52 | 显示全部楼层
感谢楼主无私奉献!!

出0入42汤圆

发表于 2017-8-14 15:48:41 | 显示全部楼层
kinsno 发表于 2017-8-13 14:23
只要是开源的,都是可喜的,可攒的。
下面我也准备要折腾,能配置多从多主的freemodbus,大约在3年前,已经 ...

冒昧的问一句,fork的目的是啥?

出0入0汤圆

发表于 2017-8-14 16:42:14 | 显示全部楼层
liyang121316 发表于 2017-8-14 15:48
冒昧的问一句,fork的目的是啥?

首先你得有一个自己的GIT账号,你FORT人家的开源项目,相当于把它复制到你的账号内部

出0入42汤圆

发表于 2017-8-14 18:15:20 | 显示全部楼层
kinsno 发表于 2017-8-14 16:42
首先你得有一个自己的GIT账号,你FORT人家的开源项目,相当于把它复制到你的账号内部 ...

了然了,我有GIT账号不过很少用,还不太熟悉。

出0入0汤圆

发表于 2017-8-14 19:53:42 | 显示全部楼层
liyang121316 发表于 2017-8-14 18:15
了然了,我有GIT账号不过很少用,还不太熟悉。


然后你就可以把你感兴趣的一些开源项目,全部变成COPY一份藏在你自己的账号里,当然前提是你喜欢逛GIT,而且能挖掘到一些对于你来说感兴趣并觉得有价值的项目。






出0入0汤圆

 楼主| 发表于 2017-8-14 21:32:50 | 显示全部楼层
liyang121316 发表于 2017-8-14 15:48
冒昧的问一句,fork的目的是啥?

为该项目创建自己分支,然后修改,同时也可以将修改部分提交回作者

出0入0汤圆

发表于 2017-8-14 23:14:44 | 显示全部楼层
好东西啊,真的是好东西!

出0入0汤圆

发表于 2017-8-15 08:44:29 | 显示全部楼层
这个必须要赞一下,学习了

出0入0汤圆

发表于 2017-8-15 09:17:10 | 显示全部楼层
可以支持 网络TCP么

出100入101汤圆

发表于 2017-8-15 09:19:25 | 显示全部楼层
顶一下大牛,不明觉历

出0入0汤圆

 楼主| 发表于 2017-8-15 09:34:15 来自手机 | 显示全部楼层
凌海滨 发表于 2017-8-15 09:17
可以支持 网络TCP么

抱歉 目前主机模式仅支持rtu 后续会跟进支持tcp

出0入42汤圆

发表于 2017-8-15 10:15:51 | 显示全部楼层
FlandreUNX 发表于 2017-8-14 21:32
为该项目创建自己分支,然后修改,同时也可以将修改部分提交回作者

这个回答好,如果要保存的话用star应该就可以吧?

出0入0汤圆

发表于 2017-8-15 10:49:38 | 显示全部楼层
mark火钳刘明

出0入0汤圆

 楼主| 发表于 2017-8-15 12:15:53 | 显示全部楼层
liyang121316 发表于 2017-8-15 10:15
这个回答好,如果要保存的话用star应该就可以吧?

对的.star就能吧该项目收藏起来,不必再自己的项目下创一个新的

出0入0汤圆

发表于 2017-8-15 13:02:51 | 显示全部楼层
github下载不了,那位转到本坛

出0入0汤圆

 楼主| 发表于 2017-8-15 18:02:11 来自手机 | 显示全部楼层
shian0551 发表于 2017-8-15 13:02
github下载不了,那位转到本坛

登录后clone就行

出0入0汤圆

发表于 2017-8-16 18:25:57 | 显示全部楼层
本帖最后由 XUEPENGBIN 于 2017-8-16 18:32 编辑


pMBM_Timer_t mbm_Timer = {
  .pMBM_TimerInit = pMBM_TimerInit,
  .pMBM_TimerDisable = pMBM_TimerDisable,
  
  .pMBM_T35TimerEnable = pMBM_T35TimerEnable,
  
  .pMBM_RespondTimerEnable = pMBM_RespondTimerEnable
};
为什么不用 操作系统时候,会报错。。正往STM32F103上更改


找到原因了,模板没有把 C99打开

出0入0汤圆

 楼主| 发表于 2017-8-18 16:22:07 来自手机 | 显示全部楼层
XUEPENGBIN 发表于 2017-8-16 18:25
pMBM_Timer_t mbm_Timer = {
  .pMBM_TimerInit = pMBM_TimerInit,
  .pMBM_TimerDisable = pMBM_TimerDi ...

程序的默认特性默认是c99的 记得打开

出0入0汤圆

发表于 2017-8-18 20:24:52 | 显示全部楼层
发现C99 写代码自由一点。

出0入0汤圆

 楼主| 发表于 2017-8-18 23:57:46 | 显示全部楼层
XUEPENGBIN 发表于 2017-8-18 20:24
发现C99 写代码自由一点。

现在都基本用C99标准了 还有新的C11标准也推荐使用

出0入0汤圆

发表于 2017-9-7 11:49:07 | 显示全部楼层
有从机的RTX的demo 么

出0入0汤圆

 楼主| 发表于 2017-9-9 14:52:06 来自手机 | 显示全部楼层
vjcmain 发表于 2017-9-7 11:49
有从机的RTX的demo 么

网上从机很多个了…

出0入0汤圆

发表于 2017-9-9 16:13:51 | 显示全部楼层
很好 佩服楼主的开源精神

出0入0汤圆

发表于 2017-9-10 12:16:36 | 显示全部楼层
主机的会用到的,赞一个

出0入0汤圆

发表于 2017-9-11 13:58:49 | 显示全部楼层
好顶赞,谢谢!mark

出0入0汤圆

发表于 2017-9-11 18:27:27 | 显示全部楼层
以前好像收藏过一个master的,再收lz的,有机会用用

出0入4汤圆

发表于 2018-5-3 20:56:52 | 显示全部楼层
FlandreUNX 发表于 2017-8-13 15:13
不需要 根据例程 stm32直接按照我这个改USART都没问题的了

USART1改为其他串口 ...


我怎么找不到
.\Objects\Motherboard.axf: Error: L6218E: Undefined symbol pMBM_SerialRXNE_ISR (referred from pmserial.o).
.\Objects\Motherboard.axf: Error: L6218E: Undefined symbol pMBM_SerialTC_ISR (referred from pmserial.o).

出0入0汤圆

发表于 2018-5-3 22:13:04 | 显示全部楼层
顶一个。                                         

出0入0汤圆

发表于 2018-5-15 10:05:04 | 显示全部楼层
厉害,谢谢楼主的支持!

出0入0汤圆

发表于 2018-5-15 11:19:36 | 显示全部楼层
开源精神一定要赞

出235入235汤圆

发表于 2018-5-15 12:03:30 | 显示全部楼层
STM32 有比较稳定的modbus从机库吗?

出0入0汤圆

发表于 2018-6-8 17:33:48 | 显示全部楼层
看了两天,眼都瞅花了,还有很多清弄明白,
有没有smt32f103的OK工程,能跑一下。

出0入0汤圆

发表于 2018-6-8 17:36:49 | 显示全部楼层
ztrx 发表于 2018-5-4 00:56
我怎么找不到
.\Objects\Motherboard.axf: Error: L6218E: Undefined symbol pMBM_SerialRXNE_ISR (refer ...

pMBM_SerialRXNE_ISR
pMBM_SerialTC_ISR
这两个我觉得要把它指向下面两个函数的指针:
mbm.c 文件下
656行
void mbm_Serial_TC_ISR(pMBM_Serial_t *serial) {
  mbm_RTUTxProcess(serial->mbm_Device);
}

void mbm_Serial_Rx_ISR(pMBM_Serial_t *serial) {
  mbm_RTURxProcess(serial->mbm_Device);
}

出0入0汤圆

发表于 2018-12-19 09:19:44 | 显示全部楼层
谢谢楼主的分享!!

出0入0汤圆

发表于 2018-12-19 09:22:26 | 显示全部楼层
以前也搞modbus,谢谢楼主分享!

出0入0汤圆

发表于 2019-5-21 22:47:54 | 显示全部楼层
请问如何 测试这部分代码呢

出0入0汤圆

发表于 2019-5-21 23:09:12 来自手机 | 显示全部楼层
uModBus.     .

出0入0汤圆

发表于 2019-5-29 19:34:49 | 显示全部楼层
还没看  先感谢下 谢谢~~~~~~~~~~~~

出0入12汤圆

发表于 2020-7-13 12:07:41 | 显示全部楼层
报告一个错误:uMBM_HoldingReg_MultiReadWrite()中PDUFrame[MBM_PDU_REQ_READWRITE_WRITE_REGCNT_OFFSET] = pack2Tx->data.length * 2;应该是PDUFrame[MBM_PDU_REQ_READWRITE_WRITE_REGCNT_OFFSET+2] = pack2Tx->data.length * 2
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 16:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表