lylatyou
发表于 2011-2-9 03:11:49
简单的MODBUS协议实现一主机对多从机轮询的示例(主从机均为51单片机,485通讯,PROTEUS仿
我在开发产品的时候做的一个通讯测试工装,就是做一个简易小巧的模块安装在产品测试架上方便跑流水线,模块作为主机轮询若干产品。这样就省去了使用计算机加485转换器的麻烦。
在工装设计之前做了这么一个仿真示例,展示主机与从机之间应用简易的MODBUS 04命令进行轮询会话的过程。PROTEUS设计中有标示,程序中代码有注释,希望能对需要的朋友有所帮助。
今天我小改了下,给每个51从设备增加了一个I2C接口的ADC0831,它的用法大家都懂得,就是为了增加一个采样信号,主机通过协议来轮询这个采样信号,解析后显示在主机的LCD屏的对应位置上。
C代码、HEX文件、PROTEUS设计ourdev_615093XEN4TE.rar(文件大小:178K) (原文件名:POLLING-new.rar)
http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_615094J2SWHM.JPG
PROTEUS设计运行 (原文件名:POLLING.JPG)
good_001
发表于 2011-2-9 06:17:02
顶
edaworld
发表于 2011-2-9 06:24:41
马克思
vipcff
发表于 2011-2-9 07:07:09
mk
xiaowei0588
发表于 2011-2-9 08:22:52
很好!
telwin
发表于 2011-2-9 09:10:38
回复【楼主位】lylatyou 张伯伦
-----------------------------------------------------------------------
学习,3Q
lucaschou
发表于 2011-2-9 09:15:51
mark
elsonx
发表于 2011-2-9 11:26:36
mark
tingfenghu
发表于 2011-2-9 12:09:49
好东东,留名
windboy
发表于 2011-2-9 12:29:04
mark
muzheyun
发表于 2011-2-9 12:55:21
mark
ljt8015
发表于 2011-2-9 13:06:01
mark!~
showgu
发表于 2011-2-9 16:10:50
mark
cuikai12345
发表于 2011-2-9 18:26:58
mark
ztrx
发表于 2011-2-9 19:13:21
MODBUS标记,谢谢
zoto
发表于 2011-2-9 21:12:11
赞
lylatyou
发表于 2011-2-10 03:10:08
修改了下,从设备加了个ADC采集信号,主设备用LCD把轮询到的采样信号显示出来。
zhangjinxing
发表于 2011-2-10 07:02:14
mark
gxy508
发表于 2011-2-10 10:26:02
mark
lee345
发表于 2011-2-12 11:00:18
认真学习下借鉴
Adrian
发表于 2011-2-12 13:14:14
呵呵不错的学习下
wtiechen1969
发表于 2011-2-12 15:38:56
mark
hbzxx
发表于 2011-2-16 15:02:27
学习了。
plc_avr
发表于 2011-2-16 15:15:56
谢谢。。。。。。
bmw53
发表于 2011-2-24 13:00:14
无私的朋友,可以留下QQ吗,学习学习。
xintaisniper
发表于 2011-2-28 20:24:38
呵呵,好强大
charlie2008
发表于 2011-3-1 08:56:40
mark!
snowy
发表于 2011-3-1 09:35:12
mark
aijiawo
发表于 2011-3-11 19:06:26
不错,谢谢楼主无私的共享,学习了!
stely
发表于 2011-3-11 19:34:46
mark
danceman_uk
发表于 2011-3-14 01:38:34
马克思
liumaojun_cn
发表于 2011-3-14 09:00:33
mark
jadeyang
发表于 2011-3-26 15:17:17
mark
mailzql
发表于 2011-3-26 15:28:36
标记
wukaka
发表于 2011-3-27 11:25:26
适合我这菜鸟!谢谢LZ
jadeyang
发表于 2011-3-31 16:05:36
mark
sunjyong
发表于 2011-3-31 17:22:30
谢谢楼主,学习了
beiyunhe
发表于 2011-3-31 19:43:36
mark,顶起
jadeyang
发表于 2011-4-1 20:57:19
回复【楼主位】lylatyou张伯伦
-----------------------------------------------------------------------
楼主你好,我是个初学者正研究这个程序
请问这个子程序void mdproc(uchar b)
{ Uint16 temp16_1,temp16_2;
if(nodeok==0)
{ if(b==send101)
{ nodeok=1;
revptr=1;
mrx=b;
}
}
else if(revptr<11)
{ mrx=b;
}
else
{
revptr=0;
nodeok=0;
temp16_1=Crc16(mrx,9);
temp16_2=mrx;
temp16_2<<=8;
temp16_2|=mrx;
if(temp16_1==temp16_2)
{ crcok=1;
//rcnt=~rcnt;
//rcnt=~rcnt; // generate a pulse to the counter in proteus when received correct frame
}
}
这句temp16_2|=mrx是不是有问题,还有procok,crcok这两个变量分都代表什么
xiaolei0428
发表于 2011-4-3 16:48:32
mark
liu_xf
发表于 2011-4-3 17:05:27
楼主能不能介绍一下协议,超时和重发。热拔插会不会死机
lylatyou
发表于 2011-4-3 23:25:03
LS的,MODBUS是一个软件的协议,如果能解决硬件的抗静电过压等问题,热插拔是不会有问题的。
超时与重发都是你自己写代码来控制的。比如你发送一个请求帧出去后开始计时,收到对应的ID设备的有效回复后,关闭计时器并清除及时,然后重复下一次操作。如果在计时上限没有收到有效的回复,则掉包计数器加1,然后重发并重新计时,掉包计数器达到你预定的数值后,则置位通讯错误信号。。。。。起始MODBUS可以理解为一种思想,很多都是自己编程实现的,当然也有现成的标准MODBUS协议包可以直接来用,现实中为了优化,只使用少量的功能号。
unicontrol
发表于 2011-4-3 23:38:58
这个要顶呀。
tian_tian_kan
发表于 2011-4-18 09:55:12
多谢楼主,好东西啊
loveskangaroo
发表于 2011-4-23 18:58:05
mark
xiaolian519
发表于 2011-4-25 16:20:15
谢谢!
xuyingjuna
发表于 2011-5-3 15:41:27
好,谢谢楼主共享
dujun168
发表于 2011-9-1 11:28:15
mark谢谢楼主共享
qhshilin
发表于 2011-9-1 11:40:56
学习,3Q
Bicycle
发表于 2011-9-1 11:47:10
留上脚印,谢LZ
wwqq
发表于 2011-9-1 11:56:20
回复【51楼】Bicycle 单车
留上脚印,谢lz
-----------------------------------------------------------------------
+1
l09046162
发表于 2011-9-1 13:45:17
mark
gusigusi
发表于 2011-9-1 14:23:43
严重顶!
haolaishi
发表于 2011-9-14 17:23:34
mark
l09046162
发表于 2011-9-17 14:53:35
mark
cndongj
发表于 2011-9-17 16:38:02
mark,谢谢
ustcgesa
发表于 2011-9-26 11:26:32
多谢!
mculushp88
发表于 2011-10-11 17:23:03
LZ请问这种多机通信中的“轮询”啥意思?难道是逐个扫描?
hero245
发表于 2011-10-22 14:48:37
mark
cqxubo01
发表于 2011-10-22 15:11:30
mark
center311
发表于 2011-10-22 18:03:19
mark
fanwt
发表于 2011-10-22 18:19:00
modbus mark
miss12643
发表于 2011-10-22 19:15:07
mark
rlogin
发表于 2011-10-22 20:58:14
记号
gaochen15159
发表于 2011-11-10 22:48:09
谢谢楼主
truemanfjk
发表于 2011-12-8 12:40:24
回复【楼主位】lylatyou 张伯伦
-----------------------------------------------------------------------
好帖子!
xslff
发表于 2011-12-8 13:24:32
必顶!
mcu_mouse
发表于 2011-12-8 17:44:31
mark
USACH
发表于 2011-12-8 18:02:42
回复【40楼】liu_xf 新发
-----------------------------------------------------------------------
超时和重发在modbus协议里面讲得比较清楚啦。协议我想你有的,如果没有,看我发的主题,有上传。
另:freemodbus源程序里面对重发和超时做得比较好,我正在移植到430.
635656623
发表于 2011-12-8 18:19:48
顶一个!mark!
taojie
发表于 2011-12-8 18:20:23
呵呵
liangwb
发表于 2011-12-8 18:25:47
好东西 ,学习学习
senzh01
发表于 2011-12-8 20:57:30
这个挺好啊
sunluster
发表于 2011-12-8 22:02:38
学习学习
fzkqi
发表于 2011-12-8 23:17:44
mark
yww214
发表于 2011-12-10 10:26:45
狂顶啊,正在学习!
sias1002
发表于 2011-12-14 16:13:02
if(ruf1==0xed)
{
LCD_Write_String(1,5,"456");
delay_ms(500);
if((addr==0x10)&&(ruf1==0x0)){ FLAG1=1; }
if((addr==0x10)&&(ruf1==0xff)) {FLAG1=0; }
LCD_Write_String(1,5,"####");
delay_ms(500);
if((addr==0x20)&&(ruf1==0x0)) {FLAG2=0;}
if((addr==0x20)&&(ruf1==0xff)){ FLAG2=1;}
LCD_Write_String(1,5,"ruf1");
}}
zhanliang
发表于 2012-1-17 11:10:57
来学习下楼主的思想!
goldrained
发表于 2012-1-17 14:40:58
顶一下
madswan
发表于 2012-1-25 22:38:02
mark,以后有用
ni_fogota
发表于 2012-1-26 15:38:25
非常有用...可以拿来做多芯片机器
cookie
发表于 2012-2-6 09:53:39
赞
zy0818
发表于 2012-2-7 21:41:56
mark
williamrain
发表于 2012-2-19 14:54:34
可以看看
CK345
发表于 2012-2-19 15:08:46
mark
myh_hh
发表于 2012-2-21 16:24:27
mark 一定要加crc!
yxyax
发表于 2012-2-22 16:40:18
学习一下,谢谢分享
haphard
发表于 2012-2-22 16:53:09
好资料啊!谢谢
auto01
发表于 2012-2-28 14:45:26
想了解一下校验部分是怎样做的
peter_yu
发表于 2012-3-3 09:06:50
谢谢楼主!
紧急出口
发表于 2012-4-21 16:34:10
我想要啊,能把所有程序什么的发我邮箱吗?921905701@qq.com
583362324
发表于 2012-5-2 21:24:47
楼主大哥,这是老论坛附件了 下载不了,能发到我邮箱:583362324@qq.com 急需要!论坛管理者连续看了一个星期杂还是不能下载! 郁闷,纠结 下载不了 就暂封了
ad00r
发表于 2012-5-3 08:10:08
正在学习modbus,用51上传到PC机的modbus模拟器。求解中
zjk
发表于 2012-5-3 09:14:17
不错啊,mark
mengy325
发表于 2012-5-4 11:32:42
来支持下。感谢!
yuyous
发表于 2012-5-15 15:22:13
mark
rowa
发表于 2012-5-15 15:31:35
不错啊
johnsonz999
发表于 2012-5-15 15:55:44
MARK!!!!!!!!!!!!
liuruoshui
发表于 2012-5-15 16:51:34
下来研究一下架构
xukai871105
发表于 2012-10-13 20:22:49
研究一下楼主的思路!
学艺不精,代码看了很多不懂啊!