OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: 刘东君

分享一个ModBus主机自己写的,求点评!支持01 02 03 05 06 15 16 功能码

  [复制链接]

74

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2017-6-7
在线时间
137 小时
发表于 2018-7-5 00:02:59 | 显示全部楼层
@正点原子 @刘东君 QQ截图20180705000203.jpg 我感觉怎么没写要写入的数据 就写校验了 我理解错了 还是本身就错了?
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-7-22
在线时间
7 小时
发表于 2018-7-14 14:54:42 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2018-8-7
在线时间
74 小时
发表于 2018-8-28 20:12:45 | 显示全部楼层
@刘东君 兄弟,16功能码有点问题吖,写一次之后就不能写第二次了
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-9-10
在线时间
7 小时
发表于 2018-9-10 15:16:14 | 显示全部楼层
vghuu123 发表于 2018-1-16 16:05
楼主你好,我开发板用主机的程序,电脑当从机,串口调试助手和Modbus Slave软件接收的都是FF,这是什么情况 ...

朋友,我也遇到和你同样的问题。发送是可以的,但是返回值不对。第一个返回值就是 FF 搞了几天也没有搞定。 请问你是怎么解决的?
回复 支持 反对

使用道具 举报

3

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-9-4
在线时间
4 小时
发表于 2018-9-11 10:00:59 | 显示全部楼层
本帖最后由 hjjw1985 于 2018-9-11 10:03 编辑

@刘东君 您好,按照您的代码,在modbus slave中使用功能码06 16都成功了,但是用功能码03读数据时,modbus slave显示正确收到数据,却没有返回任何数据。您能分析下原因么,功能码03是否有其他特殊的要求?
modbus_slave.png
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
发表于 2018-10-12 09:24:18 | 显示全部楼层
楼主你好,我怎么没有找到对Timer7的初始化呢,在串口中断判断一帧数据完成的间隔时间不是Timer7在工作么,可是怎么没有初始化呢?
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
发表于 2018-10-12 09:25:50 | 显示全部楼层
10101100 发表于 2018-10-12 09:24
楼主你好,我怎么没有找到对Timer7的初始化呢,在串口中断判断一帧数据完成的间隔时间不是Timer7在工作么, ...

找到了,在485初始化里面,尴尬
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2018-11-6
在线时间
0 小时
发表于 2018-11-6 17:42:42 | 显示全部楼层

谢谢分享,帮顶!
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2017-8-2
在线时间
7 小时
发表于 2018-11-8 22:02:55 | 显示全部楼层
请问我的modbus Poll与modbus Slave进行通信时,一个端口用的是模拟端口,一个端口用的是板子的485端口,为什么modbus Poll总是显示超时
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2017-8-2
在线时间
7 小时
发表于 2018-11-8 22:03:43 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2017-8-2
在线时间
7 小时
发表于 2018-11-9 21:29:02 | 显示全部楼层
我用的是串口二,跳线帽是接好了的,rs485的ab端通过usb转485接到电脑,这个端口做从机,然后电脑上面还有一个模拟端口,做主机,这样接线有什么问题吗?
4851.jpg
4852.jpg
modbus金陵.jpg
回复 支持 反对

使用道具 举报

22

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
132 小时
 楼主| 发表于 2018-11-14 11:09:40 | 显示全部楼层
王鑫鹏 发表于 2018-11-9 21:29
我用的是串口二,跳线帽是接好了的,rs485的ab端通过usb转485接到电脑,这个端口做从机,然后电脑上面还有 ...

检查下控制引脚 看看控制引脚一样不 ,
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2017-8-2
在线时间
7 小时
发表于 2018-11-19 13:34:09 | 显示全部楼层
刘东君 发表于 2018-11-14 11:09
检查下控制引脚 看看控制引脚一样不 ,

硬件没有问题,应该是程序的问题,请问楼主用你的主机程序下载进板子,读取电机驱动器的寄存器,modbus-poll和modbus-slave调试的时候说接收字节不足呢?
回复 支持 反对

使用道具 举报

22

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
132 小时
 楼主| 发表于 2018-11-22 12:56:42 | 显示全部楼层
王鑫鹏 发表于 2018-11-19 13:34
硬件没有问题,应该是程序的问题,请问楼主用你的主机程序下载进板子,读取电机驱动器的寄存器,modbus-p ...

我这个都自己试验了 无问题,你在找下吧
回复 支持 1 反对 0

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2018-12-5
在线时间
39 小时
发表于 2018-12-7 21:30:13 | 显示全部楼层
楼主很给力!好东西分享。有两点不是很明白,望赐教。
1、主机程序中的Tim4定时器有什么功能?在哪里调用了?
2、void modbus_rtu(void)
{       
        static u8 i=0;
        static u8 j=0;
        switch(i)
        {
                case 0:
                                RS485_TX_Service();//主机先发送请求
                                if(TX_RX_SET) i=1;//发送,接受命令切换。 0发送模式 1接受模式
                                break;
                case 1:
                                RS485_RX_Service();
                                if(ComErr==0)
                                {
                                        i=3;//完成命令更换功能码!
                                }
                                else
                                {
                                        i=1;//
                                        j++;//一个命令发送3次没有应答切换下一个命令
                                        if(j>=2)
                                        {
                                                j=0;
                                                i=3;
                                                //ComErr=7;  //通讯超时
                                        }
                                }
                                break;
                case 2: //从机地址++
                                //SlaverAddr++;
                                break;
                case 3://功能码
                                break;                               
        }
       
}
这个函数不是很明白。这里的i只有一个数值,例如执行case1之后,i可能变成了3,但是会break,就跳出switch函数了。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-12-5
在线时间
4 小时
发表于 2018-12-17 12:57:37 | 显示全部楼层
为你这份精神,给你32个赞👍
回复 支持 反对

使用道具 举报

17

主题

237

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1312
金钱
1312
注册时间
2017-3-1
在线时间
259 小时
发表于 2019-3-8 17:55:02 | 显示全部楼层
本帖最后由 NewGuard 于 2019-3-8 17:59 编辑
八度空间 发表于 2017-4-7 12:35
1、labview可以的
2、关于优化嘛,这个看你怎么想了,建议将部分公用的变量什么的弄成结构体,串口设置 ...

能否问下,对于收发数据的机制,使用定时器50ms基准轮循收发事件合适吗?或者有没有其它好的思路,个人有点拙。事件少的话的感觉应该没大问题,如果轮循事件多的话,是不是实时性就差多了。
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-3-28
在线时间
8 小时
发表于 2019-4-3 10:31:36 | 显示全部楼层
楼主上线吗?为什么我下载您的主机程序后,从机是RS485型传感器,为什么没有返回来的数据呢?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-1-11
在线时间
5 小时
发表于 2019-4-22 16:28:10 | 显示全部楼层
只能说太NB了
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2016-4-21
在线时间
70 小时
发表于 2019-4-23 21:07:21 | 显示全部楼层
感谢楼主分享,代码有几次不明之处,希望能解答一下!
1、Master_05_Slove函数中,判断value,value只能为1否则不发送数据。那么如何来区别同一start_address的开和关?
2、Master_15_Slove函数中,按照协议文档,字节数是根据输入的lenth计算出来的,但函数都带了一样的参数了如何区分开和关?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-4-23
在线时间
6 小时
发表于 2019-4-23 22:56:33 | 显示全部楼层
谢谢老哥!!!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-5-2
在线时间
1 小时
发表于 2019-5-2 16:17:56 | 显示全部楼层
直接用于32的串口,不经过485可以么?
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-5-16
在线时间
18 小时
发表于 2019-5-23 16:30:48 | 显示全部楼层
楼主在吗,我课设是stm32f1基于modbus rtu与mcgs触摸屏通信的,可以加下好友吗,可以有偿的。    qq:852350171   谢谢啦:
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-5-16
在线时间
18 小时
发表于 2019-5-24 19:21:02 | 显示全部楼层
楼主,我也是战舰版,考完你的程序出现通信超时,是硬件问题还是软件问题啊?
回复 支持 反对

使用道具 举报

22

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
132 小时
 楼主| 发表于 2019-5-28 11:50:43 | 显示全部楼层
随风123456 发表于 2019-5-23 16:30
楼主在吗,我课设是stm32f1基于modbus rtu与mcgs触摸屏通信的,可以加下好友吗,可以有偿的。    qq:852350 ...

这个MCGS直接就可以通讯,不用改东西,MCGS屏做主机, STM32是从机 就可以,我自己以前用过。 不会出问题
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-9-6
在线时间
34 小时
发表于 2019-5-29 17:20:51 | 显示全部楼层
@jeff_梁,你那个弄好了,到底设什么原因呢?我现在也是用其他的程序可以通上,但是用楼主的就显示超时
回复 支持 反对

使用道具 举报

18

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2018-3-9
在线时间
44 小时
发表于 2019-5-29 18:33:14 | 显示全部楼层
主机没什么难度,crc校验一下就可以串口发送,有难度的是从机,需要清晰的架构和缜密的逻辑
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-9-6
在线时间
34 小时
发表于 2019-5-31 17:04:28 | 显示全部楼层
我的也OK了,表示感谢
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-5-16
在线时间
18 小时
发表于 2019-6-6 14:37:53 | 显示全部楼层
刘东君 发表于 2019-5-28 11:50
这个MCGS直接就可以通讯,不用改东西,MCGS屏做主机, STM32是从机 就可以,我自己以前用过。 不会出问题

真的很感谢楼主,现在可以通过触摸屏控制灯的亮灭了,不过那个16H码是不是有点问题啊,写多组寄存器时总会丢一个字
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-5-16
在线时间
18 小时
发表于 2019-6-6 14:39:31 | 显示全部楼层
随风123456 发表于 2019-6-6 14:37
真的很感谢楼主,现在可以通过触摸屏控制灯的亮灭了,不过那个16H码是不是有点问题啊,写多组寄存器时总 ...

而且读的时候,高字节和低字节好像颠倒了
回复 支持 反对

使用道具 举报

22

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
132 小时
 楼主| 发表于 2019-6-15 12:23:23 | 显示全部楼层
这个你问下MCGS的 应该不会反,我都试过了
回复 支持 反对

使用道具 举报

22

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
132 小时
 楼主| 发表于 2019-6-15 12:24:34 | 显示全部楼层
嵌入式新手 发表于 2019-5-2 16:17
直接用于32的串口,不经过485可以么?

不可以的。
回复 支持 反对

使用道具 举报

22

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
132 小时
 楼主| 发表于 2019-6-15 12:25:34 | 显示全部楼层
codywon 发表于 2019-4-23 21:07
感谢楼主分享,代码有几次不明之处,希望能解答一下!
1、Master_05_Slove函数中,判断value,value只能为 ...

这个要和规则对照来看的
回复 支持 反对

使用道具 举报

22

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
132 小时
 楼主| 发表于 2019-6-15 12:29:20 | 显示全部楼层
林深见鹿 发表于 2018-12-7 21:30
楼主很给力!好东西分享。有两点不是很明白,望赐教。
1、主机程序中的Tim4定时器有什么功能?在哪里调用 ...

这个是后面自己补充的,你的主机想如何控制从机,在这个函数设置,  假如 你有一共主机A  两个从机B1 、B2,那么你的A机要读B1的 03码 也要读B2的03码 ,读完了 B1,B2的03码,你可能要读 B1,B2的其他码 ,这里就用到循环了 ,具体需要根据实际需要来进行自己补充的。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-6-8
在线时间
10 小时
发表于 2019-6-17 14:18:32 | 显示全部楼层
楼主如何用modbus调试精灵来测试你发的那个写单个输出开关量
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2017-6-26
在线时间
73 小时
发表于 2019-7-31 09:51:21 | 显示全部楼层
楼主,请问一下,STM32F103接了两个485芯片,那么STM32是不是既可以做主机,又可以做从机。做从机时,主机是上位机;做主机时,从机是变频器。
回复 支持 反对

使用道具 举报

4

主题

98

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2018-6-27
在线时间
45 小时
发表于 2019-7-31 12:56:00 | 显示全部楼层
不错,好东西
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2019-6-27
在线时间
56 小时
发表于 2019-8-1 20:58:00 | 显示全部楼层
您好,我想请教一下,0x10也就是16功能码怎么配置使用啊?STM32做主机,给传感器发送16功能码的指令,写不进去。有一次成功了,之后再试就不行了。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-8-12
在线时间
15 小时
发表于 2019-8-21 16:40:36 | 显示全部楼层
楼主真特么的牛逼,正是我所需的,太屌了
回复 支持 反对

使用道具 举报

0

主题

45

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2018-5-24
在线时间
120 小时
发表于 2019-8-22 14:13:39 | 显示全部楼层
楼主,你好,我看一下程序,感觉串口初始化的时候好像有点问题,如果开奇偶校验且停止位为1位的话,数据长度应该为9,
回复 支持 反对

使用道具 举报

0

主题

45

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2018-5-24
在线时间
120 小时
发表于 2019-8-22 14:28:19 | 显示全部楼层
楼主,又发现一个问题,开启USART_IT_RXNE中断时候默认开启了USART_FLAG_ORE中断,所以在中断函数里要做USART_FLAG_ORE中断的处理,要不然现场通讯质量不佳的话很容易造成设备死机
回复 支持 反对

使用道具 举报

0

主题

45

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2018-5-24
在线时间
120 小时
发表于 2019-8-22 15:04:25 | 显示全部楼层
calCRC=CRC_Compute(RS485_RX_BUFF,RS485_RX_CNT-2);//计算所接收数据的CRC
进入这个函数前,需要进行长度判断,RS485_RX_CNT的长度小于2的话,例如1,进入函数后,执行长度为65535-1,单片机SRAM小的话直接进入HardFault_Handler,
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-9-5
在线时间
1 小时
发表于 2019-9-5 10:26:03 | 显示全部楼层
谢谢楼主,学习了。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-7-25
在线时间
15 小时
发表于 2019-9-11 13:49:51 | 显示全部楼层
本帖最后由 佳,JiA 于 2019-9-11 13:53 编辑

啊16是10傻×了
回复 支持 反对

使用道具 举报

1

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2018-4-24
在线时间
52 小时
发表于 2019-9-11 15:48:02 | 显示全部楼层
zczc支持支持
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-7-25
在线时间
15 小时
发表于 2019-9-16 15:38:30 | 显示全部楼层
本帖最后由 佳,JiA 于 2019-9-17 14:03 编辑

学习中
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-7-25
在线时间
15 小时
发表于 2019-9-17 14:02:32 | 显示全部楼层
开发板做主机发送 使用功能码16发送01 10 0003 0001 02 0001,modbus slave显示接收到了01 10 0003 0001 02 0001,但是返回值01 90 01 显示功能码错误,都接收到了 10  为什么显示功能码错误
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2019-4-29
在线时间
27 小时
发表于 2019-9-18 14:01:38 | 显示全部楼层
@楼主,这两个程序能在两个开发板上实现吗?就是A开发板发送数据给B开发板接收,而不是发给上位机
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-15
在线时间
13 小时
发表于 2019-9-18 15:36:13 | 显示全部楼层
牛逼,学习学习~~
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-9-20
在线时间
26 小时
发表于 2019-12-23 18:14:28 | 显示全部楼层
hjjw1985 发表于 2018-9-11 10:00
@刘东君 您好,按照您的代码,在modbus slave中使用功能码06 16都成功了,但是用功能码03读数据时,modbus  ...

你好,请问这个问题解决了吗,我也碰到这问题了,03指令读5个以下的数据正常,但一旦超个6个,串口中断只进入一次就不再进中断了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-10 19:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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