OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2721|回复: 12

有个问题请教一下?关于modbus-rtu协议的

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-10-18
在线时间
15 小时
发表于 2018-10-18 22:32:00 | 显示全部楼层 |阅读模式
1金钱
最近在用MIK-P300压力变送器,需要使用RS485和MODBUS-RTU通信协议,希望好心人帮助一下。跪谢!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-10-19 02:28:42 | 显示全部楼层
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-10-19 08:30:08 | 显示全部楼层
问题嘞?
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-10-18
在线时间
15 小时
 楼主| 发表于 2018-10-19 09:20:43 | 显示全部楼层

就是我想通过485接口读取到压力变送器的数据,是直接发送十六进制的指令给变送器就好了吗?
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-10-19 09:34:04 | 显示全部楼层
遵循modbus-rtu协议格式以一定间隔时间向变送器发送指令就可以了,单片机接收数据处理
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-10-18
在线时间
15 小时
 楼主| 发表于 2018-10-19 09:42:19 | 显示全部楼层
245925587 发表于 2018-10-19 09:34
遵循modbus-rtu协议格式以一定间隔时间向变送器发送指令就可以了,单片机接收数据处理

while(1)
        {

                rs485buf[0]=0X01;
                rs485buf[1]=0X03;
                rs485buf[2]=0X00;
                rs485buf[3]=0X04;
                rs485buf[4]=0X00;
                rs485buf[5]=0X01;
                rs485buf[6]=0XC5;
                rs485buf[7]=0XCB;

                        RS485_Send_Data(rs485buf,8);//·¢Ëí5¸ö×Ö½ú        


                }       


我现在以这样的格式发送指令,但是变送器没有响应原因可能是什么?       
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-10-19 13:12:54 | 显示全部楼层
首先看看协议是否正确,看看有没有什么多发漏发的。

上一步确认好后,把单片机接到电脑上,打开串口助手观察是否发送对应信息。
猪猪熊呢?
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-10-18
在线时间
15 小时
 楼主| 发表于 2018-10-19 16:21:34 | 显示全部楼层
323232 发表于 2018-10-19 13:12
首先看看协议是否正确,看看有没有什么多发漏发的。

上一步确认好后,把单片机接到电脑上,打开串口助手 ...

while(1)
        {

                rs485buf[0]=0X01;
                rs485buf[1]=0X03;
                rs485buf[2]=0X00;
                rs485buf[3]=0X04;
                rs485buf[4]=0X00;
                rs485buf[5]=0X01;
                rs485buf[6]=0XC5;
                rs485buf[7]=0XCB;

                        RS485_Send_Data(rs485buf,8);

                }        


我现在以这样的格式发送指令,后面两个crc校验数据也是有的,但是变送器没有响应原因可能是什么?      
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-10-19 16:30:17 | 显示全部楼层
Slogan 发表于 2018-10-19 09:42
while(1)
        {

modbus协议是发送完一帧数据 后,接收方在一个一定的时间内没有接收到数据,代表,一帧结束,发送的时候,不能一直发,发送完一帧,等待下,然后再发第二帧,发送完一帧,加个延时发第二帧
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-10-18
在线时间
15 小时
 楼主| 发表于 2018-10-19 16:39:19 | 显示全部楼层
245925587 发表于 2018-10-19 16:30
modbus协议是发送完一帧数据 后,接收方在一个一定的时间内没有接收到数据,代表,一帧结束,发送的时候 ...

while(1)
        {
       
                                rs485buf[0]=0X01;//ìî3ä·¢Ëí»o3åÇø
                                rs485buf[1]=0X03;
                                rs485buf[2]=0X00;
                                rs485buf[3]=0X04;
                                rs485buf[4]=0X00;
                                rs485buf[5]=0X01;
                                rs485buf[6]=0XC5;
                         rs485buf[7]=0XCB;

                        RS485_Send_Data(rs485buf,8);//·¢Ëí8¸ö×Ö½ú        
               
                RS485_Receive_Data(rs485buf,&key);
         if(key)//½óêÕμ½óDêy¾Y
                {
                        if(key>8)key=8;//×î′óêÇ8¸öêy¾Y.
                        for(i=0;i<key;i++)
                                {
                                        printf("%02x",rs485buf);
                                }
                }               
                       
                        while(t<=20)
                        {
                                delay_ms(2000);
                                t++;
                        }
       
        }

这是我的循环里面的代码,您能帮忙给看一下哪有问题吗?
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-10-19 16:44:54 | 显示全部楼层
Slogan 发表于 2018-10-19 16:39
while(1)
        {
       

发整个工程出来吧
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-10-18
在线时间
15 小时
 楼主| 发表于 2018-10-19 16:52:23 | 显示全部楼层
245925587 发表于 2018-10-19 16:44
发整个工程出来吧

就是这个,在战舰的基础上改的

实验25 485实验.rar

2.54 MB, 下载次数: 243

回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-10-19 17:26:24 | 显示全部楼层
Slogan 发表于 2018-10-19 16:52
就是这个,在战舰的基础上改的

RS485_Send_Data(rs485buf,8);//·¢&#203;í8&#184;&#246;×&#214;&#189;ú     

delay_ms(500);
//这里加一个延时先测试下  ,如果可以,就改一下,用一定时器来判断一帧结束否,然后再主程序中发送一帧数据后,查询接收完成否,如果接收完成,就处理,如果在一定时间内没接收到,就重新发送一次;
如果一直测试都没有,用USB转485工具,电脑串口助手,看下单片机发送的数据正不正确,然后用这个USB转485工具连接传感器,用串口助手发送这个命令,看下传感器有没数据传回,一个一个去测试  
               
RS485_Receive_Data(rs485buf,&key);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 06:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表