DCS数据采集技术.doc

上传人:rrsccc 文档编号:11066584 上传时间:2021-06-25 格式:DOC 页数:146 大小:91KB
返回 下载 相关 举报
DCS数据采集技术.doc_第1页
第1页 / 共146页
DCS数据采集技术.doc_第2页
第2页 / 共146页
DCS数据采集技术.doc_第3页
第3页 / 共146页
DCS数据采集技术.doc_第4页
第4页 / 共146页
DCS数据采集技术.doc_第5页
第5页 / 共146页
亲,该文档总共146页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《DCS数据采集技术.doc》由会员分享,可在线阅读,更多相关《DCS数据采集技术.doc(146页珍藏版)》请在三一文库上搜索。

1、第五章 DCS数据采集技术 10页 1.6万字 目前各种I/O设备提供的对外数据接口可分为以下几类: 1, 数字通讯接口,包括串口类,以太网(TCP/IP协议)类,现场总线类,仪器总线类通讯接口(如GPIB等). 2, 模拟量通道输出,设备直接提供4-20mA,1-5V或继电器接点信号等. 力控 具有世界上大部分主流设备的I/O接口程序,对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-1 5.2 合理设置扫描周期,避免引起设备死机 有些I/O设备内部只有一个CPU,同时负责数据通讯和计算,如果在力控 上设置的数据扫描周期太快容易使设备死机,因此在设置这一参数时应该慎重,最好通过多次试验确定一个合适的扫描周期.一般的串口设备的扫描周期可设在10-100毫秒之间. 5.3 通过拨号方式与I/O设备通讯 力控 的所有串口I/O驱动程序都支持通过MODEM以拨

4、号方式与设备通讯.只要正确设置电话号码即可,如图5-2所示. 15.4 通讯状态监视,设备状态数据的读取 力控 为每一个I/O设备自动定义了一个系统变量,假如系统中有一个设备PLC1,则每当PLC1不能与力控 正常通讯时,系统变量$IO PLC1的值就会被置为1.I/O 设备故障属于系统报警.计算机通讯口故障,电缆,PLC端通讯口的故障,PLC通讯口与计算机通讯口的参数设置不一致都会造成这种结果.还有一种可能,就是数据连接项错误,如果计算机的命令发给PLC的只读参数,PLC是不会予以理睬的. 5.5 怎样用I/O驱动程序调试I/O设备 力控 的I/O驱动程序有数百个,针对每一种设备都有一个独立

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

6、.如果在参数设置中设置周期性发送周期不为0,则在连接设备后会出现周期发送按钮,否则出现手动发送按钮.使用周期发送或手动发送按钮,可以周期性或一次性地发送编辑框中的数据了. 编辑框中数据的格式缺省是混合方式的,如果你想发送编辑框中的数据,这也是唯一的数据类型,它的形成规则如下:任何ASCII码(除)可以直接输入,可以使用来输入;内是由 (空格)分隔的转意字符,它们的意义为: 图5-5 : 用来输入; 2*: 在发送数据是表示延时1毫秒 图5-6 #: 在发送数据是表示延时10毫秒 $: 在发送数据是表示延时100毫秒 !: 在发送数据是表示延时1000毫秒 : 表示它后面的数据是十进制的(缺省是

7、16进制) (空格): 作为分隔符,任何未定义的字符都可以作为分隔符,最好使用空格. 09: 可以用来输入10进制或16进制数据. AF/af: 可以用来输入16进制数据. 例子: abcv 30 *#$! 345 对应的16进制数据串为: 61H,62H,63H,76H,5BH,30H,33H,34H,35H;而且在30H之后有1111毫秒的延时. 当用在其它情况(不是用来发送数据)时,唯一的差别是没有了延时的概念. 其它工具:校验使用混合格式的数据,计算常用的校验码,ASCII码表显示使用16进制和10进制显示的ASCII码表,各种数据转换把混合格式,16/32位整数,32位浮点数等转换位

8、十几种常用数据格式,除混合格式外,其它数据格式为直接用空格分隔的数据串 图5-7 5.6 如何开发I/O设备驱动程序 在力控 中有一个SDK工具包,叫做FIOS SDK,可以开发硬件设备与计算机的通讯接口程序.最简单的只需要编写几个函数就可以可以做自己的I/O驱动,现在支持的硬件类型有串口(RS485/232/422),网络,板卡,硬件厂家提供DLL等多种方式的通讯类型.在该SDK中开发自己的通讯接口,不需要关心硬件和计算机通讯的细节,只需要了解通讯协议就可以了. 如果通讯协议很复杂,该SDK中提供了足够灵活的手段满足不同层次的需要.例如:在设备初始化时发什么命令或做其他处理,动态改变硬件通讯

9、参数等等. 5.6.1 FIOS开发包简介 FIOS负责完成与各种I/O设备进行数据交换.一方面,它把从I/O设备采集到的实时过程数据发送给数据库DB,另一方面,从DB发出的下置数据也通过FIOS发送给I/O设备. 根据监控PC与I/O设备之间通信机制的不同,FIOS主要支持两种工作方式:同步方式与异步方式. 异步方式适用以下一类I/O设备:这类I/O设备一般可以独立运行,与监控计算机之间通过串口,网络或MODEM连接.与监控计算机之间通过明确的消息传送(文本或二进制消息)完成数据交换.数据交换过程为异步方式. 同步方式适用以下一类I/O设备:这类I/O设备或者依赖PC运行(如:插在PC插槽内

10、),或者独立运行.但与监控计算机之间主要通过直接访问方式进行数据交换,具体形式包括:寄存器直接访问(如:板卡),API函数调用,ActiveX控件访问等.数据交换过程为同步方式. 下面列举了FIOS可实现的一些基本功能: 底层通信功能:1),串口通信,包括:RS232/422/485.2),TCP/IP网络通信.3),MODEM3通信,通过模拟MODEM在电话网上通信.4),寄存器访问,如:各种DAS板卡.5),其它. 链路控制功能:用M代表Master,即上位机(监控PC工作站);S代表Slaver,即下位机(各种I/O设备).对于异步方式,FIOS支持多种链路控制方式.链路控制方式支持以下

11、几种方式:1),M请求,S应答方式.2),M请求,S无应答方式.3),S主动发送,M被动等待.另外,对一次完整数据处理(读或写)过程,支持以下方式:1),1次请求,0次应答方式.2),1次请求,1次应答方式.3),1次请求,多次应答方式.4),0次请求,1次应答方式.5),多次请求,多次应答方式. 冗余功能:FIOS支持的冗余方式包括:1),单监控站,双I/O冗余.2),双监控站,单I/O冗余.3),双监控站,双I/O冗余.4),对于总线型设备(如RS485),提供总线监测功能,可实现对冗余通信网络的保护和监测. 前端机功能:DB与IO Server不在同一工作站上,IO Server运行在前

12、端机上,前端机与操作站之间通过串口,TCP/IP网络或MODEM进行通信. 硬件测试与远程调试功能:使用FIOS可完成对I/O设备的简单测试功能.另外可实现远程调试. 故障诊断与恢复功能:FIOS提供诊断机制,在较短的采集周期内报告故障的发生,诊断出下位机故障情况.当下位机更换或恢复后,不需要对FIOS及相关程序进行任何人工干预,而在较短时间自动恢复通信.当某一台,几台或部分通道发生故障,FIOS要自动优化通信链,使其与其他下位机或通道之间的通信不受影响,保证通信效率. 界面显示功能:为测试,调试,运行维护方便,FIOS提供显示界面,可显示包括:发送,应答,状态信息,启动时间,分包数,分包信息

13、,成功通信次数(发送次数,成功应答次),故障次数等信息. 历史数据处理功能:对于某些能保存历史数据的设备(如:无纸记录仪等),FIOS能将采集到的历史数据恢复到数据库DB中. 5.6.2 FIOS SDK编程方式 FIOS SDK提供了一种简洁的,面向对象的编程方式以缩短开发时间,降低开发难度. FIOS SDK提供标准的开发接口和程序模板,程序员仅需要根据I/O设备的具体通信协议或驱动接口说明,填写几个扫描函数的实现代码,进行必要的调试与测试,即可完成一种FIOS 的开发. FIOS提供的开发工具封装了大部分程序员不必关心的技术环节,如:底层通信功能(串口通信,网络通信等),设备超时处理,设

14、备故障诊断等.同时FIOS提供各种调试工具,方便程序员进行系统测试. FIOS开发环境完全基于32位Windows平台.它使用动态链接库(DLL)技术将程序员开发的代码整合到力控 系统中.FIOS提供给程序员的开发接口为API函数和C+类库. 5.6.3 FIOS SDK组件及示例程序 FIOS SDK主要由4部分组成:设备组态接口(Iodevui),数据连接组态接口(Ioitemui),编程接口Ioapi和描扫程序Ioscan.Iodevui:负责管理设备组态过程.Ioitemui:负责管理数据连接组态过程.Ioapi:负责完成与I/O设备间的数据交换,包括:对通信协议的解析,数据格式的转换

15、等.Ioscan:主要完成对Ioapi 部分的dll代码进行周期性地扫描.同时完成与I/O设备的底层通信(串口通信,网络通信等),以及设备超时处理,设备故障诊断等.Ioscan还负责与数据库DB之间的通信与协作.它把从I/O设备采集到的数据经Ioapi解析转换后提交给DB,或将DB下置给I/O设备的数据经Ioapi解析转换后写入I/O设备.Ioscan是FIOS SDK提供的一个标准软件工具. 程序员仅需要开发Iodevui,Ioitemui,Ioapi三部分的代码. 示例程序 4FIOS SDK提供了两个示例:DemoController与DemoModbus. DemoController

16、是一个初级编程示例,它能引导初学者快速掌握开发FIOS的基本概念和方法.DemoModbus是一个实用编程示例,它采用标准MODBUS通信协议,通过该示例,可以掌握在力控 平台上开发标准MODBUS设备I/O驱动程序的方法. FIOS SDK的全部内容都是在安装在力控 自动安装的,在力控 目录下的子目录Fiossdk中.FIOS SDK主要包含以下几部分内容:Examples,程序示例,仿真程序.Include,头文件.Manual,文档说明.Utility,调试工具. 这2个示例具有一定的代表性,它们体现了FIOS SDK的主要功能.FIOS SDK提供了这2个示例的全部源代码,在它们的基础

17、上,稍做改动,就可以开发出新的FIOS.我们把象这2个示例源程序一样具有模板作用的程序称为I/O模板程序.为了提高开发效率,我们建议尽量使用I/O模板程序,这在一定程度上,也减少,降低了编程错误的发生. 常用术语 我们把FIO SDK中经常涉及的一些概念给出定义,有些术语虽然是通用名词,但在FIOSDK中有特定含义.这些术语有一些在前文给出了解释,有一些会在后文中陆续给出解释. FIOS ForceControl I/O Server,即力控 I/O驱动程序 FIOS SDK FIOS软件开发工具包 FCINSTDIR 力控 软件系统的安装目录 FCAPPINSTDIR 用力控 创建的工程应用

18、的目录 IOID 唯一区别各个I/O驱动程序的I/O标志 Iodevui 设备组态接口 Ioitemui 数据连接组态接口 Ioapi 编程接口 Ioscan 扫描程序 I/O模板程序 FIOS工SDK附带示例的源程序 I/O配置文件 设备组态时的缺省参数设置保存文件 连接项结构 保存数据连接信息的数据结构IOITEMDEF I/O描述文件 定义设备的类别,厂商,型号,通信方式等参数的文本文件Iodesc.txt程序员 在本文档范围内专指用FIOS SDK进行开发的技术人员 扫描函数 包含在Ioapi中的API函数,它们由扫描程序周期扫描.扫描函数完成对设备数据解析及格式转换 IOC Inpu

19、t Output Class(输入输出类库)的缩写. 5.6.4 设备组态接口IODEVUI.DLL I/O描述文件 在使用力控 进行组态时,一般均涉及定义I/O设备的过程.在定义设备时,要选择设备的类别(PLC,智能仪表等),厂商,设备型号或通信协议,然后根据设备通信方式(串口方式,网络方式,其它方式等)设置参数.以上关于一种设备的信息(类别,厂商,型号,通信方式等)完全是由I/O描述文件决定的.I/O描述文件是一个标准文本文件,根据其规定的填写格式,由程序员根据具体设备自行填写.下面介绍I/O描述文件的填写格式. I/O描述文件的文件名为IODESC.TXT,安装目录为:FCINSTDIR

20、IO ServersIOID. IO文件说明格式为: 类别;厂商或IO程序描述;执行文件名称 5子类型1;类型号;资源标志;提供设备地址 子类型2;类型号;资源标志;提供设备地址 . 注意,子类型号不能重复.表示回车换行.最上面一行是驱动程序的总体描述,包括三项.各项之间必须以分号;分隔.各项内容不能含有分号;. 各项含义如下:类别,驱动程序所属类别,现分为以下几类:PLC,智能仪表,智能模块,变频器.程序员也可以自行扩展.厂商或IO程序描述,I/O设备生产厂商名称,协议名称,如西门子.执行文件名称,I/O驱动程序(运行程序)的名称,如opto_drv.exe 接下来几行为驱动程序所包含的设备

21、类型的描述,如西门子包括S5,S7等,每一子类别一行,每行包括三项,各项之间必须以分号;分隔.各项内容不能含有分号;.各项含义如下:子类型,设备类型描述.如S5.类型号,设备类型编号,类型号不能重复.合法的值为0,1,2,3等.使用计算机资源,使用计算机何种通信资源通信,合法的值为0,1,2等.含义如下:0,同步通信方式;1,串口通信方式;2,TCP/IP网络通信方式; 3,MODEM通信方式;4,板卡方式;5,并口通信方式.提供设备地址:1表示需要指定设备地址,否则表示不需要设备地址. 管理程序会自动将相同厂商或IO程序描述相同的驱动程序归为同一树下. 开发Iodevui 力控 组态环境DR

22、AW中的设备管理功能提供了一个根据I/O描述文件可灵活配置的标准设备组态接口.这个组态接口提供了一些对常用设备参数进行设置的方法.如:设备名称,设备地址,通信端口,端口参数等.如下图所示: 对于很多设备,如果标准设备组态接口能够满足要求,就不再需要自己编写Iodevui接口程序了.比如示例DemoController采用的就是标准设备组态接口.而示例DemoModbus因为涉及一些特殊的参数设置,就需要自己编写Iodevui接口程序了. 因此,Iodevui接口程序实际上就是对标准设备组态接口的一个补充和扩展,并可由程序员灵活控制.Iodevui要以DLL形式提供.该DLL必须是MFC 扩展D

23、LL.该DLL的缺省文件名称为IODEVUI.DLL,该文件必须安装在目录FCINSTDIRIO ServersIOID下. 在进行设备组态时,力控 的I/O设备管理程序会自动检查在目录FCINSTDIRIO ServersIOID下是否存在IODEVUI.DLL文件.如果存在,则首先根据I/O描述文件的格式,调出标准设备组态接口界面,当用户确认后,再调出Iodevui组态接口界面;若不存在该文件,则只调出标准设备组态接口界面. 示例DemoModbus的Iodevui接口程序可以做为开发Iodevui的模板程序.我们结合示例DemoModbus的Iodevui模板程序具体解释实现过程.查看头

24、文件Iodevui.h可以发现,Iodevui.dll主要实现3个输出函数: 6extern C AFX_EXT_API long AddIoDev(const char* szDeviceName, int nType); extern C AFX_EXT_API long ModIoDev(const char* szDeviceName); extern C AFX_EXT_API long DelIoDev (const char* szDeviceName); 在进行设备组态时,当增加一个设备时,力控 设备管理程序会自动调用AddIoDev()函数;当修改一个已创建设备时会调用Mod

25、IoDev()函数;当删除一个设备时会调用DelIoDev ()函数. 其中,参数szDeviceName为I/O设备名称(输入值,组态时由用户指定).nType 为设备子类型号,由程序员在I/O描述文件中指定.返回值为0表示操作成功;其它表示操作失败.为了较好地实现程序结构化,本模板程序提供了一个CDevMan类对设备及组态操作过程进行管理.Iodevui.dll的3个输出函数AddIoDev(),ModIoDev()DelIoDev ()的具体实现过程是在CDevMan的三个成员函数Add(),Mod()和Del()中实现的. 首先看一下Add()的实现代码: /* / 添加I/O设备 /

26、 szDeviceName, 设备名称(输入值) / nType, 设备子类型(用于一个驱动程序驱动多种类型设备)(输入值) / 返回值说明:0, 操作成功;其它, 操作失败 /* long CDevMan:Add(const char* szDeviceName, int nType) if(Find(szDeviceName) AfxMessageBox(该数据源名已经存在!); return -1; CDevice* pDev = new CDevice(szDeviceName,nType); if(CallDialog(pDev) m_list.AddTail(pDev); Stor

27、e(); return 0; else delete pDev; return -1; 程序的一开始,调用Find()函数来查找是否已有相同的设备名存在,如果有给出提示并返回-1表示操作失败,否则生成一个CDevice对象并调用CallDialog函数来显示一个对话框,让用户做进一步的选择,如果用户进行确认,操作成功,它把此CDevice对象加入设备链表中,并调用Store函数来保存设备信息.另外两个函数和它类似. Store()函数如下: void CDevMan:Store() C; 7if(const char*)(ddeacc.dat),C) CArchive ar(&file, CA

28、rchive:store); Serialize(ar); ar.Close(); (); 该函数它先打开ddeacc.dat文件,如果不存在,就建立此文件.然后调用序列化函数对它进行保存,最后关闭此文件.再看一看序列化函数: void CDevMan:Serialize(CArchive &ar) TRY CObject:Serialize(ar); m_list.Serialize(ar); CATCH(C) AfxMessageBox(文件版本不匹配!); END_CATCH 该函数对m_list(由CDevice类实例组成)进行序列化.在调用各个CDevice类实例的序列化函数时,如果

29、是读取操作,会依次创建CDevice实例,并调用CDevice的序列化函数,随后把CDevice实例加入m_list链表.具体保存和读取的变量数据在CDevice类中控制,也就是说程序员针对不同的设备可以改写CDevice类,定义不同的成员变量,记录设备的不同的属性,对CDevice类重载Serialize即可实现设备的保存,加载,增加,删除和修改等功能. 我们再看一下CDevice类序列化的实现过程: void CDevice:Serialize(CArchive& ar) if (ar.IsStoring() ar m_csName; /设备名称 ar m_csName; ar m_dwD

30、ata; 如果是保存操作,序列化函数会将参数自动存盘;如果是读取操作,序列化函数会从磁盘上读取参数值. 8察看CallDialog函数可以发现,它生成了一个对话框,让用户做相应的选择,然后把用户选择的信息保存在CDevice类的成员函数中,以便于储存. 整个程序框架使用CDevice类来保存设备的信息.在CallDialog函数中使用一个对话框,来让用户进行选择设备的属性,并且在CallDialog函数中把它保存在CDevice类中.所以对于一个新的设备,程序员所要做的工作就是,分析设备的协议查看是否仅使用描述文件就可以完成设备的定义,如果不能,那么应该编制IoDevUi.dll.这时应分析应

31、该增加哪一些属性,定义哪一些CDevice类的成员变量,以及显示什么样的对话框,让用户做什么样的选择.所以程序员的工作重点在于修改CDevice类,增加成选变量,并重载它的Serialize函数,然后修改对话框,让用户做不同的选择,并把选择保存在CDevice类的成员变量中即可. 在该示例中,我们定义了2个设备参数: CString m_csName; /设备的名称 DWORD m_dwData; /用于保存数据 这样只需在对话框中对m_csName和m_dwData赋值即可. /*/ /调用对话框定义数据源 / pDev 数据源指针 /返回值 true 成功 /*/ bool CDevMan

32、:CallDialog(CDevice* pDev) ASSERT(pDev); CDevDef dlg; dlg.m_name = pDev-m_csName; dlg.m_nProtocol = (pDev-m_dwData&0x01); dlg.m_inPackLong= (pDev-m_dwData)8)&0xff; if(IDOK = dlg.DoModal() pDev-m_csName = dlg.m_name ; pDev-m_dwData = (dlg.m_nProtocol&0x01); /m_dwData的第0位为1表示是RTU方式 0 表示ASCII方式 pDev-m_

33、dwData = (pDev-m_dwData)|(dlg.m_inPackLongcsPath+=ddeacc.dat;/数据保存在了工程目录的ddeacc.dat中 DWORD data; CString strtemp; 9short temp; C; if(const char*)csPath,C)/打开该文件 CArchive ar(&file, CArchive:load); /读取的第一个数据是定义的设备的个数, /但是因为可以通过GetDeviceCount函数得到设备的个数, /所以这里把读到的数据简单的丢掉. artemp; int nDevCnt = pManager-G

34、etDeviceCount(); for (int i = 0; i GetDevice(i); arstrtemp;/读取设备的名字 ardata;/读取数据 /这两句在讲到Ioapi.dll时再进行介绍 pDevice-SetPrivateData(1,long(data&1); pDevice-SetPrivateData(2,long(data8)&0xff); DCB dcb; pDevice-GetDCB(dcb); dcb.fBinary = TRUE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fDtrCon

35、trol = DTR_CONTROL_DISABLE; dcb.fNull = FALSE; dcb.fRtsControl = RTS_CONTROL_DISABLE; pDevice-SetDCB(dcb); ar.Close(); ();/关闭文件 else strtemp=对不起,没有找到; strtemp+=csPath; strtemp+=程序不能运行!; AfxMessageBox(strtemp); PostQuitMessage(0);/没有找到文件,给出提示,并终止程序的运行. 注意序列化的内容和顺序必须和IoDevUi.dll一致,否则会导致程序运行时产生错误. 5.6.

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

37、DEF. IOITEMDEF定义在Ioitemui.h中: typedef struct IoItemDefStru char str64; long n8; IOITEMDEF; 这个结构是一个通用结构,由程序员自己赋值,自己解释.Ioitemui要以DLL形式提供.该DLL必须是MFC 扩展DLL.该DLL的缺省文件名称为IOITEMUI.DLL,该文件必须安装在目录FCINSTDIRIO ServersIOID下. Ioitemui的工作过程如下: 在进行数据连接组态时,力控 的DBMAN管理程序会自动检查在目录FCINSTDIRIO ServersIOID下是否存在IOITEMUI.D

38、LL文件.如果存在,则调出数据连接组态接口界面. 下面介绍如何编写Ioitemui接口程序. Ioitemui.dll主要实现1个输出函数:extern C AFX_EXT_API long DoItemDlg(const char * szDeviceName, int nType, IOITEMDEF &item, char * szDesc, int nFlag); 其参数说明如下: szDeviceName, 设备名称(输入值).如果在力控 中定义了一个设备Device1,那么在给该设备组点时,传给DoItemDlg的szDeviceName值就是字符串Device1. nType,

39、设备子类型(用于一个驱动程序驱动多种类型设备)(输入值).它的值在IODESC.TXT中指定(参见上一章对I/O描述文件的介绍). item, 数据连接项结构(返回值).需要注意的是,item除了是输出值外,也是输入值,DBMAN管理程序每次调用DoItemDlg()时,将上一次操作赋给item的值传递过来. szDesc, 数据连接项描述,用于DBMAN程序显示的提示信息. nFlag, 1表示增加数据连接项,2表示修改,0表示删除(输入值).其返回值0表示操作成功.其它, 操作失败. Ioitemui.dll的工作过程如下: 当用户打开数据组点连接对话框时,选中了一个点,并按下增加,修改或

40、删除键,这时就会调用Ioitemui.dll的DoItemDlg函数.程序员应该在此函数中,弹出一个对话框让用户进行选择,在用户按下了OK键之后,把用户的选择保存在item中,以后编制Ioapi.dll时可以利用这些信息. 编程示例 我们先结合示例DemoController介绍如何开发Ioitemui. 仿真器SimController的内部有数字区(DIO)和模拟区(AIO).DIO和AIO区通道范围为:0255.每个DIO通道的数据的数值范围为:0或1.每个AIO通道数据的数值范围为:04095.所以我们应该在DoItemDlg函数中弹出一个对话框,用户可以在此对话框中选择输入通道和内存

41、地址.输入通道有两个选项DIO通道和AIO通道供用户选择,内存地址可以让用户输入0255之间的数据. 11我们介绍一下如果不使用I/O模板,如何自己生成一个新的Ioitemui工程: 在VC+环境下,选择菜单命令new,选择新建工程,工程名为Ioitemui,选择MFC Appwizard (dll)选项,在下一步DLL类型中选择MFC Extension DLL型,然后按下Finish键.即可创建一个新的Ioitemui工程. 打开Ioitemui.cpp文件,在文件的开头加入#include Ioitemui.h,把Ioitemui.h拷入本工程,然后在文件的最后键入: long DoIt

42、emDlg(const char * strDataSour,int nType,IOITEMDEF &item,char * szDesc,int nFlag) 这就加入了dll的输出函数. 打开示例DemoController的Ioitemui模板程序,它的DoItemDlg()函数实现过程如下: long DoItemDlg(const char * szDeviceName, int nType,IOITEMDEF &item,char * szDesc,int nFlag) CLinkDlg dlg; dlg.item_n0 = item.n0; dlg.item_n1 = item

43、.n1; switch(nFlag) case 0:/删除操作 return 0; /增加或修改操作 case 1: case 2: if(dlg.DoModal()=IDOK) item.n0=dlg.item_n0; item.n1=dlg.item_n1; sprintf(szDesc,%s,(LPCSTR)dlg.m_desc); sprintf(item.str,%s,(LPCSTR)dlg.m_desc); return 0; break; return 1; 在这个模板程序里,还涉及一个对话框类CLinkDlg .这个对话框为用户进行数据连接组态时提供一个界面,其形式如下: 12

44、CLinkDlg 类有2个成员变量: CString m_desc;/保存连接项描述 int item_n2;/item_n0保存数据区类型,0表示DIO,1表示AIO; /item_n1保存地址 在CLinkDlg的WM_INITDIALOG消息函数中进行如下处理: BOOL CLinkDlg:OnInitDialog() CDialog:OnInitDialog(); /在此处设置值使对话框的显示和是一次选择相同,以利于执行和上一次相近的操作 m_CtrlChannel.SetCurSel(item_n0); /设置操作选项为上一次的操作 m_nAddr = item_n1; /设置地址为上一次的值 UpdateData(FALSE); return TRUE; 这些处理为了使对话框的显示和上一次选择相同,以利于执行和上一次相近的操作.在ONOK消息函数进行如下处理: void CLinkDlg:OnOK() UpdateData(TRUE);/得到各个选项得值 CString string; item_n0 = m_C

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1