PLC串行通信在分布式监控系统中的应用
1 引言
目前,plc作为一种成熟稳定可靠的控制器,已经在工业控制中得到了广泛的应用。在实际应用中通常采用以工业控制计算机和plc构成计算机监控系统。在这里,plc完成对系统的底层控制,即直接控制执行机构,实现数据采集,处理与控制;上位计算机则完成数据处理、信息管理等复杂的监控管理任务。通讯的实现就成为这种系统中的关键技术之一。本文以电厂输煤监控系统为例,介绍了串行通信技术在分布式监控系统中的应用。
2 监控系统硬件构成
某电厂输煤系统共有储煤圆筒仓6个,每个仓下面各对应着环式给煤机,犁煤机,变频器和皮带等设备,每个仓距离几十米。我们使用可编程控制器(omron c200h型plc)作为下位机负责对每台圆筒仓下的设备信号采集和控制命令的发送。由程序实现对设备启停的连锁控制,出现异常情况,如设备电流越限,给煤车挡板卡死等情况,能快速作出反应并报警。
采用工业控制计算机(ipc)作为操作员站,实现对整个的监控和管理功能。plc之间以rs422方式组成网络,并和上位机之间采用hostlink方式连接。系统结构图如图1所示。
每个圆筒仓下的设备使用一个c200h型plc对其进行控制,并配置一个com06通信模块。它能够为plc提供rs422/485方式的通讯。这样可以方便的将其联网。rs422采用平行发送接收方式,具有传输距离长,抗干扰能力强和多点通信能力,最多可以连接32台plc。在plc和上位机之间使用一个rs422/232转换模块,将rs422信号转换为rs232信号,这里使用的是研华adam4520。这种网络通信方式经济实用,完全能满足生产运行的需要。
3 系统软件开发及串行通信的实现
上位机监控系统开发c++ builder6.0编程软件。c++builder是borland公司的产品,它采用面向对象的c++语言,实时性好,运算速度快,编程效率高,人机界面功能强大。近年来越来越多地应用于工业控制。
plc与上位机的串行通信程序的编制是监控系统开发的关键部分。使用c++builder开发系统人机界面的部分较为容易,不是本文讨论的主要内容,在此不作详细叙述。
3.1 plc的通信协议简介
上位计算机和plc通讯使用的是上位链接通讯方式,所以我们要开发c++ builder与omron plc的串行通信,必须使用omron plc的上位机链接通信协议。
上位机链接通信是通过在上位机和plc之间交换命令(command)和应答(response)帧实现的。在一次交换中从上位机传输至plc的命令称为命令帧,plc对命令帧的应答数据称为应答帧。每个帧以设备号和标题开始,以检验码fcs及结束符结束。一个命令帧最多可以包含131个数据字符,多于131个数据字符的数据要分成若干帧发送。
从上位机发送一个命令帧时,命令格式如图2所示。
@符号必须置于每个命令的开头。节点号用来辨识接收命令的plc,节点号在数据寄存区dm6558地址中设定。识别码是2个字符的命令代码,用来设置通信的功能。正文设置命令参数,包括要读写的plc寄存器单元的起始地址和字数。fcs是2个字符的帧检查顺序码,是检查前面数据的校验码,终止符以“*”和回车(chr$(13))两字符,表示命令结束。一些常用命令代码如rr表示读ir/sr区的值,rd表示读dm区的值,wd表示向dm区写数据。具体情况可参照相关操作手册。
响应帧的格式与命令帧类似,在标志码后多了两位的结束代码。不同结束代码的值代表不同含义。查看结束码可以得知是否有错误发生以及发生错误的类型。正常情况下的结束码为00。表1为常见的结束代码及其含义。
帧顺序检查fcs在终止符之前,以检查传送时是否存在数据错误。fcs是一个转换成2个ascⅱ字符的8位数据。这8位数据为从帧开始到帧正文结束所有字符ascⅱ码执行“异或”操作的结果。每次接收到一帧,先要计算fcs,与帧中所包含的fcs作比较,就能检查数据传输的正确与否。例如:要读出01号plc的ir200里的数据,通过上位机可以发送格式为“@01rr0100000141*”的命令帧。其中“41”即为计算所得的fcs。每一帧的fcs的可由上位机程序计算得到。
3.2 c++ builder中串行通信的实现
使用c++ builder开发串行通信程序有两种方法:一种是利用activex控件,c++builder本身并不提供单独的串行通信控件,可以使用visual basic自带的mscomm32控件,在c++builder中注册它,c++ builder就可以调用了。另一种方法是利用windows api函数创建串行通信。
利用activex控件开发串行通信程序较为容易,很多文章都进行论述过,但是这种方法实时性较差。使用windows api函数开发串行通信程序虽然比较复杂,但是采用多线程技术,其准确性高,实时性好,适用于连续生产过程中通讯要求严格,实时性强,数据量大的场合。在本次系统开发中,经过综合考虑,我们选择了使用windows api函数开发串行通信程序。
在开发过程中,我们使用了多线程,事件驱动的方式。通信程序主要由两个线程组成,主线程负责接收用户输入,相应键盘鼠标,接收windows消息,以及向串口发送数据。另一个监视线程监视串口接收消息,并向主线程发送windows消息。通信过程如图3所示。
使用过程中,首先使用一系列api函数初始化通信端口。这部分程序如下:
char *comno;
dcb dcb;
string sendtemp;
file://取得要打开的通信端口
sendtemp=“com” + inttostr(radiogroup1-》itemindex +1);
comno=sendtemp.c_str(); file://字符串转换
hcomm=createfile(comno,generic_read|generic_write,0,null,open_existing,0,0);
file://使用createfile函数打开一个通信端口,打开的
file://端口视窗体上选择的而定。
if (hcomm==invalid_handle_value)
file://如果串口未打开,报警消息。
{
messagebox(0,“打开通信端口错误!!”,“comm error”,mb_ok);
return;
}
getcommstate(hcomm,&dcb); file://取目前串口状态
file://设置通信端口的状态
dcb.baudrate =cbr_9600; file://波特率设为9600
dcb.bytesize =7; file://数据位7位
dcb.parity =evenparity;//奇偶校验设为偶校验
dcb.stopbits =twostopbits;//停止位设为2位 if
(!setcommstate(hcomm,&dcb))
{
messagebox(0,“通信端口设置错误!!
”,“set error”,mb_ok);
return;
}
通信端口初始化成功后,主线程开始接收用户消息,监测用户输入,然后开始发送命令帧,发送完毕后将发送事件标记设为false,接收事件标记设为true。接收标记为true时,监视线程启动,使用readfile函数读取从plc返回的应答帧。如果没有错误而且校验帧fcs正确,则使用一段翻译程序将应答帧中的plc信息翻译出来,例如某个dm区的值,存入内存变量中,即可以在监控画面上作出显示。然后主线程发送下一个命令帧,开始下一个循环。
如果plc返回的应答帧错误,或者fcs不正确,那么监视线程将根据错误的类型,发送消息至主线程,通知主线程重发命令帧或者改变设置。主线程经过多次重发仍然出现错误,则发出相关报警信息,通知操作员进行处理。由于监视线程在接收消息状态下立即启动,且与主线程采用同步处理方式,只需要向主线程发送消息,因此循环时间短,提高了控制系统的实时性。
在本系统中,例如要使用上位计算机控制plc关闭某个设备。主线程首先监测到鼠标点击开关事件,然后将这个操作事件翻译成相应的命令帧,通过串口发送此命令到对应的plc中,改变plc内存区的某个对应的值,进而改变plc的输出,关闭这个设备。同时监控画面可以显示出改变后的设备状态。
4 结束语
使用本文介绍的方法编制通信程序,在火电厂输媒监控系统中得到了实际应用。目前这一方案已经应用到现场,一段时间的试运行表明此方案是可行的。通信稳定可靠,实时性强,完全满足现场设备通信的需要。同时,由c++builder开发的监控画面,采用了面向对象的编程技术,缩短了此系统的开发周期,在上位机上再现生产过程,人机界面友好。相信此方案对同类系统的设计与开发有一定借鉴作用。
文章版权归西部工控xbgk所有,未经许可不得转载。