商鋪名稱:廈門光沃自動化設備有限公司
聯系人:吳(先生)
聯系手機:
固定電話:
企業郵箱:1878187406@qq.com
聯系地址:廈門市海滄區滄湖東一里海景奧斯卡
郵編:361000
聯系我時,請說是在焊材網上看到的,謝謝!
1771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC3171771-IXHR ABGE IC693ACC317
利用軟件編程方式,可以更加靈活實現各種非常規的通訊。
由于自行編寫的程序在工程師站/操作員站運行,需要占用一定的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);
}……