1 引言
现代PLC的通信功能很强,可以实现PLC与计算机、PLC与PLC、PLC与其他智能控制装置之间的通信联网。PLC与计算机联网,可以发挥各自所长,PLC用于现场设备的直接控制,计算机用于对付PLC的编程、监控与管理。OMRON公司的C200HG系列PLC具有可靠性高、数据处理能力强、能满足高水平的控制要求。Delphi是Borland公司推出的可视化应用程序开发工具。它的代码规范,开发效率高,能让用户在windows平台上快速开发出32位的windows应用程序。20吨退火炉炉温控制系统主要由上位机和PLC构成,上位机通过PLC采集炉气温度值、料温值、和各个风机的转速,以建立数据库、显示运行状态、打印报表等,上位机同时进行数据分析,控制热电偶的功率和风机的转速。主从机之间大量的状态信息,控制信息需要进行串行通信,传统的通信程序由一个主线程构成。当系统在执行一些比较费时的任务时系统会长时间处于等待状态,而且上位机所接收的通信往往是异步的,突发性的,所以串口通信会出现停滞和反应不及时的现象。本系统建立了三个单独的线程来实现数据从微机发送到PLC、向PLC发送读取数据命令、读取PLC发送的串口数据,因此上位机能及时高效地实现读取与发送数据。
2 硬件配置
硬件是上位机链网的物质基础,它对网络的物理层提供保证。
在PLC方面,其硬件主要是Host Link 单元或装置。主要靠它提供RS-232口或RS-422口。C200HG机的CPU可插入通讯板提供RS-232口。个人计算机通常配置了两个RS-232口。PLC的通讯口与计算机的通讯口要靠电缆联接。RS-232口要三根线。图1为接线情况。
图1 接线
3 Delphi中串口通信的实现
用Delphi开发串口通信软件一般有两种方法:一是利用Windows的通信API函数,另一种是采用Microsoft的MSComm控件。考虑到与下位PLC的通信比较简单,通信过程中并没有涉及到复杂的底层操作,所以本系统就选用Microsoft的MSComm控件。
MSComm控件实际上是一些Windows API函数的有机集成,它以属性和事件的形式提供了对Windows通讯驱动程序API函数接口,为应用程序提供了通过串行接口收发数据的简便方法。因此,程序员只需在程序中设置和监视MSComm控件的属性和事件即可完成对串口的编程。
MSComm控件提供了两种处理通讯的方法:一是事件驱动方法;一是查询方法。
2.1事件驱动法
OnComm事件是MSComm控件提供的唯一的事件,当有数据到达端口或端口状态发生改变或有通讯错误时,都将触发OnComm事件,以获取和处理这些通讯事件和通讯中产生的错误,通过查询CommEvent属性值,可以获得关于通讯事件和通讯错误的完整信息,进而进行处理。这是一种功能很强的处理串行口错误的方法,具有程序响应及时,可靠性高的优点。
2.2查询法
MSComm控件的CommEvent属性返回通讯中产生的事件和错误类型,由控件自动检测和跟踪通信状态后设置。然后由控制软件进行分析和处理。
4 使用多线程(Multi-Thread)机制
线程(Thread)又称执行控制绪,可以想象线程就好像是一个指针,它会指着正在运行的那一程序,线程负责控制整个程序的运作与运行。而多线程则是指在同一个程序中、同一个时间、同时有好几个线程运作着。每个线程彼此独立,而且互不干扰地运行着。线程是进程内的一个执行单元,当一个进程被创建后,系统就会为它创建一个主线程,如果需要的话,该主线程还会创建其它线程。Win32系统会把CPU时间片分给这些线程,每个线程在指定的时间片内运行,Win32系统基于每个线程的优先级来管理时间的分配。
在串行通信中,上位机所接收的通信往往是异步的、突发性的。在通讯程序中引入多线程,即创建专门的通信线程实现对串口的访问。这种方法可以有效地克服串口通信中的停滞和反应不及时现象。
5 通信程序设计
图2为通信程序界面。Delphi7将多线程对象封装成TThread对象。本系统创建了三个线程来实现微机与PLC的通信,在通信界面的OnCreate事件中创建这三个线程,在通信界面的OnClose事件中结束。三个线程独立工作。
图2 通信界面
其相互间关系见图3。
下面以线程1为例详细地介绍线程开发和通信。
线程1:创建此线程用来将数据从微机发送到PLC。当输出值发生改变时启动该线程,传送成功暂停该线程。建立一个线程组件,将其命名为Tshuchu。
procedure TForm3.Edit5Change(Sender: TObject);
begin
thread1.Resume; //启动线程1
end;
procedure Tshuchu.Execute;
begin
while not terminated do //检查线程的Terminated属性
begin
synchronize(update); //调用synchronize以避免多个线程间可能造成的冲突
end;
end;
procedure Tshuchu.update;
var
outdata,indata:string;
i:integer;
loop:string[20];
begin
if not(form3.mscomm1.PortOpen) then
form3.mscomm1.PortOpen:=true; //判断端口是否打开
i:=1;
while i<=3 do
begin
outdata:=@00WD1000 form3.edit5.Text
fcs(@00WD1000 form3.edit5.Text) * #13;
form3.mscomm1.Output:=outdata; //向PLC发送写请求
sleep(10);
indata:= form3.mscomm1.Input;
loop:=indata;
if copy(indata,4,2)=WD then //判断是否为应答帧
begin
if (loop[6]=0) and (loop[7]=0) then //判断是否为正确响应
i:=5
thread1.Suspend;
else
i:=i 1;
end;
end;
end;
线程2:创建此线程来不断向PLC发送读取数据命令。点击”开始通信”就启动该线程,点击”停止通信”暂停该线程。
线程3:创建此线程用来读取PLC发送的串口数据。当MSComm控件产生OnComm事件时启动该线程,数据接收成功暂停该线程。
线程2、3的编写与线程1类似。
FCS函数由用户根据需要自行编写。编写的方法为用copy函数从字符串中取出字符,用ord函数转为对应的序数,再用xor函数进行异或处理,最后转换为16进制。
例如:if copy(indate,n,1)=0 then
xushu:=ord(0);
jieguo1:=jieguo1 xor temp;
jieguo:=inttohex(jieguo1,2);
6 结论
20吨铝箔退火炉温度控制系统已经通过了实际调试和运行,信号数据能够在上位机和PLC之间可靠快捷的传递。创新点:与传统的通讯程序相比较,本系统建立了三个单独的线程来实现数据从微机发送到PLC、向PLC发送读取数据命令、读取PLC发送的串口数据,三个线程分工合作,与主线程一起位数据通信服务,因此上位机能及时高效地实现读取与发送数据,而且整个程序编写结构十分清楚合理,极大的提高了程序的效率。对广大用户有很大的参考价值。
参考文献:
[1] OMRON公司. Programmable Controllers C200HX/C200HG/C200HE. 上海:欧姆龙(中国)有限公司.1997
[2] 范逸之,陈立元. Delphi与RS-232串行通信控制. 北京:清华大学出版社.2002
[3] 林金霖.Delphi6实物经典. 北京:中国铁道出版社.2002
[4] 宫淑贞,王冬青. 可编程控制器原理及应用. 北京:人民邮电出版社.2002
[5] 赵兰涛,苏彦华. Delphi串口通信技术与工程实践. 北京:人民邮电出版社.2004
[6] 赵闻蕾,付维胜.利用VB6.0实现PC机与PLC的串行通信.微计算机信息.2004(1) .89~90
附注:
基金资助:国家十一.五 973项目,2005CB623707
作者简介:
唐军,男,汉,1981年10月生,在读硕士研究生,机械电子工程专业,从事20t铝箔退火炉温度控制系统研究。
毛大恒,男,汉,1946年生,教授,博士生导师,从事金属压力加工及装备和摩擦润滑技术研究。
联系地址: 湖南省长沙市中南大学 桃B-335,邮编410083
Email: tangjunok@tom.com