0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何将FreeMODBUS协议栈移植到AT32 MCU

MCU开发加油站 来源:AT32 MCU 雅特力科技 2023-12-15 16:22 次阅读

概述

Modbus是一种串行通信协议,是Modicon公司(现施耐德电气)于1979年为使用可编程逻辑控制器PLC)通信而发表。如今Modbus已成为工业领域通信协议的业界标准,并且是工业电子设备之间常用的连接方式。

关于Modbus协议

Modbus协议使用的是主从的通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方所使用的协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如可编程逻辑控制器(PLC)等。

MODBUS是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。 Modbus通讯物理接口可以选用串口(包括RS232RS485等),也可以选择以太网口等。 图1. Modbus通信栈

a05d2096-9b1f-11ee-8b88-92fbcf53809c.png

MODBUS协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的MODBUS协议映射能够在应用数据单元(ADU)上引入一些附加域。

图2. 通用Modbus帧

a074ec3a-9b1f-11ee-8b88-92fbcf53809c.png

当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。需要管理超时,以便明确地等待可能不会出现的应答。

图3. Modbus事务处理(无差错)

a0820208-9b1f-11ee-8b88-92fbcf53809c.png

图4. Modbus事务处理(异常响应)

a09cf4f0-9b1f-11ee-8b88-92fbcf53809c.png

MODBUS使用一个‘big-Endian’表示地址和数据项。这意味着当发射多个字节时,首先发送最高有效位。例如,寄存器大小16-bit的值为0x1234,先发送的第一字节为0x12,然后为0x34。

MODBUS的数据模型以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:

表1. Modbus数据模型

a0a9ff1a-9b1f-11ee-8b88-92fbcf53809c.png

MODBUS有三类功能码:公共功能码、用户定义功能码、保留功能码。

公共功能码是较好地被定义的功能码,保证是唯一的、公开证明的,具有可用的一致性测试。

图5. 公共功能码定义

a0adc1b8-9b1f-11ee-8b88-92fbcf53809c.png

Modbus串行链路协议是一个主从协议。在同一时刻,只有一个主节点连接于总线,一个或多个子节点(最大编号为247)连接于同一个串行总线。Modbus通信总是由主节点发起。子节点在没有收到来自主节点的请求时,从不会发送数据。子节点之间从不会互相通信。主节点在同一时刻只会发起一个Modbus事务处理。

主节点以两种模式对子节点发出Modbus请求:

1、单播模式,主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文(一个'应答')。每个子节点必须有唯一的地址(1到247),这样才能区别于其它节点被独立的寻址。

图6. 单播模式

a0be2e90-9b1f-11ee-8b88-92fbcf53809c.png

2、广播模式,主节点向所有的子节点发送请求。对于主节点广播的请求没有应答返回。广播请求一般用于写命令。所有设备必须接受广播模式的写功能。地址0是专门用于表示广播数据的。

图7. 广播模式

a0d02cd0-9b1f-11ee-8b88-92fbcf53809c.png

Modbus有两种串行传输模式被定义:RTU模式(默认)和ASCII模式。

图8. RTU和ASCII模式的位序列

a0db3c88-9b1f-11ee-8b88-92fbcf53809c.png

Modbus串行链路上所有设备的传输模式(和串行口参数)必须相同。

有关Modbus实现和特性的详细信息,请访问Modbus官网:https://modbus.org。

关于FreeModbus协议栈

FreeMODBUS是一个针对通用的Modbus协议栈在嵌入式系统中应用的实现。它提供了RTU/ASCII传输模式及TCP协议支持。FreeModbus遵循BSD许可证,这意味着用户可以将FreeModbus应用于商业环境中。目前FreeMODBUS只免费提供了一个Modbus从机节点的协议栈。该协议栈使用ANSI C编写,并且支持多个变量。 本应用指南将介绍如何在AT32F435单片机上,通过FreeMODBUS协议栈实现Modbus从机节点的主要功能,并提供基于AT32F43x_StdPeriph_Lib和FreeMODBUS协议栈的源代码。如结合AT32-Comm-EV Board和AT-START Board可以方便快速的搭建起基于RS485的Modbus从机节点。

关于Modbus Poll调试软件

Modbus Poll是一个Modbus主机模拟器,支持Modbus RTU、ASCI、TCP/IP传输模式。它可以协助开发人员调试Modbus从设备,测试和模拟Modbus协议的通信。通过多文档界面接口,可以同时监控多个Modbus从机设备、数据域等。每个窗口可简单地设定从设备ID、功能码、地址、长度和轮询间隔。支持Modbus数据模型的四个基本表格,支持Modbus的多个公共功能码。

本应用指南中将下载安装Modbus Poll在PC机上作为Modbus主机,与AT-START Board(作为Modbus从机)通过USB转RS485的模块相连,实现一个完整的、可测试的Modbus通信网络

AT32硬件准备

硬件主要由AT32-Comm-EV Board和AT-START Board组成。

本应用指南提供的demo使用到的外设资源有USARTTMR等,用户可根据具体需要灵活配置和修改,使用RS232或RS485来实现Modbus物理层的连接。

图9. AT32 Modbus结构原理图

a0ecdee8-9b1f-11ee-8b88-92fbcf53809c.png

AT-START Board

当前提供例程基于AT-START-F435。可提供基于RS232的Modbus通信。

图10. AT-START-F435 V1.0实验板

a0ff1c66-9b1f-11ee-8b88-92fbcf53809c.png

AT32-Comm-EV Board

可提供例程基于RS485的Modbus通信支持。

图11. AT-START结合AT32-Comm-EV使用

a1298adc-9b1f-11ee-8b88-92fbcf53809c.png

将FreeModbus移植到AT32上

基础工程准备

下载最新版本BSP&PACK文件,按照其应用指南进行安装及配置,本文档及例程均基于AT32F4xx_StdPeriph_Lib_V2.x.x的BSP&PACK文件进行开发。可借用at_start_f435文件夹下的temple工程来进行修改,更改文件夹及工程名为freemodbus,并准备在该工程内添加FreeMODBUS源码。

工程内添加FreeModbus源码

用户需前往FreeMODBUS官网或Github上下载最新版源码。源码包解压后,内有如下文件。

本文及所有移植例程均基于freemodbus-v1.6版本进行移植。

图12. FreeMODBUS源码文件

a141c2d2-9b1f-11ee-8b88-92fbcf53809c.png

将源码包解压后,复制modbus文件夹和demoBAREport文件夹到前面的基础工程freemodbus目录下面,将port文件夹改名为modbus_port。如下图所示。

图13. freemodbus工程目录

a161d5b8-9b1f-11ee-8b88-92fbcf53809c.png

打开工程文件,并按以下2个步骤添加到工程文件内。可参考AT提供的例程文件进行添加。

1、添加modbus和modbus_port内的所有.c文件(与tcp相关的除外)到工程项目内。

图14. freemodbus工程的项目

a17c4452-9b1f-11ee-8b88-92fbcf53809c.png

2、需将添加的.c文件所对应的.h文件的路径添加到工程的文件夹设置内。

图15. freemodbus工程的文件夹设置

a1889a68-9b1f-11ee-8b88-92fbcf53809c.png

工程代码的修改

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个基本表格)用于与ModbusPoll(作主机)进行模拟通信测试。 “mbtask.c/.h”文件中实现的调用管理:

保持寄存器的读/写

输入寄存器的读取

线圈的读/写

离散量输入的读取

“mbtask.h”文件中定义的Modbus数据模型和建立通信所需的参数:

表2. Modbus的配置参数

a1945060-9b1f-11ee-8b88-92fbcf53809c.png

设备功能的实现

1、在“mbtask.c”文件中编写void modbus_task(void)函数去调用协议栈的API层,来实现modbus从机任务的功能。

a1a3222a-9b1f-11ee-8b88-92fbcf53809c.png

2、在“main.c”文件中,由int main(void) 主函数去调用modbus_task()任务函数即可。

a1b9a4d2-9b1f-11ee-8b88-92fbcf53809c.png

设备的测试

至此,官方例程移植完毕,编译并下载,开打与AT-Link相连的串口,可看到如下打印信息。 图16. 串口打印信息

a1ca76fe-9b1f-11ee-8b88-92fbcf53809c.png

从打印信息可以看到,从设备已经正常的运行起来。

这时我们需要将此设备与上位机相连接,再打开Modbus Poll软件,模拟主设备来进行单播通信,即发送请求并接收应答。

1. 首先对Modbus Poll软件进行连接设置,选择与从设备相同的传输模式(RTU Mode),并配置相应串口的参数,也须与从设备相同。

图17. Modbus Poll连接设置

a1e54092-9b1f-11ee-8b88-92fbcf53809c.png

2. 再对Modbus Poll软件进行读写命令的定义,下面仅以功能码03(读保持寄存器)为例来讲解,用户可自行用同样的方式测试其他功能码。

图18. Modbus Poll读/写定义

a1f1a38c-9b1f-11ee-8b88-92fbcf53809c.png

3. 在Modbus Poll软件的文档界面中,可以看到已成功读回保持寄存器的值,并与从设备的程序中初始化保持寄存器时的值一致,测试通过。

图19. Modbus Poll文档界面

a1ff15c6-9b1f-11ee-8b88-92fbcf53809c.png

来源:AT32 MCU 雅特力科技

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17148

    浏览量

    351195
  • 通信协议
    +关注

    关注

    28

    文章

    883

    浏览量

    40308
  • MODBUS
    +关注

    关注

    28

    文章

    1805

    浏览量

    76996
  • 移植
    +关注

    关注

    1

    文章

    379

    浏览量

    28131
  • AT32
    +关注

    关注

    1

    文章

    113

    浏览量

    2102
收藏 人收藏

    评论

    相关推荐

    开发一款支持主机模式的FreeModbus协议

    FreeModbus 是一款开源的 Modbus 协议,但是只有从机开源,主机源码是需要收费的。同时网上也没有发现比较好的开源的 Modbus 主机协议
    发表于 07-27 16:18 3063次阅读
    开发一款支持主机模式的<b class='flag-5'>FreeModbus协议</b><b class='flag-5'>栈</b>

    如何将freemodbus移植stm32平台

    modbus是一个非常好的串口协议(当然也能用在网口上),它简洁、规范、强大。可以满足大部分的工业、嵌入式需求。这里详细说下如何将freemodbus移植
    发表于 08-16 06:59

    如何将LwIP协议移植μC/OS-II实时操作系统上去呢

    LwIP协议是什么?什么是μC/OS-II实时操作系统呢?如何将LwIP协议移植μC/OS-
    发表于 11-05 08:44

    如何将FreeModbus移植STM32平台上去

    modbus是什么?如何将FreeModbus移植STM32平台上?
    发表于 11-17 07:44

    介绍Modbus协议在STM32平台上的移植

    在STM32平台上的移植。1.1 freemodbus介绍  freemodbus是一个奥地利人写的Modbus协议。它是一个针对嵌入式应用的一个免费(自由)的通用
    发表于 01-14 06:57

    怎样去获取FreeMODBUS协议

    FreeMODBUS是什么呢?FreeMODBUS协议有何功能呢?怎样去获取FreeMODBUS协议呢?
    发表于 01-24 07:45

    RT-Thread freemodbus协议移植实现

    前言继续熟悉RT-Thread freemodbus的应用,熟悉modbus协议。平台:Pandora STM32L475,Keil MDK5,RT-Thread 4.0.3有前几次的移植,本次验证
    发表于 04-29 14:40

    Modbus on AT32 MCU

    Modbus on AT32 MCU前言本应用笔记介绍了如何将FreeMODBUS协议移植
    发表于 07-26 20:22

    GUIX移植AT32 MCU的过程和方法

    本应用笔记主要演示GUIX移植AT32 MCU的过程和方法。本应用笔记在ThreadX OS基础上进行讲解,因此建议阅读者先看AT32的如
    发表于 10-25 07:51

    如何将FreeMODBUS协议移植AT32F43x单片机

    本应用笔记介绍了如何将FreeMODBUS协议移植AT32F43x单片机方法。本文档提供的源代码演示了使用Modbus的应用程序。单片机
    发表于 10-26 06:18

    其实ST的HAL库与FreeModbus移植很配哦--FreeModbus从站设计(8)

    用HAL库函数理清Modbus的数据收发流程。阐述了HAL库与FreeModbus协议接口的基本框架。最初设想是能不能完全用HAL库的函数来实现的FreeModbus移植。基于HAL
    发表于 12-20 18:55 16次下载
    其实ST的HAL库与<b class='flag-5'>FreeModbus</b><b class='flag-5'>移植</b>很配哦--<b class='flag-5'>FreeModbus</b>从站设计(8)

    FreeModbus 在 STM32F1 平台的移植和解析

    Modbus协议在STM32平台上的移植。1.1 freemodbus介绍  freemodbus是一个奥地利人写的Modbus协议。它是一
    发表于 01-14 13:57 41次下载
    <b class='flag-5'>FreeModbus</b> 在 STM32F1 平台的<b class='flag-5'>移植</b>和解析

    如何将FreeMODBUS协议移植AT32 MCU

    之间常用的连接方式。关于Modbus协议Modbus协议使用的是主从的通讯技术,即由主设备主动查询和操作从设备。一般主控设备方所使用的协议称为ModbusMast
    的头像 发表于 11-14 08:15 945次阅读
    <b class='flag-5'>如何将</b><b class='flag-5'>FreeMODBUS协议</b><b class='flag-5'>栈</b><b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>

    如何将FreeMODBUS协议移植AT32F43x单片机方法

    电子发烧友网站提供《如何将FreeMODBUS协议移植AT32F43x单片机方法.pdf》资料免费下载
    发表于 12-18 11:15 0次下载
    <b class='flag-5'>如何将</b><b class='flag-5'>FreeMODBUS协议</b><b class='flag-5'>栈</b><b class='flag-5'>移植</b><b class='flag-5'>到</b>AT32F43x单片机方法

    FreeMODBUS协议移植AT32 MCU的方案设计

    Modbus协议使用的是主从的通讯技术,即由主设备主动查询和操作从设备。一般主控设备方所使用的协议称为Modbus Master,从设备方所使用的协议称为Modbus Slave。典
    发表于 12-15 16:09 729次阅读
    <b class='flag-5'>FreeMODBUS协议</b><b class='flag-5'>栈</b><b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>的方案设计