6ES7231-0HF22-0XA0诚信经营
1、引言
本文主要从应用的角度利用VB6.0的MSComm控件和MODBUS协议,成功实现了某liuliang控制系统中工控机与带RS-232输出接口的智能数字liuliang积算仪之间的串口通信功能。D08-8CZM数字显示表应用于底吹氩liuliang控制系统中liuliang的显示,工控机通过读取其显示值作为反馈信号,从而实现liuliang的闭环控制。
2、D08-8CZM型智能数字liuliang显示积算仪与串口通信
2.1 硬件构成
D07-12A型质量liuliang传感器采用毛细管传热温差量热法原理测量气体的质量liuliang(无需温度压力补偿)。将传感器加热电桥测得的liuliang信号送入放大器放大,放大后的liuliang检测电压与设定电压进行比较,再将差值信号放大后去控制调节阀门,闭环控制流过通道的liuliang使之与设定的liuliang相等。当本liuliang积算仪与MFC(质量liuliang计)配套使用时,只需用电缆通过D型插头将liuliang积算仪与MFC连接起来即可。采用一台上位机与一台D08-8CZMliuliang积算仪进行通信的方式,使用RS232通讯方式:将2引脚(TXD)与上位机串口的RXD(工控机串口的2引脚)相连;3引脚(RXD)与上位机串口的TXD(工控机串口的3引脚)相连;5引脚(SG)与上位机串口的SG(工控机串口的5引脚)相连。
2.2 通讯原理
工控机作为上位机与从机(数字liuliang积算仪)采用主从应答方式进行通信,一个网络中只有一个主机(上位机,节点地址为0),主机通过站号(数字liuliang积算仪的唯一地址)区分不同的从机。上位机始终处于主动状态,根据程序运行的需要向(通信端口)数字liuliang积算仪发出读写等命令;从机处于被动状态,接收并响应上位机的命令。需要读采样数据时,上位机通过通信口向指定地址的数字liuliang积算仪发出读数据命令,数字liuliang积算仪响应并将数据准备好,按统一的数据通信帧格式编成响应字符串,主机读通信口接收缓冲区即可读到所需的数据。向数字liuliang积算仪写数据时,上位机向指定数字liuliang积算仪发出写命令及参数数据,积算仪即可接受并返回响应情况。上位机通过RS-232通信进行运行状态监控、参数设置、诊断等远程测控功能,实现这些功能采用了不同的通信格式。其中MODBUS协议通讯原理图如下:
图1 MODBUS协议的询问应答环路
2.3 通讯协议
本通信协议应用于D08-8CZM型liuliang积算仪与上位机的通信,数据以16进制格式传输,波特率:9600;数据位8位;停止位:1位;效验位:无。本协议与MODBUS协议兼容,可以通过上位机显示liuliang积算仪的瞬时liuliang、累积liuliang、满量程、单位和阀状态(包括阀控、关闭和清洗),可以通过上位机设定liuliang积算仪的瞬时liuliang、使liuliang积算仪的累积liuliang清零。在本协议用到了MODBUS协议的命令$03(Reading1~9words)、命令$05(Force single coil)和命令$06(Writing 1 word)。
使用命令$03可以通过上位机读liuliang积算仪的当前状态,其通信协议的具体格式为:
上位机 积算仪:01 03 00 02 00 08 E5 CC
各字节含义:
01: MODBUS地址;
03: 功能码03(Reading 1~9words);
00 02:起始地址,00为高8位,02为低8位;
00 08:读取的字数;
E5 CC:CRC效验值,E5为CRC的低8位,CC为高8位。
上位机 积算仪:01 03 10 (1)~(16) CRCL CRCH
各字节含义:
01:MODBUS地址;
03:MODBUS命令号;
10:上传的字节数;
(1)~(4):瞬时liuliang值;“00~09”表示数字“0~9”,“10~19”表示“0.~9.”;
(5)~(10):liuliang累积值;同上;
(11)~(14):满量程;同上;
(15):liuliang单位;00表示SCCM和SCC,01表示SCCM和SL,11表示SLM和SL;
(16):阀状态;00表示关闭,80表示阀控,FF表示清洗;
CRCL:CRC的低八位;CRCH:CRC的高8位。
3、用VB实现串行通讯
3.1 MSComm控件
VB的通信控件MSComm能够提供串行通信的全部功能,程序编写、调试简单方便,开发速度快,该控件封装了通信过程中的底层操作程序,用户只需设置和监控控件的属性和事件,就可以方便地实现异步串行通信。
采用MSComm控件接收数据,按照接收方式分两种形式:事件驱动方式,定时查询方式。本例为适应liuliang的实时控制采用定时驱动方式,若定时器计时到,通过串行通信口向指定地址liuliang积算仪发出读写等操作命令,等待时间到则检查InBufferCount属性值来判断输入缓冲区中是否接受到了相应数目的字符,从而进行读取、判断数据合法性和数据存储、处理等操作。
3.2 通信功能的编程实现
程序框图如下:
图2 串口通信程序框图
串口初始化:MSComm1.CommPort = 1
MSComm1.SThreshold = 1
MSComm1.Settings = 9600,N,8,1
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 1024
MSComm1.bbbbbMode = combbbbbModeBinary
打开串口并定时发送数据命令:Private Sub Timer1_Timer()
Dim bytearray(0 To 7) As Byte
bytearray(0) = &H1
bytearray(1) = &H3
bytearray(2) = &H0
bytearray(3) = &H2
bytearray(4) = &H0
bytearray(5) = &H8
bytearray(6) = &HE5
bytearray(7) = &HCC
MSComm1.bbbbbLen = 21
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
If MSComm1.PortOpen = True Then
MSComm1.Output = bytearray
End If
End Sub
接受数据:Private Sub MSComm1_OnComm()
Do
DoEvents
Loop Until MSComm1.InBufferCount = 21
Dim dataread() As Byte
Dim tempdata As Variant
Dim str As bbbbbb
If MSComm1.CommEvent = comEvReceive Then
tempdata = MSComm1.bbbbb
ReDim dataread(UBound(tempdata)) As Byte
For i = 0 To UBound(tempdata)
dataread(i) = tempdata(i)
End Sub
同理利用以上程序框图和通信协议可以完成下图的所有功能:
图3 基于VB的D08-8CZM型liuliang积算仪
4、结束语
利用VB6.0的MSComm控件和MODBUS协议,实现了工控机与带RS-232输出接口的智能数字liuliang积算仪之间的串口通信功能,使其能够实时的采集瞬时liuliang,并成功的应用于底吹氩liuliang闭环控制系统。这种通信方式灵活方便,结构简单,可靠性高,完全达到了预期的要求,具有较好的实际价值和使用性。
Delphi是一种具有功能强大、简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选择Delphi作为开发工具编制各种应用程序。美中不足之处是Delphi没有自带的串口通信控件,在它的帮助文档里也没有提及串口通信,这就给编制通信程序的开发人员带来许多不便。
目前,利用Delphi实现串口通信的常用的方法有 3种:一是利用控件,如 MSCOMM控件和 SPCOMM控件;二是使用API函数;三是调用其他串口通信程序。其中利用 API编写串口通信程序较为复杂,需要掌握大量的通信知识。相比较而言,利用SPCOMM控件则相对较简单,并且该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作,还支持多线程。下面本文结合实例详细介绍SPCOMM控件的使用。
SPCOMM的安装
1.选择下拉菜单Component中的 Install Component选项,弹出如图 1所示的窗口。
在 Unit filename处填写 SPCOMM控件所在的路径,其他各项可用默认值,点击 OK按钮。
2.安装后,在System控件面板中将出现一个红色控件 COM。现在就可以像 Delphi自带控件一样使用 COM控件了。
SPCOMM的属性、方法和事件
1.属性
●CommName:表示COM1、 COM2等串口的名字;
●BaudRate:根据实际需要设定的波特率,在串口打开后也可更改此值,实际波特率随之更改;
●ParityCheck:表示是否需要奇偶校验;
●ByteSize:根据实际情况设定的字节长度;
●Parity:奇偶校验位;
●StopBits:停止位;
●SendDataEmpty:这是一个布尔型属性,为true时表示发送缓存为空,或者发送队列里没有信息;为 false时表示发送缓存不为空,或者发送队列里有信息。
2.方法
●Startcomm方法用于打开串口,当打开失败时通常会报错。错误主要有7种:⑴串口已经打开;⑵打开串口错误;⑶文件句柄不是通信句柄;⑷不能够安装通信缓存;⑸不能产生事件;⑹不能产生读进程;⑺不能产生写进程;
●StopComm方法用于关闭串口,没有返回值;
●WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word)方法是个带有布尔型返回值的函数,用于将一个字符串发送到写进程,发送成功返回 true,发送失败返回false。执行此函数将立即得到返回值,发送操作随后执行。该函数有两个参数,其中 pDataToWrite是要发送的字符串,dwSizeofDataToWrite是发送字符串的长度。
3.事件
●OnReceiveData:procedure (Sender: Tbbbbbb;Buffer: Pointer;BufferLength: Word) ofbbbbbb
当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据, BufferLength是收到的数据长度。
●OnReceiveError: procedure(Sender: Tbbbbbb; EventMask : DWORD)
当接收数据出现错误时将触发该事件。
SPCOMM的使用
下面是一个利用SPCOMM控件的串口通信的例子。
以实现 PC机与单片机8051之间的通信为例,要调通它们之间的握手信号。假定它们之间的通信协议是: PC到 8051一帧数据 6个字节, 8051到PC一帧数据也为 6个字节。当 PC发出( F0,01,FF,FF,01,F0)后 8051能收到一帧(F0,01,FF,FF,01,F0),表示数据通信握手成功,两者之间就可以按照协议相互传输数据。
创建一个新的工程COMM.DPR,把窗体的 NAME属性定为 FCOMM,把窗体的标题定义为测试通信,按照图 2添加控件 (图2中黑色矩形围住的控件即为 COMM1)。
1.设定COMM1属性:
●波特率:4800;
●奇偶校验位:无;
●字节长度:8;
●停止位:1;
●串口:COM1。
Memo1中将显示发送和接收的数据。将新的窗体存储为Comm.pas。
2.编写源代码
//变量说明
var
fcomm:TFCOMM;
viewbbbbbb:bbbbbb;
i:integer;
rbuf,sbuf:array[16] ofbyte;
//打开串口
procedureTFCOMM.bbbbShow(Sender: Tbbbbbb);
begin
comm1.StartComm;
end;
//关闭串口
procedureTFCOMM.bbbbClose(Sender: Tbbbbbb; var bbbbbb:TClosebbbbbb);
begin
comm1.StopComm;
end;
//自定义发送数据过程
proceduresenddata;
var
i:integer;
commflg:boolean;
begin
viewbbbbbb:=‘’;
commflg:=true;
for i:=1 to 6do
begin
if notfcomm.comm1.writecommdata(@sbuf[i],1) then
begin
commflg:=false;
break;
end;
//发送时字节间的延时
sleep(2);
viewbbbbbb:=viewbbbbbb+inttohex(sbuf[i],2)+‘’ ; end;
viewbbbbbb:=‘发送’+viewbbbbbb;
fcomm.memo1.lines.add(viewbbbbbb);
fcomm.memo1.lines.add(‘’);
if not commflgthen messagedlg(‘发送失败 !’ ,mterror,[mbyes],0);
end;
//发送按钮的点击事件
procedureTFCOMM.Btn_sendClick(Sender: Tbbbbbb);
begin
sbuf[1]:=byte($f0); //帧头
sbuf[2]:=byte($01); //命令号
sbuf[3]:=byte($ff);
sbuf[4]:=byte($ff);
sbuf[5]:=byte($01);
sbuf[6]:=byte($f0); //帧尾
senddata;//调用发送函数
end;
//接收过程
procedureTFCOMM.Comm1ReceiveData(Sender: Tbbbbbb; Buffer:Pointer;BufferLength: Word);
var
i:integer;
begin
viewbbbbbb:=‘’;
move(buffer^,pchar(@rbuf^),bufferlength);
for i:=1 tobufferlength do
viewbbbbbb:=viewbbbbbb+inttohex(rbuf[i],2)+‘’ ;
viewbbbbbb:=‘接收’+viewbbbbbb;
memo1.lines.add(viewbbbbbb);
memo1.lines.add(‘’);
end;
如果 memo1上显示发送 F001 FF FF 01 F0和接收到 F0 01 FF FF 01F0,这表示串口已正确地发送出数据并正确地接收到数据,则串口通信成功。
近年来,嵌入式系统以其体积小、成本低和功能专一等特点在工控领域得到越来越广泛的应用。本文实现了嵌入式远程测控终端与西门子S7-200PLC的通信,并基于此完成了对PLC数据的采集。通过嵌入式系统的扩展网口将PLC与Internet相联,突破了串行通信速率的限制,节省了采用高端PLC实现网络测控的经费投入。在从PLC采集数据功能的实现过程中,避开了以往使用PLC自由端口通信需要改写PLC梯形图的问题,而直接利用PLC厂家制定的通信协议来实现数据交换,无需对PLC编程,方法简单可靠,为今后实现更多品牌PLC与上位机通信开辟了新的途径。基于嵌入式操作系统μClinux及其多线程机制实现了一套中央空调远程测控终端系统。
1、系统总体设计
1.1 硬件构成
系统采用1片三星公司推出的基于ARM7TDMI精简指令系统的32位高速处理器S3C44B0X作为嵌入式微处理器,扩展了一个RS485串口、两个RS232串口和一个以太网口。如图1所示,嵌入式微处理器通过扩展的RS485串口与西门子S7-200PLC进行通信,一个RS232口通过调制解调器连接到公众电话网,实现串行通信,扩展的以太网口则将整个嵌入式系统接入Internet,拓展了PLC的通信方式。考虑到与现存本地监控系统的兼容,在S7-200的串口上可并接西门子的文本显示器TD200,三者组成一个PPI令牌环网络。
图1 系统结构和连接示意图
1.2 软件总体设计
本系统采用μClinux嵌入式操作系统作为应用软件的运行平台。μClinux系统是近年迅速发展起来的一种专门用于微控制领域的嵌入式操作系统,内核要比原Linux2.0内核小得多(内核小于512KB,内核加上工具小于900KB),但保留了Linux操作系统的主要优点:稳定性,优异的网络能力以及的文件系统支持,提供通用的LinuxAP1支持完整的TCP/IP协议栈和大量其它的网络协议。
中央空调远程测控终端的功能主要是动态地采集中央空调的现场运行参数并将这些参数实时地发送给位于远程的监控中心,并且具备提供历史数据、故障报警和某些控制功能。为了tigao系统的运行效率,利用μClinux对多线程机制的支持,将远程终端的软件系统分为四个并发的线程实现。分别为:数据采集线程、数据存储线程、数据发送线程和故障报警线程。软件系统结构如图2所示。
图2 软件系统总体框架
为了实现各个线程之间的通信,设置一个数组作为共享区域。其中,数据采集线程主要是嵌入式测控终端与PLC的通信过程,所有的数据都从PLC的寄存器中读取,并存储在测控终端的内存共享区域中。在本系统中,根据所监控的中央空调的不同型号,由数据字典文件读入所需采集的参数地址,采用循环方式将各个参数的实时数值从PLC中采集,再一并存人数据共享区。数据存储线程在本地创建文件,并将数据共享区中的参数值每隔一定时间保存在FLASH中,使之作为分析一段时间内中央空调运行状况的历史数据,为实现专家诊断系统提供数据源。基于μClinux对TCP/IP协议栈的完整封装,实时数据发送和故障报警线程从共享存储区中读取数据后,利用socket通信机制,将实时数据和故障报警信息从本地发送到远程的主控中心,实现在不同地点对中央空调运行状况的实时监测。
由于西门子S7—200系列PLC通常配合西门子TD200文本显示器一同使用以构成本地监控,与本系统共用一条总线时冲突不可避免。本系统在数据采集的基础上根据PPI协议和PROFIBUS规定的令牌环协议,实现了主站之间的令牌传递功能,保证了令牌环网络的正常运转,使TD200与本系统组成的双主站网络通过对令牌的占有来实现各自的通信功能,互不干扰。
2、软件实现
2.1 通信方式和通信协议的选择
S7—200CPU支持多种通信协议,为用户实现多种不同的网络配置提供了便利,包括:点对点(Point-to-Point)接口协议(PPI)、多点(Multi~Point)接El协议(MP1)和Profibus协议。这些协议是非同步的字符协议,有1位起始位、8位数据位、1位偶校验位和1位停止位。通信结构依赖于特定的起始字符和停止字符、源和目的站地址、报文长度和数据校验和。
目前通常采用自由口通信模式控制S7—200CPU的通讯端El实现上下位机通信。用户可以在自由El模式下使用自定义的通信协议来实现PLC与多种类型智能设备的通信。但由于需要对PLC现有程序进行修改,对于不熟悉PLC编程语言并要在短时间内实现对西门子PLC的监控功能的软件开发者来说,这种修改存在一定的风险。
本系统采用PPI协议作为嵌入式系统与S7—200CPU之间的通信协议,由于C语言的高效性,采用C语言进行编程实现通信,无需对PLC本身的程序进行修改,保证了工业控制系统的安全和稳定。
2.2 PPI协议数据格式
PPI协议是一种主一从通信协议:通信的设备分为主站和从站。PLC默认为从站,嵌入式系统和TD200文本显示器作为主站。主站设备发送请求到从站设备,从站设备响应,从站不主动发起通信,只是等待主站的数据请求命令和对该命令作出响应。PPI协议并不限制与任意一个从站通信的主站数量,在一个网络中,主站的个数不能超过32。协议的数据格式如图3所示,图3(a)是PPI主站发送的命令帧和从站发送的数据帧格式,图3(b)是PPI主站发送给从站的确认帧格式。
图3 协议数据帧格式
以字节为单位,每个字节的含义如下:
SD2,SD1:(Start Delimiter)开始定界符(SD2=68H,SDI=10H)
LE.LER:(Frame Length)报文数据长度
DA:(Destination Address)目的地址
SA:(Source Address)源地址
FC:(Function Code)方式字(5C、6C、7C)
Data Unit:数据单元
FCS:(Frame Check Sequence)校验码
ED:(End Delimiter)结束分界符(16H)
在PPI网络中,S7—200PLC的默认站地址是02H,而作为主站的嵌入式系统的站地址规定为00H。加上TD200后构成的多主站系统中,TD200做主站,站地址是01H。三个站之间的通信遵循令牌环网络规则,令牌在主站之间轮流传递,持有令牌的主站有总线的控制权,可以收发数据,从站不具有令牌持有权。
2.3 数据采集程序分析
数据采集线程的主要流程如图4所示。其中,测控终端与PLC的通信可以看作是主站与从站之间的两次发送请求和应答过程。
图4 通信程序流程图
以作为主站的嵌入式系统向作为从站的PLC发起一个读取数据值的通信过程为例,该数据是存储在v寄存器、起始地址为136的一个字。
主站以目的地址02H、源地址00H生成一个数据请求帧,对于读取请求,方式字FC为7CH。生成的数据请求帧为(以十六进制表示):68H 1BH 1BH 68H 2H 0H 6CH 32H 1H 0H 0H 6H 6H 0H EH 0H 0H 4H 1H 12HAH 10H 4H 0H 1H 0H 1H 84H 0H 4H 40H BAH16H。主站发出这一请求并等待1秒钟之后读取串口,如果PLC正确响应,会发送一个确认字节E5H,主站读取到这个字节后,就在规定时间间隔内发送数据请求确认帧到串口。确认帧内容为:10H02H 00H 5CH 5EH16H。PLC收到这个确认帧后,就读取数据请求帧中所指定得寄存器值,并按照PPI协议规定得发送数据帧格式(图3(a))打包,将数据发送出去。嵌入式主站接收到这个含有所需请求参数值的数据帧,就根据协议的规定将数据解析出来,并存储在本地内存共享区域中,从而完成一次数据采集和存储过程。
数据采集线程的主要代码如下:
Int data_collect (struct acinfo temp)
{
delay.tv_sec=0;
delay.tv_nsec=sleep;
int ret;
unsigned char ack; //打开串口1,设置波特率9600波特
open_comport (19600) ; //向PLC发送数据读取指令帧
white_com (temp);
nanosleep (&delay, NULL); //读取PLC响应帧
ack=read_act();… //对PLC发送确认帧
poll_data();
nanosleep(&delay,NULL); //从串口读取来自PLC的数据
ret=read_com(); //恢复串口设置,关闭串口
com_reset();
com_close();
return();
}
PLC 的响应有一定延迟,需要在程序中调用nanosleep(&delay,NULL)函数让线程暂停一段时间再读取串El。为了保证令牌环网络的正常运转,受令牌占有时间的限制,在波特率为9600时,PLC与主站的一次数据通信时间不应该超过3s,根据所采集的参数规模计算得出小响应和传输时间间隔在0.1s左右。
3、结束语
本测控终端系统经过实际运行,验证了其有效性和实用性。采用嵌入式系统与西门子PLC利用PPI协议进行通信的方法,简化了原本复杂的通信功能实现过程,为对PLC的实时监控提供了一种性价比很高的实现方式。通过嵌入式系统扩展以太网1:3,为原本只有通过串口才能与外界通信的PLC提供了以太网的通信方式,tigao了通信效率。基于此技术实现的嵌入式系统与PLC相结合的远程测控终端为分布式实时监控系统的实现提供了一种低价又便捷有效的方式。