概述
modbus是一种串行通信协议,是modicon公司(现施耐德电气)于1979年为使用可编程逻辑控制器(plc)通信而发表。如今modbus已成为工业领域通信协议的业界标准,并且是工业电子设备之间常用的连接方式。
关于modbus协议
modbus协议使用的是主从的通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为modbus master,从设备方所使用的协议称为modbus slave。典型的主设备包括工控机和工业控制器等;典型的从设备如可编程逻辑控制器(plc)等。
modbus是osi模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。 modbus通讯物理接口可以选用串口(包括rs232、rs485等),也可以选择以太网口等。 图1. modbus通信栈
modbus协议定义了一个与基础通信层无关的简单协议数据单元(pdu)。特定总线或网络上的modbus协议映射能够在应用数据单元(adu)上引入一些附加域。
图2. 通用modbus帧
当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。需要管理超时,以便明确地等待可能不会出现的应答。
图3. modbus事务处理(无差错)
图4. modbus事务处理(异常响应)
modbus使用一个‘big-endian’表示地址和数据项。这意味着当发射多个字节时,首先发送最高有效位。例如,寄存器大小16-bit的值为0x1234,先发送的第一字节为0x12,然后为0x34。
modbus的数据模型以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:
表1. modbus数据模型
modbus有三类功能码:公共功能码、用户定义功能码、保留功能码。
公共功能码是较好地被定义的功能码,保证是唯一的、公开证明的,具有可用的一致性测试。
图5. 公共功能码定义
modbus串行链路协议是一个主从协议。在同一时刻,只有一个主节点连接于总线,一个或多个子节点(最大编号为247)连接于同一个串行总线。modbus通信总是由主节点发起。子节点在没有收到来自主节点的请求时,从不会发送数据。子节点之间从不会互相通信。主节点在同一时刻只会发起一个modbus事务处理。
主节点以两种模式对子节点发出modbus请求:
1、单播模式,主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文(一个'应答')。每个子节点必须有唯一的地址(1到247),这样才能区别于其它节点被独立的寻址。
图6. 单播模式
2、广播模式,主节点向所有的子节点发送请求。对于主节点广播的请求没有应答返回。广播请求一般用于写命令。所有设备必须接受广播模式的写功能。地址0是专门用于表示广播数据的。
图7. 广播模式
modbus有两种串行传输模式被定义:rtu模式(默认)和ascii模式。
图8. rtu和ascii模式的位序列
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结构原理图
at-start board
当前提供例程基于at-start-f435。可提供基于rs232的modbus通信。
图10. at-start-f435 v1.0实验板
at32-comm-ev board
可提供例程基于rs485的modbus通信支持。
图11. at-start结合at32-comm-ev使用
将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源码文件
将源码包解压后,复制modbus文件夹和demobareport文件夹到前面的基础工程freemodbus目录下面,将port文件夹改名为modbus_port。如下图所示。
图13. freemodbus工程目录
打开工程文件,并按以下2个步骤添加到工程文件内。可参考at提供的例程文件进行添加。
1、添加modbus和modbus_port内的所有.c文件(与tcp相关的除外)到工程项目内。
图14. freemodbus工程的项目
2、需将添加的.c文件所对应的.h文件的路径添加到工程的文件夹设置内。
图15. freemodbus工程的文件夹设置
工程代码的修改
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的配置参数
设备功能的实现
1、在“mbtask.c”文件中编写void modbus_task(void)函数去调用协议栈的api层,来实现modbus从机任务的功能。
2、在“main.c”文件中,由int main(void) 主函数去调用modbus_task()任务函数即可。
设备的测试
至此,官方例程移植完毕,编译并下载,开打与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文档界面
来源:at32 mcu 雅特力科技
瀚薪科技完成B轮融资,已出货碳化硅二极管、MOSFET超3000万颗
安森美宣布已向汽车零部件供应商海拉交付第10亿颗感应传感器IC
什么是塑料薄膜电容器,有哪些特点?
中小企业如何利用云耀云服务器弯道超车?
薄膜共模滤波器新产品TCE1210(TDK子公司)
如何将FreeMODBUS协议栈移植到AT32 MCU
!销售/回收HP4285A信号源HP4285A小兵/李S
Vectoraic项目评测:区块链落地自动驾驶的革命性技术
车载以太网的发展趋势及测试经验分享
广州供电局智能微电网项目在南沙试点投运
CAD怎么将图形从一张图纸复制到另一张图纸中?
世界正逐步将物联网转变为万物互联
小米重磅推出新款小米路由器AX6000
Wolfson推出高传真音讯(HD Audio)新产品线 为PC和NB掀起高传真音
用户反馈:Google Assistant 无法控制智能家居设备
牙科CBCT中最重要的元件:平板探测器
立讯精密正式打入iPhone供应链!上半年利润同比增长21.73% iPhone13上市带动下半年盈利预期
指纹极速解锁速度究竟有多快
绕组磁势谐波的影响因素与谐波抑制
远程视频会议系统硬件设备主控芯片填充胶加固补强点胶应用