3.2 工程内添加 FreeMODBUS 源码 用户需前往FreeMODBUS官网或Github上下载最新版源码。源码包解压后,内有如下文件。 本文及所有移植例程均基于freemodbus-v1.6版本进行移植。 图 12. FreeMODBUS 源码文件 将源码包解压后,复制modbus文件夹和demo\BARE\port文件夹到前面的基础工程freemodbus目录下面,将port文件夹改名为modbus_port。如下图所示。 图 13. freemodbus 工程目录 打开工程文件,并按以下2个步骤添加到工程文件内。可参考AT提供的例程文件进行添加。 1、添加modbus和modbus_port内的所有.c文件(与tcp相关的除外)到工程项目内。 图 14. freemodbus 工程的项目 2、需将添加的.c文件所对应的.h文件的路径添加到工程的文件夹设置内。 图 15. freemodbus 工程的文件夹设置 3.3 工程代码的修改 1、 修改“port.h”文件。在该文件中添加包含关于AT32 MCU的“at32f435_437.h”头文件。补全用于互斥操作的开关中断宏定义。屏蔽掉关于TRUE、FALSE的宏定义,因在AT BSP的头文件中已有定义,避免编译出错。 2、 修改“portserial.c”和“porttimer.c”文件。在该文件中添加关于USART和TMR外设的底层驱动部分代码。用户可根据自己的硬件环境来自行修改,所以这里不进行具体说明,也可参考AT所提供的例程文件。 3、 需特别注意的是,因USART寄存器DT的值里包含数据位和校验位,而FreeMODBUS源码里在读取USART接收的数据后,会把所有值都当作数据位来处理而出错,这可能是和其他厂家的MCU有差异,所以这里需在“mbascii.c”文件中去修改源码。具体可参考AT所提供的例程文件。 4、 在工程中新建并添加“mbtask.c/.h”文件。该文件用于创建Modbus的通信任务(作从机)来调用FreeMODBUS协议栈的API层,并建立Modbus的数据模型(4个基本表格)用于与Modbus Poll(作主机)进行模拟通信测试。 “mbtask.c/.h”文件中实现的调用管理: 保持寄存器的读/写 输入寄存器的读取 线圈的读/写 离散量输入的读取 “mbtask.h”文件中定义的Modbus数据模型和建立通信所需的参数: 表 2. Modbus 的配置参数 3.4 设备功能的实现 1、 在“mbtask.c”文件中编写void modbus_task(void)函数去调用协议栈的API层,来实现modbus从机任务的功能。 2、 在“main.c”文件中,由int main(void) 主函数去调用modbus_task()任务函数即可。 4 设备的测试 至此,官方例程移植完毕,编译并下载,开打与AT-Link相连的串口,可看到如下打印信息。 图 16. 串口打印信息 从打印信息可以看到,从设备已经正常的运行起来。这时我们需要将此设备与上位机相连接,再打开Modbus Poll软件,模拟主设备来进行单播通信,即发送请求并接收应答。 1. 首先对Modbus Poll软件进行连接设置,选择与从设备相同的传输模式(RTU Mode),并配置相应串口的参数,也须与从设备相同。 图 17. Modbus Poll 连接设置 2. 再对Modbus Poll软件进行读写命令的定义,下面仅以功能码03(读保持寄存器)为例来讲解,用户可自行用同样的方式测试其他功能码。 图 18. Modbus Poll 读/写定义 3. 在Modbus Poll软件的文档界面中,可以看到已成功读回保持寄存器的值,并与从设备的程序中初始化保持寄存器时的值一致,测试通过。 图 19. Modbus Poll 文档界面 |