一.簡介
隨著我國工業的自動化整體水平的提高,企業中的控制系統及控制設備的種類也越來越多;同時,隨著市場經濟的發展,各個企業也對DCS系統的要求也越來越高,除了要滿足常規的控制以外,還要求DCS系統能將控制系統的各個運行參數實時傳送到上位的MIS系統或SIS系統中去,進行數據后處理加工、共享、性能優化。所有的這些,都對DCS系統提出了通訊問題,包括和其它DCS或PLC的通訊、以及與上位機的通訊。
在諫壁發電廠的四臺300MW機組(7#、8#、9#、10#)的DCS改造中,全部采用的Foxboro公司的I/A’s系統,與I/A’s通訊的裝置有893類智能數據采集前端、鍋爐高過壁溫分析系統、基于PC機的實時報表數據庫系統、PI海量數據庫(SIS系統),幾乎涵蓋了DCS系統與其他系統進行通訊的所有方式:使用專業通訊硬件實現通訊、使用專業通訊軟件實現通訊、自行開發通訊程序(包括:串口通訊、TCP/IP通訊、FTP通訊、基于TCP/IP的MODBUS協議通訊)。
下面,將對以上幾種通訊方式的實現做一個簡單介紹并比較,給出在選擇通訊方式時的幾點建議。
二.利用硬件實現通訊
對于市場上廣泛使用的A-B公司PLC產品,Foxboro公司專門開發專用的通訊硬件--集成在I/A’s中的AB-STATION,通過AB-STATION,在I/A’s中可以直接對A-B的PLC進行管理、組態、通訊及數據采集監視,使整個系統既具有PLC快速的優點,又具有DCS系統友好的人機界面,強大的數據庫管理的優勢。
對于工業界廣泛采用的MODBUS協議(含ASCII協議及RTU協議),Foxboro公司開發了多種符合MODBUS協議的硬件,主要有:MODBUSGATEWAY,MODBUSGATEWAYPLUS,適用于RS-232通訊及RS-485通訊,并可以選擇做為仆方或主方。采用專門的通訊硬件,可以與一切提供MODBUS協議通訊接口的設備進行通訊,包括其它公司的DCS系統、PLC產品等。在上海Foxboro公司所實施的大部分需要進行通訊的項目中均采用這種方式。
除以上兩種專門通訊硬件外,Foxboro公司還有一個可以自定義協議的通訊硬件—FOREIGNDEVICEINTIGRATOR30(設備集成器30)。使用此通訊硬件,需要通訊的雙方只要定義好通訊數據包格式(包括數據包報頭信息、數據格式、數據包報尾信息)和通訊參數(包括起始位、停止位、數據位、波特率)即可實現通訊。在鎮江電廠項目中,上海Foxboro公司就采用這個方法實現了與GEPLC及無錫陽山智能數據采集前端的通訊,大大減少了用戶的投資。
此外,對于市場上使用較多的PLC和DCS產品,Foxboro公司提供專門的通訊軟件進行通訊。
以上所有的通訊方式所采用的硬件是一樣的:通訊處理機30(COMMUNICATIONPROCESSOR30),不同之處在于所選用的通訊軟件不一樣。
對于MODBUS協議,采用的波特率通常為9600bps,因此每秒所能通訊的數據包是有限制的。
對于MODBUS協議,如果MODBUS設備不同,每個通訊包所能通訊的量是不一樣的,通常使用的548設備可以通訊到256個字節,亦即128個模擬量或2048個數字量。
標準的MODBUS通訊幀格式為:“〈仆方地址〉〈功能碼〉〈起始地址〉〈數據傳送量〉〈校驗碼〉”。對于不同的設備具有不同的MODBUS地址;同一設備,不同數據類型(外部寄存器、內部寄存器、外部保持線圈、內部保持線圈等)具有不同的功能碼;同一數據類型,讀/寫操作不同時,也具有不同的功能碼。
因此,在考慮MODBUS協議通訊時,不能只看有多少個模擬量/數字量,而必須同時考慮:有多少個設備,每個設備的通訊模擬量/數字量數據有多少,數據是否雙向傳送,通訊速率為多少。綜合考慮以上因數后,計算出需要多少個通訊處理器。
需要強調的是:Foxboro公司的硬件通訊產品COMM30與許多公司的硬件通訊方式通過采用插在工程師站/操作員站主板上的串口通訊卡實現不同,Foxboro公司的COMM30具有專用的CPU芯片,獨立于工程師站及操作員站運行,是控制網絡中一個獨立的處理站,即使在工程師站/操作員站死機時仍能保證通訊的正常運行,這在參與控制的通訊(如與定排程控、吹灰程控等)中顯的尤為重要。
三.用專業通訊軟件實現通訊
專業的通訊軟件主要分為兩類:一類實現數據的實時采集與傳送,另一類實現流程畫面的實時傳送。
3.1數據的實時采集及傳送
用Foxboro公司開發的通訊軟件或利用第三方開發的針對I/A’s的通訊軟件實現通訊是一種非常方便的辦法,它可以大大縮短項目周期。
Foxboro公司的專業通訊軟件從早期的DataforWindow、PIMS中的DataLink到現在使用的AIM*AT軟件秉承始終如一的思想,利用AISAPI(FOXAPI的早期版本),FOXAPI的內部函數調用實現數據的實時讀寫;利用TCP/IP實現數據在I/A’s與PC機之間的雙向傳送;利用DDE技術將I/A’s的數據在支持DDE技術的程序(如:Excel、Lotus1-2-3、Delphi等)中顯示,同時提供VB調用函數,便于用戶的二次開發。該軟件的最快傳送速率為0.1秒。在目前的項目中,比較多的采用了這種辦法。
對于目前較流行的OPC通訊協議,Foxboro公司提供專門的OPC通訊軟件,同時也可以選用第三方,如:MATRICON公司的OPC通訊軟件。
第三方通訊軟件主要是美國OSI公司的PI實時數據庫。OSI公司的PI系統基于C/S結構,能將100多家的DCS系統或PLC中的實時數據傳送到WindowNT服務器中,利用其專利的“螺旋門壓縮”技術,將數據進行壓縮加工,使其保存周期可長達數年以上(取決于硬盤容量)。同時,利用其強大的系統工具實現二次開發,包括流程畫面顯示、趨勢顯示、優化處理、性能計算等。PI實時數據庫在Foxboro的I/A’s中的應用在國外已經有了上百個成功使用的業績。諫壁發電廠利用PI系統將其#7、#8、#9、#10四臺300MW機組多達20,000點的數據實現了實時傳送、長達2年的數據存儲,并利用其強大的二次開發工具,為全廠MIS(或SIS)系統的應用開發服務。
專業的通訊軟件,如:PI,除了具有高率、高速、數據保存時間長、安全可靠、功能強大、界面友好、使用方便等優點外,通常在數據傳送時還具有以下特性:
l采用“例外報告”方式:設定數據需要傳送的變化范圍,對未超過變化范圍的數據不傳送,這一機制大大降低了通訊負載。
l具有“數據緩存”機制:在網絡通訊中斷時,將需要傳送的數據緩存在工作站的硬盤上,待網絡通訊恢復時,在網絡通訊的空閑時再將數據傳送到數據庫中。這一機制保證了數據不丟失。
3.2流程畫面的實時傳送
將流程畫面實時傳送到PC機上,可以使企業領導和運行管理人員、熱工儀表維護人員可以及時掌握現場的生產運行情況,便于整個企業的資源共享、狀態監視及物流管理。
關于流程畫面的實時傳送,目前使用較多的是使用HumingBird公司的Exceed軟件。利用Exceed軟件的Telnet功能和I/A’s的附加顯示管理器(AdditionalDisplayManager),將I/A’s中的流程畫面實時傳送至PC機中,并可以定義在PC機中的操作權限是否可以操作。
除Exceed軟件外,還可以使用GraphOn公司的GO_Global軟件,該軟件可以直接利用網絡傳輸,也可以用撥號方式,將I/A’s中的流程畫面實時傳送至PC機中。
在使用Exceed及GO_Global軟件時,利用Modem撥號,就可以實現“遠程診斷”(FOXWATCH),即:將I/A’s使用情況等信息,及時傳送回Foxboro公司,Foxboro公司的工程技術人員在公司內就可以對用戶的各種要求進行及時響應,對其系統進行診斷,并對用戶提出使用建議。在諫壁發電廠的I/A’s系統中,就安裝有FOXWATCH軟件,使用效果非常好,廠級領導、熱工維護人員等在辦公室內即可了解機組生產運行情況;在出現故障時,可以迅速將DCS系統使用情況傳送給Foxboro公司的工程技術人員,在最短的時間內得到技術支持,最大程度地降低損失。
無論是采用專門的硬件實現通訊,還是使用專業的通訊軟件實現通訊,實現方法都比較簡單,下面將重點介紹在Foxboro公司I/A’s產品中用軟件編程方法實現通訊的幾種方法。
四.利用軟件編程實現通訊
利用軟件編程方式,可以更加靈活實現各種非常規的通訊。
由于自行編寫的程序在工程師站/操作員站運行,需要占用一定的CUP時間及內存,因此在通訊數據量較大,同時要求通訊速度較快時,由于沒有專業通訊軟件的“例外報告”機制,建議不要采用自行開發程序的辦法。
由于自行編寫的程序通常沒有“數據緩存”機制,在傳送非常重要的數據時應該謹慎使用。
自行編程主要工作為了兩方面,一為I/A數據的讀寫及處理,一為通訊的實現。
通常自行開發通訊軟件包括:串口通訊(如智能前端)、TCP/IP通訊(如實時數據傳送)、FTP通訊(如定期傳送報表文本)、基于TCP/IP的MODBUS協議通訊。
以上幾種通訊方式在通訊的實現方式上不同,但在I/A’s內數據的讀寫操作是一樣的,接下來將闡述軟件編程時的主要函數及方式:
4.1I/A’s數據的讀寫及處理
Foxboro公司I/A’s系統提供強大的內部編程函數(C函數、FORTRAN),主要包括有:
lOMCALL函數–實現I/A’s系統內部數據的讀寫操作。
主要函數有:
2intgetval(char*name,intobj_type,intimport,char*value,unsignedint*status,intdata_len) 此函數實現單個數據的讀操作。 2intom_getval(char*name,intobj_type,intimport,charvalue,unsignedint*status,intdata_len,PSAP_ADDR*psap_ptr) 此函數實現單個數據的讀操作,它使用PSAP指針。 2intsetval(char*name,intobj_type,intimport,char*value,unsigned*status,intdata_len) 此函數實現單個數據的寫操作。 2intom_setval(char*name,intobj_type,intimport,char*value,unsigned*status,intdata_len,PASP_ADDR*psap_ptr); 此函數實現單個數據的寫操作,它使用PSAP指針。 2intomopen(structom_header_node*om_descriptor,intopen_id) 此函數實現打開一個LIST,為數據的讀寫操作做準備。 2intomread(intomopen_id,intsize_list,structvalue*var_list) 此函數實現從打開的LIST中讀取數據。 2intomwrite(intomopen_id,intsize_list,structvalue*var_list); 此函數實現向打開的LIST中寫數據。 2intomclose(intopen_id,structom_header_node*header,structopen_var*var_list,structnet_addr*addr_tbl) 此函數實現關閉一個已經打開的LIST。
2頭部文件、OM結構及例程
#include #include #include #include #include main() { structopen_varin_var_list[8]; structheader_nodein_om_desc; structnet_adrin_net_adr_tbl[2]; intin_open_id; intrtn; floatdelta_temp,delta_fc,delta_df; structvalue*in_data_list,*temp; inti; delta_temp=5.0; delta_fc=1.0; delta_df=0.5; in_om_desc.task_status=OM_R_ACCESS; in_om_desc.net_adr_tbl_ptr=in_net_adr_tbl; in_om_desc.size_net_adr_tbl=2; in_om_desc.open_list_ptr=in_var_list; in_om_desc.size_open_list=8; …… }
2特點
使用getval、setval、om_getval、om_setval函數進行編程比較簡單,但效率較差;用omopen、omread、omwrite、omclose編程需要復雜的聲明,編程比較復雜,但程序通用性好(不要FOXAPI的支持)、效率高。
lFOXAPI函數–實現I/A’s系統內部數據的讀寫操作及強大的C/S結構編程。
主要函數有:
2intsbopen(int*gw_array,intnument,char*name_array,int*valtyp_array,intacctyp,float*delta_array,intclexit,intrsr,intwsr,float*wdelta_array,int*dset,int*index_array,int*error_array,int*reterr)
此函數實現以連續更新的方式打開一個讀寫SET。 2intbread(intdset,long*value_array,int*status_array,int*reterr) 此函數實現從一個已經打開SET中讀取數據。 2intbwrite(intdset,long*value_array,int*error_array,int*reterr) 此函數實現向一個已經打開SET中寫數據。 2intclsset(intdset,int*reterr) 此函數實現關閉一個已經打開SET,釋放程序所使用的內存空間,釋放對CP中數據的控制權。
2頭部函數,FOXAPI結構定義及例程
#include #include #include #include #include #include #include #defineOBJNUM100 #defineSETNUM20 typedefunion { longlval; shortival; floatfval; charbval; }IAXVAL; /*PredefinedParameterofI/Avalue*/ staticintgw[SETNUM][OBJNUM];/*GatewayArray*/ charname[SETNUM][OBJNUM][32];/*ObjectNameArray*/ chardesc[SETNUM][OBJNUM][15];/*ObjectdescriptionArray*/ staticintvaltype[SETNUM][OBJNUM];/*ObjectValueTypeArray*/ staticintacctype=1;/*Read-onlyArray*/ staticfloatrdelta[SETNUM][OBJNUM];/*ObjectsReadDeltaArray*/ staticfloatwdelta[SETNUM][OBJNUM];/*ObjectsWriteDeltaArray*/ interror[SETNUM][OBJNUM];/*ObjectsErrorArray*/ intindex[SETNUM][OBJNUM];/*ObjectsIndexesArray*/ intstatus[SETNUM][OBJNUM];/*ObjectsStatusArray*/ IAXVALvalue[SETNUM][OBJNUM];/*ObjectsValueArray*/ staticintrsr=4;/*ReadScanRate*/ staticintwsr=4;/*WriteScanRate*/ staticintclexit=1;/*IgnoredinUNIX*/ intreterr[SETNUM];/*OpenSetreturnErrorCode*/ /*PredefineParameterofutility*/ intset[SETNUM];/*OpenSetNumber*/ intTotal_SET;/*TotalSetNumber*/ intLast_SET_Num;/*LastSetValueNuber*/ intTotal_Num;/*TotalNumberofobjects*/ intTotal_File;/*TotaloutputfilesNumber*/ intINTERVAL;/*Communicateinterval*/ intCol_Num;/*Valuenumberperline*/ main() { ……scopen(gw[i],k,name[i],valtype[i],acctype,rdelta[i],clexit,rsr,\ wsr,wdelta[i],&set[i],index[i],error[i],&reterr[i]); printf("ReturnErrorCode=%-d\n",reterr[i]); printf("ReturnDataSet=%-d\n",set[i]); ……rtn=bread(set[i],value[i],status[i],&reterr[i]); if(reterr[i]!=0) { printf("BufferedReadObjectsError%d,%d,%d\n",rtn,\ reterr[i],set[i]); } ……for(i=0;i { clsset(set[i],&reterr[i]); } …… }
2特點
使用FOXAPI編程比較簡單,程序效率也很高,但程序的執行需要FOXAPI的支持,編譯好的程序只能在裝有FOXAPI的AW、AP機器中運行。PI實時數據庫實際上便是利用FOXAPI函數編寫的應用程序。
lHICALL函數–實現具有I/A’s風格的人機界面(HUMANINTERFACE)編程,包括顯示元素,如:矩形、圓弧、填充色;對話框、菜單結構、鼠標鍵盤驅動、查詢、文件驅動等,事實上,整個I/A’s的人機界面編寫既是通過這些函數完成。
lIPCALL函數–實現I/A’s系統內部通訊編程,如:SOE軟件等。 lICCAPI函數–實現I/A’s控制處理器CP中CIO的相關操作。 l數學庫–提供各種經典數值計算的調用函數。 l物理特性庫–提供各種物理特性計算的調用函數,包括水、蒸汽的焓、熵等計算。 2intvpt(floatp,floatt,float*v) 此函數根據蒸汽的壓力及溫度計算蒸汽的容積。 2inthpt_stm(floatp,floatt,float*h) 此函數根據蒸汽的壓力及溫度計算蒸汽的焓。 2intspt_stm(floatp,floatt,float*s) 此函數根據蒸汽的壓力及溫度計算蒸汽的熵。 2inthpt_wtr(floatp,floatt,float*h) 此函數根據水的壓力及溫度計算水的焓。 2intspt_wtr(floatp,floatt,float*s) 此函數根據水的壓力及溫度計算水的熵。 2inthpt_air(floatp,floatt,float*h) 此函數根據空氣的壓力及溫度計算空氣的焓。 2intspt_air(floatp,floatt,float*s) 此函數根據空氣的壓力及溫度計算空氣的熵。 lINFORMIX編程。 在某些需要對歷史數據進行操作的場合,可以利用INFORMIX及E-SQL進行編程。
4.2通訊的實現
在用軟件編程實現通訊時所采用的具體的通訊硬件上,既可以通過串口實現RS-232通訊,也可以通過AUI網卡、BNC網卡、RJ-45網卡實現FTP通訊、TCP/IP通訊。
當與I/A’s通訊的其它設備(如智能數據采集前端、GPS、自動同期裝置等非通用設備)可以提供串口通訊,且通訊點數量不多時,采用專門的硬件實現通訊硬件不是一個非常經濟的方案,此時可以采用RS-232實現通訊。
用RS-232實現通訊時,首先應初始化通訊端口,然后可以按RS-232通訊規程(RXD,TXD,RTS,CTS,DSR,DTR,DCD信號),發送指令并接受數據。
以下是初始化端口的一段例程:
intinit_port(intk,int*fd,char*comport) { intsavef; if((*fd=open(comport,O_RDWR|O_NDELAY|O_NONBLOCK))<0) return(1); fflush(stdout); fflush(stdin); if(savef=fcntl(*fd,F_GETFL,0)<0) return(2); if(fcntl(*fd,F_SETFL,savef|O_NDELAY)<0) return(3); if(ioctl(*fd,TCGETS,&termio)<0) return(4); /*Settheportparameteras9600Baudrate,8databits,1siopbit, Enablereceiver,Evenparityenable*/ termio.c_cflag=B9600|CS8|CREAD|PARENB|CLOCAL; termio.c_cflag&=~CSTOPB; termio.c_cflag&=~PARODD; termio.c_iflag=INPCK; termio.c_iflag&=~ISTRIP; termio.c_lflag=0; termio.c_oflag=0; termio.c_cc[VMIN]=1; termio.c_cc[VTIME]=0; if(ioctl(*fd,TCSETS,&termio)<0) return(5); sleep(1); return(0); } 以下是讀寫端口的一段例程: intcomm(unsignedcharnum,intfd) { intI,rtn,tioc; unsignedcharT[200]; unsignedcharbuff[200]; ……ioctl(fd,TIOCMGET,&tioc); tioc=tioc|TIOCM_RTS; ioctl(fd,TIOCMSET,&tioc); ……write(fd,T,200); rtn=ioctl(fd,TCSBRK,1); strcpy(buf,”“,200); read(fd,buf,200); }
如果與I/A’s進行通訊的是PC機或其它DCS,比較好的通訊辦法是利用RJ-45等通訊口,按FTP協議或TCP/IP協議進行通訊。其中,FTP通訊的效率較低,且一直有讀盤/寫盤動作,對機器的影響較大,但此方法比較簡單,容易實現,因此,在通訊不頻繁的時候(建議大于一小時),也可以采用這個辦法。在更多的時候,則建議使用TCP/IP協議進行通訊。
利用TCP/IP進行通訊時,有兩個協議可以選擇:TCP及UDP,其中TCP(TransportControlProtocol,傳輸控制協議)是面向聯接的,它提供高可靠性服務,尤其適用于傳輸大量報文信息。UDP(UserDatagramProtocol,用戶數據報協議)是無聯接的,它提供高效率的服務,適用于一次傳輸少量報文信息的場合。
UDP通訊的程序的編寫也比較容易,只需指定客戶機的IP地址(或主機名)及傳送端口號即可,下面是一段利用UDP初始化例程:
#include #include #include #include #include #include intsock,length; structsockaddr_in,sockname; charbuff[1024]; intInit_Socket() { char*clientName=“AW5101”; intportNum=10002; structhostent*hp,*gethostbyname(); /*Creatsocketonwhichtosend.*/ sock=socket(AF_INET,SOCK_DGRAM,0); if(sock==-1) { perror(“opendatagramsocketerr0r”); exit(1); } hp=gethostbyname(clientName); if(hp==(structhostent*)0) { printf(“unkownhost:%s\n”,clientName); exit(2); } memcpy((char*)&sockname.sin_addr,(char*)hp->h_addr,hp->h_length); sockname.sin_family=AF_INET; sockname.sin_port=htons(atoi(portNum); return(0); }……
五.通訊安全性的考慮
在采用了I/A’s和PC或其它DCS之間雙向通訊后,安全性就成為一個比較突出的問題,應盡力避免不必要的人為破壞。安全性是一個非常復雜的問題,請參考專業文獻。在此不做詳細討論,只就一般性原則提出幾點建議:
I.自行開發軟件時,必須考慮到安全性,包括對控制處理器數據的讀寫操作權限、軟件的事件處理功能(進程的意外中斷、程序的死循環、邊界處理、內存的釋放等)、TCP/IP的操作權限。
II.對于專業軟件,由于功能強大,在使用時,應對軟件不必要的部分加以封閉,并對軟件的操作加以口令授權。
III.建立通訊程序握手機制時,必須考慮安全性。
IV.加強有關的安全性規章制度的建設,避免人為的破壞。
V.DCS系統與MIS/SIS系統之間設置網關,企業MIS/SIS系統聯結到INTERNET時配置防火墻。
六.結論
本文通過以諫壁發電廠使用的Foxboro公司的I/A’s系統為例,討論了DCS系統中實行通訊的幾種方法。歸納起來有:使用專業硬件、使用專門通訊軟件,以及自行開發軟件三種。
對主流通訊協議(MODBUS、A-BPLC)以及通訊數據量較多時,采用專業通訊硬件實現通訊是一個比較好的辦法。這種配置方式的優勢在于:通訊可靠、安全性好、容易實現、開發周期短;不足之處在于:增加了硬件投資。需要指出:在考慮MODBUS協議通訊時,不能只看有多少個模擬量/數字量,而必須同時考慮:有多少個設備,每個設備的通訊模擬量/數字量數據有多少,數據是否雙向傳送,通訊速率為多少。綜合考慮以上因數后,計算出需要多少個通訊處理器。
專門的通訊軟件由于功能強大,在使用時首先要考慮的是安全性,同時要增加軟件費用(大型的數據庫如:PI,I-FIX等價格都比較貴)。但它也有非常明顯的優勢:實現通訊容易、二次開發工具充足,項目周期短,項目質量有保證。
在需要實時傳送流程畫面時,當然應采用專業通訊軟件,如:Exceed、GO_Global等。
如果自行開發通訊程序,需要考慮的有:編程工具—C語言投資、程序的魯棒性、編程的工作量、項目周期、通訊效率、對工程師站/操作員站的CPU占用等問題。它的優勢在于:開發靈活,容易實現用戶的各種特殊需求。
如果通訊量不大(50點左右),建議使用增加I/O卡件,不同系統系統之間通過硬接線連接的方式實現。這樣既考慮到了總體投資、項目周期,也增加了系統的可靠性。
如果通訊只提供RS-232通訊,則采用RS-232C協議進行通訊。
如果通訊量較大,但時間間隔較長,可以考慮采用FTP方式傳送文本數據。
如果通訊頻率較高,建議采用TCP/IP中的UDP協議進行通訊。
|