基于RS485总线的远程数据采集模块的构建设计

2022-04-21 02:44蒋雪昀
中小企业管理与科技 2022年3期
关键词:组态王数据类型寄存器

蒋雪昀

(青岛工学院机电工程学院,山东青岛 266300)

1 引言

随着现代工业不断向信息化和规模化的方向逐渐发展,工业控制系统需要采集的控制信息越来越多,对系统数据采集的速度和精度要求也越来越高。传统的数据采集方法无法满足在实际中的要求,作为应用新的数据采集技术的单片机应运而生。随着单片机技术的不断发展,搭建可靠性高,成本低廉,部署快速的数据采集模块就显得很有必要。复杂电磁环境,须使用有较高抗电磁辐射干扰能力的模块。总线传输模块RS485 由于具有较强的抗电磁干扰能力而被发现和使用。基于该模块构建的数据信息传输系统,也就具有了较好的抗电磁干扰能力,呈现出可靠的稳定性[1]。

2 设计方案

2.1 系统的工作原理

原理:由于RS485 总线具有平衡差分传输的特性,其抗干扰能力强,传输距离远,具有很强的级联能力。它可以实现远程多站的通信,成本低,组网方便,并已广泛应用于工业控制领域。这里的上位机选择“组态王”,下位机选择芯片与单片机。基于RS485 总线的远程数据采集模块的连接图如图1所示。

图1 基于RS485 总线的远程数据采集模块的连接图

A/D 转换模块由单片机进行控制,单片机读取A/D 转换芯片的数据,并通过RS485 总线将数据传输至组态王。工作时,模块作为从设备,等待组态王发送数据查询命令,命令中包括数据类型及所通信的设备地址,单片机与程序内部中的地址相比较,若相同,则建立点对点的连接,通过485 接口电路,将TTL 电平转化为RS485 电平进行数据发送。

2.2 系统的总体设计

通过使用RS485 总线,可以使其进行远距离传输。总体结构如图2所示。

图2 远程数据采集模块总体结构图

由图2可以看出,系统主电路采用的是以AT89C52 为核心,以ADC0808 作为模拟量采集端口,MAX487 芯片将TTL电平转换为RS485 电平。传感器检测到的物理量经过信号调理电路转变为0~5 V 的标准信号、由A/D 采样后将数字量传送到单片机系统中,单片机根据与上位机通信协议来传输送数据,并把测量数据传送到组态王从而实现实时监控。

3 系统的硬件设计

3.1 单片机最小系统及资源分配

本设计中A/D 转换模块,需要8 个IO 口,3 位数据地址选择控制端A、B、C,A/D 转换采用循环查询转换方式,需要串行通信接口。单片机AT89C52 系统的资源完全可以满足系统设计的资源要求,所以设计中单片机采用AT89C52。

3.1.1 单片机的微结构

AT89C52 单片机最小系统包括数个晶体振荡器、回(复)位电路,开关电路,其中晶振方式采用内部时钟方式,外接石英晶体振荡器,接电容C1 和C2 分别为30 pF,人工复位方式为按键复位,即单片机复位端RST 通过100 Ω 的电阻与VCC电源连接,按下开关后RST 变高,开关弹起后RST 端经1 kΩ电阻后接地,从而实现复位[2]。具体连接如图3所示。

图3 单片机的最小系统图

在图3中,晶体振荡器X1 的频率为11.059 2 MHz,选用这个晶振频率是为了产生各种标准的波特率发生频率为11.059 2 MHz。电阻R2 和C3 电容的电路组成单片机的上电复位电路。在单片机通电的过程中,R2 和C3 在上电时产生一个负脉冲通过RST 引脚复位。复位时复位信号要使用大于2 个机器周期的高电平,R2 和C3 分别是100 Ω 和22 uF,满足时钟宽度要求,按键用于人工复位。EA 为1 时,CPU 访问内部程序存储器。

3.1.2 单片机的资源分配

对于数据采集模块,需要一个串口进行通信,需要定时器来产生相应的波特率,需要8 位数据输出端AD0~AD7,3位数据地址选择控制端A、B、C,地址锁存允许ALE 经分频后输给ADC0808 作为时钟信号,AT89C52 的资源完全可以满足要求。

3.2 A/D 转化模块的硬件设计

3.2.1 A/D 转换器原理

ADC0808 是CMOS 单片型逐次逼近式A/D 转换器,内部结构如图4所示。

图4 ADC0808 内部结构图

首先输入3 位地址,并拉高ALE,将地址锁入地址锁存器中。此地址经译码后选通8 路模拟输入之一到A/D 转换器。START 接收到上升沿时将逐次逼近寄存器复位。下降沿便启动A/D 转换,之后EOC 被拉低,说明A/D 转换正在进行。A/D 转换完成之后,EOC 被拉高,说明A/D 转换已经完成,数据已存入内部的锁存器,需等待三态门打开才会输出数据,这个信号可以作为中断申请[3]。当OE 输入“1”时,输出三态门打开,转换结果的数字量输出到数据总线上。

3.2.2 转换芯片硬件连接

图5为ADC0808 连接图。

图5 ADC0808 连接图

由于ADC0808 可以与AT89C52 单片机直接相连。初始化时,使START 和OE 信号全为低电平。转换通道的地址要连接到ADD A、ADD B、ADD C 端口上。当要开始转换时,先将地址输出到ADC0808 的ABC 端,再将ALE 拉高,锁定地址,START 接收到一个正脉冲,启动A/D 转换。启动转换后的一段时间,单片机去读取数据,并发送到上位机,完成一次数据采集。ALE 输出频率为晶振的1/6,约为1.9 MHz,再经过四分频电路后可以得到480 kHz 的脉冲,可以满足ADC0808 的工作要求。模拟信号输入通道的选择与地址选择输入端的对应为:通道IN0 对应输入地址ADD A:0(字节),ADD B:0(字节),ADD C:0(字节);通道IN1 对应输入地址ADD A:1(字节),ADD B:0(字节),ADD C:0(字节);通道IN2 对应输入地址ADD A:0(字节),ADD B(字节):1,ADD C:0(字节);通道IN3对应输入地址ADD A(字节):1,ADD B:1(字节),ADD C:0(字节);通道IN4 对应输入地址ADD A:0(字节),ADD B:0(字节),ADD C:1(字节);通道IN5 对应输入地址ADD A:1(字节),ADD B:0(字节),ADD C:1(字节);通道IN6 对应输入地址ADD A:0(字节),ADD B:1(字节),ADD C:1(字节);通道IN7 对应输入地址ADD A:1(字节),ADD B:1(字节),ADD C:1(字节)。

3.3 通讯接口

3.3.1 RS485 简介

采用差分信号负逻辑,逻辑低电平以两线间的电压差为+2 V~+6 V 表示。逻辑高电平以两线间的电压差为-2 V~-6 V表示。RS-232-C 比接口信号电平高,就不易损坏接口电路的芯片,RS-485 接口是采用平衡驱动器和差分,接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。连接RS-485 通信链路时用一对双绞线将各个接口的A、B 端连接起来[4]。

3.3.2 RS485 电平与TTL 电平的转换

在RS485 中规定:接口两端(设为A、B)的电压差高于+2V 时为逻辑1,低于-2 V 伏时为逻辑0。工作电源为+5 V,额定电流为300 μA,采用半双工通讯方式的MAX487 完成将TTL 电平转换为RS485 电平的功能。MAX487 引脚结构如图6所示。

图6 MAX487 引脚结构

从图6中能看出MAX487 的内部是由驱动器和接收器组成的。与单片机连接时只需RO 和DI 分别与单片机的RXD 和TXD 相连即可,RO 是接收器的输出,DI 是驱动器的输入端,/RE 是接收使能端DE 是发送使能端,A 端和B 端分别为接收和发送的差分信号端。同时,A 和B 端加上阻值约为120 Ω 的匹配电阻。单片机与芯片连接图见图7。

图7 单片机与MAX487 连接图

4 软件设计

程序主体主要分3 个部分:命令接收部分、命令分析部分以及A/D 转换部分。其中通信程序中的接收部分的优先级最高,A/D 转换部分优先级最低。其总体流程如图8所示。

图8 总体流程图

4.1 单片机的串口设置

为了支持RS-485 通信,需要对单片机的串行口进行设置。通信串行口的工作由串行口控制寄存器SCON 和电源管理寄存器PCON 控制。

串行口控制寄存器SCON 用以设定串行口的工作方式、多级通信控制、接收/发送状态,发送/接受中断状态。由于数据采集系统传送的数据是由10 位二进制数组成的,所以选择串行口工作方式1,即SM0、SM1 设置为“01”,波特率由单片机定时器设置,单片机时钟晶振选为11.059 2 MHz,波特率选为19 200 bit/s,所以设置SMOD=0,RCAP2H=0xff;RCAP2L=0xee[5]。

串口初始化程序如下:

void serial_init () {

ctrl=0;

SCON= 0x50;

C_T2=0;

RCLK=1;

TCLK=1;

TMOD=0x20;

RCAP2H=0xff;

RCAP2L=0xee;

TR2=1;/*enable Timer2 run*/

ES=1; REN=1; EA=1; SM2=1; /*SM2=1 时收到的第9 位为1 才置位RI 标志*/

}

4.2 A/D 转换模块程序的设计

对于A/D 转换模块,当要对其读取数据时,先将ADC0808 的START 和ALE 引脚拉低,此时可以将通道选择地址输入ADC0808 的ABC 地址端口。流程见图9。

图9 A/D 转换流程图

对应程序如下:

start=0; //使0808 复位

oe=0; //数据三态门不允许输出

adca=0;adcb=0;adcc=0;start=1;//锁定地址

start=0;oe=1;for(i=0;i<=40;i++) {} d[1]=P0;//启动AD 转换,并将转换后的数据放入P0

for(i=0;i<=40;i++) {} start=0; oe=0; //复位,准备下次转换

adca=1;adcb=0;adcc=0;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[2]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;

adca=0;adcb=1;adcc=0;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[3]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;

adca=1;adcb=1;adcc=0;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[4]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;

adca=0;adcb=0;adcc=1;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[5]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;

adca=1;adcb=0;adcc=1;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[6]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;

adca=0;adcb=1;adcc=1;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[7]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;

adca=1;adcb=1;adcc=1;start=1; start=0;oe=1;for(i=0;i<=40;i++) {} d[8]=P0;for(i=0;i<=40;i++) {} start=0; oe=0;

地址锁存之后,延时一段再将START 拉高,便启动了A/D转换。延时一小段时间后,便可以向A/D 转换芯片读取数据。单片机控制A/D 转换芯片循环采集每一路的数据,并且存放于数组中。当组态王发来查询指令时,根据数据包中的地址来寻找数组中相应的数据,并将其发送到上位机。

4.3 采集模块与组态王的ASCII 协议

①通讯口使用RS-485 通讯方式。

上位机所设置的参数必须与单片机中的通讯参数一致,例如,波特率、奇偶校验等。

②设备地址的格式。

格式:**.*。

前面的两个字符是设备地址,范围为0~255,此地址是由单片机中的程序决定。

后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,如果用户在定义设备没有确定打包,那么上位机就不会处理下位机的时数打包工作,反之则处理。

③寄存器格式在上位电机的定义。

寄存器名称:Xdd;dd 上限:65535;dd 下限:0;数据类型:BYTE、UINT、FLOAT。

注意:在上位机中定义变量时,某一个寄存器根据所选数据类型(如BYTE 占用一个字节,FLOAT 占用四个字节),不同的数据类型会对应不同的寄存器地址,同一数据区内不可交叉定义不同数据类型的变量。BYTE 是单片机从地址0开始的数据类型的变量,相应的变量在上位机中定义的寄存器为X0、X1……每个变量占一个字节。UINT 是单片机从地址100 开始的数据类型的变量,相应的变量的寄存器为X100、X102、X108……每个变量占两个字节。FLOAT 是单片机从地址200 开始的数据类型的变量。在上位机中定义相应的变量的寄存器为X200、X212……每个变量占四个字节。

④上位机与单片机通讯的命令格式。

读写格式(除字头、字尾外所有字节均为ASCII 码):

字头:1 字节1 个ASCII 码,40H。

设备地址:1 字节2 个ASCII 码,0~255 (即0---0x0ffH)。

CR:0x0d[6]。

标志:1 字节2 个ASCII 码。

数据地址是2 字节4 个ASCII 码,0x0000~0xffff。数据字节数是1 字节2 个ASCII 码,1~100,实际读写的数据的字节数。

⑤组态王发送读命令。

下位机应答:若正常:

例如,读15 号仪表,数据地址为15 的数据。其中数据为100,数据类型为字节,不打包。上位机所发命令如表1所示。

表1 上位机所发数据单位:字节

若正确,则收到表2所示数据。

表2 正确数据单位:字节

4.4 采集模块与组态王的通讯

通讯程序需要完成的功能:接收上位机传来的查询命令,需要解析出所查数据类型、变量名、设备地址、数据字节数,完成校验功能。接收上位机命令的流程如图10 所示。

图10 接收命令流程图

当接收到组态王发来的信息的字头时,开始接收后面的数据,并组成一个数组,用于做校验及识别组态王命令。

单片机在完整接收完组态王发来的命令后,便开始分析命令。分析的流程如图11 所示。

图11 单片机分析数据流程图

5 调试

设计完采集模块后,需要对采集模块进行通信测试。COM1 口连接RS232/RS485 转换器,转换器的AB 端分别接到数据采集模块的AB 端。组态王软件中支持ASCII 协议,所以选用组态王进行通信测试。测试之前要对组态王进行设置,之后设定不同的模拟量,观察能否得到正确的A/D 转换结果。

测试两个采集模块,每个采集模块的AB 端都并联起来,接到RS232/RS485 的转换器上即可。

5.1 组态王设置

因为是在PC 上读取下位机数据,下位机与上位机连接所使用的串口为COM1,因此,在组态王中要选择COM1,首先就要对组态王进行设置,设置步骤如下:

①首先新建一个工程,在工程浏览器中,找到设备选项见图12。

图12 选择连接串口

②找到COM1,在右边选择新建,选择设备时,找到单片机—通用单片机ASCII—串口,之后选择下一步,见图13。

图13 选择设备类型

③给设备设置一个名字,之后串口选择COM1,设备地址中每一个模块都要有自己唯一的地址,用以区分不同的模块。其余的设置选择默认即可。见图14、15。

图14 选择设备所连接的串口

图15 选择设备地址

之后在数据词典中建立相关变量即可。再按照相同的步骤,建立地址为4.0 的设备。

5.2 采集模块的调试

对于前四路每个输入口给定不同的电压,第一路输入3 V,第二路输入0 V,第三路输入5 V,第四路输入2.5 V,观察四路的数据。测试结果见图16。

图16 组态王接收到的数据

对于A/D,0 V 对应的数值为0,5 V 对应的数值为255,转换在实际结果中我们可以看到,在输入不同的模拟量之后,不同地址的模块也得到了相同的结果,结果见表3、4。至此,数据采集模块的基本功能已经实现。

表3 采集模块地址为3 的数据

6 结语

组态王开发监控系统软件,是新型的工业自动控制系统,它以标准的工业计算机软、硬件平台构成的集成系统取代传统的封闭式系统。对于企业使用组态王可以很方便直观的观察各个传感器发送的数据,而且软件灵活度高,功能强大,易于操作,可以省去很多开发时间,提高效率。因而为配合采集模块,采用了组态王作为监控软件。因为其灵活性极高,可以用在大多数工厂的应用场合。

表4 采集模块地址为4 的数据

猜你喜欢
组态王数据类型寄存器
如何理解数据结构中的抽象数据类型
Lite寄存器模型的设计与实现
二进制翻译中动静结合的寄存器分配优化方法
移位寄存器及算术运算应用
基于SeisBase模型的地震勘探成果数据管理系统设计
基于组态王软件和泓格PIO-D64 板卡的流水灯控制
液压系统电气控制虚拟实验系统的开发
线上众筹产品的特征分析与研究
基于组态王和PLC的实验室通风监控系统
相似度计算及其在数据挖掘中的应用