利用软件编程方式,可以更加灵活实现各种非常规的通讯。
由于自行编写的程序在工程师站/操作员站运行,需要占用一定的CUP时间及内存,因此在通讯数据量较大,同时要求通讯速度较快时,由于没有专业通讯软件的“例外报告”机制,建议不要采用自行开发程序的办法。
由于自行编写的程序通常没有“数据缓存”机制,在传送非常重要的数据时应该谨慎使用。
自行编程主要工作为了两方面,一为I/A数据的读写及处理,一为通讯的实现。
通常自行开发通讯软件包括:串口通讯(如智能前端)、TCP/IP通讯(如实时数据传送)、FTP通讯(如定期传送报表文本)、基于TCP/IP的MODBUS协议通讯。
以上几种通讯方式在通讯的实现方式上不同,但在I/A’s内数据的读写操作是一样的,接下来将阐述软件编程时的主要函数及方式:
1.I/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)
本文关键字:软件编程 工艺技术,电子知识资料 - 工艺技术
上一篇:DCS通讯安全性的考虑