搜索
bottom↓
回复: 83

modbus通信协议与程序示范

  [复制链接]

出0入0汤圆

发表于 2015-3-11 11:23:39 | 显示全部楼层 |阅读模式
RT.
MODBUS协议内通信,发送与回收格式。
另附stc12c5a60s2单片机上运行成功的modbus代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2015-6-9 09:57:50 | 显示全部楼层
MODBUS一个示例工程,是用来跟一个触屏通信做显示的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-11 12:56:51 | 显示全部楼层
有读写数据冒

出0入0汤圆

发表于 2015-3-11 12:59:30 | 显示全部楼层
是从站还是主站?

出0入0汤圆

发表于 2015-3-11 13:00:09 | 显示全部楼层
参考一下。谢谢了。                                                                                                                                    

出0入0汤圆

发表于 2015-3-11 13:20:48 | 显示全部楼层
顶一个吧!!!!!

出0入0汤圆

发表于 2015-3-11 13:31:42 | 显示全部楼层
楼主,你的头像

出0入0汤圆

发表于 2015-3-11 13:40:57 | 显示全部楼层
有没有整个工程的代码?

出0入0汤圆

发表于 2015-3-11 13:46:22 | 显示全部楼层
谢谢,刚好看看Modbus

出0入0汤圆

发表于 2015-3-11 14:23:39 | 显示全部楼层
楼主,传个工程文件学习一下

出0入0汤圆

 楼主| 发表于 2015-3-11 15:34:22 | 显示全部楼层

是主站,里面有一个参数可以设置为从站,只是还没有实现

出0入0汤圆

发表于 2015-3-12 06:03:05 来自手机 | 显示全部楼层
收藏!研究研究。

出0入0汤圆

发表于 2015-3-12 08:36:30 来自手机 | 显示全部楼层
学习一下        

出0入0汤圆

发表于 2015-3-12 14:28:48 | 显示全部楼层
期待从站也能完成,学习了

出0入0汤圆

发表于 2015-3-12 23:46:23 | 显示全部楼层
能否把整个工程上传一下,或者上传一下#include "common.h"
否则报错,谢谢

出0入0汤圆

发表于 2015-3-13 02:19:47 | 显示全部楼层
狠好,正好需要!

出0入0汤圆

发表于 2015-3-13 07:14:41 来自手机 | 显示全部楼层
刚好需要,谢谢楼主分享

出0入0汤圆

发表于 2015-3-13 08:01:37 | 显示全部楼层
多谢分享!!!

出0入0汤圆

发表于 2015-3-20 15:21:35 | 显示全部楼层
正在学习 谢谢

出0入0汤圆

发表于 2015-3-21 09:38:51 | 显示全部楼层
这个还不错的。谢谢

出0入0汤圆

发表于 2015-3-27 14:50:05 | 显示全部楼层
谢谢  正弄rtu的方式在...

出0入0汤圆

发表于 2015-3-27 15:07:50 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2015-4-5 00:26:44 | 显示全部楼层
下载收藏  好东西

出0入0汤圆

发表于 2015-4-7 11:43:15 | 显示全部楼层
是比较常用的通信协议,谢谢分享

出0入0汤圆

发表于 2015-4-7 17:52:39 | 显示全部楼层
收藏了,看一下,谢楼主!

出0入0汤圆

发表于 2015-5-1 10:41:42 | 显示全部楼层
刚刚在自己学这个modbus  看了后  学到很多呀

出0入0汤圆

 楼主| 发表于 2015-6-9 09:55:58 | 显示全部楼层
血刃修罗 发表于 2015-3-12 23:46
能否把整个工程上传一下,或者上传一下#include "common.h"
否则报错,谢谢 ...

#ifndef _COMMON_H_
#define _COMMON_H_

#include "STC_NEW_8051.H"
#include "74hc595.h"
//#include "ram.h"
//#include "io.h"
#include "Usart2.h"
#include "SampleSolvent.h"
#include "ModBusCrc16.h"
#include "ModBus.h"
#include "main.h"
#include "method.h"


#endif

出0入0汤圆

发表于 2015-6-9 11:29:35 | 显示全部楼层
谢谢楼主,

出0入0汤圆

发表于 2015-6-9 22:14:08 | 显示全部楼层
多谢分享。。。

出0入0汤圆

发表于 2015-6-9 23:28:37 | 显示全部楼层
学习一下,多谢

出100入101汤圆

发表于 2015-6-10 09:25:24 | 显示全部楼层
不错,顶一下

出0入0汤圆

发表于 2015-7-4 22:44:19 | 显示全部楼层
非常感谢分享,最近在学习Modbus。

出0入0汤圆

发表于 2015-7-5 23:16:10 | 显示全部楼层
谢谢。。

出0入0汤圆

发表于 2015-7-8 16:14:51 | 显示全部楼层
正好在看  谢谢!

出0入0汤圆

发表于 2015-8-11 13:46:16 | 显示全部楼层
不错,顶了

出0入0汤圆

发表于 2015-8-19 20:23:32 | 显示全部楼层
哥们,你这个有STM32版本的没有

出0入0汤圆

 楼主| 发表于 2015-8-20 10:44:57 | 显示全部楼层
霸气侧漏 发表于 2015-8-19 20:23
哥们,你这个有STM32版本的没有

STM32的你只要把MODBUS初始化的地方定时器还有串口改成STM32的就可以了。其他的公共的地方不用动。这个是STM32的CRC是一样的文件。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-8-20 10:50:52 | 显示全部楼层
blavy 发表于 2015-8-20 10:44
STM32的你只要把MODBUS初始化的地方定时器还有串口改成STM32的就可以了。其他的公共的地方不用动。这个是 ...

Ok  明白了,嘿嘿

出0入0汤圆

 楼主| 发表于 2015-8-20 10:50:58 | 显示全部楼层
霸气侧漏 发表于 2015-8-19 20:23
哥们,你这个有STM32版本的没有

我这个是从机代码,但通过bHost_protocol置位可以变成主机发送,当然相关的协议外代码要另外匹配,主要在externfunction、modbusrequest两个函数里面。
bHost_protocol = TRUE;                                        //主从机设置开关,TRUE 为主机,FALSE 为从机。

出0入0汤圆

发表于 2015-8-20 10:52:16 | 显示全部楼层
blavy 发表于 2015-8-20 10:44
STM32的你只要把MODBUS初始化的地方定时器还有串口改成STM32的就可以了。其他的公共的地方不用动。这个是 ...

哥们,上传一个工程呗

出0入0汤圆

发表于 2015-8-20 10:52:50 | 显示全部楼层
blavy 发表于 2015-8-20 10:50
我这个是从机代码,但通过bHost_protocol置位可以变成主机发送,当然相关的协议外代码要另外匹配,主要在 ...

感觉你的代码写的很规范,嘿嘿

出0入0汤圆

 楼主| 发表于 2015-8-20 11:01:48 | 显示全部楼层
霸气侧漏 发表于 2015-8-20 10:52
感觉你的代码写的很规范,嘿嘿

嘿,这个工程就不放上去了,这个是公司项目的,私人调试玩的项目现在电脑没有,下班再拿出来分享

出0入0汤圆

发表于 2015-8-20 11:12:32 | 显示全部楼层
坐等楼主分享ModBus。谢谢!

出0入0汤圆

发表于 2015-8-20 11:12:42 | 显示全部楼层
blavy 发表于 2015-8-20 11:01
嘿,这个工程就不放上去了,这个是公司项目的,私人调试玩的项目现在电脑没有,下班再拿出来分享  ...

   原来哥们也是有保密项目在身上。

出0入0汤圆

发表于 2015-8-20 11:19:54 | 显示全部楼层
晕,开你工程,我电脑必定卡死,开自己的工程没事

出0入0汤圆

发表于 2015-8-20 19:42:56 | 显示全部楼层
哥们上工程

出0入0汤圆

发表于 2015-8-20 21:35:10 | 显示全部楼层
标记,备用...

出0入0汤圆

 楼主| 发表于 2015-8-21 09:42:07 | 显示全部楼层
zuu0 发表于 2015-8-20 11:19
晕,开你工程,我电脑必定卡死,开自己的工程没事

因为我这个是用KEIL5做的工程,我之也有这种情况发生。自从装了5之后4的装上去一启动就跳错,根本开不了。

出0入0汤圆

 楼主| 发表于 2015-8-21 09:52:38 | 显示全部楼层
现在还需要凑足十个字

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2015-8-21 09:58:09 | 显示全部楼层
谢谢楼主的分享!

出0入0汤圆

发表于 2015-8-24 17:50:13 | 显示全部楼层
我自己写了从机的 控制继电器的一小部分,现在用着没有问题,学习下你的!

出0入0汤圆

发表于 2015-8-24 18:35:58 来自手机 | 显示全部楼层
记号      

出0入0汤圆

发表于 2016-6-29 16:49:21 | 显示全部楼层
本帖最后由 zuu0 于 2016-6-29 17:02 编辑

感觉写的很规范,有意拿来用

看了一下代码 if((ModbusPara.sRUN&MB_BUSY) ==  MB_BUSY)  没找到在哪里 把状态置为BUSY

应该在进入发送或接接就要置BUSY吧,代码中没看到

出0入0汤圆

发表于 2016-7-6 15:10:28 | 显示全部楼层
本帖最后由 zuu0 于 2016-7-6 16:23 编辑

上面明白了,,没错

if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num) <= SUM_HoldingREG_WORD)

这个想不明白楼主是怎么想的,没看明白,, 约定起始地址必须从0开始吗?,这样就能解释的通了

做从机,这代码被我改动蛮多的。。。调试中

出0入0汤圆

 楼主| 发表于 2016-7-7 09:13:16 | 显示全部楼层
zuu0 发表于 2016-7-6 15:10
上面明白了,,没错

if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num)

这代码主从都可以用,只需要设置地址与标志变量就可以了。
你看的那些命令行的代码不用更改。因为命令行里有都有主从两部份代码,有一个host变量来控制的。

出0入0汤圆

 楼主| 发表于 2016-7-7 09:19:08 | 显示全部楼层
zuu0 发表于 2016-7-6 15:10
上面明白了,,没错

if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num)

rbuf与tbuf就是做为接收或者发送的数组。只是限定的寄存器数量为120个,哪里有只能从0开始的。
        if(bHost_protocol)//当做主机
        {
                reg_num = ModbusPara.tBuf[4];                //输出数量---利用发送的数据
                reg_num <<= 8;
                reg_num += ModbusPara.tBuf[5];
                byteCount = reg_num *2;                                // 字节数=         输出数量*2
                if(ModbusPara.rBuf[2] <= LENGTH_HoldingREG && byteCount == ModbusPara.rBuf[2])
                。
                。
        }
        else//当做从机
        {
                addr_data = ModbusPara.rBuf[2];                //起始地址
                addr_data <<= 8;
                addr_data += ModbusPara.rBuf[3];
                reg_num = ModbusPara.rBuf[4];
                reg_num <<= 8;
                reg_num += ModbusPara.rBuf[5];
                if(reg_num >= 1 && reg_num <= SUM_HoldingREG_WORD)        //有读取寄存器,且数量在120个以内
                {// 保持寄存器个数判断OK
                        if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num) <= SUM_HoldingREG_WORD)
        }

出0入0汤圆

发表于 2016-7-7 09:48:54 | 显示全部楼层
本帖最后由 zuu0 于 2016-7-7 11:02 编辑
blavy 发表于 2016-7-7 09:19
rbuf与tbuf就是做为接收或者发送的数组。只是限定的寄存器数量为120个,哪里有只能从0开始的。
        if(bHost ...


谢谢你的解答

主要是这里

if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num) <= SUM_HoldingREG_WORD)  这个我是实在没看明白

addr_data 数据起始地址,SUM_HoldingREG_WORD寄存器数量      这二个的比较关系,没看明白,,,因为我以前这个起始地址都是乱来的,0x100,0x1000随便来

(addr_data + reg_num) <= SUM_HoldingREG_WORD  

再加上这句,我就更不明白了  addr_data起始地址, reg_num实际的寄存器数量,,,SUM_HoldingREG_WORD 最大的寄存器数量

后面                                ModbusPara.tBuf[k + 3] =  HoldingREGPara[addr_data];//                       
                                addr_data++;

addr_data不应该是从0开始的么?所以我觉的,是不是约定了起始地址应该0开始的

哎啊,疯了,,能解释一下么

出0入0汤圆

 楼主| 发表于 2016-7-7 13:35:54 | 显示全部楼层
zuu0 发表于 2016-7-7 09:48
谢谢你的解答

主要是这里

读取回来的数据都是放在HoldingREGPara[120*2]这个数组里,每个寄存器对应其中的HoldingREGPara[2*addr_data],HoldingREGPara[2*addr_data+1]这两字节,为什么addr_data要约定为0.

出0入0汤圆

发表于 2016-7-7 14:09:08 | 显示全部楼层
blavy 发表于 2016-7-7 13:35
读取回来的数据都是放在HoldingREGPara[120*2]这个数组里,每个寄存器对应其中的HoldingREGPara[2*addr_d ...

我主要做从机,主机这部分基本删了。。。主机这块也没怎么看,就是看到这个数组,下标 addr_data  一般情况这个地址我会比较任意的,只要双方对应好就可以了

这个地址可以0-fffff都随意,那这个数组得有多大啊

出0入0汤圆

发表于 2016-7-7 14:13:46 | 显示全部楼层

谢谢楼主的分享!

出0入0汤圆

发表于 2016-7-7 15:13:55 | 显示全部楼层
谢谢分享,MODBUS还是挺不错的。

出0入0汤圆

发表于 2017-7-12 10:53:48 | 显示全部楼层
收藏一下,不错

出0入0汤圆

发表于 2017-8-23 23:45:44 | 显示全部楼层

收藏一下,慢慢研究

出0入0汤圆

发表于 2018-5-31 20:58:03 | 显示全部楼层
收藏,刚碰到一个modbus的项目

出0入0汤圆

发表于 2018-5-31 22:56:12 | 显示全部楼层
谢谢楼主的分享!

出0入0汤圆

发表于 2018-5-31 22:58:44 来自手机 | 显示全部楼层
备注一下,后面会用到

出0入0汤圆

发表于 2018-6-20 12:49:37 | 显示全部楼层
正要用,学习一下

出0入0汤圆

发表于 2018-8-6 12:59:12 | 显示全部楼层
收藏一下,不错

出0入0汤圆

发表于 2018-8-6 14:55:39 | 显示全部楼层
谢谢分享 学习一下

出0入0汤圆

发表于 2018-9-12 15:23:55 | 显示全部楼层
好资料,MODBUS工业自动化上应用还是很多的

出0入0汤圆

发表于 2018-9-12 16:41:32 | 显示全部楼层
收藏一下,用时再慢慢研究,以前写过一个简单的通信,都忘记了。

出0入0汤圆

发表于 2018-9-15 18:14:34 | 显示全部楼层
不错,好好研究一番

出0入0汤圆

发表于 2018-9-17 18:03:37 | 显示全部楼层
简洁易懂,正好最近在研究这个

出0入0汤圆

发表于 2018-9-27 08:10:58 | 显示全部楼层
正在学习 太好了 谢谢啊

出0入0汤圆

发表于 2018-12-20 16:34:57 | 显示全部楼层
谢谢分享,学习了

出0入0汤圆

发表于 2019-3-15 17:00:56 | 显示全部楼层
是个极好的例程

出100入0汤圆

发表于 2019-7-25 13:52:14 | 显示全部楼层
主机模式有个问题看不明白,求赐教!               
        if(style == SET_COIL_MULTIPLE)
                        {// 强制多个位输出
                                ModbusPara.tBuf[6] = val/8;        // 字节数     (*此处/8如何表示字节数,看不懂,求赐教)
                                if(val%8) ModbusPara.tBuf[6] ++;
                                for (k = 0 ; k < ModbusPara.tBuf[6]; k++)
                                { // 读取指定的状态位
                                        ModbusPara.tBuf[7+k] = 0;
                                        for (i = 0 ; i < 8 ; i++)
                                        {
                                                ModbusPara.tBuf[7+k] >>= 1;
                                                if(val)
                                                {
                                                        val --;
                                                        style = 1;
                                                        style <<= sAdd%8;                                //寻找对应的BIT位号
                                                }
                                                else style = 0;                                                // 零填充
                                               
                                                if(CoilBitPara[sAdd/8] & style)
                                                {
                                                        ModbusPara.tBuf[7+k] |= 0x80;        // 将该位置1
                                                }
                                                sAdd ++;
                                        }
                                }
                                sAdd = ModbusPara.tBuf[6] + 7;
                        }

出0入0汤圆

发表于 2019-7-25 16:00:10 来自手机 | 显示全部楼层
modbus     .

出0入0汤圆

发表于 2020-7-8 09:10:59 | 显示全部楼层
dsp或者stm32 需要使用modbus的时候,大家一般是自己写代码还是移植现有开源库,比如freemodbus

出0入0汤圆

发表于 2021-8-13 21:54:07 | 显示全部楼层
谢谢楼主学习一下

出0入0汤圆

发表于 2021-8-13 22:18:06 | 显示全部楼层
谢谢楼主的分享!

出0入0汤圆

发表于 2022-2-16 19:38:44 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2022-2-24 09:09:32 | 显示全部楼层
Modbus模块还是挺好用的,最近研究了PLC和单片机Modbus rtu通讯,很好用。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 21:36

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

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