工控网首页
>

应用设计

>

利用多线程机制实现微机与OMRON C200HG的串行通信

利用多线程机制实现微机与OMRON C200HG的串行通信

2007/10/15 11:49:00

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

投诉建议

提交

查看更多评论
其他资讯

查看更多

助力企业恢复“战斗状态”:MyMRO我的万物集·固安捷升级开工场景方案

车规MOSFET技术确保功率开关管的可靠性和强电流处理能力

未来十年, 化工企业应如何提高资源效率及减少运营中的碳足迹?

2023年制造业“开门红”,抢滩大湾区市场锁定DMP工博会

2023钢铁展洽会4月全新起航 将在日照触发更多商机