利用软件编程实现DCS通讯Word文档下载推荐.docx

上传人:b****2 文档编号:4707673 上传时间:2023-05-03 格式:DOCX 页数:22 大小:19.96KB
下载 相关 举报
利用软件编程实现DCS通讯Word文档下载推荐.docx_第1页
第1页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第2页
第2页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第3页
第3页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第4页
第4页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第5页
第5页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第6页
第6页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第7页
第7页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第8页
第8页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第9页
第9页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第10页
第10页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第11页
第11页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第12页
第12页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第13页
第13页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第14页
第14页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第15页
第15页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第16页
第16页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第17页
第17页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第18页
第18页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第19页
第19页 / 共22页
利用软件编程实现DCS通讯Word文档下载推荐.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

利用软件编程实现DCS通讯Word文档下载推荐.docx

《利用软件编程实现DCS通讯Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《利用软件编程实现DCS通讯Word文档下载推荐.docx(22页珍藏版)》请在冰点文库上搜索。

利用软件编程实现DCS通讯Word文档下载推荐.docx

 主要函数有:

 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

 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_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结构定义及例程

 #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*/

 ……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]);

 使用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

进行编程。

 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初始化例程:

 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);

 }……

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2