本帖最后由 熊家余 于 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个寄存器的值,当迪文屏接受到从机返回的数据时,会将整个数据包以十六进制的方式显示在屏幕上
更多的细节,可以参考代码,下面上传所有代码和资源
|