DCS数据采集技术_第1页
DCS数据采集技术_第2页
DCS数据采集技术_第3页
DCS数据采集技术_第4页
DCS数据采集技术_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章DCS数据采集技术10页1.6万字目前各种I/O设备提供的对外数据接口可分为以下几类:数字通讯接II,包括串II类,以太网(TCP/IP协议)类,现场总线类,仪器总线类通讯接口(如GPIB等).模拟量通道输出,设备直接提供4-20niA,l-5V或继电器接点信号等.力控具有世界上人部分主流设备的I/O接II程序,对GPIB总线以及Honeywell,Yokogawa,Foxboro,Fisher-Rosemount等厂家的DCS也能够支持.除通常意义上的数据采集外,力控可以利用采集到的实时数据对装置进行实时建模,插入力控自己的先进控制控件,实施先进控制.5.1对一个设备上的数据定义不同的

2、釆集周期如果一台设备上有1000个实时数据需要采集,而在这1000个数据中只有10个是经常刷新且需要密切监视的,其余990个全部是辅助数据,但是也需要时常查看.如果把这1000个数据同等地对待,采用统一的扫描周期进行采集,就会严重影响10个重要数据的刷新速度怎样既保证1000个数据都能够采集,又确保这10个重要数据的采集速度呢有两种办法:办法1:为一个设备定义两个逻辑设备,使其具有不同的采集周期,如图5-1所示.但是这种方法定义的最长扫描周期为10分钟.办法2:不用上面的办法,一台设备只定义一个设备名称也可以达到要求.因为力控的I/O驱动对画面中不显示而且没有组态历史趋势和报警的数据是不采集的

3、,仅当画面中显示这个数据时才进行采集.因此将不常用的数据单独组态在一个或几个画面中,使用完毕马上关闭就不会影响整个采集速度这种方法适用于存在有大量不需要快速更新的数据的情况.图5-15.2合理设置扫描周期,避免引起设备死机有些I/O设备内部只有一个CPU,同时负责数据通讯和计算,如果在力控上设置的数据打描周期太快容易使设备死机,因此在设置这一参数时应该慎重,最好通过多次试验确定一个合适的扫描周期一般的串I设备的扫描周期可设在10J00亳秒之间.5.3通过拨号方式与DO设备通讯力控的所有串丨IbO驱动程序都支持通过MODEM以拨号方式与设备通讯.只要正确设置电话号码即可,如图5-2所示.15.4

4、通讯状态监视,设备状态数据的读取力控为每一个O设备自动定义了一个系统变量,假如系统中有一个设备PLC1,则每当PLC1不能与力控正常通讯时,系统变量SIOPLC1的值就会被置为1.IO设备故障属于系统报警.计算机通讯II故障,电缆,PLC端通讯II的故障,PLC通讯II与计算机通讯II的参数设置不一致都会造成这种结果.还有一种可能,就是数据连接项错误,如果计算机的命令发给PLC的只读参数,PLC是不会予以理睬的.5.5怎样用LO驱动程序调试IO设备力控的I/O驱动程序有数百个,针对每一种设备都有一个独立的程序.当力控实时数据库DB没有启动时,单独启动LO驱动可以作为本地I/O设备调试工具使用.

5、此时可以测试计算机与IO设备的通讯情况,摸索最佳的扫描周期.菜单”设置S/参数”用来规定I/O通讯过程中是否显示计算机发出和设备响应的通讯信息.如图5-3所示.菜单”工具T/工具”用来在不启动实时数据库及其数据连接项的情况卞执行与I/O设备的通讯弹出对话框如图5-5上部所示.此时可以按”参数设置”按钮设置通讯参数,如图5-6和5-7所示,主要是设置串【啲DCB参数,IP地址等.图5-2图5-3图5-4正确设置参数后,按”连接设备”按钮,如果成功的话,“连接设备”按钮的标题变成”断开连接”,表示可以收发数据了.如果在“参数设置”中设置”周期性发送周期”不为0,则在”连接设备”后会出现”周期发送”

6、按钮,否则出现”手动发送”按钮使用”周期发送”或吁动发送“按钮,可以周期性或一次性地发送编辑框中的数据了.编辑框中数据的格式缺省是混合方式的,如果你想发送编辑框中的数据,这也是唯一的数据类型,它的形成规则如下:任何ASCII码(除T)可以直接输入工可以使用”来输入;”内是由(空格)分隔的转意字符,它们的意义为:图5-5T:用来输入T;2嗦:在发送数据是表示延时1亳秒图5-6#:在发送数据是表示延时10亳秒S*:在发送数据是表示延时100亳秒T:在发送数据是表示延时1000亳秒V:表示它后面的数据是十进制的(缺省是16进制)气空格):作为分隔符,任何未定义的字符都可以作为分隔符,最好使用空格.0

7、9:可以用来输入10进制或16进制数据.AF/af:可以用来输入16进制数据.例子:abcv30*#$!345对应的16进制数据串为:61H.62H,63H,76H.5BH,30H,33H.34H,35H;而且在30H之后有1111亳秒的延时.当用在其它情况(不是用来发送数据)时,唯一的差别是没有了延时的概念.”其它工具“:校验使用混合格式的数据,计算常用的校验码,ASCII码表显示使用16进制和10进制显示的ASCII码表,各种数据转换把混合格式,16/32位整数,32位浮点数等转换位十几种常用数据格式,除混合格式外,其它数据格式为直接用空格分隔的数据串图5-75.6如何开发I/O设备驱动程

8、序在力控中有一个SDKT具包,叫做FIOSSDK;口J以开发硬件设备与计算机的通讯接II程序.最简单的只需要编写几个函数就可以可以做自己的I/O驱动,现在支持的硬件类型有串丨l(RS485/232/422),网络,板卡,硬件厂家提供DLL等多种方式的通讯类型.在该SDK中开发自己的通讯接II,不需要关心硬件和计算机通讯的细节,只需要了解通讯协议就可以了.如果通讯协议很复杂,该SDK中提供了足够灵活的手段满足不同层次的需要.例如:在设备初始化时发什么命令或做其他处理,动态改变硬件通讯参数等等.FIOS开发包简介FIOS负贵完成与各种VO设备进行数据交换.一方面,它把从EO设备采集到的实时过程数据

9、发送给数据库DE,另一方面,从DB发出的下置数据也通过FIOS发送给LO设备.根据监控PC与I/O设备之间通信机制的不同,FIOS主要支持两种工作方式:同步方式与异步方式.异步方式适用以卞一类I/O设备:这类EO设备一般可以独立运行,与监控计算机之间通过串II,网络或MODEM连接.与监控计算机之间通过明确的消息传送(文本或二进制消息)完成数据交换数据交换过程为异步方式.同步方式适用以卞一类I/O设备:这类EO设备或者依赖PC运行(如:插在PC插槽内),或者独立运行.但与监控计算机之间主要通过直接访问方式进行数据交换,具体形式包括:寄存器直接访问(如:板卡),API函数调用ActiveX控件访

10、问等.数据交换过程为同步方式.下面列举了FIOS可实现的一些基本功能:底层通信功能:1),串II通信,包括:RS232/422/485.2),TCP.IP网络通信.3),MODEM3通信,通过模拟MODEM在电话网上通信.4),寄存器访问,如:各种DAS板卡.5),其它.链路控制功能:用M代表Master,即上位机(监控PC工作站);S代表Slaver,即下位机(各种VO设备).对于异步方式,FIOS支持多种链路控制方式.链路控制方式支持以下几种方式:1),M请求,S应答方式.2),M请求,S无应答方式.3),S主动发送,M被动等待.另外,对一次完整数据处理(读或写)过程,支持以下方式:1),

11、1次请求,0次应答方式.2),1次请求,1次应答方式.3),1次请求,多次应答方式.4),0次请求,1次应答方式.5),多次请求,多次应答方式.冗余功能:FIOS支持的冗余方式包括:1),单监控站,双VO冗余.2),双监控站,单IO冗余.3),双监控站,双LO冗余.4),对于总线型设备(如RS485),提供总线监测功能,可实现对冗余通信网络的保护和监测.前端机功能:DE与IOServer不在同一工作站上,IOServer运行在前端机上,前端机与操作站之间通过串II,TCP/IP网络或MODEM进行通信.硬件测试与远程调试功能:使用FIOS可完成对I/O设备的简单测试功能.另外可实现远程调试.故

12、障诊断与恢复功能:FIOS提供诊断机制,在较短的采集周期内报告故障的发生,诊断出下位机故障情况.当卞位机更换或恢复后,不需要对FIOS及相关程序进行任何人工干预,而在较短时间自动恢复通信.当某一台,几台或部分通道发生故障,FIOS要自动优化通信链,使其与其他下位机或通道之间的通信不受影响,保证通信效率.界面显示功能:为测试,调试,运行维护方便,FIOS提供显示界面,可显示包扌舌:发送,应答,状态信息,启动时河,分包数,分包信息,成功通信次数(发送次数,成功应答次),故障次数等信息.历史数据处理功能:对于某些能保存历史数据的设备(如:无纸记录仪等),FIOS能将采集到的历史数据恢复到数据库DB中

13、.FIOSSDK编程方式FIOSSDK提供了一种简洁的,面向对象的编程方式以缩短开发时间,降低开发难度.FIOSSDK提供标准的开发接II和程序模板,程序员仅需要根据I/O设备的具体通信协议或驱动接II说明,填写几个扫描函数的实现代码,进行必要的调试与测试,即可完成一种FIOS的开发.FIOS提供的开发工具封装了人部分程序员不必关心的技术环节,如:底层通信功能(串II通信,网络通信等),设备超时处理,设备故障诊断等.同时FIOS提供各种调试工具,方便程序员进行系统测试.FIOS开发坏境完全基于32位Windows平台.它使用动态链接库(DLL)技术将程序员开发的代码整合到力控系统中.FIOS提

14、供给程序员的开发接II为API函数和C卄类库.FIOSSDK组件及示例程序FIOSSDK主要由4部分组成:设备组态接Il(Iodevm),数据连接组态接Il(Ioitemui),编程接IIIoapi和描扫程序IoscanJodevm:负贵管理设备组态过程.Ioitemur负责管理数据连接组态过程.Ioapi:负贵完成与LO设备间的数据交换,包括:对通信协议的解析,数据格式的转换等.Ioscan:主要完成对Ioapi部分的dll代码进行周期性地扫描.同时完成与I/O设备的底层通信(串丨I通信,网络通信等),以及设备超时处理,设备故障诊断等.Ioscan还负贵与数据库DB之间的通信与协作.它把从I

15、/O设备采集到的数据经Ioapi解析转换后提交给DE,或将DB下置给I/O设备的数据经Ioapi解析转换后写入I/O设备.Ioscaii是FIOSSDK提供的一个标准软件工具.程序员仅需要开发IodeuiJoitennii,Ioapi三部分的代码.示例程序4FIOSSDK提供了两个示例:DemoControllerDemoModbus.DemoConU-oller是一个初级编程示例,它能引导初学者快速掌握开发FIOS的基本概念和方法.DemoModbus是一个实用编程示例,它釆用标准MODBUS通信协议,通过该示例,可以掌握在力控平台上开发标准MODBUS设备I/O驱动程序的方法.FIOSSD

16、K的全部内容都是在安装在力控自动安装的,在力控目录卞的子目录Fiossdk中.FIOSSDK主要包含以下几部分内容:Examples,程序示例,仿真程序.Include,头文件.Manual,文档说叽Utility,调试工具.这2个示例具有一定的代表性,它们体现了FIOSSDK的主要功能.FIOSSDK提供了这2个示例的全部源代码,在它们的基础上,稍做改动,就可以开发出新的FIOS.我们把象这2个示例源程序一样具有模板作用的程序称为LO模板程序.为了提高开发效率,我们建议尽量使用LO模板程序,这在一定程度上,也减少,降低了编程错误的发生.常用术语我们把FIOSDK中经常涉及的一些概念给出定义,

17、有些术语虽然是通用名词,但在FIOSDK中有特定含义.这些术语有一些在前文给出了解释,有一些会在后文中陆续给出解释.FIOSForceContiolI/OSeiver,即力控I/O驱动程序FIOSSDKFIOS软件开发工具包FCINSTDIR力控软件系统的安装目录FCAPPINSTDIR用力控创建的工程应用的目录IOLD唯一区别各个PO驱动程序的I/O标志Iodevm设备组态接口Ioitemui数据连接组态接IIIoapi编程接口Ioscan扫描程序IO模板程序FIOS工SDK附带示例的源程序IO配置文件设备组态时的缺省参数设置保存文件连接项结构保存数据连接信息的数据结构IOITEMDEFIO

18、描述文件定义设备的类别,厂商,型号,通信方式等参数的文本文件Iodesc.txt程序员在本文档范围内专指用FIOSSDK进行开发的技术人员打描函数包含在Ioapi中的API函数,它们由打描程序周期打描.打描函数完成对设备数据解析及格式转换IOCInputOutputClass(输入输出类库)的缩写.设备组态接IIIODEVUI.DLLLO描述文件在使用力控进行组态时,一般均涉及定义O设备的过程.在定义设备时,要选择设备的类别(PLC,智能仪表等),厂商,设备型号或通信协议,然后根据设备通信方式(串I方式网络方式,其它方式等)设置参数以上关于一种设备的信息(类别,厂商,型号,通信方式等)完全是由

19、IO描述文件决定的.1/0描述文件是一个标准文本文件,根据其规定的填写格式,由程序员根据具体设备自行填写.下面介绍I/O描述文件的填写格式.IO描述文件的文件名为IODESC.TXT,安装目录为:FCINSTDIRJOSeiversIOIDH.IO文件说明格式为:类别;厂商或IO程序描述;执行文件名称5子类型1;类型号;资源标志;提供设备地址子类型2;类型号;资源标志;提供设备地址注意,子类型号不能重复.表示回车换行最上面一行是驱动程序的总体描述,包括三项.各项之间必须以分号“;“分隔.各项内容不能含有分号”;各项含义如下:类别,驱动程序所属类别,现分为以下几类:PLC,智能仪表,智能模块,变

20、频器程序员也可以自行扩展厂商或IO程序描述,DO设备生产厂商名称,协议名称,如西门子.执行文件名称,1/0驱动程序(运行程序)的名称,如opto_div.exe接下来几行为驱动程序所包含的设备类型的描述,如西门子包括S5,S7等,每一子类别一行,每行包括三项,各项之间必须以分号“;”分隔.各项内容不能含有分号“;“.各项含义如下:子类型,设备类型描述如S5.类型号,设备类型编号,类型号不能重复.合法的值为0丄2,3等.使用计算机资源,使用计算机何种通信资源通信,合法的值为0,1,2等.含义如下:0,同步通信方式;1,串II通信方式;2,TCP.IP网络通信方式;3,MODEM通信方式;4,板卡

21、方式;5,并II通信方式.提供设备地址:1表示需要指定设备地址,否则表示不需要设备地址.管理程序会自动将相同厂商或IO程序描述相同的驱动程序归为同一树卞.开发Iodevui力控组态环境DRAW中的设备管理功能提供了一个根据IO描述文件可灵活配置的标准设备组态接II.这个组态接II提供了一些对常用设备参数进行设置的方法.如:设备名称,设备地址,通信端口,端口参数等.如下图所示:对于很多设备,如果标准设备组态接II能够满足要求,就不再需要自己编写Iodevui接II程序了.比如示例DemoController采用的就是标准设备组态接II.而示例DemoModbus因为涉及一些特殊的参数设置,就需要

22、自己编写Iodevui接门程序了.因此,Iodevm接II程序实际上就是对标准设备组态接II的一个补充和扩展,并可由程序员灵活控制.Iodevui要以DLL形式提供.该DLL必须是MFC扩展DLL.该DLL的缺省文件名称为IODEVUI.DLL,该文件必须安装在目录FCINSTDIRIOServersIOID”F.在进行设备组态时,力控的I/O设备管理程序会自动检查在目FCINSTDIRIOSeiversIOEDF是否存在IODEVUI.DLL文件.如果存在,则首先根据I/O描述文件的格式,调出标准设备组态接II界面,当用户确认后,再调出Iodevm组态接II界面;若不存在该文件,则只调出标准

23、设备组态接匸I界面.示例DemoModbus的Iodevui接II程序可以做为开发Iodevui的模板程序.我们结合示例DemoModbus的Iodevui模板程序具体解释实现过程.查看头文件Iodevui.h可以发现,Iodevm.dll主要实现3个输出函数:6externCAFX_EXT_APIlongAddIoDev(constchai*szDeviceName,intnTvpe);externCAFX_EXT_APIlongModIoDev(constchar*szDeviceName);externCAFX_EXT_APIlongDelloDev(constchai*szDevice

24、Name);在进行设备组态时,当增加一个设备时,力控设备管理程序会自动调用AddIoDev()函数;当修改一个已创建设备时会调用ModIoDev()函数;当删除一个设备时会调用DelloDev()函数.其中,参数szDeviceName为I/O设备名称(输入值,组态时由用户指定J.nType为设备子类型号,由程序员在IO描述文件中指定.返回值为0表示操作成功;其它表示操作失败为了较好地实现程序结构化,本模板程序提供了一个CDevMan类对设备及组态操作过程进行管理.Iodevui.dll的3个输出函数AddIoDev(),ModIoDev()DelIoDev()的具体实现过程是在CDevMan

25、的三个成员函数Add(),Mod()和Del()中实现的.首先看一下Add()的实现代码:*/添加I/O设备/szDeviceName,设备名称(输入值)/“Type,设备子类型(用于一个驱动程序驱动多种类型设备)(输入值)/返回值说明O操作成功;其它,操作失败longCDevMan:Add(constchar*szDeviceName,iiitnType)if(Fiiid(szDeviceName)AfxMessageBox(ni数据源名已经存在!J;return-1;CDevice*pDev=newCDevice(szDeviceNaine4iTvpe);if(CallDialog(pDe

26、v)m_list.AddTail(pDev);StoreQ;return0;elsedeletepDev;return-1;程序的一开始,调用Fmd()函数来查找是否已有相同的设备名存在,如果有给出提示并返回-1表示操作失败,否则生成一个CDevice对象并调用CallDialog函数来显示一个对话框,让用户做进一步的选择,如呆用户进行确认,操作成功,它把此CDevice对象加入设备链表中,并调用Store函数来保存设备信息.另外两个函数和它类似.Stoie。函数如下:voidCDevMaii:Store()CFilefile;7if(file.Open(coustchaiXddeacc.da

27、fjCFilemodeReadWnteCFile:modeCreate)CArchivea】(&file,CArchive:store);Senalize(ai);ar.Close();file.CloseQ;该函数它先打开ddeacc.dat文件,如果不存在,就建立此文件.然后调用序列化函数对它进行保存,最后关闭此文件再看一看序列化函数:voidCDevMaii:Serialize(CAichive&ai)TRYCObject:Serialize(ai);m_list.Seiialize(ar);CATCH(CFileException.e)AfxMessageBox(H件版本不匹配!J;E

28、NDCATCH该函数对m_Ust(由CDevice类实例组成)进行序列化.在调用各个CDevice类实例的序列化函数时,如果是读取操作,会依次创建CDevice实例,并调用CDevice的序列化函数,随后把CDevice实例加入mjist链表.具体保存和读取的变量数据在CDevice类中控制,也就是说程序员针对不同的设备可以改写CDevice类,定义不同的成员变量,记录设备的不同的属性,对CDevice类重载Serialize即可实现设备的保存,加载,增加,删除和修改等功能.我们再看一下CDevice类序列化的实现过程:voidCDevice:Serialize(CAicluve&ar)if(

29、ar.IsStormgQ)arm_csNam亡;设备名称arom.csName;arm.dwData;如呆是保存操作,序列化函数会将参数自动存盘;如果是读取操作,序列化函数会从磁盘上读取参数值.8察看CallDialog函数可以发现,它生成了一个对话框,让用户做相应的选择,然后把用户选择的信息保存在CDevice类的成员函数中,以便于储存.整个程序框架使用CDevice类来保存设备的信息.在CallDialog函数中使用一个对话框,来让用户进行选择设备的属性,并且在CallDialog函数中把它保存在CDevice类中.所以对于一个新的设备,程序员所要做的工作就是,分析设备的协议查看是否仅使用

30、描述文件就可以完成设备的定义,如果不能,那么应该编制IoDevUi.dll.这时应分析应该增加哪一些属性,定义哪一些CDevice类的成员变量,以及显示什么样的对话框,让用户做什么样的选择.所以程序员的工作重点在于修改CDevice类,增加成选变量,并重载它的Serialize函数,然后修改对话框,让用户做不同的选择,并把选择保存在CDevice类的成员变量中即可.在该示例中,我们定义了2个设备参数:CStrmgm_csName;设备的名称DWORDm_dwData;/用于保存数据这样只需在对话框中对m_csName和m_dwData赋值即可.*调用对话框定义数据源/pDev数据源指针返回值t

31、rue成功*boolCDevMan:CallDialog(CDevice*pDev)ASSERT(pDev);CDevDefdig;dlg.m_naine=pDev-m_csName;dlg.m_iiPiotocol=(pDev-m_dwData&0 x01);dlg.m_uiPackLong=(pDev-m_dwData)8)&0 xff;if(IDOK=dlg.DoModalQ)pDev-m_csNaine=dlg.m_naine;pDev-m_dwData=(dlg.m_iiPiotocol&OxO1);/nudwData的第0位为1表示是RTU方式0表示ASCH方式pDev-m_dwD

32、ata=(pDev-m_dwData)|(dlg.m_HiPackLongcsPath+=Hddeacc.daty/数据保存在了工程目录的ddeacc.dat中DWORDdata;CStimgstrtemp;9shorttemp:CFilefile;if(file.Open(coustchai*)csPath,CFile:modeRead)/打开该文件CArchivea】(&file,CArchive:load);读取的第一个数据是定义的设备的个数,但是因为可以通过GetDeviceCount函数得到设备的个数,所以这里把读到的数据简单的丢掉.artemp;mtliDevCnt=pMaiiag

33、ei-GetDeviceCountQ;for(mti=0;iGetDevice(i);arsutemp;/读取设备的名字ardata;读取数据/这两句在讲到Ioapi.dll时再进行介绍pDevice-SetPrivateData(1Jong(data&!);pDevice-SetPrivateData(2Jong(data8)&0 xff);DCBdeb;pDevice-GetDCB(dcb);dcb.fBiiiaiy=TRUE;dcb.fOutxCtsFlow=FALSE;dcb.fOutxDsiFlow=FALSE;dcb.fDuControl=DTRCONTROLDISABLE;dcb

34、.fNull=FALSE;dcb.fRtsControl=RTSjCONTROL_DISABLE;pDevice-SetDCB(dcb);ar.Close();file.CloseQ;/关闭文件elsestnemp=H对不起,没有找到”;stnemp+=csPath;strtemp+=”程序不能运行!”;AfxMessageBox(strtenip);PostQuitMessage(O);没有找到文件,给出提示,并终止程序的运行.注意序列化的内容和顺序必须和IoDevUi.dll一致,否则会导致程序运行时产生错误.5.6.5Ioitemui介绍及编程示例在用力控进行组态时,把数据库DE中的点参

35、数与某种设备的具体通道建立连接的过10程被为数据连接过程在进行数据连接时,一般还要指定数据转换格式,数据长度等参数.数据连接过程对于不同的I/O设备,其形式和内容可能完全不同.因此必须针对不同的IO设备,设计相应的数据连接形式,保存各种参数信息.Ioitemui接II主要完成的两部分功能,一是为用户进行数据连接组态时提供一个界面;另外就是将用户组态的设备参数信息用某种格式保存起来,以便在开发编程接IIIoapi时使用我们定义了一个数据结构来保存设备参数信息,这就是数据连接项结构(下面简称连接项结构JIOITEMDEF.IOITEMDEF定义在Ioitemui.li中:tvpedefstmctI

36、oIteniDefStmcharsti64;longn8;IOITEMDEF;这个结构是一个通用结构,由程序员自己赋值,自己解释.Ioitemui要以DLL形式提供.该DLL必须是MFC扩展DLL.该DLL的缺省文件名称为IOITEMUI.DLL,该文件必须安装在目录FCINSTDIRJOSeiversMOED.下.Ioitemui的工作过程如下:在进行数据连接组态时,力控的DBMAN管理程序会自动检查在目录“FCINSTDIRIOSeiversMOEDV卜是否存在IOITEX1UI.DLL文件.如果存在,则调出数据连接组态接II界面.下面介绍如何编写Ioitemui接口程序.Ioitemui

37、.dll主要实现1个输岀函数:externCAFX_EXT_APIlongDoIteniDlg(constchai*szDeviceName,iiitnType,IOITEMDEF&item,char*szDesc,intnFlag);其参数说明如下:szDeviceName,设备名称(输入值).如呆在力控中定义了一个设备Device1,那么在给该设备组点时,传给DoIteniDlg的szDeviceName值就是字符串Device1.nType,设备子类型(用于一个驱动程序驱动多种类型设备)(输入值).它的值在IODESC.TXT中指定(参见上一章对LO描述文件的介绍).item,数据连接项

38、结构(返回值).需要注意的是,item除了是输出值外,也是输入值,DBMAN管理程序每次调用DoIteniDlgO时,将上一次操作赋给item的值传递过来.szDesc,数据连接项描述,用于DBMAN程序显示的提示信息.iiFlag,1表示增加数据连接项,2表示修改,0表示删除(输入值)其返回值0表示操作成功其它,操作失败.Ioitemui.dll的工作过程如F:当用户打开数据组点连接对话框时,选中了一个点,并按下增加,修改或删除键,这时就会调用Ioitemui.dll的DoIteniDlg函数.程序员应该在此函数中,弹出一个对话框让用户进行选择,在用户按下了OK键之后,把用户的选择保存在it

39、em中,以后编制Ioapi.dll时可以利用这些信息.编程示例我们先结合示例DemoContioiler介绍如何开发Ioitemui.仿真器SmiControllei-的内部有数字区(DIO)和模拟区(AIO).DIO和AIO区通道范闱为:0255.每个DIO通道的数据的数值范围为:0或1.每个AIO通道数据的数值范I制为:0M095.所以我们应该在DoIteniDlg函数中弹出一个对话框,用户可以在此对话框中选择输入通道和内存地址输入通道有两个选项DIO通道和AIO通道供用户选择,内存地址可以让用户输入0255之间的数据.11我们介绍一卞如果不使用I/O模板,如何自己生成一个新的Ioitem

40、ui工程:在VC+坏境卞,选择菜单命令neg选择新建工程,工程名为Ioitemui,选择”MFCAppwizaid(dll)”选项,在下一步DLL类型中选择”MFCExtensionDLL1型撚后按卜”Finish键.即可创建一个新的Ioitemui工程.打开Ioitemui.cpp文件,在文件的开头加入存includeIoitemui.h,把Ioitemui.h拷入本工程,然后在文件的最后键入:longDoIteniDlg(constchar*strDataSnType.IOITEMDEF&item,char*szDesc,mtnFlag)这就加入了dll的输出函数.打开示例D

41、emoContioller的Ioitemui模板程序,它的DoIteniDlgQ函数实现过程如下:longDoIteniDlg(constchar*szDeviceName,mtnTvpeJOITEMDEF&item,chai-*szDliFlag)CLuikDlgdig;dlg.item_nO=item.nO;dlg.item_nl=item.n1;switch(nFlag)case0:/删除操作return0;增加或修改操作case1:case2:if(dlg.DoModal()=EDOK)item.nO=dlg.item_nO;item.n1=dlg.item_n1;spi

42、intf(szD亡scst(LPCSTR)dlg.m_desc);sprintf(item.str/,%s,l,(LPCSTR)dlg.m_desc);return0;break;return1;在这个模板程序里,还涉及一个对话框类CLuikDlg.这个对话框为用户进行数据连接组态时提供一个界面,其形式如下:12CLuikDlg类有2个成员变量:CStrmgm_desc;保存连接项描述mtitem_n2;/item_nO保存数据区类型,0表示DIO.1表示AIO;/item_nl保存地址在CLuikDlg的WM_INITDIALOG消息函数中进行如下处理:BOOLCLinkDlg:OnInit

43、Dialog()CDialog:OiiInitDialog();/在此处设置值使对话框的显示和是一次选择相同,以利于执行和上一次相近的操作m_CtrlChamiel.SetCurSel(item_nO);/设置操作选项为上一次的操作m_iiAddi=item_nl;设置地址为上一次的值UpdateData(FALSE);returnTRUE;这些处理为了使对话框的显示和上一次选择相同,以利于执行和上一次相近的操作.在ONOK消息函数进行如下处理:voidCLuikDlg:OnOK()UpdateData(TRUE);/得到各个选项得值CStimgstrmg;item_n0=m_CtilChai

44、mel.GetCurSeloy/保存操作选项m_CtrlChaimel.GetWindowText(m_desc);item_nl=m_iiAddi;/保存输入的地址m_desc+=”起始地址:”;stiing.Fonnat(M%d,m_.iiAddr);m_desc+=suing;CDialog:OnOKQ;在这个函数里,把用户组态的内容(数据区的选择,地址的指定)保存在item_n,并根据这些内容生成连接项描述.5.6.6扫描程序IOSCANIOSCAN是FIOS的一个主要程序模块.它负贵完成对IOAPI部分的DLL代码进行周期性地扫描同时完成与I/O设备的底层通信(串II通信,网络通信等

45、),以及设备超时处理,设备故障诊断等.IOSCAN还负责与数据库DB之间的通信与协作.它把从I/O设备采集到的数据经IOAPI解析转换后提交给DB,或将DB卜置给LO设备的数据经IOAPI解析转换后写入FO设备.IOSCAN是FIOSSDK提供的一个标准软件工具供程序员在调试和运行时直接使用.13FIOS开发工具包里提供了debug和release版本的IOSCAN程序,在目录”FCINSTDIRFiossdkUtility”卜可以找到它们.Debug版本的IOSCAN程序主要供程序员在调试时使用,它能提供更为丰富的调试信息.在使用时,需要把IOSCAN.EXE以及配套的几个DLL文件(即目录

46、FCINSTDIRFiossdkUtilityDebugF的DLL文件)拷贝到生成的debug版本的IOAPI.DLL文件的同一目录下(注意:debug版本的IOAPI.DLL文件必须配合debug版本的IOSCAN程序,release版本的IOAPI.DLL文件必须配合release版本的IOSCAN程序).同时不要忘记将IOSCAN.EXE的文件名更改为要开发的LO驱动的IOED名称.debug版本的IOSCAN需要程序员手工启动或用VC+调试启动.5.6.7编程接IIIOAPI.DLLIOAPI是FIOS提供的最主要的一个编程接II.程序员的主要工作就是开发IOAPI部分的程序代码.IO

47、API提供了一组API函数和一些C卄类库.这组API函数规定了名称,参数及返回值,函数内容由程序员根据具备的I/O设备编程实现.C卄类库则为程序员提供各种获取力控IO组态信息,参数设置信息,与数据库DB进行数据交换等数据处理的方法.我们把这组API函数称为扫描函数,把这些C卄类库称为IOC,IOC是InputOutputClass(输入输出类库)的缩写.程序员编写的Ioapi最后要形成MFC的扩展动态链接库(MFCExtensionDLL),扫描函数是这个DLL的输出函数.当力控系统运行时,力控FIOS的扫描程序Ioscan对Ioapi中扫描函数部分的dll代码进行周期性地扫描,它把从PO设备

48、采集到的数据经扫描函数解析转换后提交给DB,或将DB卞置给I/O设备的数据经扫描函数解析转换后写入I/O设备.归结起来,开发Ioapi的主要内容就是用IOC编写扫描函数.IOC中的所有类库全部以纯虚类的形式提供,并且只有成员函数,没有成员变量.目前IOC中主要包括4个类:CItem,CPacket,CDevice,CManager.CItem,数据项类.CPacket,数据包类.CDevice,设备类.CManager,管理器类.一个FIOS实例创建一个CManager实例.用户在组态时每定义一个设备,则创建一个CDevice实例.CManager对所有的CDevice进行管理.一个CDevi

49、ce实例,由一个或多个CPacket实例组成,而每个CPacket实例又由一个或多个CItem实例组成.每个CItem实例,对应数据库DB中的一个点参数,也就是对应I/O设备的一个”点”(如:设备的一个通道,一个参数等).IOC提供的这4个类库,实际上就是对以上所述的这几种数据对彖提供了一组操作方法,以供程序员更加灵活的控制程序.Citem类CItem类提供了对数据项对彖的一组操作方法.一个数据项对象包含的是数据库DB中的一个点参数与I/O设备中一个物理通道的映射关系.Citem使用的基本数据结构是IOITEMDEF.一个Citem实例保存一个IOITEMDEF实例.IOITEMDEF的定义如

50、下:tvpedefstmctIoIteniDefStmcharstr64;longn8;JIOITEMDEF;14Citem类的定义如下:classCitem:publicCObjectpublic:vutualIOITEMDEF*GetltemStm(尸0;/取得数据连接项结构指针设置连接项的可写属性,缺省时可写的,bAEbute为TRUE设置为不可写.viitualvoidSetReadOiily(BOOLbAttiibute=TRUE)=0;设置连接项的可读属性,缺省时可读的,bAEbute为TRUE设置为不可读.viitualvoidSetWnteOiily(BOOLbAttiibut

51、e=TRUE)=0;viitualvoidSetData(shoitsData)=O;/按短整型格式设置采集数据virtualvoidSetData(longlData)=0;按长整型格式设置采集数据virtualvoidSetData(doublefData)=O;/按浮点型格式设置采集数据viitualvoidSetData(char*szData)=0;按字符串格式设置采集数据/按字符串格式取得上一次用SetDataQ设置的采集数据viitualvoidGetData(chai*szData)=0;设置私有数据,oFset范围:03viitualvoidSetPiivateData(un

52、signedshoiloffset,longlPrivateData)=O;viituallongGetPrivateData(unsignedshortoffset尸0;/取得私有数据,offset范圉:03viitualCPacket*GetPacket()=0;取得本连接项类所归属的数据包指针viitualCDevice*GetDeviceQ=0;取得本连接项所归属的设备指针viitualCMaiiager*GetManager()=0;取得IoScan管理器指针/按浮点型格式设置历史数据viitualvoidSetHisData(HisInsDatStm*pHisIiisDatSti-

53、u,iiitnCount)=0;;各个函数的解释如下:IOITEMDEF*GetItemStru()功能:取得数据连接项结构指针.参数:无.返回值:数据项结构指针.举例:IOITEMDEF*pltemStm=pItem-GetItemStm();longliCmdType=pItemSti-u-n3;voidSetReadOnly(BOOLbAttribute=TRUE)功能:设置连接项的写属性,缺省时连接项是可写的.参数:TRUE:设置为不可写;FALSE:设置为可写.返回值:无.举例:for(mti=0;iGetltemCountO;i+)CItem*pltem=pPacket-GetIt

54、em(i);pItem-SetReadOiily();voidSetWiiteOnly(BOOLbAttiibute=TRUE)功能:设置连接项的读属性,缺省时连接项是可读的.15参数:TRUE:设置为不可读;FALSE:设置为可读.返回值:无.举例:for(mti=0;iGetltemCountQ;i+)CItem*pltem=pPacket-GetItem(i);pItem-SetWnteOiilyQ;voidSetData(shortsData)功能:按短整型格式设置采集数据.参数:短整形数据值.返回值:无.voidSetData(longIData)功能:按长整型格式设置采集数据.参数

55、:长整型数据值.返回值:无.voidSetData(doublefData)功能:按浮点格式设置采集数据.参数:浮点数据值.返回值:无.voidSetData(char*szData)功能:按字符串格式设置采集数据.参数:字符串数据值.返回值:无.voidGetData(char*szData)功能:按字符串格式取得上一次用SetDataQ设置的采集数据.参数:存放最近一次设置的采集数据(字符串型数值)的字符串指针缓冲区长度应不小于32.返回值:无.举例:charszData32;pItem-GetData(szData);voidSetPiivateData(unsignedshoitoffset,longlPnvateData);功能:设置私有数据.参数:offset,私有数据的偏置,Q-3;lPnvateData,整型私有数据.返回值:无.备注loscan自动为每个CItem实例分配了一块由4个整型数(32位)组成的程序员私有数据空间供程序员使用程序员除了用这部分私有数据区保存数值外,也可以分配新的内存空间,然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,正确

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论