modbus通信协议与程序示范
RT.MODBUS协议内通信,发送与回收格式。
另附stc12c5a60s2单片机上运行成功的modbus代码。 MODBUS一个示例工程,是用来跟一个触屏通信做显示的。 有读写数据冒 是从站还是主站? 参考一下。谢谢了。
顶一个吧!!!!! 楼主,你的头像{:funk:} 有没有整个工程的代码? 谢谢,刚好看看Modbus 楼主,传个工程文件学习一下 liuyingqing139 发表于 2015-3-11 12:59
是从站还是主站?
是主站,里面有一个参数可以设置为从站,只是还没有实现 收藏!研究研究。 学习一下 期待从站也能完成,学习了{:smile:}{:smile:} 能否把整个工程上传一下,或者上传一下#include "common.h"
否则报错,谢谢{:smile:} 狠好,正好需要!{:lol:} 刚好需要,谢谢楼主分享 多谢分享!!! 正在学习 谢谢 这个还不错的。谢谢 谢谢正弄rtu的方式在...{:smile:} 学习一下 下载收藏好东西 是比较常用的通信协议,谢谢分享{:smile:} 收藏了,看一下,谢楼主! 刚刚在自己学这个modbus看了后学到很多呀 血刃修罗 发表于 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 谢谢楼主,{:lol:}{:lol:}{:lol:} 多谢分享。。。 学习一下,多谢 不错,顶一下 非常感谢分享,最近在学习Modbus。 谢谢。。{:biggrin:} 正好在看谢谢! 不错,顶了 哥们,你这个有STM32版本的没有 霸气侧漏 发表于 2015-8-19 20:23
哥们,你这个有STM32版本的没有
STM32的你只要把MODBUS初始化的地方定时器还有串口改成STM32的就可以了。其他的公共的地方不用动。这个是STM32的CRC是一样的文件。 blavy 发表于 2015-8-20 10:44
STM32的你只要把MODBUS初始化的地方定时器还有串口改成STM32的就可以了。其他的公共的地方不用动。这个是 ...
Ok明白了,嘿嘿 霸气侧漏 发表于 2015-8-19 20:23
哥们,你这个有STM32版本的没有
我这个是从机代码,但通过bHost_protocol置位可以变成主机发送,当然相关的协议外代码要另外匹配,主要在externfunction、modbusrequest两个函数里面。
bHost_protocol = TRUE; //主从机设置开关,TRUE 为主机,FALSE 为从机。 blavy 发表于 2015-8-20 10:44
STM32的你只要把MODBUS初始化的地方定时器还有串口改成STM32的就可以了。其他的公共的地方不用动。这个是 ...
哥们,上传一个工程呗 blavy 发表于 2015-8-20 10:50
我这个是从机代码,但通过bHost_protocol置位可以变成主机发送,当然相关的协议外代码要另外匹配,主要在 ...
感觉你的代码写的很规范,嘿嘿 霸气侧漏 发表于 2015-8-20 10:52
感觉你的代码写的很规范,嘿嘿
嘿,这个工程就不放上去了,这个是公司项目的,私人调试玩的项目现在电脑没有,下班再拿出来分享{:lol:} 坐等楼主分享ModBus。谢谢! blavy 发表于 2015-8-20 11:01
嘿,这个工程就不放上去了,这个是公司项目的,私人调试玩的项目现在电脑没有,下班再拿出来分享...
{:lol:} 原来哥们也是有保密项目在身上。 晕,开你工程,我电脑必定卡死,开自己的工程没事 哥们上工程{:lol:} 标记,备用... zuu0 发表于 2015-8-20 11:19
晕,开你工程,我电脑必定卡死,开自己的工程没事
因为我这个是用KEIL5做的工程,我之也有这种情况发生。自从装了5之后4的装上去一启动就跳错,根本开不了。 现在还需要凑足十个字 谢谢楼主的分享! 我自己写了从机的 控制继电器的一小部分,现在用着没有问题,学习下你的! 记号 本帖最后由 zuu0 于 2016-6-29 17:02 编辑
感觉写的很规范,有意拿来用
看了一下代码 if((ModbusPara.sRUN&MB_BUSY) ==MB_BUSY)没找到在哪里 把状态置为BUSY
应该在进入发送或接接就要置BUSY吧,代码中没看到 本帖最后由 zuu0 于 2016-7-6 16:23 编辑
上面明白了,,没错
if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num) <= SUM_HoldingREG_WORD)
这个想不明白楼主是怎么想的,没看明白,, 约定起始地址必须从0开始吗?,这样就能解释的通了
做从机,这代码被我改动蛮多的。。。调试中 zuu0 发表于 2016-7-6 15:10
上面明白了,,没错
if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num)
这代码主从都可以用,只需要设置地址与标志变量就可以了。
你看的那些命令行的代码不用更改。因为命令行里有都有主从两部份代码,有一个host变量来控制的。 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 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开始的
哎啊,疯了,,能解释一下么 zuu0 发表于 2016-7-7 09:48
谢谢你的解答
主要是这里
读取回来的数据都是放在HoldingREGPara这个数组里,每个寄存器对应其中的HoldingREGPara,HoldingREGPara这两字节,为什么addr_data要约定为0.
blavy 发表于 2016-7-7 13:35
读取回来的数据都是放在HoldingREGPara这个数组里,每个寄存器对应其中的HoldingREGPara
我主要做从机,主机这部分基本删了。。。主机这块也没怎么看,就是看到这个数组,下标 addr_data一般情况这个地址我会比较任意的,只要双方对应好就可以了
这个地址可以0-fffff都随意,那这个数组得有多大啊
谢谢楼主的分享! 谢谢分享,MODBUS还是挺不错的。 收藏一下,不错
收藏一下,慢慢研究 收藏,刚碰到一个modbus的项目 谢谢楼主的分享! 备注一下,后面会用到 正要用,学习一下 收藏一下,不错 谢谢分享 学习一下 好资料,MODBUS工业自动化上应用还是很多的 收藏一下,用时再慢慢研究,以前写过一个简单的通信,都忘记了。 不错,好好研究一番 简洁易懂,正好最近在研究这个{:lol:} 正在学习 太好了 谢谢啊 谢谢分享,学习了 是个极好的例程 主机模式有个问题看不明白,求赐教!
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;
} modbus . dsp或者stm32 需要使用modbus的时候,大家一般是自己写代码还是移植现有开源库,比如freemodbus 谢谢楼主学习一下 谢谢楼主的分享! 谢谢楼主
Modbus模块还是挺好用的,最近研究了PLC和单片机Modbus rtu通讯,很好用。
页:
[1]