还剩22页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第五章数据采集技术页万字DCS
101.6目前各种设备提供的对外数据接口可分为以下几类I/O数字通讯接口,包括串口类,以太网(协议)类,现场总线类,仪器总线类△通讯接口1,TCP/IP(如等)巴模拟量通道输出,设备直接提供或继电器接点信号等GPIB24-20mA,1—5Va力控具有世界上大部分主流设备的接口程序,对总线以及I/O GPIB Honeywel1,aYo koga等厂家的也能够支持wa,Fox bo r o,F i sher—Ros e mou n t DC S除通常意义上的数据采集外,力控可以利用采集到的实时数据对装置进行实时建模,插入力A控自己的先进控制控件,实施先进控制.对一个设备上的数据定义不同的采集周期如果一台设备上有个实时数据需要采集,5o1A1000而在这个数据中只有个是经常刷新且需要密切监视的,其余个全部是辅助数据,100010A990但是也需要时常查看如果把这个数据同等地对待,采用统一的扫描周期进行采集,就1000a会严重影响个重要数据的刷新速10度.怎样既保证个数据都能够采集,又确保这个重要数据的采集速度呢有两种办法:100010A办法为一个设备定义两个逻辑设备,使其具有不同的采集周期,如图所示4但是这种方15-1法定义的最长扫描周期为分钟.10办法不用上面的办法,一台设备只定义一个设备名称也可以达到要求.因为力控的驱动对2:1/6画面中不显示而且没有组态历史趋势和报警的数据是不采集的,仅当画面中显示这个a数据时才进行采集因此将不常用的数据单独组态在一个或几个画面中,使用完毕马上关闭就不会影响整个采集速度这种方法适用于存在有大量不需要快速更新的数据的情况.图5—1合理设置扫描周期,避免引起设备死机有些设备内部只有一个同时负责数据通5o2A I/O CPU,讯和计算,如果在力控上设置的数据扫描周期太快容易使设备死机,因此在设置这一参数时应该慎重,最好通过多次试验确定一个合适的扫描周期.一般的串口设备的扫描周期可设在毫秒之间.通过拨号方式与10-100A53设备通讯I/O力控的所有串口驱动程序都支持通过以拨号方式与设备通讯.只要正确设置电话I/O MODEM号码即可,如图所示通讯状态监视,设备状态数据的读取a力控为每一个5-2a1534I/O设备自动定义了一个系统变a量,假如系统中有一个设备则每当不能a与力控正PLC1,PLC1常通讯时,系统变量的值就会被$10PL C1置为设备故障属于系统报警计算机通讯口
④故障,电缆,端通讯口的故障,通1I/O PLC P LC讯口与计a算机通讯口的参数设置不一致都会造成这种结果还有一种可能,就是数据连接项错误,如果计算机的命a令发给的只读参数,是不会予以PLC PLC理睬的.怎样用驱动程序调试设备5A.5I/O I/O力控的驱动程序有数百个,针对每
④一种设备都有一个独立的程序当力控实时a数据库I/O没有启动时,,单独启动驱动可a以作为本地设备调试工具使用此时可以测试计算DB I/O I/O机与设备的通讯情况,摸索最佳a的扫描周期.a菜单”设置参数”用来规定通讯I/O[S]/1/过程中是否显示计算机发出和设备响应的通讯信息.如图5・3所示菜单”工具工具”用来在不启动实时[T]/数据库及其数据连接项的情况下执行与/3设备的通讯弹出对话框如图上部所示此I5-5时可以按“参数设置”按钮设置通讯参数,如图和所示,主要是设置串口的参数,A5-65-7DCB地址等IPCS t ring m_desc;〃保存连接项描述保存数据区类型表示表示i nt i t em_n
[2];//item_n
[0],0DIO,1A I0;⑴保存地址a在的」消息函数中进行如下处理://item_n CLi n kDlgWM NITD I AL OGABOOLCL i n kDI g On I ni tDia1og{ACD ia1o g::On I nit Di a1og;//在此处设置值使对话框的显示和是一次选择相同,以利于执行和上一次相近的操作m_Ctr1Chann e1Set Cur S e1i t em—n
[0];//设置操作选项为上一次的操作Am_n A d dr=ito设置地址为上一次的值eUpda t e D a taFALSE;are t urn TRUE;a}a这些处理为了使对话框的显示和上一次选择相同,以利于执行和上一次相近的操作.在ONOK消息函数进行如下处理A v oi dCL i nkD1g:OnOK{得到各个选项得值Upda t e D a taT RUE;//aCS t r in g string;;//保存操作选项i t em_n
[0]=m_C t r1C ha n nel.Ge t C u r S e1am_CtrlCh annel.Get WindowTextm_desc;i tem_n
[1]=m_n Addr;〃保存输入的地址m_des c+=”起始地址;s t ring.Forma t%d,m_nAddr;m_de s c+=s tr i ng;CDi a1og::OnOK;在这个函数里,把用户组态的内容数据区的选择,地址的指定保存在item“,并根a据这些内容生成连接项描述扫描程序5o6o6IOSC AN是的一个主要程序模块.它负责完成对部分的代码进行周期性地IO SCANFIOS IOAPID LL A扫描.同时完成与设备的底层通信串口通信,网络通信等,以及设备超时处
④理,设备故I/O障诊断等还负责与数据库之间的通信与协作它把从设备采.IOSCAN DB I/O集到的数据经解析转换后提交给或将下置给设备的数据经解析I OAPIDB,DB I/O I OAPI转换后写入设备是提供的一个标准软件工具供程序员在调试和运行I/O aIOSCANFIOS SDK时直接使用开发工具包里提供了和版本的程序,在目录a13a FIOSdebug rel e a s eIOSC AN下可以找到它们.版本的程序主要供程序员在aFCINS TDIR\Fios sdk\Utility”Debug I0SCAN调试时使用,它能提供更为丰富的调试信息在使用时,需要把以及配套的IO S CAN.EXE几个文件即目录”下的文件拷贝到生成的D LLFCINSTDIR\F iossdk\Util i tyDebug”DLL版本的文件的同一目录下注意:版本的文件必须配adebug I OAPI DLLdeb ug IOAPI DLL A合版本的程序,版本的文件必须配合版本的debug IOSCANrele ase IOAPLDLLreleas e程序.同时不要忘记将的文件名更改为要开发的驱动的名IOSCAN IOSCANEXE I/O I O IDa称版本的需要程序员手工启动或用调试启动.d ebug IOSCANVC++编程接口
5.
6.7IOAPI DLL是提供的最主要的一个编程接口.程序员的主要工作就是开发部分的程序代IOAPI FIOS IOAPI码.提供了一组函数和一些类库.这组函数规定了名称,参数及返回a值,函数IOAPI APIC++API内容由程序员根据具备的设备编程实现类库则为程序员提供各种获取力I/0C++控组态信息,参数设置信息,与数据库进行数据交换等数据处理的方法我们把这组I/O DB API函数称为扫描函数,把这些类库称为是输入输出a类库的缩写.C++IOCJOC InputOu tputClass程序员编写的最后要形成的扩展动态链接库扫描函数是这个loapi MFC MFC ExtensionDLL,的输出函数当力控系统运行时,力控的扫描程序对叩讪中扫描函数部DLL F I OSlose an I分的州代码进行周期性地扫描,它把从设备采集到的数据经扫描函数解I/0析转换后提交给或将下置给设备的数据经扫描函数解析转换后写入设备归结DB,D BI/0I/O起来,开发的主要内容就是用编写扫描函数.中的所有类库全部以纯虚类的形loapi IOCa I0C式提供,并且只有成员函数,没有成员变量.目a前中主要包括个类:IOC4CItem Packet,C Devi数据项类.数据包类设备类c e,CManag e r.aC I tem,CPa c k e t,a C D e vice,管理器类义一个实例创建一个实例用户在组态时每定义一个设CMana g er,FIOS CMana g e r备,则创建一个实例对所有的进行管理.一个实例,A CD e v ice.CMan a ger CDevice CD e vice由一个或多个实例组成,而每个实例又由一个或多个实例组成.每个实例/对CPacke tCPa c ket CI t e m CItem应数据库中的一个点参数,也就是对应设备的一个“点如设备的一个通道,DB I/O一个参数等.提供的这个类库,实际上就是对以上所述的这几种数据对象提供了一组操作方IOC4法,以供程序员更加灵活的控制程序类类提供了对数据项对象的一组操作方法.cCitem aCIt em一个数据项对象包含的是数据库中的一个点参数与设备中一个物理通道的映射关系DBAI/O使用的基本数据结构是一个实例保存一个实例CItem AIOITEMDEF.C Item IOITEMDEFIOITEMD EF的定义如下Mype d e f s truc tloItemDefSt r u A{c har str
[64];Along n
[8];A类的定义如下JIOITEM DEF;1A4CIt e mcl ass CI tempub1ic CObjec t a{pu blie:;〃取得数据连接项结构指针v i r t u a I TOIT EMDEF*Getl t em S tr u=0//设置连接项的可写属性,缺省时可写的,为设置为不可写bAttr i bute TRUEv irtu al void SetRead0n1y BOOL b Attribu t e=TRUE=0;//设置连接项的可读属性,缺省时可读的,为设置为不可读.bA tt r ibu te TRUE A virtual vo i dSetWri t eOnlyB0OL bAtt r ib ute=TRUE=0;^vi r t u al void Set Dat a short sData=0;//按短整型格式设置采集数据〃按长整型格式设置采集数据v irtual void S e tDat a1o ngIDat a=0;4V ir t ualv o id Set D at a;//按浮点型格式设置采集数据d ouble fData=0按字符串格式设置采集数据v irtu a1void S e tD a t a c h ar*s zDat a=0;//〃按字符串格式取得上一次用设置的采集数据Se tDat av irtua1v o id G et D atachar*szData=0;//设置私有数据,范围offset:0〜3v irtua1void S etPr i vateDatau n si g ne d s h o rt offs e t,lo n g1P r ivate D ata=0;Avir t u al1o n gG e tP r i v a teDatauns i g ned sh o r t of f set=O;//取得私有数据,of f set范围:0〜3//取得本连接项类所归属的数据包指针v ir t ual CPacket*G e tPacket=0;vi r tu a1CDe v ice*取得本连接项所归属的设备指针〃G e tD e vice=0;//vir tual CMana ger*G e tM a n a ger=0;取得管理器指针Io S can〃按浮点型格式设置历史数据Av ir tual void Se tH i sDa t aHi sI ns D a tSt ru*pHisI;a各个函数的解释如下:a功能:nsDatStru,intnCount=0;A}A1IOIT EMDEF*G e tltemS tru取得数据连接项结构指针.a参数无返回值:数据项结构指针a举例4IOITEMDEF*p ItemStru=pl t e m—Ge t I temS t ru;a1ong nCmdT y pe=pltemSt ru—n
[3];2^.v o id SetRea d功能设置连接项的写属性,缺省时连接项是可写的a参Only B00LbA11ribute=TRUE数:TRUE设置为不可写;FALSE设置为可写.返回值无a举例or i n t i=;i etltemCount;i++f0GCItem*pl t em=p P ac k et-GetItem i;ap It e m-SetRead0n ly;}3A.void Se t W riteOnly BOOL bAttri but e=TRUE功能设置连接项的读属性,缺省时连接项是可读的al5a参数:TRUE:设置为不可读;FA LSE设置为可读.返回值:无
④举例;fo rinti=0i Getl t emCoun t;i++{aC Item*pl t e m=pPacket-Get Itemi;〉pl t em-SetWr i teOnlyO;}心.a功能:按短整型格式设置采集数据.参数:短整形数据值avoid S e tDat ashortsDat a返回值:无.总功能按长整型格式设置采集数据总参数:长整型数据值void SetDa ta1ong IData5o返回值:无a功能:按浮点格式设置采集数据参数浮点数据值返回void SetData double fData A A6o值:无.总功能按字符串格式设置采集数据.总参数字符串7a.vo i d S etDatach a r*s zDa t a数据值.总返回值:无.
8.v oidGe tDat ac h ar*s zData功能:按字符串格式取得上一次用设置的采集数据.SetDat a参数存放最近一次设置的采集数据字符串型数值的字符串指针缓冲区长度应不小于
32.A返回值无.举例c har szDa ta
[32];aplt e m-G etDa tas zData;94void S e t P ri va t e Da t aunsigned short of;a功能:设置私有数据参数:fset,Ion gIPriva t eD a t aoff s e,私有数据的偏置长整型私有数据.总返回值:无备注自动为每个t〜3;lPri va teData,loscan C实例分配了一块由个整型数位组成的程序员a私有数据空间供程序员使用程序It em432员除了用这部分私有数据区保存数值外,也可以分配新的内存空间,然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,正确释放新分配的内存空间.a举例一〉char*pB u f=n ew char[MAXCMD LEN];Api t e mSe tPrivateData3,long p Bu f;A
10.功能:取得私有数据long Ge tP r ivateDa t aun s i gn e d sho r t o f fset a16A参数私有数据的偏置忏「九@口@长整型私有数据返回值:整型私有数据off set,,0〜3112,A备注自动为每个实例分配了一块由个整型数lose an CItem4位组成的程序员私有数据空间供程序员使用,程序员除了用这部分私有数据区保存数值外,32A也可以分配新的内存空间,然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,A正确释放新分配的内存空间.功能取得本连接项类所归属的数据包指针a参数无a返回值:
11.CPacket*GetPacket a本数据项所归属的数据包指针a举例:CP a c k et*p P a cket=p Item一〉GetP a c ke t;A
12.CDe v ice*GetDevice功能取得本连接项所归属的设备指针.参数:无A返回值本连接项所归属的设备指针.功能:取得管理器13A CManag e r*GetManagerI scan指针.参数:无a返回值Iosc an管理器指针.1g.vo i d SetHisDa t a Hisln sDa tStru*pH islnsDatSt ru,i n t n Coun t功能按浮点型格式设置历史数据总参数无返回值:无类C pac k et类提供了对数据包对象的一组操作方法.一个数据包对象包含一个或多个数据项对象CPa c k et类的声明如下C Pac ketaclass CP ac k e t pu blicC Ob ject{Apubli c:取得包中数据连接项个数v ir tu al i n t Getlte m C ount=0;//vir tual in t Add Item CItem*p Item=0;〃按先后顺序加入数据连接项av ir tu a1void In sertlt〃按索引插入连接项e mu n signed s h o r t nlnde x,CItem*pltem=0;按索引取得数据连接项指针virt ual CItem*G e t It emint n Inde x=0;////设置包的可写属性,缺省时可写的,为设置为不可写bAttribute TRUE4V irtual void Set R ead/设置包的可读属性,缺省时可读的,为0n1y BO OL bAtt ribute=TRUE=0;a/bAtt ribute T设置为不可读.RUEv irt u a1void S e tWrite OnlyBOOL bAtt ri bute=TRUE=0;//设置私有数据范围,of fs e t:0~15Avi r tu alvo i d SetPr iv ate Datau n s igned sho r t offset,long取得私有数据,1Private D ata=0;avirt u al1ong G e tPriv ateD ata unsign e ds hort of fs e t=0;//of范围//重复扫描当前数据包fs e t:0~l5};-virtual void Rep e a tSca n=0;〃取得本数据包所归属的设备指针v irt ual CDev i ce*GetDevi c e=0;4virtual CManag e r*G etMan a ge r=0;//取得I oSc an管理器指针};下面详述类的各个函数功能取得本数据包内数据17A CPa c ket A1i n t Getlte mCoun t项的个数参数:无.返回值:本数据包内数据项的个数举例i nt nltem C nt=pPacke t——G e tltemC oun t;总功能:按先后顺序加入数据连接项.参数:加入数据包的数据
2.i n t Addltem CItem*p Item;项指针.a返回值:本数据包内数据项的个数.举例if p P ac k et-G e tltemC oun t==0a p Packe t-A d dIt e mplte m;功能:按指定位置加入数据连接项
3.v oidIn sertItemC Itemp Ite m,uns i gn e d shor t nln dex4a参数:加入数据包的数据项指针加入的数据项在数据包内的序号从P Item,n In d ex,开始a返回值:本数据包内数据项的个数.
04.C Item*G e t Item i nt nln d ex;功能:按序号取得数据连接项.a参数:,数据项在数据包内的序号从开始a返回值:nlnde x数据项指针.举例;aforint i=0i G e t ItemC ou n t;i++a{CItem*pItem=pPa cket一>GetItemi;o••o•o二a功能:设置数据包的写属性,缺省时数据包void SetReadOnlyBOOL bAttributeTRUE
50.o是可写的.A参数:TRUE:设置为不可写;FALSE设置为可写.返回值:无举例;A i nt nPacketC nt=0一〉;nP ac k etCn t=p D e vic e Get P ack e tC ountAfor in t i=0;i G etP a cket i;pPacket-S etReadOnly;功能:设置数据包的读属性,缺省时数据包
6.v o idSe t WriteOnlyB0OL bAtt ribute=TRUE是可读的.参数:TRUE设置为不可读;FALSE设置为可读.A返回值:无.7Avoid S etPriv功能:设置私有数据.a teD ata u n sig n eds ho rt offs et,long IPriv ateData a18参数私有数据的偏置长整型私有数据△返回值无.备注:offset,,0〜15;lPrivat e Dat a,:Ioscan自动为每个实例分配了一块由个整型数位组成的程序员私有数据空间供程序员CPacket1632使用程序员除了用这部分私有数据区保存数值外,也可以分a配新的内存空间,然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,a正确释放新分配的内存空间.举例Acha r*pB uf=new c ha r[M AXCMDLE N];一〉;pPa ck et SetPrivateData3,1o ngpBu f功能:取得私有数据.参数,私有数据long GetPriva te Datau nsi gne dshort off s etAoffset8o的偏置,长整型私有数据.〜15;lPrivateData,返回值:整型私有数据备注自动为每个实例分配了一块由个整型数位组成的程序员私有数loscan CPacket1632A据空间供程序员使用程序员除了用这部分私有数据区保存数值外,也可以分配新的内存空间,然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,△正确释放新分配的内存空间功能:重复扫描当前数据包.a参数无9A.v o i d Re p eatSc a n4返回值:无备注:对于异步工作方式,在采集数据时,一个数据包的采集数据可能需要多帧传送,或者一次采集过程需要多次请求枣应答过程在这种情况下,在解析数据时,执行该函总数,I将重复扫描当前数据包scan
10.C Dev i ce*GetD e vice;功能:取得本数据包所归属的设备指针.参数:无a返回值:本数据包所归属的设备指针.a举例:CDevic e*pD e v i c e=pP ac k et-GetDevice;
11.CManager*G etMa nag er功能取得Iscan管理器指针.参数:无
④返回值I°sc an管理器指针举例〉CMan a ge r*pM a n ager=p Pa cket—GetM an ager;类类提供了对设备对象进行操作的一组方法一个设备包对象包含一个或Cd e vice AC Devic e多个数据包对象下面是的定义CDeviceclass CDevice:publi cCObject{apub1icA〃取得设备名称Avir tua1C Strin g Ge t Nam e=0;〃取得设备类型如:串口类,网络类等virtual int Ge tT y pe=O;;〃取得设备型号取得设备19A v irtual int GetMod el=0avir tua1CString GetAdd r=0;//地址;〃取得地址或主机名称Ayirt ual C S tring G etN etA d dr=0IP A v irtualC S t r ing GetPh〃取得电话号码one Number=0;v irtual i nt GetPo rt=O;//取得串口设备端口号或网络设备端口取得数据更新周期常数毫秒v irtual i nt GetUpd a teCy cle=0;///取得超时时间常数毫秒/取得通信空闲时间常数毫秒,用v irtual int GetTim eOut=0;/于决定是否按字节发送和每个字节之间的延时;^vi rtuali ntG e tld1e Time=0//设置通信空闲时间常数毫秒,用于决定是否按字节发送和每个字节之间的延时Avirtu a1vo;;〃i d Setld1eTi me un signe dsh o rt n Time=0^virtual voi d GetDCBDCB de b=0取得参数〃设置参数DCB A irt ual voidSetDCBDC B deb=0;DCBv〃设置向设备写入数据的结果状态4V irtual v oid SetW r iteStatusBOOL bS uccess=TRUE=0;a//设置私有数据,范围丫€^5©10~1541111v oi dS e tPrivateDa tau nsign edshorto ffset,lo n g1PrivateData=0;Avirt ua11ong G etPrivateDa tau nsignedsho rtoffs et=0;〃取得私有数据,范围〃重复扫描当前设备
④〃按offset0〜15vi r tual void Repea t Scan=0;LPCSTR格式显示过程信息A virtu a1voi dShowProcessMessage LPC STR szMs g=0;A//按CStr i ng格式显示过程信息/按格式显示virtu a1voidR ecordProces s Messagec o ns tC S tring csMs g=0;A/LP C STR事件信息,决定是否提交给bNotifyDB DB/按vi r tual voidShow Event Messa geLPC STRszE vent,BOOL bNo tifyDB=FALSE=0;CSt r格式显示事件信息,决定是否提交给ing bNoti fyDBDBvirtual v oidR e cord EventMes s ageco ns tC St r ing c sEvent=0;//取得设备包含的数据包个数
④〃按索引取得数据包指针vi rtuali ntG etPac k etCount=0;virtual CP ac ket*G etPacketu nsi gned s hort n Index=0;//取得管理器指针virt ual CMan ager*Ge tManage r=0;loSc an//向设备写入数据virtu a1in t Se nd char*c hComma nd,int n Comman d Len=0;AV ir tuali nt Ge tl temCount=0;//取得设备中数据连接项个数内irtual CIt em*G etItemin tnIndex=0;〃按索引取得数据连接项指针^virtual voidS etUnPublic iz edB0OL bUnPublicized=TRUE=0;//设置协议为未公开设置参数〃设置接收缓冲区大小字v irtua1v oi dSe tDCBAfterS e ndDCB deb=0;//DC Ba节Av irtua1in t Set AcceptBuff e rLengthint nNewAccept Bu ff erLe n gth=1024=0;A//设置发送缓冲区大小字节v irt ualint SetSe nd Buf f erLengthint nNewSendBu fferLength=1024=0;〃设置一次从串口读取的字符串块大小字节X irtual intSe t ReadDataBu ffe r Len g th int n N ewR ea dD ataBuffe rLe n g th=128=0;a};下面详述类的各个函数a功能:取得设备的名称CDev i ce2Aoia.C Strin gG et Name参数无总返回值设备的名称,自备注:设备名即在设备定义”对话框”设备名称”编辑“1/0框中输入的字符串.举例:A C Str i n g c sDe v i ceN ame=pD e vi c e—GetName;;A
2.int Ge t Ty p e;功能:取得设备类型如:串口类,网络类等.参数无.返回值:设备类型目前该函数返回值及含义包括如下几种洞步通信类型设备,串口通信类型设备网络通信类型_SYNCH S ERIAL_PORT A_NET,TCP/IP设备通信类型设备_MO DEM,M0DEM板卡类型设备并口通信类型设备a对于同步通信类型设备,板卡类型_BOARD,PARELL EL,设备,为同步工作方式.对于串口通信类型设a备,网络通信类型设备,通信类loscan MODEM型设备,并口通信类型设备,扫描程序为异步工作方式.I os c am举例一〉功能:取得设备型号.aint nD e viceType=pDev i ce GetT ype;A3int GetMod e1o参数:无返回值:设备型号.a备注:设备型号在文件中指定.a举例io d es co txt int nDeviceM ode1=pDevice—Ge tM odel;4^.CS t rin gG et Addr功能:取得设备地址.a参数:无.a返回值设备地址备注设备地址指在设备定义,对A“I/O话框中的“设备地址”编辑框中输入的内容,并不一定与物理设备地址相同总举例intnD eviceAd dr=pDevic e-Ge t Addr;54CString G etNetA ddr功能:取得网络结点的地址地址或主机名称.a参数:无.TCP/IP IP返回值网络结点的地址地址或主机名称a备注网络结点的地址在设备TCP/IP IPTCP/IP组态时指定.举例:CStr i ng c sNetAd dr=p D evi c e-GetN etAdd r;6o CStri ng GetPho n eNumber功能:取得电话号码总参数无.返回值:电话号码.备注设备的电话号码在设备组态时指定.举例二21a A CString csPho n eNumberpDe vice-GetP;ho n eNumbe r7oi nt GetPort功能取得串口设备端口号或网络设备端口a参数无返回值:如果是串口类设备,该函数返回串口的端口号.;如果是网络设备,则1,2,
3..TCP/IPA返回的是网络端口号a备注:设备的串口端口号或网络端口号在设备组态时指定aTCP/IP举例i ntnPo rt=pDevice-GetPor t;
8.int GetUpda teCycl e功能:取得数据更新周期毫秒.参数无.返回值:数据更新周期毫秒备注:数据更新A A A周期在设备组态时指定.△举例int nUp da teCycle=pDevic e—GetUpdat eCycle;%,inta功能:取得设备超时时间毫秒.a参数无GetTimeO ut返回值设备超时时间毫秒.a备注设备超时时间在设备组态时指定a举例:int n TimeOut=
④功能取得通信空闲时间毫秒.pDevi c e-GetT im eOut;lOo i ntGe tId!eTime参数无.返回值:通信空闲时间毫秒.a通信空闲时间由函数设定,初始为当通信空闲时SetldleTime0间设置为时,向0I/O设备发送的每帧数据为一次性发送,若设置了通信空闲时间大于,每帧数据按字0节一个一个发送,每个字节之间让通信信道空闲等待,等待的时间长度则为通信空闲时a间.a举例i ntnIdleTime=pDevice-GetIdleTime;功能设置通信空闲时间毫秒参数:11o voi dSetl d1eT imeunsig nedsh o rt nTimeA A通信空闲时间毫秒.返回值无备注A通信空闲时间由函数设定,初始为当通信空闲时间设置为时,向设备Setld1eTime00I/O发送的每帧数据为一次性发送,若设置了通信空闲时间大于,每帧数据按字0节一个一个发送,每个字节之间让通信信道空闲等待,等待的时间长度则为通信空闲时a间.举例〉功能:取得参数.pDevice—Setldle Time10;U
2.vo i d GetDCBDCB deb DCB参数:返回参数的结构指针.a返回值:无DCB22举例D CBdcb;pD evi c e一〉Ge tDCBd cb;a功能:设置参数.a参数:参数a返回值13o vo i dSetDC BD CBd cb DCBDC B备注:一般情况下,如果需要对系统缺省设置的参数中的个别参数需要修改时必须先通过DCB取得系统缺省设置的参数,然后修改其中的参数后,再用本函数设置回去.Ge tDCBDCB举例;aDCBdcbpDe v ice一GetDCB dc b;debo fBinar y=TRUE;^deb f0u txCts Flow=FALSE;debo fO utx DsrF1ow=FALSE;deb.fDtrControl=DTR_CONT RO L_DISAB LE;c b.fNu11=FALSE;deb ofR t sCont rol=RT S_C0N T ROL.DIS AB LE;apDe v ic e-SetDCB deb;二功能:设置向设备写入数据的结果状态.^
14.vo i d SetWri t eStatusB0OL bSuccess TRUE4总参数写成功写失败ATRUE AFAL SE:返回值无总备注:在异步方式下,向设备发送下置数据命令,并且需要设备应答以明确下置过程是否成功时,在扫描函数中必须调用本函数明确通知下置过程a是否On Par seRe s ponselos can成功,在调用本函数时同时相当于通知本次下置过程结束无论成功与否.I os can如果程序员没有正确调用本函数,在下置数据时,可能会导致无限制地循环在I sc an数据卜置过程a举例ai fbyRespon s e
[3]==0x6bb yRe s ponse
[4]==0x80〉pD ev i ce-SetWr iteSta tus;elsep D evic e——Set WriteS tatusF ALS E;功能:设置私有数据.a15o voidSetPr ivateDat aunsigned shortoffset,Ion g1P rivate Data4参数:offs et,私有数据的偏置,0〜15;1Pr ivateData,长整型私有数据,a返回值:无.4备注Ioscan自动为每个实例分配了一块由个整型数位组成的程序CD evi c e1632员私有数据空间供程序员使用程序员除了用这部分私有数据区保存数值外,也可以分配新的内存空间,然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,总正确释放新分配的内存空间23a举例Achar*pBu f=new c har[M AXCMDLEN];ApDevice一〉SetPri v at e Data3,Ion gpBuf;功能取得私有数据.16^.long GetPr ivat eDatau nsigneds hortoffs e ta参数私有数据的偏置,长整型私有数据.
④返回值:整型私有数据.a:offset,O-15;1P rivateDat a,备注自动为每个实例分配了一块由个整型数位组成的程序loscan CD e vice1632员私有数据空间供程序员使用程序员除了用这部分私有数据区保存数值外,也可以分a配新的内存空间,然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,正确释放新分配的内存空间.功能:重复扫描当前设备7vo i dRe peatScan参数:无a返回值:无a备注对于异步工作方式,在创建与设备的初始链接过程时,如果协商I/O过程需要多次请求枣应答过程,在解析数据时,执行该函数,loscan将重复扫描当前设备18o v o idS how Proc es sMe ssa geLPC ST Rs z Msg功能:按格式显示过程信息a参数格式字符串LPC STRLPC STR返回值无总备注调用本函数后,的内容将被显示在的过程显示窗口上.a举例szMsg loscanc har s zMs g
[100];A spr i nt fs zMsg,“He1lo!n;apDe vic e一〉Show Proc essMessa geszMs g;a
19.voidSh ow ProcessMes sa geco ns t CSt ring csMsg功能:按格式显示过程信息、.参数格式信息CS tringA CString返回值:无备注调用本函数后,的内容将被显示在的过程显示窗口上A csMsgI oscan
20.void功能:按S how Even t Me ss ageLPCSTRszEve nt,BOO LbNo ti fyDB=F ALSEa LPCSTR格式显示事件信息参数:szEve ntLPC STR格式字符串bNotifyDB为TRUE时报告给D B,否则不报告.返回值:无备注调用本函数后,的内容将被显示在的事件信息对话条的列表框中a如果szEvcnt loscan将该事件通知给该信息会在运行时显示在系统报警窗口上DB,View举例char szMsg
[100];!;spri ntfszMsg,Hell o一〉pD evi c eShow Even tMes sage szMsg;a21v oidShowEventMes sa ge con s tCStringa功能按格式显示事件信息、.a参数cs Event,B0OL bNoti fyDB=FALSE CStri ngc sE vent LPCSTR格式字符串bNotifyDB为TRUE时报告给DB,否则不报告2a4返回值:无义备注:调用本函数后,的内容将被显示在的过程显示窗口上如果将csM sg losean该事件通知给该信息会在运行时显示在系统报警窗口上a举例DB,View voidRe co rdEve ntM es sage LPCSTRszE vent22o int GetPacketCount功能:取得本设备内数据包的个数.参数无返回值:本设备内数据包的个数.总举例1ntn PacketC nt=0;一〉n PacketCnt=pDe vice Get Pac ketCount;功能:按索引取得数据包23o CPacket*GetPa cket unsig nedshortnlnde x参数从开始的索引号a返回值:数据包指针a举例-〉0anPacke tCnt=pD evi c e GetPacketCo unt;A for int i=0;i Get Packe ti;A....}OO
24.CMana ger*GetMan a ger功能:取得管理器指针lose an参数无返回值管理器指针.:Ioscan举例CManag er*pManager=pDevi c e-GetMana ger;功能:直接发送命令字符串,可能通过
25.intSendchar*c hCommand,int nComm and Len A串口,MODEM,网络等A参数:chCommand:命令字符串指针.nCommandLen命令字符串长度A返回值:成功:TRUE;失败:FALSE.26i ntGet ItemC ount△功能:取得设备上数据连接项的数量参数无返回值设备的所有连接项数量A备注:一般用来直接在设备上遍历连接项.
274.CItem*Get Itemint nlnd ex功能按索引得到设备上的连接项.a参数索引从开始0返回值:连接项指针.功能设置设备的协议为未公开的28o voidS etUn Pub liciz edBOO LbUnPublici zed=TRUE参数:无a返回值无备注如果设备的协议不设置为未公开的,可以在调度程序里通过“系统参数”对话框,设25A置”显示十六进制裸数据”或“显示混合裸数据”而直接显示通讯过程数据设置为不公
④开协议的设备永远不能直接显示通讯过程数据.a功能:在发送数据后设置参数为某设备专用,
29.voidSetDCBAft erSend DCBdeb DCBd cb,一般不要理会这个函数.参数:无总返回值:无AA
30.int SetA c c e pt Buffer Length int nNew Aa功能:设置接收缓冲区的大小,建议使用这个参数设置接收缓c ceptBufferL e ng t h=1024冲区为合适的值,以节省a内存开销.△参数:新的接收缓冲区大小.a返回值:新的接收缓冲区大小.功能:设置发a3Lint SetSe nd BufferLen gthint nNew Send Bu fferL e ngth=1024A送缓冲区大小.参数:新的发送缓冲区大小.图总图图a正确设置参数后,按“连接设备”按钮,如
④果成功的话「连接设备”5—25-35—4按钮的标a题变成“断开连接”,表示可以收发a数据了如果在“参数设置“中设置a”周期性发送周期”不为,则在”连接设备”后会出现“周期发送”按钮,0A否则出现手动发送”按钮.使用”周期发送“或“手动发送按钮,可以
④周期性或一次性地发送编辑框中的数据了编辑框中数据的格式缺省是a混合方式的,如果你想发送编辑框中的数据,这也是唯一的数据类型,a它的形成规则如下:任何码(除『)可以直接输AS CIIA入,可以使用T“[口”来输入;”[『内是由(空格)分隔的转意字符,它们的意义为图用来输入[;A5—二已在发送数据是表示延时毫秒a21图5-6婷#:在发送数据是表示延时10毫秒*$,在发送数据是表示延时100毫秒在发送数据是表示延时毫秒T:1000V表示它后面的数据是十进制的(缺省是16进制)*(空格)作为分隔符,任何未定义的字符都可以a作为分隔符,最好使用空格9〜8可以用来输入进制或进制数据.1016可以用来输入进制数据A〜F/a〜f:16例子对应的进制数据串为abcv[[30*#$!]34516A61H,62H,63H,76H,5BH,30H,33H,34H,35H;而且在之后有毫秒的延时a当用在其它情况(不是用来发送数据)时,唯一的差别是30H1111没有了延时的概念.”其它工具,,:校验使用混合格式的数据,计算常用的校验码,码表显示使用进制和A ASC II16进制显示的码表,各种数据转换把混合格式,位整数位浮点数等转换位十18ASCII16/32,32几种常用数据格式,除混合格式外,其它数据格式为直接用空格分隔的数据串a图5-7如何开发设备驱动程序△在力控中有一个工具包,叫做可以开发硬件
5.6I/O SDKFIOS SDK,设备与计算机的通讯接a口程序.最简单的只需要编写几个函数就可以可以做自己的驱动,I/O现在支持的硬件类型a有串口(),网络,板卡,硬件厂家提供等多种方1^485/232/422DLL式的通讯类型在该SDK中开发自己的通讯接口,不需要关心硬件和计算机通讯的细节,只需要了解通讯协议就可以了a如果通讯协议很复杂,该中提供了足够灵活的手段满足不同层次的需要•例如:a在设备SDK初始化时发什么命令或做其他处理,动态改变硬件通讯参数等等开发包简介a
56.1FI OSAF负责完成与各种设备进行数据交换.一方面,它把从设备采集到的实时过程数据I OSI/I/O A发送给数据库另一方面,从发出的下置数据也通过发送给设备a根据监控DB,DB FI OSI/O与设备之间通信机制的不同,主要支持两种工作方式:同步方式PC I/O F IOS与异步方式.异步方式适用以下一类设备这类设备一般可以独立运行,与监控计算机之间通过串I/O I/0口,网络或连接与监控计算机之间通过明确的消息传送(文本或二进制消息)完MODEM A成数据交换数据交换过程为异步方式.同步方式适用以下一类设备:这类设备或者依4I/1/O赖运行(如插在插槽PC PC内),或者独立运行.但与监控计算机之间主要通过直接访问方式进行数据交换,具体形式a包括:寄存器直接访问(如板卡),函数调用,控件访问等,数据交换过程为同步方式API A c tiveXA返回值:新的发送缓冲区大小功能:设置一32o intSet Read DataBufferLengthint nNewRe a dDa taBufferLength=128次从串口读取的字符串块大小参数:新的一次从串口读取的字符串块大小返回值:新的一次从串口读取的字符串块大小类ACmana ger类提供了对管理器对象进行操作的一组方法一个管理器对象管理一个或多个设备CMana ger对象下面是类的定义CMana gerc lass CMa nager:pu b1i cCOb ject//设置程序标题publ ic:Avirtual vo idSetT it1ec onst CStri ngc s Title=0;IOSCAN a virtual CS tringG etM o dule N a m e二0;〃取得10SCAN执行文件名称,Avirtua1CString GetAppPa th二0;〃取得当前工程应用的安装路径virt ualCString GetlnstallPat h=0;//取得I/O驱动的安装路径avirt uali ntGetDe viceCoun t〃取得设备个数=0;//按索引取得设备指针virtualC De vice*GetDevice unsigneds hort nInd ex=0;virtual v oid SetSynchBOOLbS ynch=TRUE=0;^vi rtual voidSetS1ave BOOLbS1av e=//设置为从机方式总〃设置私有数据,范围TRUE=0;Io scano ffset:0~15virtu a1voidSetPr ivat eDat aunsi gnedshortoffset,Ion gIPri vat eData=0;A//取得私有数据,offs et范围:0〜15};Ay irtual Ion gGetPr ivateDataunsi gnedshort offset=0;/设置是否进行超时处理,缺省如果不止一个设备,则进行超时处理4virtua1voidSetDoN othingWhenTimeOut BOOLbD o Nothin g=TRUE=0;a//是否需要动态分包,缺省不动态分包virtual BOOL SetDynamicAl1o catePacketBOOLbD y n amic Allocat ePacket=T RUE=0;a};下面详述类的各个函数CManage ra功能:设置程序标题参数66A
1.vo idSe tTit1ec onstCStri ngcs Title I oscan I osc程序标题a返回值无an举例pManager-Set TitlenSMAR CD600智能调节器”;2a.CStringGetMod uleName功能:取得的执行文件名称,即I os canIO ID参数无△返回值的执行文件名称,即I oscan IOID举例〉CStr ingcslo id=p Manager—GetModuleName;功能取得当前工程应用的安装路径△参数:无a返回值:当前工7o CStringGetAppPathA程应用的安装路径a备注△也就是在系统安装路径下存放该驱动程序相关系统文件的子I/O目录名称,以及在用户工程应用路径下存放该驱动程序相关配置文件的子目录名称.I/O举例:功能CStri ngc s AppPath=pMana ger—GetA ppPath;g CS tringGetl ns tallPathA取得驱动的安装路径.总参数:无I/O返回值驱动的安装路径.:I/O5o intGetDev iceC ou nt功能取得设备个数参数无返回值:取得设备个数举例;intnDevic e Cnt=0;n Dev i ceCnt=p Manag er—GetDeviceC ount功能按索引取得设备指针总参数
6.CD e vice*GetD eviceu nsignedshort nlndexA索引号从开始0返回值:设备指针.二功能:设置为从机方式参数:
7.void SetSlav e B0OLbSlave TRUE a loscanA TRUE:从机方式.主机方式.FALS E:返回值无备注:缺省为主机方式.功能设置私有数
8..voidSetPrivateData unsignedshorto ffset,long1Privat eDataa据.参数aoffs et,私有数据的偏置,0〜15;,长整型私有数据.IPrivateDat a27返回值无.备注自动为实例分配了一块由个整型数位组成的程序员私有数lose an CManager1632A据空间供程序员使用.程序员除了用这部分私有数据区保存数值外,也可以分配新的内存空间,A然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,正确释放新分配的内存空间.举例char*pBuf=new char[MAX CM D LEN];^pMa nager-Set PrivateDa ta3,1ong pBuf;总功能:取得私有数据a参数:
9.long GetPri vateDataunsignedshort offsetoffset,私有数据的偏置,0〜15;1PrivateD ata,长整型私有数据.返回值:整型私有数据备注自动为每个实例分配了一块由个整型数位组成的程序:I oscan CMnager1632员私有数据空间供程序员使用.程序员除了用这部分私有数据区保存数值外,也可以分配新的A内存空间,然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,正确释放新分配的内存空间I
0.voidSetDoNot hingWhen Time0utB0O Lb DoNo thing=T RU E功能:超时时是否进行既定的处理.A参数:TRUE不进行超时处理;FALSE进行超时处理;返回值:无备注:缺省进行超时处理功能:II.BO0LSetDynamicAllo catePacketBO0L bDynam icA11ocate Packet=T RUEa是否需要动态分包.a参数设置为动态分包.aTR UE:FALSE不动态分包返回值原来是否动态分包备注缺省不动态分包.
④扫描函数a扫描函数是程序员必须处理的部分」具体规定了扫描oapi函数的名称,参数形式及返a回类型.程序员根据具体设备及通信协议编写函数内容下面I/O是中扫描函数的声明这些函数不必全部实现,没有实现的函数不调用,也不出IOAPI DLLA错4//**********************************************************************//扫描函数定义〃**********************************************************************A e x tern”C AFX_EXT_API void OnCrea teCManager*p Manager;extern CAFX_E XT_AP Ivoid OnLoadD evice CMan ager*pManage r;ae x temC AFX_EXT_API void0nSortl temCDevic e*p Devic e,intnKey1,int nKey2;A e xtemAFX_EXT_API void0n ItemTo P acket CPacket*p Packet,CItem*pit em;exte r n CAFX_EXT_AP IvoidOnEndPacketLo adCDev ice*pDev ice;a ex ter n nC nA FX_EXT_API lo ng0nCreateDeviceLin kCDevice*p Devic e,char*szC o mman d,A intnCmdLen;A extern C”AFX EXT_API long O nCreate Packe tLinkCPack et*p Packet,ch ar*s zC ommand,intan CmdLen;28^exte rnCAFX EXT API long0nReadDataC Packet*pPa cke t,char*s zC omma nd,i ntnCmd L en;aex ter nAF X_EXT_API1ongO n Wr iteDataCItem*pltem,LPC STRs z WriteData,ch ar*as zCommand,intnCmdLen;^ex ternC”AFX_EXT_A PIlong0nl s Respons eCompleteCDevice*pDevic e,CPacket*pPac ket,cha r*s zResp ons e,int nRe spon Len,int nStart,int nLen;ae xter nnC A FX—E XT_AP IvoidOnParseR esp on seCDevice*pDe vi ce,CPac ket*pPack et,cha r*as zR espons e,intn Respo nLen;A exte rnnCnA FX_E XT_API Ion g0nT imeoutCDevice*pDevice,CPa cket*pP acket,CItem*apl tem,ch ar*sz C o mman d,i ntnCmdLe n;4extern CAFXEXTAPI void OnUn1oa dDeviceC Manager*pMa nager;A exte rnCA FX_E XT_API voidOnClose CManager*pManage r;A extemCAFX_EX T_API voidOnUnloa dPacketCPacket*pPaa当载入后,立刻调cket;M voidOnC reate CManager pMa nagerIOSCAN IO API DLLo用该函数.此时还没有活动设备列表,10SCA N所以不能在这里调用关于设备,包,连接项等的任何函数一般在这里设置调度程序的标题,设置进行动态分包,是否进行超时处理等.举例Avoid OnCrea te CManager*pMana ger{ApMan ager-Set Tit1e»SMAR CD600智能调节器”;}2AvoidOnLoadDevice CManager*p Manage rO形成设备列表后,立刻调用该函数,这时还取得数据连接项列表,更没有形成a包,所I0SCAN以不要试图遍历包或数据连接项.a举例〉voidOnL o adDe viceCManager*pManager a{Ain tnDevCnt=pM anager—GetDe viceCount;A forinti=0;i GetDevic e i;DCBdeb;ApDev i ce—GetDC Bdeb;Adcb fBinary=TRUE;deb.f OutxCtsF low=FALSE;deb of0utxDsrFl ow=FALSE;ad c b fDtr Co ntr o1=DTR_CONTROL_D ISABLE;Adcbo fNull=FALSE;dcb.fRtsContro1=RTS_C ONTROL_DISABLE;pD evice一〉SetDCB dcb;得到连接项29A3void0n Sort ItemCDevice*pD evice,intnK e yl,int nK e y2alOSCANo列表后,调用该函数,在该函数内部程序员可以给第一排序关键字,第二排序关nKeyl nK e y2键字赋值,程序返回后,将根据和对所以连接项进行排序I OSCANnKe y1nK ey2A nKey1和是连接项结构数组的索引,有效值是a实际上我们一般不需要排序,这样的话nKey2n0〜7我们可以在该函数内不写任何代码,或根本不实现该函数AVO id0n SortItemCD evi ce*使用进行排序.}pDevic e,i ntnKey1,intnKey2A{AnKey1=4;n
[4]void OnltemT oPack e tCPacket*pPa cket,C Item*p Item;al0S CAN完成所以连接项的4o排序后,随即调用该函数,将所有连接项打入包中.这个函a数同时也会遍历所有的连接项,所有可以用来对连接项设置各种标志如果没有一个连接项a被加入包中,则每个连接项形成一个包.例子avoid OnltemTo PacketCPack et*pPacket,C Item*pit ema{Mfp Packet-GetItemCoun t==0pPack et-Addlt em p Item;el se{10IT EMDEF*pPa ckHea dItemStr u=pPac ket—〉Getltem0一〉GetltemS tru;〉IOITEM DEF*p ItemS tr u=p Item—GetltemSt ru;ifpit emS tru一〉n
[0]-p PackHea dItem Stru一n
[0]128ret urn;if pItemStru-n
[0]==pPackHeadlte mStru-n
[0]一〉〉pl te mStrun[l]==pPackHead Item Stru-n[l]aplt emS tru—n
[2]==pPack He adI temStr—〉一un
[2]apl te mStru-n
[3]==p PackHeadltemStrun
[3]pPacket-Addltempl tem;A}a当所有的包形成之后,调用一次该该函}54void0nEndPacket LoadCDevice*pD evice;数.例子Avoi dOnE ndPa cketLoa dCDevic e*pDev i ce{^int nPa c ketCnt=0;二nPacket Cnt pDevice-GetPa cke tCount;for inti=0;i GetPacketi;achar*p Buf=new c har[MAXCMDLEN];30pPacket-SetPri vateD ata3,long pBuf;当一个包即将失效时调用该函数,应}A}A6voidO n Un1o adPacketCPac ket*p Packet4o该在这里释放动态分配的资源包上的或包中连接项上的.当所有设备即将失效时调用该函数,7^0voidOnUn1oadDev iceCManager*p Manager应该在这里释放动态分配的资源程序退出前调用该函数,调用它时所有设备已经失效.void0nCloseCManag er*pManager A8o
9.1o ng0nCrea teDev ice L inkCDev ice*pDe vice,c har*s zC o mmand,int nCmdLena IOS在进而周期性扫描后首先一次或多次扫描该函数,使用函数可以a重复调用C ANRepe atS can一个设备a本函数用于完成与设备建立链接,会话,初始化通信等过程,对于每个设备均I/0要扫a描本函数在异步方式下,程序根据要建立链接的设备,形成正确的链接请求命令,由将命令传送给设备,然后在扫描函数和loscana0nlsResponse Comp1ete OnP a rseRes ponse处理收到a的设备应答信息在同步方式下,在本函数中要完成全部链接的处理,并且不再扫描扫描函数和返回值无0nIsRe spon seComplet e0n ParseR e spons eAo用于异步方式的返回类型〃向设备发送命令,等待设备应答需要在COMMAND_WAIT_FOR_RESPONSE和中处理〃0nIs ResponseComplete OnPar se Resp onse aCOMMAN D_NO_RESPONSE向设备发送命令,设备没有应答或忽略设备应答发送a后即完成aN O_COMMAND_W不向设备发送命令,等待设备主动应答需a要在AIT_FO R_RESP ONSE//On IsRes p o nseC中处理omple te^d0nPar seRespo n se直接跳过当前设备,调度下一个设备.a用于同步方式的返回类型SK IP//NO_COMMAND_N〃调度完该设备后,在下一个调度周期中调度下一个0_R ESPONSE设备.直接跳过当前设备,调度下一个设备参数设备指针ASKIP//A ApDe vice,A c hComman d,在异步方式下,发送命令字符串指针.在同步方式下,该参数无效.在异步方式下,anCmdL en,发送命令字符串的长度.在同步方式下,该参数无效.10o1o ngOnCreateP acketLinkC Packet*p Packet,c har*sz Command,int nCmdLena I0对所有设备完成的调度后调度该程序,每个包将被调度一SCAN0nCr eateDev iceLin k次或多次,取决于是否调用函数Repe at Scan本函数用于完成各个数据包与设备建立链接,会话,初始化通信等过程,对于每个I/O数据包均要扫描本函数a参见0nCreateD evi ceLink.11o OnReadDataCPacke t*pPa cket,char*szComm a nd,int nCmdLen;a I0S CAN周期性调度该程序参见0nCrea teDevic eLin k.3U
12.long OnWriteDa taCItem*p Item,LPCS TRs zWr iteData,char*szCommand,int nC当有数据下置时调用该程序a参数:数据项指针,下置数据字mdLen4apltem,as zWriteData符串格式在异步方式下,发送命令字符串指针在同步方式下,该参数无效ac hCom mand,在异步方式下,发送命令字符串的长度在同步方式下,该参数无效.a当数据下置a nCmdLen,时,必须调用函数洞步方式直接在函数中调S etWriteS tatu sn WriteData用,异步方式在中调用.否则将导致无限次的写同一个连接项.O nParseResp nseh
3.long On IsR espons eCo mp let eCDevice*p Device,CPac ket*pP acket,cha r*s zResponse,i ntanR esa异步方式下当以等待应答的方式调用了ponLen,intnStart,intnLen OnCreateDevic eLink,后,如果收到异步数据,将调用OnCreateP acketLink,^OnReadDat a,OnWri teData IOSCAN该函数询问是否收到了完整的包IOAP I.DLL需要在这里判断是否形成完整的包,如果形成完整包,则代表有效数据的起IOAPLDLL nStart始偏移量,代表数据串的长度,并且应该返回返回值如果收到的设备应答nL en COMPLETE.A信息完整,正确,返回如果收到的设备应答信息不完整,返回COMPLETE;INCO MPLETEks将继续等待接收剩余信息;如果收到的设备应答信息完a整,但内容发生错误如未经过can校验返回建议不使用返回值,而是在函数中处BAD_DATA BAD_DATA OnParseRespons e理错误信息的显示.注如果返回时将置为一将导致之前的数据被截除INCOMPLETE nLen2,nStar t参数设备指针数据包指针ApD evice,apPacke t,接收到的应答信息字符串指针c hResponse,接收到的应答信息字符串的长度接收到的应答信息中正确,有效部分nRespon Len,^nS tar t,的开始位置从开始0接收到的应答信息中正确,有效部分的长度nL en,14o void OnPars eResp onse CDevice*pD evic e,CP acket*p Packet,char*szResp onse,intn ResponLen如果在时返回将调用该函数,主要用来10APIDLLOnlsResponseComp1eteCOMPLETE,设置写状态晌数据库下设数据等参数设备指针pD evi ce,数据包指针pPa cket,,接收到的完整,正确应答信息的字符串指针chResponse接收到的完整,正确应答信息字符串的长度a例子nRespo nL en,voidOnParseRespons eCDevice*p Device,CPac ket*pPac ket,char*c hResponse,int所nR esponLen A{Mo ng nR o rW=pP acket—GetP rivateDa ta0;432f nRorW==_READ一〉{aCI tem*pItem=pPacket GetItem0;//因为这里一个包中只有一个点所以处理非常简单switc hchResp onse
[2]A{Acase1://DIOpItem-SetDatalongchResp onse
[4];々b reak;case3://AIO a{Mong1data;Idata=BYT EchR es ponse
[4];Mdat a=Idat a}break;本数据包采集成功!”;CStringc sMsg;ACSM Sg.F ormat”apDevice—Sho wProcessMessage csMsg;}A}
15.longOnTi meou tCDevice*pDevice,C Packet*pPacke t,CItem*p Item,char*aszC ommand,int nCmdLen;当异步扫描发生超时时调用该函数,可以在这里设置各种标志,状态等.参数设备指针pD evice,包指针连接项指针没有意义pP acket,Apltem,as zCommand,没有意义n CmdLen,下面列举了可实现的一些基本功能底层通信功能串口通信,包括:FIO SA:1,RS232/422/485o网络通信2,TCP/IP3,MODEM通信,通过模拟在电话网上通信,寄存器访问,如:各种板卡.其它.3A MODEM4DAS5,链路控制功能用代表即上位机监控工作站;代表即下
④位机各种M Mast er,PC SSlave r,设备.对于异步方式,支持多种链路控制方式.链路控制方式支持以a下几种方式I/O FIOS:1,M请求,应答方式请求,无应答方式主动发送,S2,M S.3,S M被动等待.另外,对一次完整数据处理读或写过程,支持以下方式次请求,8次应答方式1,1次请求』次应答方式.次请求,多次应答方式次请求2,13,
1.4,0,1次应答方式.,多次请求,多次应答方式5冗余功能FIOS支持的冗余方式包括1,单监控站,双I/O冗余2,双监控站,单1/0冗余.3,双监控站,双冗余对于总线型设备如,提供总线监测功a能,可实现对冗余I/O4,RS485通信网络的保护和监测.a前端机功能与不在同一工作站上,运行在DB IO Server10Ser ver前端机上,前端机与操作站之间通过串口,网络或进行通信.a硬件测试与远程调试功能:使用TCP/IP MODEM可完成对设备的简单测试功能另外可实现FIOS I/0远程调试.故障诊断与恢复功能:提供诊断机制,在较短的采集周期内报告故障的发生,诊F IOS断出下位机故障情况.当下位机更换或恢复后,不需要对及相关程序进行任何人工干预,FIOS而在较短时间自动恢复通信当某一台,几台或部分通道发生故障,要自动优化通信链,FIOS A使其与其他下位机或通道之间的通信不受影响,保证通信效率.界面显示功能为测试,调试,运行维护方便,提供显示界面,可显示包括:发送,应答,FIOS A状态信息,启动时间,分包数,分包信息,成功通信次数发送次数,成功应答
④次,故障次数等信息历史数据处理功能:对于某些能保存历史数据的设备如无纸记录仪等,能将a采集到的FIOS历史数据恢复到数据库中DB编程方式
5.
6.2FIOS SDK提供了一种简洁的,面向对象的编程方式以缩短开发时间,降低开发难度FIOS SDKFI0S SDK提供标准的开发接口和程序模板,程序员仅需要根据设备的具体通信协议或驱动接口说明,I/O填写几个扫描函数的实现代码,进行必要的调试与测试,即可完成一种a的开发FI0S提供的开发工具封装了大部分程序员不必关心的技术环节,如:底层通信功能串a□通信,FIOS网络通信等,设备超时处理,设备故障诊断等同时提供各种调试工具,FIOS方便程序员进行系统测试开发环境完全基于位平台它使用动态链接库AFI OS32Windows技术将程序DLL员开发的代码整合到力控系统中提供给程序员的开发接口为函数和类库FIOS APIC++
5.8组件及示例程序3FIOS SDK主要由部分组成:设备组态接口,数据连接组态接口》编程接口FIOS SDK4lode vuiloitemui I oapi和描扫程序I oscan.I odev ui负责管理设备组态过程loit em ui:负责管理数据A连接组态过程」o即i负责完成与I/0设备间的数据交换,包括:对通信协议的解析,数据格式的转换等主要完成对部分的代码进行周期性地扫描.同时完成与设lose an:loapi d11I/O备的底层通信串口通信,网络通信等,以及设备超时处理,设备故障诊断等还负责I oscana与数据库之间的通信与协作•它把从设备采集到的数据经解析转换后提交给D BI/O loapiDB,或将下置给设备的数据经解析转换后写入设备是DBI/0I oap iI/O IoscanFIOS提供的一个标准软件工具.程序员仅需要开发三部分的代码.a示SDK lodevu i,I o itemu i,loapi例程序心提供了两个示例:与FIOS SDKDemoControlle rDemoM od bus.是一个初级编程示例,它能引导初学者快速掌握开发的基本概念a和方Demo Controller FIOS法是一个实用编程示例,它采用标准通信协议,通过该示例,a可以掌.DemoModb us MODBUS握在力控平台上开发标准设备驱动程序的方法的全部内容都是在安MODBUS I/0aFIOS SDK装在力控自动安装的,在力控目录下的子目录中主要包含以下几部分内Fiossdka FIOS SDK容:程序示例,仿真程序头文
④件文档说明调试工具.cExamples,Inc1u de,M anual,Uti1i ty,这个示例具有一定的代表性,它们体现了的主要功能.提供了a这个示2FIOS SDKFIOS SDK2例的全部源代码,在它们的基础上,稍做改动,就可以开发出新的我们把FIOS象这个示例源程序一样具有模板作用的程序称为模板程序为了提高开发效率,我们建2I/O议尽量使用模板程序,这在一定程度上,也减少,降低了编程错误的发生a常用术语我I/0们把中经常涉及的一些概念给出定义,有些术语虽然是通用名词,但在中有特FIO SDKOSDK定含义这些术语有一些在前文给出了解释,有一些会在后文中陆续给出解a释AFIOS Foree•,即力控驱动程序Contr olI/OServe iI/O软件开发工具包FIOSSDKFIOS力控软件系统的安装目录FC INSTDIR用力控创建的工程应用的目录唯一区别各个驱动程序的标F CAPPINSTDIR aI01DI/O I/O志设备组态接口数据连接组态接口编程接口扫描程序可alodevui AI it emui aloapi aI oscano/模板程序附带示例的源程序0FIOSX SDK配置文件设备组态时的缺省参数设置保存文件I/0连接项结构保存数据连接信息的数据结构描述文件定义设备的类别,厂商,I0I TEMDEFal/o型号,通信方式等参数的文本文件lode sctxt程序员在本文档范围内专指用进行开发的技术人员扫描函数包含在中的FIO SSDK Aloa pi API函数,它们由扫描程序周期扫描扫描函数完成对设备数据解析及格式转换(输入输出类库)的缩写设备aI0C Inp utOutput Class5464o组态接口砧/描述文件IO DEVUI.DLL0在使用力控进行组态时,一般均涉及定义设备的过程在定义设备时,要选择设a备的类别I/O(智能仪表等),厂商,设备型号或通信协议,然后根据设备通信方式(串PLC,□方式,网络方式,其它方式等)设置参数以上关于一种设备的信息(类别,厂商,型号,通信方式等)完全是由描述文件决定的描述文件是一个标准文本文件,根据其规a定的填I/
0.1/0写格式,由程序员根据具体设备自行填写.下面介绍描述文件的填写格式.I/0描述文件的文件名为安装目录为文I/010DESC.TXT,^FCINSTDIRMO Se r vers\IOIDV\al件说明格式为类别;厂商或程序描述;执行文件名称105A子类型1;类型号;资源标志;提供设备地址△子类型2;类型号;资源标志;提供设备地址a注意,子类型号不能重复表示回车换行.最上面一行是驱动程序的总体描述,包括三项各项之间必须以分号“;“分隔各项内容不能含有分号”广a各项含义如下:类别,驱动程序所属类别,现分为以下几类:智能仪表,智能模PLC,块,变频器.程序员也可以自行扩展,厂商或程序描述设备生产厂商名称,协议名称,如10,1/0西门子执行文件名称,驱动程序(运行程序)的名称,如接下来几行为驱动I/O pto_d rv.exe程序所包含的设备类型的描述,如西门子包括等,每一子类别一a行,每行包括三项,各S5,S7项之间必须以分号”「分隔.各项内容不能含有分号“;”.各项含义a如下:子类型,设备类型描述如,类型号,设备类型编号,类型号不能重复合法的S5值为等.使用计算机资源,使用计算机何种通信资源通信,合法的值为等0,1,2,30,1,2A含义如下同步通信方式;,串口通信方式;网络通信方式;通信方式;:0,12,TCP/IP3,MODEMA4,板卡方式;并口通信方式提供设备地址表示需要指定设备地址,否则表示不需要设备地5,1址管理程序会自动将相同厂商或程序描述相同的驱动程序归为同一树下.a开发10lode vui力控组态环境中的设备管理功能提供了一个根据描述文件可灵活配置的标准设DRAW I/OA备组态接口.这个组态接口提供了一些对常用设备参数进行设置的方法如设备名称,设备地址,通信端口,端口参数等如下图所示对于很多设备,如果标准设备组态接口能够满足要4求,就不再需要自己编写接lodevui□程序了比如示例采用的就是标准设备组态接口.而示例DemoC ontr oilerDemoM od bus因为涉及一些特殊的参数设置,就需要自己编写接口程序了a因此,接口程序lodevu ilodevui实际上就是对标准设备组态接口的一个补充和扩展,并可由程a序员灵活控制要以I devu i形式提供.该必须是扩展该的缺
④省文件名称为DLL DLL MFC DLLD LLIODEVU I o DLL,该文件必须安装在目录在进行设备组态时,力控的FCINSTD IR\IOServersMOID VT.41/O设备管理程序会自动检查在目录吓是否存在FCINSTDIRVO^ServersI0I DVIODEVUI DLL文件如果存在,则首先根据描述文件的格式,
④调出标准设备组态接口界面,当用户确认I/O后,再调出组态接口界面;若不存在该文件,则只调出标准设备组态接口界面a示lodevui A例的接口程序可以做为开发的模板程序.我们结合示D emoModbusI od evuiIo devu i例的模板程序具体解释实现过程查看头文件可以发现,aDemoModbus lodevu iIode vui h主要实现个输出函数lodevui dl13adextern CAFX_EXT_API1ong AddIo Devcons t char*szDev iceName,intnType;extern CAFX_E XT_AP IIongModloD evcon stchar*sz Devic eName;aex ternCAFX_EXT_APIlongDel Io Devconstchar*s zDevic eName;在进行设备组态时,当增加一个设备时,力控设备管理程序会自动调用函AddloDev数;当修改一个已创建设备时会调用函数;当删除一个设备时会调用ModloDev De HoDev0函数其中,参数为设备名称输入值,组态时由用户指定.为设备子类szDevic eName I/nT ypeA型号,由程序员在描述文件中指定.返回值为表示操作成功;其它表示操作失败.为了较好I/O0地实现程序结构化,本模板程序提供了一个类对设备及组态操作过程进行管理CDevMan Io的个输出函数的具体实现过程是在devui.d113Addlo Dev,ModIoDev DelloDevA CDevMa的三个成员函数和中实现的.nAdd,Mod De1首先看一下的实现代码Add〃**********************************************************************//添加设备I/O设备名称输入值//s zDeviceNam e,设备子类型用于一个驱动程序驱动多种类型设备输入值//nTyp e,//返回值说明操作成功;其它,操作失败/****************************:0,******************************************Mono CDevMan**Add cons tchar*szDev iceN a me,intn Type“该数据源名经存在!;{Aif FindszDeviceN ameA{A AfxMess ageBoxNe turn—1;a}aCD evice*p Dev=n ewCDeviceszDevi ceName,nTyp e;ifCall Di alo gpDev」a{am is tAdd Ta ilpDev;aStor e;r eturn0;el sede1ete pDev;;return—1程序的一开始,调用函数来查找是否已有相同的设备名存在,如果有给出提示并a返回}A Find一表示操作失败,否则生成一个对象并调用函数来显示一个对话框,a1CDev iceCallDi a log让用户做进一步的选择,如果用户进行确认,操作成功,它把此对象加入设备链表CDevice中,并调用函数来保存设备信息另外两个函数和它类似.StoreStore函数如下avoid CDevMan:Sto re{ACF ilef ile;a7Mf fi le.Op enconst ch ar*ddeacc.dat,CFil e::mod eRe adWr ite|CFile:modeCreate A{ACArch ivearfile,CA rchive::s tore;Serial i zear;A ar Clo se;fil e.Clo se;A}A该函数它先打开文件,如果不存在,就建立此文件然后调用序列化函数对它进行ddeacc.dat保存,最后关闭此文件再看一看序列化函数av oid CDevMan::S erializeCA rch ive ar{ATRY」CObj ect::Serializ ear;amis t.S eria1izear;}aCAT CHCFileExc eption,e{文件版本不匹配!”;A fx MessageBo x AEND_CATCH}a该函数对由类实例组成进行序列化,在调用各个类实例的a序m_list CDeviceCDevice列化函数时,如果是读取操作,会依次创建实例,并调用的序列化函数,a随CDe vice CDevice后把实例加入链表具体保存和读取的变量数据在类中控制,也aCDev ice1ist CDevice就是说程序员针对不同的设备可以改写类,定义不同的成员变量,记录设备的不同CDevice的属性,对类重载即可实现设备的保存,加载,增加,删除和修改等功能CDevic eSerializea我们再看一下类序列化的实现过程CDev ic evoid CDevice::Ser ia lizeCAr chivear{a if arIs Stor inga{//设备名称ar«m_c sName;arm_csName;^ar»m_dwData;a}如果是保存操作,序列化函数会将参数自动存盘;如果是读取操作,序列化函数会从磁盘上读取参数值.a8察看函数可以发现,它生成了一个对话框,让用户做相应的选择,然后把用
④户选Ca HDia1og择的信息保存在类的成员函数中,以便于储存△整个程序框架使用类来保CDevice CDevice存设备的信息,在函数中使用一个对话框,Cal1Dia1g来让用户进行选择设备的属性,并且在函数中把它保存在类中,所以对C allDialogCDeviceA于一个新的设备,程序员所要做的工作就是,分析设备的协议查看是否仅使用描述文件就可a以完成设备的定义,如果不能,那么应该编制这时应分析应该增加哪一些属I oDevUidllo性,定义哪一些类的成员变量,以及显示什么样的对话框,让用户做什么样的选择.所CDevice以程序员的工作重点在于修改类,增加成选变量,并重载它的函数,如后修CDe vice Serialize改对话框,让用户做不同的选择,并把选择保存在类的成员变量中即可.a在该示例中,CDevice我们定义了个设备参数2//设备的名称//用于保存数据这样只需在CSt ringm_csName;aDWO RD m_d wData;对话框中对m_csName和m_dwData赋值即可4〃***********************************************************////调用对话框定义数据源/数据源指针pDev//返回值成功△〃**************************************************true*********〃bo o1CDevMa nCall Dia1og CDevice*pDev A{AASSERTpDe v;CDevDefdlg;dlg.m_n ame=pDe v-m_csN ame;^dlg.m_nProtocol=pDev—m_d wData一〉0x01;Adlg.m_i nPackLong=p Devm_dwD ata8Oxff;if IDOK==dlg.Do Modal{ApDev-m_csName=dlgo m_nam e;apDe v一〉m_d wData=dl g om—nProtocolOx01;的第位为表示是方式表示方式V/m_dwDa ta01RTU0ASCI IpDev-m_dwDa ta=pD ev-m_d wData|dlg.m_inPackLo ngcsPat h+=\\ddeacc dat”;〃数据保存在了工程目录的中ddeac cdat ADWORD data;oC Stringstrtemp;9A shortte mp;//打CFile fi1e;fi1e Openconst char*csP ath,CFile::mod eRead开该文件A{AC Archivearfile,C Archive:load;〃读取的第一个数据是定义的设备的个数,//但是因为可以通过函数得到设备的个数,/所以这里把读到的数据简单的GetDeviceC ount4/丢掉ar»temp;二intn DevCntpManager-GetDe viceCou nt;forinti=0;i GetDevicei;a ar〉〉strtemp;〃读取设备的名字aar〉data;//读取数据//这两句在讲到时再进行介绍A loapid11pDevi ce-SetPrivateData1,1ongdat a1;apDe vice-S etPrivateData2,1o ngdata80x ff;ADCB deb;p Device-GetDCBdcb;dc b.f Bina ry=TRU E;adc bfOutxC tsFlo w=F ALS E;odcbo fOutxDsrFlow=FAL SE;cb.fDtrCo ntro1=DTR_CONTROL_DISA BLE;adcbfN u11=F ALSE;;dcb.fRt sCont ro1=RTS.CONTRO L_DISA BLE;apDe vice-SetDCBdcb;a}ar.Clos efile.CloseQ;〃关闭文件}Ae1se A{对不起,没有找到”;strtemp=strtemp+=csPa th;+=程序不能运行!!!strtem pAfxMes sageBoxstrtemp;Po st QuitMessage0;//没有找到文件,给出提示,并终止程序的运行注意序列化的内容和顺序必须和一致,否则会导致程序运行时产生错误}“A ioDevUi.dll A5O
6.5介绍及编程示例loitem ui在用力控进行组态时,把数据库中的点参数与某种设备的具体通道建立连接的过DB程被为数据连接过程在进行数据连接时,一般还要指定数据转换格式,数据长度等参数10a数据连接过程对于不同的设备,其形式和内容可能完全不同因此必须针对不同的aI/O I/设备,设计相应的数据连接形式,保存各种参数信息接口主要完成的两部分功能,一是为用户进行数据连接组态时提供一个界面;另外就Io it emui是将用户组态的设备参数信息用某种格式保存起来,以便在开发编程接口时使a用.我们loapi定义了一个数据结构来保存设备参数信息,这就是数据连接项结构下面简称连接项结构IOITEMDEF.定义在中阳IOIT EMDE Floi temu ih yp edef structIo Item DefStru chars tr
[64];Iongn
[8];A}IO ITEMDEF;这个结构是一个通用结构,由程序员自己赋值,自己解释要以形式提a供该.loitemui DLL必须是扩展该的缺省文件名称为该文件必须安装在DLL MFCDLL DLLIOITEMU I.DLL,A目录下的工作过程如下:a在进行数据连接组态时,FCINSTDIRIO Servers\IOID\Moi temui力控的管理程序会自动检查在目录D BMANFCINSTDIRIO吓是否存在文件,如果存在,则调出数据连接组态接口界面S erversI01DV IOITEMUIDLL下面介绍如何编写接口程序.loitemui主要实现个输出函数loitemui.d111externCAFX_EXT_AP Ilong DoItemD1g constchar*sz DeviceName,intnType,IOITEMD EF item,char*sz D es c,intnF1ag;其参数说明如下:设备名称输入值如果在力控中定义了一个设备aszDevi ceName,Devic,那么在给e1该设备组点时,传给的值就是字符串“设备子类Dol temDlg szD eviceName Devicel”.nType,型用于一个驱动程序驱动多种类型设备输入值它的值在中指定参见上一IODESC.TXT章对描述文件的介绍数据连接项结构返回值需要注意的是,除了是输出I/O Mtem,item值外,也是输入值,管理程序每次调用时,将上一次操作赋给的值传递过来.DBMAN DoItemD1gitem-zDe数据连接项描述,用于程序显示的提示信息.表示增加数据连接项表示sc,DBMAN anFlag,1,2修改,表示删除输入值其返回值表示操作成功.其它,操作失败A的工作过程如下a当用户打开数据组点连接对话框时,选中了一个点,并按下I oitemuiodl1增加,修改或删除键,这时就会调用的函数程序员应该在此函数中,弹出一个对话框让用户I oitemui.d11DoItemD1g进行选择,在用户按下了键之后,把用户的选择保存在中,以后编制时a可以0K itemloapid11利用这些信息.a编程示例a我们先结合示例介绍如何开发DemoCon tro11erIoitemu i.仿真器的内部有数字区和模拟区和区通道范围为:SimC onoiler DIO AIO.DIO AIO〜255每个通道的数据的数值范围为或每个通道数据的数值范围为a所DIO:01A100〜4095以我们应该在函数中弹出一个对话框,用户可以在此对话框中选择输入通道DoItemDl g和内存地址.输入通道有两个选项通道和通道供用户选择,内存地址可以让用户总输入DIOAIO之间的数据我们介绍一下如果不使用模板,如何自己生成一个新的0〜255Alia I/O loitemui工程a在环境下,选择菜单命令选择新建工程,工程名为选择VC++new,I oitemui,M FC选项,在下一步类型中选择型,然后按下Appwizard dll”DLLMFC Extensi onDLL”“Finish”键即可创建一个新的工程I oitemui打开文件,在文件的开头加入把拷入本工loi temui.c pp#incl udeIoitemuio h”,loitemui.h程,然后在文件的最后键入long DoltemDlg co nstchar*strDataSo ur,intnType,10ITEMDEFitem,char*szDesc,intnF1ag a{}a这就加入了的输出函数.dll打开示例的模板程序,它的函数实现过程如下DemoCon tro1ler Ioite muiDoItemDlg1ong DoItemDlgconstchar*szDevic eName,int nType,10IT EMDEFi tem,char*szDesc,intnF1aga{C LinkD1g dig;^dlgo item_n
[0]=item.n
[0];Adlg item_n[l]=item.n
[1];AS witch nFlagoA{Acas e0://删除操作A return0;a//增加或修改操作ca se1:case2:if dl goDoM oda1==IDOK A{Mt emn
[0]=dlgo item_n
[0];Mtem n[l]=dlgoitem_n
[1];sp rist fszDesc,%s”,LPC STRdlgm_desc;Asp rintf itemstLoPCSTRdlg.m_de sc;aretu rn0;a}b reak;}re turn1;a}在这个模板程序里,还涉及一个对话框类.这个对话框为用户进行数据连接a组态时CLinkD1g提供一个界面,其形式如下U2类有个成员变量CLinkDlg2。
个人认证
优秀文档
获得点赞 0