blavy 发表于 2015-3-11 11:23:39

modbus通信协议与程序示范

RT.
MODBUS协议内通信,发送与回收格式。
另附stc12c5a60s2单片机上运行成功的modbus代码。

blavy 发表于 2015-6-9 09:57:50

MODBUS一个示例工程,是用来跟一个触屏通信做显示的。

liuyingqing139 发表于 2015-3-11 12:56:51

有读写数据冒

liuyingqing139 发表于 2015-3-11 12:59:30

是从站还是主站?

51EDA技术 发表于 2015-3-11 13:00:09

参考一下。谢谢了。                                                                                                                                    

iop 发表于 2015-3-11 13:20:48

顶一个吧!!!!!

yu_studio 发表于 2015-3-11 13:31:42

楼主,你的头像{:funk:}

sbk100 发表于 2015-3-11 13:40:57

有没有整个工程的代码?

ahpuhts 发表于 2015-3-11 13:46:22

谢谢,刚好看看Modbus

yongxiangu 发表于 2015-3-11 14:23:39

楼主,传个工程文件学习一下

blavy 发表于 2015-3-11 15:34:22

liuyingqing139 发表于 2015-3-11 12:59
是从站还是主站?

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

mofire 发表于 2015-3-12 06:03:05

收藏!研究研究。

AVRTDK 发表于 2015-3-12 08:36:30

学习一下      

血刃修罗 发表于 2015-3-12 14:28:48

期待从站也能完成,学习了{:smile:}{:smile:}

血刃修罗 发表于 2015-3-12 23:46:23

能否把整个工程上传一下,或者上传一下#include "common.h"
否则报错,谢谢{:smile:}

pengtaoABC 发表于 2015-3-13 02:19:47

狠好,正好需要!{:lol:}

liang冥 发表于 2015-3-13 07:14:41

刚好需要,谢谢楼主分享

xuqingtian 发表于 2015-3-13 08:01:37

多谢分享!!!

usnmyrj 发表于 2015-3-20 15:21:35

正在学习 谢谢

dongwang_fl 发表于 2015-3-21 09:38:51

这个还不错的。谢谢

optimal001 发表于 2015-3-27 14:50:05

谢谢正弄rtu的方式在...{:smile:}

xurenhui 发表于 2015-3-27 15:07:50

学习一下

huangweida 发表于 2015-4-5 00:26:44

下载收藏好东西

fuze2009 发表于 2015-4-7 11:43:15

是比较常用的通信协议,谢谢分享{:smile:}

yayagepei 发表于 2015-4-7 17:52:39

收藏了,看一下,谢楼主!

逍遥不记年 发表于 2015-5-1 10:41:42

刚刚在自己学这个modbus看了后学到很多呀

blavy 发表于 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

ouravr2012 发表于 2015-6-9 11:29:35

谢谢楼主,{:lol:}{:lol:}{:lol:}

豪爵太子 发表于 2015-6-9 22:14:08

多谢分享。。。

zhuangchao12 发表于 2015-6-9 23:28:37

学习一下,多谢

fengyunyu 发表于 2015-6-10 09:25:24

不错,顶一下

boyun 发表于 2015-7-4 22:44:19

非常感谢分享,最近在学习Modbus。

毛毛 发表于 2015-7-5 23:16:10

谢谢。。{:biggrin:}

anpanda 发表于 2015-7-8 16:14:51

正好在看谢谢!

jerry840922 发表于 2015-8-11 13:46:16

不错,顶了

霸气侧漏 发表于 2015-8-19 20:23:32

哥们,你这个有STM32版本的没有

blavy 发表于 2015-8-20 10:44:57

霸气侧漏 发表于 2015-8-19 20:23
哥们,你这个有STM32版本的没有

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

霸气侧漏 发表于 2015-8-20 10:50:52

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

Ok明白了,嘿嘿

blavy 发表于 2015-8-20 10:50:58

霸气侧漏 发表于 2015-8-19 20:23
哥们,你这个有STM32版本的没有

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

霸气侧漏 发表于 2015-8-20 10:52:16

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

哥们,上传一个工程呗

霸气侧漏 发表于 2015-8-20 10:52:50

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

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

blavy 发表于 2015-8-20 11:01:48

霸气侧漏 发表于 2015-8-20 10:52
感觉你的代码写的很规范,嘿嘿

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

HJMB 发表于 2015-8-20 11:12:32

坐等楼主分享ModBus。谢谢!

霸气侧漏 发表于 2015-8-20 11:12:42

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

{:lol:}   原来哥们也是有保密项目在身上。

zuu0 发表于 2015-8-20 11:19:54

晕,开你工程,我电脑必定卡死,开自己的工程没事

霸气侧漏 发表于 2015-8-20 19:42:56

哥们上工程{:lol:}

wuzhpo720 发表于 2015-8-20 21:35:10

标记,备用...

blavy 发表于 2015-8-21 09:42:07

zuu0 发表于 2015-8-20 11:19
晕,开你工程,我电脑必定卡死,开自己的工程没事

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

blavy 发表于 2015-8-21 09:52:38

现在还需要凑足十个字

micintcnh 发表于 2015-8-21 09:58:09

谢谢楼主的分享!

mvpgpz 发表于 2015-8-24 17:50:13

我自己写了从机的 控制继电器的一小部分,现在用着没有问题,学习下你的!

0123456789 发表于 2015-8-24 18:35:58

记号      

zuu0 发表于 2016-6-29 16:49:21

本帖最后由 zuu0 于 2016-6-29 17:02 编辑

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

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

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

zuu0 发表于 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开始吗?,这样就能解释的通了

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

blavy 发表于 2016-7-7 09:13:16

zuu0 发表于 2016-7-6 15:10
上面明白了,,没错

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

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

blavy 发表于 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;                //输出数量---利用发送的数据
                reg_num <<= 8;
                reg_num += ModbusPara.tBuf;
                byteCount = reg_num *2;                                // 字节数=         输出数量*2
                if(ModbusPara.rBuf <= LENGTH_HoldingREG && byteCount == ModbusPara.rBuf)
                。
                。
        }
        else//当做从机
        {
                addr_data = ModbusPara.rBuf;                //起始地址
                addr_data <<= 8;
                addr_data += ModbusPara.rBuf;
                reg_num = ModbusPara.rBuf;
                reg_num <<= 8;
                reg_num += ModbusPara.rBuf;
                if(reg_num >= 1 && reg_num <= SUM_HoldingREG_WORD)        //有读取寄存器,且数量在120个以内
                {// 保持寄存器个数判断OK
                        if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num) <= SUM_HoldingREG_WORD)
        }

zuu0 发表于 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 =HoldingREGPara;//                       
                                addr_data++;

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

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

blavy 发表于 2016-7-7 13:35:54

zuu0 发表于 2016-7-7 09:48
谢谢你的解答

主要是这里


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

zuu0 发表于 2016-7-7 14:09:08

blavy 发表于 2016-7-7 13:35
读取回来的数据都是放在HoldingREGPara这个数组里,每个寄存器对应其中的HoldingREGPara

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

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

liulingang_1205 发表于 2016-7-7 14:13:46


谢谢楼主的分享!

李程宏 发表于 2016-7-7 15:13:55

谢谢分享,MODBUS还是挺不错的。

robincui 发表于 2017-7-12 10:53:48

收藏一下,不错

dazelong2018 发表于 2017-8-23 23:45:44


收藏一下,慢慢研究

yjunson 发表于 2018-5-31 20:58:03

收藏,刚碰到一个modbus的项目

yangxizhong 发表于 2018-5-31 22:56:12

谢谢楼主的分享!

337zhang 发表于 2018-5-31 22:58:44

备注一下,后面会用到

心有独钟 发表于 2018-6-20 12:49:37

正要用,学习一下

小黑人嘿嘿 发表于 2018-8-6 12:59:12

收藏一下,不错

unnormal 发表于 2018-8-6 14:55:39

谢谢分享 学习一下

68167253 发表于 2018-9-12 15:23:55

好资料,MODBUS工业自动化上应用还是很多的

dongwang_fl 发表于 2018-9-12 16:41:32

收藏一下,用时再慢慢研究,以前写过一个简单的通信,都忘记了。

cnzhoujin 发表于 2018-9-15 18:14:34

不错,好好研究一番

Tyrant 发表于 2018-9-17 18:03:37

简洁易懂,正好最近在研究这个{:lol:}

大眼睛盒 发表于 2018-9-27 08:10:58

正在学习 太好了 谢谢啊

TKZXJ 发表于 2018-12-20 16:34:57

谢谢分享,学习了

xyhh4 发表于 2019-3-15 17:00:56

是个极好的例程

pingqifa 发表于 2019-7-25 13:52:14

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

kevinchen026 发表于 2019-7-25 16:00:10

modbus   .

wanghao7797 发表于 2020-7-8 09:10:59

dsp或者stm32 需要使用modbus的时候,大家一般是自己写代码还是移植现有开源库,比如freemodbus

我会想你的 发表于 2021-8-13 21:54:07

谢谢楼主学习一下

bbbbbv 发表于 2021-8-13 22:18:06

谢谢楼主的分享!

jxyctwt 发表于 2022-2-16 19:38:44

谢谢楼主

anshaoyuan 发表于 2022-2-24 09:09:32

Modbus模块还是挺好用的,最近研究了PLC和单片机Modbus rtu通讯,很好用。
页: [1]
查看完整版本: modbus通信协议与程序示范