请选择 进入手机版 | 继续访问电脑版

迪文科技论坛

 找回密码
 立即注册
搜索
查看: 9097|回复: 33

【开源】用T5L C51开源一个优雅而易用的MODBUS RTU主机

[复制链接]

12

主题

70

回帖

2006

积分

金牌会员

Rank: 6Rank: 6

积分
2006
发表于 2021-5-8 16:39:19 | 显示全部楼层 |阅读模式
本帖最后由 熊家余 于 2021-5-9 09:53 编辑

.前言
1. 本实验平台为迪文的EK043开发板,当然了,只需要稍微修改一下GUI工程中的背景图片尺寸,也可以用于其他的T5L迪文屏
2. 本项目是基于T5L迪文屏,采用C51开发方式,来实现一个优雅而易用的MODBUS RTU主机
3. 本项目中使用了T5L芯片的串口2来作为MODBUS的底层通信接口,另外代码上还支持了RS485总线,另外架构上支持更换到其他的串口号,只需要修改相应的宏定义即可
4. MODBUS相关的所有源代码全部放在了HARDWARE/MODBUS文件夹下面,如果你没有定制的需求,请不要改动任何代码
MODBUS代码已经高度封装,目的是为了尽量简化使用难度,所有能配置的功能以宏定义的方式进行申明

二.如何快速上手使用
1. 先要初始化modbus,然后调用modbus事务处理器,如下图所示


2. 1ms定时器中调用modbus_check_recv_timeout函数,如下图所示:

3. 到这一步才需要你动手写代码,需要你自己实现modbus_msg_handler函数,这是一个modbus消息处理函数,当你收到从机发送过来的数据包时,系统会自动回调modbus_msg_handler这一个函数来处理消息,下面给出一个示例,如下图所示:

4. 现在我们已经知道如何去处理从机发送过来的消息了,那我们主机该如何去主动给从机发送消息呢?这就要利用到modbus_send_packet函数,比如我现在要给从机发送一个功能码为0x03的数据包,目的是为了从0x0005起始地址处读取3个寄存器的值,那么示例代码如下图所示:
上面的代码是当点击屏幕上的0x01按键返回控件时才会被触发执行

补充:
如果你是想发送0x10功能码的数据包,那么你可以使用专用的MODBUS_10_PACKET结构体,之前的MODBUS_PACKET结构体将不再适用,因为0x10功能码的数据包格式稍微特殊一点,使用示例如下:
下面的示例代码是往0x01从机的0x0004寄存器地址处连续写入2个字的数据

MODBUS_10_PACKET packet_10;

packet_10.slave_addr = 0x01;//从机地址
packet_10.func_code = MODBUS_FUNC_CODE_10;//功能码
packet_10.start_addr = 0x0004;//起始地址
packet_10.word_num = 2;//是要连续写入2个字
packet_10.val[0] = 0x1234;//第一个字的值
packet_10.val[1] = 0x5678;//第二个字的值
modbus_send_packet((u8*)&packet_10);

三.如何测试
如果你手头上有真实的从机设备,那么你可以直接用真实设备进行测试modbus通信效果,如果没有的话,那么我们可以借助Modbus Slave这个PC工具来模拟出一个从机设备,此工具已经放在了资料文件夹中,如下图所示:
安装好此工具后,打开并点击Connection->Connect...子菜单项,输入9876543210ABCDEFGHIJ5295 注册码进行注册,注册完之后才可正常使用

1. 按下图配置串行接口

2. 然后再按下图配置好从机的信息

3. 然后双击输入想要的寄存器值


四.GUI工程gui工程中就只有一个"0启动界面.jpg",如下图所示:



可以点击"发送一个数据包"按钮,那么迪文屏就会给从机发送一个功能码为0x03的数据包,主要是去读取从机0x0005起始地址处的3个寄存器的值,当迪文屏接受到从机返回的数据时,会将整个数据包以十六进制的方式显示在屏幕上

更多的细节,可以参考代码,下面上传所有代码和资源



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

62

回帖

1897

积分

金牌会员

Rank: 6Rank: 6

积分
1897
发表于 2021-5-8 17:09:24 | 显示全部楼层
必须赞一个
回复

使用道具 举报

4

主题

309

回帖

2193

积分

金牌会员

Rank: 6Rank: 6

积分
2193
发表于 2021-5-8 18:37:19 | 显示全部楼层
正在上大神之前的课,这个刚好能用到,感谢^_^
回复

使用道具 举报

2

主题

14

回帖

841

积分

高级会员

Rank: 4

积分
841
发表于 2021-5-8 21:06:13 | 显示全部楼层
相信您已经对迪文屏有一定的了解,希望您在使用迪文屏的时候把更多的开源项目分享出来,让我们一起成长,享受迪文屏的双核单芯片解决方案在显控和主控带来的便利。
回复

使用道具 举报

9

主题

18

回帖

156

积分

注册会员

Rank: 2

积分
156
发表于 2021-5-9 10:17:56 | 显示全部楼层
必须赞一个
回复

使用道具 举报

28

主题

62

回帖

941

积分

高级会员

Rank: 4

积分
941
发表于 2021-5-10 15:35:37 | 显示全部楼层
熊哥牛皮!!!
回复

使用道具 举报

0

主题

1

回帖

43

积分

新手上路

Rank: 1

积分
43
发表于 2021-9-9 20:34:41 | 显示全部楼层
熊哥,你好,我使用串口助手发现数据没问题,用Modbus Slave收到的数据只有功能码错了,本来应该是03,变成了20是怎么回事,串口助手显示的又是03,其他的数据对的
回复

使用道具 举报

10

主题

63

回帖

239

积分

中级会员

Rank: 3Rank: 3

积分
239
发表于 2021-10-20 14:36:20 | 显示全部楼层
鱼哥!看到你腾讯视频讲的 迪文C51开发,求资料!!!!
回复

使用道具 举报

2

主题

1211

回帖

7569

积分

论坛元老

Rank: 8Rank: 8

积分
7569
发表于 2021-10-20 15:08:35 | 显示全部楼层
本帖最后由 zzs999k 于 2021-10-20 15:11 编辑
zach09 发表于 2021-10-20 14:36
鱼哥!看到你腾讯视频讲的 迪文C51开发,求资料!!!!

https://www.yuanzige.com/course/detail/80041这个是余哥的资料,点击资料下载
回复

使用道具 举报

10

主题

63

回帖

239

积分

中级会员

Rank: 3Rank: 3

积分
239
发表于 2021-10-20 15:16:23 | 显示全部楼层
zzs999k 发表于 2021-10-20 15:08
https://www.yuanzige.com/course/detail/80041这个是余哥的资料,点击资料下载

非常感谢!!!
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-3-29 18:37 , Processed in 0.092100 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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