微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ModBUS协议通讯的应用

ModBUS协议通讯的应用

时间:06-09 来源:互联网 点击:

引言

在燃气蓄热式窑炉控制系统中,不仅需要将温度、压力、流量等模拟参数进行采集、计算控制输出至执行器,同时还应将火焰状态、电磁阀状态、换相阀状态进行采集,随时控制点火器点火,并进行周期性换相,换相周期会根据温度的不同而变化。面对众多参量的采集控制,需要建立时变系统和非线性系统的状态空间表达式进行复杂的多相关变量的运算,得到稳定输出以控制相关变量。事实上,取得大量数据,建立相应数据库,进行数据分析,单靠低端的数字控制设备难以完成。通常的做法是信号的数据采集、滤波、简单PID运算、输出量、及输出量的互锁由低端控制器完成。为了完成上述功能,我们采用ABB公司生产的PLC,配置如下:

名称 数量 描述

07KT51 1块 50CPU,8DI,6DO

XM06B5 2块 Extension I/O,4AI,2AO

XK08F1 1块 Extension I/O,4DI,6DO

PLC软件采用AC31 SOFTWARE,上位机程序用VB编制,实现与上位工控机通讯的过程中需要使用MODBUS协议。本文重点介绍其通讯实现的过程。

一、 MODBUS简介

MODBUS协议是应用于电子控制器的一种通讯语言。利用这个协议,控制器相互之间(例如485、232C等),控制器通过网络(例如以太网)和其他设备之间进行通讯。它定义了一种控制器能认识使用的消息结构,而不管它们是通过何种网络实现;描述的是控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦错并记录;制定了消息域格局和内容的公共格式。

MODBUS通讯实现有两种传输模式(ASCII或RTU),ABB公司的50系列PLC产品采用的是RTU(远程终端单元)模式,在消息中的每个8Bit字节包含两个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。

1、代码系统:

· 8位二进制,十六进制数0...9,A...F

· 消息中的每个8位域都是一个两个十六进制字符组成每个字节的位

· 1个起始位

· 8个数据位,最小的有效位先发送

· 1个奇偶校验位,无校验则无

· 1个停止位(有校验时),2个Bit(无校验时)

· 错误检测域 CRC(循环冗长检测)

2、基于RS485的RTU模式MODBUS通讯格式为:


它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。

3、其查询回应周见下图:


(1)查询 查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。

(2)回应 如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:象寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。

二、通讯的实现:

1、PLC端设置:

07KT51在出厂时拥有默认设置:该中心单元为从设备,波特率为19200,1位停止位,8位数据位,无校验位。有关数据采集的端口、传输变量的物理地址的计算,功能代码的涵义,校验等等,在AC31说明书上已有了详尽的介绍,在此不复赘述。事实上,由于AC31对MODBUS的封装,使我们的通讯工作变的异常简单,有了通讯参数,调用通讯功能模块,无须进行通讯过程的代码描述。下面是一个取地址的例子:

定义一个输出量O 62.15和内存变量M 232.01的地址为:

O 62.15=4096+(16*62)+15=5103

M 232.01=8192+(16*232)+1=11905

当然,根据AC31提供的地址表进行推算,使过程显得更容易。

2、 工控机的设置:

(1)、进行端口的配置。端口采用MOXA公司生产的Transio 53智能型RS232与RS422/485双向转换器,充分利用其传输速率: 50 bps~ 921.6 Kps带宽,内建终端电阻的特性,保证长达1000米的通讯不受干扰。特别是当 2 个信号在 RS-422/485 端短接在一起时,具有电流过载保护功能;浪涌保护:(25 KV ESD ),光电隔离(2 KV)等特性,为系统长期可靠运行提供了硬件保障。软件利用VB 实现,在VB中通过Timer控件定时引用Mscomm控件实现串口通讯,利用窗体加载事件对其初始化:

Private Sub From_Load( )

Timer1.Enabled=True

Timer1.Interval=500 ‘定时传输间隔为500毫秒

Mscomm1.Commport=1 ‘通讯串口选择Com1

Mscomm1.Settings=”19200,n,8,1” ‘通讯参数设置

Mscomm1.OutBufferSize=0 ‘清除缓冲区

Msco

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top