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

研究一下楼主的思路!
学艺不精,代码看了很多不懂啊!
页: [1] 2
查看完整版本: 简单的MODBUS协议实现一主机对多从机轮询的示例(主从机均为51单片机,485通讯,PROTEUS仿