amobbs.com 阿莫电子技术论坛

标题: 简单的MODBUS协议实现一主机对多从机轮询的示例(主从机均为51单片机,485通讯,PROTEUS仿 [打印本页]

作者: lylatyou    时间: 2011-2-9 03:11
标题: 简单的MODBUS协议实现一主机对多从机轮询的示例(主从机均为51单片机,485通讯,PROTEUS仿
我在开发产品的时候做的一个通讯测试工装,就是做一个简易小巧的模块安装在产品测试架上方便跑流水线,模块作为主机轮询若干产品。这样就省去了使用计算机加485转换器的麻烦。
在工装设计之前做了这么一个仿真示例,展示主机与从机之间应用简易的MODBUS 04命令进行轮询会话的过程。PROTEUS设计中有标示,程序中代码有注释,希望能对需要的朋友有所帮助。

今天我小改了下,给每个51从设备增加了一个I2C接口的ADC0831,它的用法大家都懂得,就是为了增加一个采样信号,主机通过协议来轮询这个采样信号,解析后显示在主机的LCD屏的对应位置上。

C代码、HEX文件、PROTEUS设计ourdev_615093XEN4TE.rar(文件大小:178K) (原文件名:POLLING-new.rar)

PROTEUS设计运行 (原文件名:POLLING.JPG)
作者: good_001    时间: 2011-2-9 06:17

作者: edaworld    时间: 2011-2-9 06:24
马克思
作者: vipcff    时间: 2011-2-9 07:07
mk
作者: xiaowei0588    时间: 2011-2-9 08:22
很好!
作者: telwin    时间: 2011-2-9 09:10
回复【楼主位】lylatyou 张伯伦
-----------------------------------------------------------------------

学习,3Q
作者: lucaschou    时间: 2011-2-9 09:15
mark
作者: elsonx    时间: 2011-2-9 11:26
mark
作者: tingfenghu    时间: 2011-2-9 12:09
好东东,留名
作者: windboy    时间: 2011-2-9 12:29
mark
作者: muzheyun    时间: 2011-2-9 12:55
mark
作者: ljt8015    时间: 2011-2-9 13:06
mark!~
作者: showgu    时间: 2011-2-9 16:10
mark
作者: cuikai12345    时间: 2011-2-9 18:26
mark
作者: ztrx    时间: 2011-2-9 19:13
MODBUS标记,谢谢
作者: zoto    时间: 2011-2-9 21:12

作者: lylatyou    时间: 2011-2-10 03:10
修改了下,从设备加了个ADC采集信号,主设备用LCD把轮询到的采样信号显示出来。
作者: zhangjinxing    时间: 2011-2-10 07:02
mark
作者: gxy508    时间: 2011-2-10 10:26
mark
作者: lee345    时间: 2011-2-12 11:00
认真学习下借鉴
作者: Adrian    时间: 2011-2-12 13:14
呵呵  不错的  学习下
作者: wtiechen1969    时间: 2011-2-12 15:38
mark
作者: hbzxx    时间: 2011-2-16 15:02
学习了。
作者: plc_avr    时间: 2011-2-16 15:15
谢谢。。。。。。
作者: bmw53    时间: 2011-2-24 13:00
无私的朋友,可以留下QQ吗,学习学习。
作者: xintaisniper    时间: 2011-2-28 20:24
呵呵,好强大
作者: charlie2008    时间: 2011-3-1 08:56
mark!
作者: snowy    时间: 2011-3-1 09:35
mark
作者: aijiawo    时间: 2011-3-11 19:06
不错,谢谢楼主无私的共享,学习了!
作者: stely    时间: 2011-3-11 19:34
mark
作者: danceman_uk    时间: 2011-3-14 01:38
马克思
作者: liumaojun_cn    时间: 2011-3-14 09:00
mark
作者: jadeyang    时间: 2011-3-26 15:17
mark
作者: mailzql    时间: 2011-3-26 15:28
标记
作者: wukaka    时间: 2011-3-27 11:25
适合我这菜鸟!谢谢LZ
作者: jadeyang    时间: 2011-3-31 16:05
mark
作者: sunjyong    时间: 2011-3-31 17:22
谢谢楼主,学习了
作者: beiyunhe    时间: 2011-3-31 19:43
mark,顶起
作者: jadeyang    时间: 2011-4-1 20:57
回复【楼主位】lylatyou  张伯伦
-----------------------------------------------------------------------

楼主你好,我是个初学者正研究这个程序

请问这个子程序void mdproc(uchar b)
{        Uint16 temp16_1,temp16_2;
        if(nodeok==0)
        {        if(b==send101[0])
                {        nodeok=1;
                        revptr=1;
                        mrx[0]=b;
                }
        }
        else if(revptr<11)
        {        mrx[revptr++]=b;
        }
        else
        {
                revptr=0;
                nodeok=0;
                temp16_1=Crc16(mrx,9);
                temp16_2=mrx[9];
                temp16_2<<=8;
                temp16_2|=mrx[10];
                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[10]是不是有问题,还有procok,crcok这两个变量分都代表什么
作者: xiaolei0428    时间: 2011-4-3 16:48
mark
作者: liu_xf    时间: 2011-4-3 17:05
楼主能不能介绍一下协议,超时和重发。热拔插会不会死机
作者: lylatyou    时间: 2011-4-3 23:25
LS的,MODBUS是一个软件的协议,如果能解决硬件的抗静电过压等问题,热插拔是不会有问题的。

超时与重发都是你自己写代码来控制的。比如你发送一个请求帧出去后开始计时,收到对应的ID设备的有效回复后,关闭计时器并清除及时,然后重复下一次操作。如果在计时上限没有收到有效的回复,则掉包计数器加1,然后重发并重新计时,掉包计数器达到你预定的数值后,则置位通讯错误信号。。。。。起始MODBUS可以理解为一种思想,很多都是自己编程实现的,当然也有现成的标准MODBUS协议包可以直接来用,现实中为了优化,只使用少量的功能号。
作者: unicontrol    时间: 2011-4-3 23:38
这个要顶呀。
作者: tian_tian_kan    时间: 2011-4-18 09:55
多谢楼主,好东西啊
作者: loveskangaroo    时间: 2011-4-23 18:58
mark
作者: xiaolian519    时间: 2011-4-25 16:20
谢谢!
作者: xuyingjuna    时间: 2011-5-3 15:41
好,谢谢楼主共享
作者: dujun168    时间: 2011-9-1 11:28
mark谢谢楼主共享
作者: qhshilin    时间: 2011-9-1 11:40
学习,3Q
作者: Bicycle    时间: 2011-9-1 11:47
留上脚印,谢LZ
作者: wwqq    时间: 2011-9-1 11:56
回复【51楼】Bicycle 单车
留上脚印,谢lz
-----------------------------------------------------------------------

+1
作者: l09046162    时间: 2011-9-1 13:45
mark
作者: gusigusi    时间: 2011-9-1 14:23
严重顶!
作者: haolaishi    时间: 2011-9-14 17:23
mark
作者: l09046162    时间: 2011-9-17 14:53
mark
作者: cndongj    时间: 2011-9-17 16:38
mark,谢谢
作者: ustcgesa    时间: 2011-9-26 11:26
多谢!
作者: mculushp88    时间: 2011-10-11 17:23
LZ请问这种多机通信中的“轮询”啥意思?难道是逐个扫描?
作者: hero245    时间: 2011-10-22 14:48
mark
作者: cqxubo01    时间: 2011-10-22 15:11
mark
作者: center311    时间: 2011-10-22 18:03
mark
作者: fanwt    时间: 2011-10-22 18:19
modbus mark
作者: miss12643    时间: 2011-10-22 19:15
mark
作者: rlogin    时间: 2011-10-22 20:58
记号
作者: gaochen15159    时间: 2011-11-10 22:48
谢谢楼主
作者: truemanfjk    时间: 2011-12-8 12:40
回复【楼主位】lylatyou 张伯伦
-----------------------------------------------------------------------

好帖子!
作者: xslff    时间: 2011-12-8 13:24
必顶!
作者: mcu_mouse    时间: 2011-12-8 17:44
mark
作者: USACH    时间: 2011-12-8 18:02
回复【40楼】liu_xf 新发
-----------------------------------------------------------------------

超时和重发在modbus协议里面讲得比较清楚啦。协议我想你有的,如果没有,看我发的主题,有上传。

另:freemodbus源程序里面对重发和超时做得比较好,我正在移植到430.
作者: 635656623    时间: 2011-12-8 18:19
顶一个!mark!
作者: taojie    时间: 2011-12-8 18:20
呵呵
作者: liangwb    时间: 2011-12-8 18:25
好东西 ,学习学习
作者: senzh01    时间: 2011-12-8 20:57
这个挺好啊
作者: sunluster    时间: 2011-12-8 22:02
学习学习
作者: fzkqi    时间: 2011-12-8 23:17
mark
作者: yww214    时间: 2011-12-10 10:26
狂顶啊,正在学习!
作者: sias1002    时间: 2011-12-14 16:13
if(ruf1[3]==0xed)       
                {
                 LCD_Write_String(1,5,"456");
                 delay_ms(500);

                if((addr==0x10)&&(ruf1[2]==0x0)){ FLAG1=1;        }
                if((addr==0x10)&&(ruf1[2]==0xff)) {FLAG1=0;        }
                 LCD_Write_String(1,5,"####");

                  delay_ms(500);
                if((addr==0x20)&&(ruf1[2]==0x0)) {FLAG2=0;}
                if((addr==0x20)&&(ruf1[2]==0xff)){ FLAG2=1;}
       

                   LCD_Write_String(1,5,"ruf1[3]");
          
           }}
作者: zhanliang    时间: 2012-1-17 11:10
来学习下楼主的思想!
作者: goldrained    时间: 2012-1-17 14:40
顶一下
作者: madswan    时间: 2012-1-25 22:38
mark,以后有用
作者: ni_fogota    时间: 2012-1-26 15:38
非常有用...可以拿来做多芯片机器
作者: cookie    时间: 2012-2-6 09:53

作者: zy0818    时间: 2012-2-7 21:41
mark
作者: williamrain    时间: 2012-2-19 14:54
可以看看
作者: CK345    时间: 2012-2-19 15:08
mark
作者: myh_hh    时间: 2012-2-21 16:24
mark 一定要加crc!
作者: yxyax    时间: 2012-2-22 16:40
学习一下,谢谢分享
作者: haphard    时间: 2012-2-22 16:53
好资料啊!谢谢
作者: auto01    时间: 2012-2-28 14:45
想了解一下校验部分是怎样做的
作者: peter_yu    时间: 2012-3-3 09:06
谢谢楼主!
作者: 紧急出口    时间: 2012-4-21 16:34
我想要啊,能把所有程序什么的发我邮箱吗?921905701@qq.com
作者: 583362324    时间: 2012-5-2 21:24
楼主大哥,这是老论坛附件了 下载不了,能发到我邮箱:583362324@qq.com 急需要!  论坛管理者连续看了一个星期杂还是不能下载! 郁闷,纠结 下载不了 就暂封了
作者: ad00r    时间: 2012-5-3 08:10
正在学习modbus,用51上传到PC机的modbus模拟器。求解中
作者: zjk    时间: 2012-5-3 09:14
不错啊,mark
作者: mengy325    时间: 2012-5-4 11:32
来支持下。感谢!
作者: yuyous    时间: 2012-5-15 15:22
mark
                                 
作者: rowa    时间: 2012-5-15 15:31
不错啊      
作者: johnsonz999    时间: 2012-5-15 15:55
MARK!!!!!!!!!!!!
作者: liuruoshui    时间: 2012-5-15 16:51
下来研究一下架构
作者: xukai871105    时间: 2012-10-13 20:22
研究一下楼主的思路!
学艺不精,代码看了很多不懂啊!




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4