DCS数据采集技术.pdf

上传人:1398****507 文档编号:72092744 上传时间:2023-02-08 格式:PDF 页数:32 大小:1.19MB
返回 下载 相关 举报
DCS数据采集技术.pdf_第1页
第1页 / 共32页
DCS数据采集技术.pdf_第2页
第2页 / 共32页
点击查看更多>>
资源描述

《DCS数据采集技术.pdf》由会员分享,可在线阅读,更多相关《DCS数据采集技术.pdf(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、D DC CS S 数数据据采采集集技技术术 Hessen was revised in January 2021第五章 DCSDCS 数据采集技术数据采集技术 10 页 万字目前各种 I/O 设备提供的对外数据接口可分为以下几类:1,数字通讯接口,包括串口类,以太网(TCP/IP 协议)类,现场总线类,仪器总线类通讯接口(如 GPIB 等).2,模拟量通道输出,设备直接提供 4-20mA,1-5V 或继电器接点信号等.力控 具有世界上大部分主流设备的 I/O 接口程序,对 GPIB 总线以及 Honeywell,Yokogawa,Foxboro,Fisher-Rosemount 等厂家的 D

2、CS 也能够支持.除通常意义上的数据采集外,力控 可以利用采集到的实时数据对装置进行实时建模,插入力控 自己的先进控制控件,实施先进控制.对一个设备上的数据定义不同的采集周期如果一台设备上有 1000 个实时数据需要采集,而在这 1000 个数据中只有 10 个是经常刷新且需要密切监视的,其余 990 个全部是辅助数据,但是也需要时常查看.如果把这 1000个数据同等地对待,采用统一的扫描周期进行采集,就会严重影响 10 个重要数据的刷新速度.怎样既保证 1000 个数据都能够采集,又确保这 10 个重要数据的采 集速度呢有两种办法:办法 1:为一个设备定义两个逻辑设备,使其具有不同的采集周期

3、,如图 5-1所示.但是这种方法定义的最长扫描周期为 10 分钟.办法 2:不用上面的办法,一台设备只定义一个设备名称也可以达到要求.因为力控 的 I/O驱动对画面中不显示而且没有组态历史趋势和报警的数据是不采集的,仅当画面中显示这个数据时才进行采集.因此将不常用的数据单独组态在一个或几个画面中,使用完毕马上关闭就不会影响整个采集速度.这种方法适用于存在有大量不需要快速更新的数据的情况.图 5-1合理设置扫描周期,避免引起设备死机有些 I/O 设备内部只有一个 CPU,同时负责数据通讯和计算,如果在力控 上设置的数据扫描周期太快容易使设备死机,因此在设置这一参数时应该慎重,最好通过多次试验确定

4、一个合适的扫描周期.一般的串口设备的扫描周期可设在 10-100 毫秒之间.通过拨号方式与 I/O 设备通讯力控 的所有串口 I/O 驱动程序都支持通过 MODEM 以拨号方式与设备通讯.只要正确设置电话号码即可,如图 5-2 所示.1通讯状态监视,设备状态数据的读取力控 为每一个 I/O 设备自动定义了一个系统变量,假如系统中有一个设备 PLC1,则每当 PLC1 不能与力控 正常通讯时,系统变量$IO PLC1 的值就会被置为 O 设备故障属于系统报警.计算机通讯口故障,电缆,PLC 端通讯口的故障,PLC 通讯口与计算机通讯口的参数设置不一致都会造成这种结果.还有一种可能,就是数据连接项

5、错误,如果计算机的命令发给 PLC 的只读参数,PLC 是不会予以理睬的.怎样用 I/O 驱动程序调试 I/O 设备力控 的 I/O 驱动程序有数百个,针对每一种设备都有一个独立的程序.当力控 实时数据库 DB 没有启动时,单独启动 I/O 驱动可以作为本地 I/O 设备调试工具使用.此时可以测试计算机与 I/O 设备的通讯情况,摸索最佳的扫描周期.菜单设置S/参数用来规定 I/O 通讯过程中是否显示计算机发出和设备响应的通讯信息.如图 5-3 所示.菜单工具T/工具用来在不启动实时数据库及其数据连接项的情况下执行与 I/O设备的通讯.弹出对话框如图 5-5 上部所示.此时可以按参数设置按钮设

6、置通讯参数,如图 5-6 和 5-7 所示,主要是设置串口的 DCB 参数,IP 地址等.图 5-2图 5-3 图 5-4正确设置参数后,按连接设备按钮,如果成功的话,连接设备按钮的标题变成断开连接,表示可以收发数据了.如果在参数设置中设置周期性发送周期不为 0,则在连接设备后会出现周期发送按钮,否则出现手动发送按钮.使用周期发送或手动发送按钮,可以周期性或一次性地发送编辑框中的数据了.编辑框中数据的格式缺省是混合方式的,如果你想发送编辑框中的数据,这也是唯一的数据类型,它的形成规则如下:任何 ASCII 码(除)可以直接输入,可以使用来输入;内是由(空格)分隔的转意字符,它们的意义为:图 5

7、-5:用来输入;2*:在发送数据是表示延时 1 毫秒图 5-6#:在发送数据是表示延时 10 毫秒$:在发送数据是表示延时 100 毫秒!:在发送数据是表示延时 1000 毫秒:表示它后面的数据是十进制的(缺省是 16 进制)(空格):作为分隔符,任何未定义的字符都可以作为分隔符,最好使用空格.09:可以用来输入 10 进制或 16 进制数据.AF/af:可以用来输入 16 进制数据.例子:abcv 30*#$!345 对应的 16 进制数据串为:61H,62H,63H,76H,5BH,30H,33H,34H,35H;而且在 30H 之后有 1111 毫秒的延时.当用在其它情况(不是用来发送数

8、据)时,唯一的差别是没有了延时的概念.其它工具:校验使用混合格式的数据,计算常用的校验码,ASCII 码表显示使用 16 进制和10 进制显示的 ASCII 码表,各种数据转换把混合格式,16/32 位整数,32 位浮点数等转换位十几种常用数据格式,除混合格式外,其它数据格式为直接用空格分隔的数据串图 5-7如何开发 I/O 设备驱动程序在力控 中有一个 SDK 工具包,叫做 FIOS SDK,可以开发硬件设备与计算机的通讯接口程序.最简单的只需要编写几个函数就可以可以做自己的 I/O 驱动,现在支持的硬件类型有串口(RS485/232/422),网络,板卡,硬件厂家提供 DLL 等多种方式的

9、通讯类型.在该 SDK中开发自己的通讯接口,不需要关心硬件和计算机通讯的细节,只需要了解通讯协议就可以了.如果通讯协议很复杂,该 SDK 中提供了足够灵活的手段满足不同层次的需要.例如:在设备初始化时发什么命令或做其他处理,动态改变硬件通讯参数等等.5.6.1 FIOS 开发包简介FIOS 负责完成与各种 I/O 设备进行数据交换.一方面,它把从 I/O 设备采集到的实时过程数据发送给数据库 DB,另一方面,从 DB 发出的下置数据也通过 FIOS 发送给I/O 设备.根据监控 PC 与 I/O 设备之间通信机制的不同,FIOS 主要支持两种工作方式:同步方式与异步方式.异步方式适用以下一类

10、I/O 设备:这类 I/O 设备一般可以独立运行,与监控计算机之间通过串口,网络或 MODEM 连接.与监控计算机之间通过明确的消息传送(文本或二进制消息)完成数据交换.数据交换过程为异步方式.同步方式适用以下一类 I/O 设备:这类 I/O 设备或者依赖 PC 运行(如:插在 PC 插槽内),或者独立运行.但与监控计算机之间主要通过直接访问方式进行数据交换,具体形式包括:寄存器直接访问(如:板卡),API 函数调用,ActiveX 控件访问等.数据交换过程为同步方式.下面列举了 FIOS 可实现的一些基本功能:底层通信功能:1),串口通信,包括:RS232/422/,TCP/IP 网络通信.

11、3),MODEM3通信,通过模拟 MODEM 在电话网上通信.4),寄存器访问,如:各种 DAS 板卡.5),其它.链路控制功能:用 M 代表 Master,即上位机(监控 PC 工作站);S 代表 Slaver,即下位机(各种 I/O 设备).对于异步方式,FIOS 支持多种链路控制方式.链路控制方式支持以下几种方式:1),M 请求,S 应答方式.2),M 请求,S 无应答方式.3),S 主动发送,M被动等待.另外,对一次完整数据处理(读或写)过程,支持以下方式:1),1 次请求,0次应答方式.2),1 次请求,1 次应答方式.3),1 次请求,多次应答方式.4),0 次请求,1次应答方式.

12、5),多次请求,多次应答方式.冗余功能:FIOS 支持的冗余方式包括:1),单监控站,双 I/O 冗余.2),双监控站,单I/O 冗余.3),双监控站,双 I/O 冗余.4),对于总线型设备(如 RS485),提供总线监测功能,可实现对冗余通信网络的保护和监测.前端机功能:DB 与 IO Server 不在同一工作站上,IO Server 运行在前端机上,前端机与操作站之间通过串口,TCP/IP 网络或 MODEM 进行通信.硬件测试与远程调试功能:使用 FIOS 可完成对 I/O 设备的简单测试功能.另外可实现远程调试.故障诊断与恢复功能:FIOS 提供诊断机制,在较短的采集周期内报告故障的

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

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

15、PI 函数和C+类库.FIOS SDK 组件及示例程序FIOS SDK 主要由 4 部分组成:设备组态接口(Iodevui),数据连接组态接口(Ioitemui),编程接口 Ioapi 和描扫程序:负责管理设备组态过程.Ioitemui:负责管理数据连接组态过程.Ioapi:负责完成与 I/O 设备间的数据交换,包括:对通信协议的解析,数据格式的转换等.Ioscan:主要完成对 Ioapi 部分的 dll 代码进行周期性地扫描.同时完成与 I/O设备的底层通信(串口通信,网络通信等),以及设备超时处理,设备故障诊断等.Ioscan还负责与数据库 DB 之间的通信与协作.它把从 I/O 设备采集

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

17、BUS 设备 I/O 驱动程序的方法.FIOS SDK 的全部内容都是在安装在力控 自动安装的,在力控 目录下的子目录Fiossdk中.FIOS SDK 主要包含以下几部分内容:Examples,程序示例,仿真程序.Include,头文件.Manual,文档说明.Utility,调试工具.这 2 个示例具有一定的代表性,它们体现了 FIOS SDK 的主要功能.FIOS SDK 提供了这 2 个示例的全部源代码,在它们的基础上,稍做改动,就可以开发出新的 FIOS.我们把象这 2 个示例源程序一样具有模板作用的程序称为 I/O 模板程序.为了提高开发效率,我们建议尽量使用 I/O 模板程序,这

18、在一定程度上,也减少,降低了编程错误的发生.常用术语我们把 FIO SDK 中经常涉及的一些概念给出定义,有些术语虽然是通用名词,但在FIOSDK 中有特定含义.这些术语有一些在前文给出了解释,有一些会在后文中陆续给出解释.FIOS ForceControl I/O Server,即力控 I/O 驱动程序FIOS SDK FIOS 软件开发工具包FCINSTDIR 力控 软件系统的安装目录FCAPPINSTDIR 用力控 创建的工程应用的目录IOID 唯一区别各个 I/O 驱动程序的 I/O 标志Iodevui 设备组态接口Ioitemui 数据连接组态接口Ioapi 编程接口Ioscan 扫

19、描程序I/O 模板程序 FIOS 工 SDK 附带示例的源程序I/O 配置文件 设备组态时的缺省参数设置保存文件连接项结构 保存数据连接信息的数据结构 IOITEMDEFI/O 描述文件 定义设备的类别,厂商,型号,通信方式等参数的文本文件程序员 在本文档范围内专指用 FIOS SDK 进行开发的技术人员扫描函数 包含在 Ioapi 中的 API 函数,它们由扫描程序周期扫描.扫描函数完成对设备数据解析及格式转换IOC Input Output Class(输入输出类库)的缩写.设备组态接口I/O 描述文件在使用力控 进行组态时,一般均涉及定义 I/O 设备的过程.在定义设备时,要选择设备的类

20、别(PLC,智能仪表等),厂商,设备型号或通信协议,然后根据设备通信方式(串口方式,网络方式,其它方式等)设置参数.以上关于一种设备的信息(类别,厂商,型号,通信方式等)完全是由 I/O 描述文件决定的.I/O 描述文件是一个标准文本文件,根据其规定的填写格式,由程序员根据具体设备自行填写.下面介绍 I/O 描述文件的填写格式.I/O 描述文件的文件名为,安装目录为:FCINSTDIRIO ServersIOID.IO 文件说明格式为:类别;厂商或 IO 程序描述;执行文件名称5子类型 1;类型号;资源标志;提供设备地址子类型 2;类型号;资源标志;提供设备地址.注意,子类型号不能重复.表示回

21、车换行.最上面一行是驱动程序的总体描述,包括三项.各项之间必须以分号;分隔.各项内容不能含有分号;.各项含义如下:类别,驱动程序所属类别,现分为以下几类:PLC,智能仪表,智能模块,变频器.程序员也可以自行扩展.厂商或 IO 程序描述,I/O 设备生产厂商名称,协议名称,如西门子.执行文件名称,I/O 驱动程序(运行程序)的名称,如接下来几行为驱动程序所包含的设备类型的描述,如西门子包括 S5,S7 等,每一子类别一行,每行包括三项,各项之间必须以分号;分隔.各项内容不能含有分号;.各项含义如下:子类型,设备类型描述.如 S5.类型号,设备类型编号,类型号不能重复.合法的值为 0,1,2,3

22、等.使用计算机资源,使用计算机何种通信资源通信,合法的值为0,1,2 等.含义如下:0,同步通信方式;1,串口通信方式;2,TCP/IP 网络通信方式;3,MODEM通信方式;4,板卡方式;5,并口通信方式.提供设备地址:1 表示需要指定设备地址,否则表示不需要设备地址.管理程序会自动将相同厂商或 IO 程序描述相同的驱动程序归为同一树下.开发 Iodevui力控 组态环境 DRAW 中的设备管理功能提供了一个根据 I/O 描述文件可灵活配置的标准设备组态接口.这个组态接口提供了一些对常用设备参数进行设置的方法.如:设备名称,设备地址,通信端口,端口参数等.如下图所示:对于很多设备,如果标准设

23、备组态接口能够满足要求,就不再需要自己编写Iodevui 接口程序了.比如示例 DemoController 采用的就是标准设备组态接口.而示例DemoModbus因为涉及一些特殊的参数设置,就需要自己编写 Iodevui 接口程序了.因此,Iodevui 接口程序实际上就是对标准设备组态接口的一个补充和扩展,并可由程序员灵活控制.Iodevui 要以 DLL 形式提供.该 DLL 必须是 MFC 扩展 DLL.该 DLL的缺省文件名称为,该文件必须安装在目录FCINSTDIRIO ServersIOID下.在进行设备组态时,力控 的 I/O 设备管理程序会自动检查在目录FCINSTDIRIO

24、ServersIOID下是否存在文件.如果存在,则首先根据 I/O 描述文件的格式,调出标准设备组态接口界面,当用户确认后,再调出 Iodevui 组态接口界面;若不存在该文件,则只调出标准设备组态接口界面.示例 DemoModbus 的 Iodevui 接口程序可以做为开发 Iodevui 的模板程序.我们结合示例 DemoModbus 的 Iodevui 模板程序具体解释实现过程.查看头文件可以发现,主要实现 3 个输出函数:6extern C AFX_EXT_API long AddIoDev(const char*szDeviceName,intnType);extern C AFX_

25、EXT_API long ModIoDev(const char*szDeviceName);extern C AFX_EXT_API long DelIoDev(const char*szDeviceName);在进行设备组态时,当增加一个设备时,力控 设备管理程序会自动调用AddIoDev()函数;当修改一个已创建设备时会调用 ModIoDev()函数;当删除一个设备时会调用DelIoDev()函数.其中,参数 szDeviceName 为 I/O 设备名称(输入值,组态时由用户指定).nType为设备子类型号,由程序员在 I/O 描述文件中指定.返回值为 0 表示操作成功;其它表示操作失

26、败.为了较好地实现程序结构化,本模板程序提供了一个 CDevMan 类对设备及组态操作过程进行管理.的 3 个输出函数 AddIoDev(),ModIoDev()DelIoDev()的具体实现过程是在 CDevMan 的三个成员函数 Add(),Mod()和 Del()中实现的.首先看一下 Add()的实现代码:外两个函数和它类似.Store()函数如下:void CDevMan:Store()CFile file;7if(const char*)(),CFile:modeReadWrite|CFile:modeCreate)CArchive ar(&file,CArchive:store);

27、Serialize(ar);();();该函数它先打开文件,如果不存在,就建立此文件.然后调用序列化函数对它进行保存,最后关闭此文件.再看一看序列化函数:void CDevMan:Serialize(CArchive&ar)TRYCObject:Serialize(ar);(ar);CATCH(CFileException,e)AfxMessageBox(文件版本不匹配!);END_CATCH该函数对 m_list(由 CDevice 类实例组成)进行序列化.在调用各个 CDevice 类实例的序列化函数时,如果是读取操作,会依次创建 CDevice 实例,并调用 CDevice 的序列化函数

28、,随后把 CDevice 实例加入 m_list 链表.具体保存和读取的变量数据在 CDevice类中控制,也就是说程序员针对不同的设备可以改写 CDevice 类,定义不同的成员变量,记录设备的不同的属性,对 CDevice 类重载 Serialize 即可实现设备的保存,加载,增加,删除和修改等功能.我们再看一下 CDevice 类序列化的实现过程:void CDevice:Serialize(CArchive&ar)if()ar temp;int nDevCnt=pManager-GetDeviceCount();for(int i=0;i GetDevice(i);arstrtemp;

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

30、存设备参数信息,这就是数据连接项结构(下面简称连接项结构)IOITEMDEF.IOITEMDEF 定义在中:typedef struct IoItemDefStruchar str64;long n8;IOITEMDEF;这个结构是一个通用结构,由程序员自己赋值,自己解释.Ioitemui 要以 DLL 形式提供.该 DLL 必须是 MFC 扩展 DLL.该 DLL 的缺省文件名称为,该文件必须安装在目录FCINSTDIRIO ServersIOID下.Ioitemui 的工作过程如下:在进行数据连接组态时,力控 的 DBMAN 管理程序会自动检查在目录FCINSTDIRIOServersIO

31、ID下是否存在文件.如果存在,则调出数据连接组态接口界面.下面介绍如何编写 Ioitemui 接口程序.主要实现 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,设备子类型(用于一个驱动程序

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

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

34、内存地址可以让用户输入 0255 之间的数据.11我们介绍一下如果不使用 I/O 模板,如何自己生成一个新的 Ioitemui 工程:在 VC+环境下,选择菜单命令 new,选择新建工程,工程名为 Ioitemui,选择MFCAppwizard(dll)选项,在下一步 DLL 类型中选择MFC Extension DLL型,然后按下Finish键.即可创建一个新的 Ioitemui 工程.打开文件,在文件的开头加入#include,把拷入本工程,然后在文件的最后键入:long DoItemDlg(const char*strDataSour,int nType,IOITEMDEF&item,c

35、har*szDesc,int nFlag)这就加入了 dll 的输出函数.打开示例 DemoController 的 Ioitemui 模板程序,它的 DoItemDlg()函数实现过程如下:long DoItemDlg(const char*szDeviceName,int nType,IOITEMDEF&item,char*szDesc,int nFlag)CLinkDlg dlg;0=0;1=1;switch(nFlag)case 0:个对话框为用户进行数据连接组态时提供一个界面,其形式如下:12CLinkDlg 类有 2 个成员变量:CString m_desc;ONOK 消息函数进行

36、如下处理:void CLinkDlg:OnOK()UpdateData(TRUE);扫描程序 IOSCANIOSCAN 是 FIOS 的一个主要程序模块.它负责完成对 IOAPI 部分的 DLL 代码进行周期性地扫描.同时完成与 I/O 设备的底层通信(串口通信,网络通信等),以及设备超时处理,设备故障诊断等.IOSCAN 还负责与数据库 DB 之间的通信与协作.它把从 I/O设备采集到的数据经 IOAPI 解析转换后提交给 DB,或将 DB 下置给 I/O 设备的数据经IOAPI 解析转换后写入 I/O 设备.IOSCAN 是 FIOS SDK 提供的一个标准软件工具供程序员在调试和运行时直

37、接使用.13FIOS 开发工具包里提供了 debug 和 release 版本的 IOSCAN 程序,在目录FCINSTDIRFiossdkUtility下可以找到它们.Debug 版本的 IOSCAN 程序主要供程序员在调试时使用,它能提供更为丰富的调试信息.在使用时,需要把以及配套的几个 DLL 文件(即目录FCINSTDIRFiossdkUtilityDebug下的 DLL 文件)拷贝到生成的debug 版本的文件的同一目录下(注意:debug 版本的文件必须配合 debug 版本的 IOSCAN 程序,release 版本的文件必须配合 release 版本的IOSCAN 程序).同时

38、不要忘记将的文件名更改为要开发的 I/O 驱动的 IOID名称.debug 版本的 IOSCAN 需要程序员手工启动或用 VC+调试启动.编程接口IOAPI 是 FIOS 提供的最主要的一个编程接口.程序员的主要工作就是开发 IOAPI部分的程序代码.IOAPI 提供了一组 API 函数和一些 C+类库.这组 API 函数规定了名称,参数及返回值,函数内容由程序员根据具备的 I/O 设备编程实现.C+类库则为程序员提供各种获取力控 I/O 组态信息,参数设置信息,与数据库 DB 进行数据交换等数据处理的方法.我们把这组 API 函数称为扫描函数,把这些 C+类库称为 IOC,IOC 是 Inp

39、ut OutputClass(输入输出类库)的缩写.程序员编写的 Ioapi 最后要形成 MFC 的扩展动态链接库(MFC Extension DLL),扫描函数是这个 DLL 的输出函数.当力控 系统运行时,力控 FIOS 的扫描程序 Ioscan对 Ioapi中扫描函数部分的 dll 代码进行周期性地扫描,它把从 I/O 设备采集到的数据经扫描函数解析转换后提交给 DB,或将 DB 下置给 I/O 设备的数据经扫描函数解析转换后写入I/O 设备.归结起来,开发 Ioapi 的主要内容就是用 IOC 编写扫描函数.IOC 中的所有类库全部以纯虚类的形式提供,并且只有成员函数,没有成员变量.目

40、前 IOC 中主要包括 4 个类:CItem,CPacket,CDevice,CManager.CItem,数据项类.CPacket,数据包类.CDevice,设备类.CManager,管理器类.一个 FIOS 实例创建一个 CManager 实例.用户在组态时每定义一个设备,则创建一个CDevice 实例.CManager 对所有的 CDevice 进行管理.一个 CDevice 实例,由一个或多个CPacket 实例组成,而每个 CPacket 实例又由一个或多个 CItem 实例组成.每个CItem 实例,对应数据库 DB 中的一个点参数,也就是对应 I/O 设备的一个点(如:设备的一个

41、通道,一个参数等).IOC 提供的这 4 个类库,实际上就是对以上所述的这几种数据对象提供了一组操作方法,以供程序员更加灵活的控制程序.Citem 类CItem 类提供了对数据项对象的一组操作方法.一个数据项对象包含的是数据库DB 中的一个点参数与 I/O 设备中一个物理通道的映射关系.CItem 使用的基本数据结构是IOITEMDEF.一个 CItem 实例保存一个 IOITEMDEF 实例.IOITEMDEF 的定义如下:typedef struct IoItemDefStruchar str64;long n8;IOITEMDEF;14CItem 类的定义如下:class CItem:p

42、ublic CObjectpublic:virtual IOITEMDEF*GetItemStru()=0;virtual void SetReadOnly(BOOL bAttribute=TRUE)=0;virtual void SetWriteOnly(BOOL bAttribute=TRUE)=0;virtual void SetData(short sData)=0;IOITEMDEF*GetItemStru()功能:取得数据连接项结构指针.参数:无.返回值:数据项结构指针.举例:IOITEMDEF*pItemStru=pItem-GetItemStru();long nCmdType

43、=pItemStru-n3;2.void SetReadOnly(BOOL bAttribute=TRUE)功能:设置连接项的写属性,缺省时连接项是可写的.参数:TRUE:设置为不可写;FALSE:设置为可写.返回值:无.举例:for(int i=0;i GetItemCount();i+)CItem*pItem=pPacket-GetItem(i);pItem-SetReadOnly();3.void SetWriteOnly(BOOL bAttribute=TRUE)功能:设置连接项的读属性,缺省时连接项是可读的.15参数:TRUE:设置为不可读;FALSE:设置为可读.返回值:无.举例:

44、for(int i=0;i GetItemCount();i+)CItem*pItem=pPacket-GetItem(i);pItem-SetWriteOnly();4.void SetData(short sData)功能:按短整型格式设置采集数据.参数:短整形数据值.返回值:无.5.void SetData(long lData)功能:按长整型格式设置采集数据.参数:长整型数据值.返回值:无.6.void SetData(double fData)功能:按浮点格式设置采集数据.参数:浮点数据值.返回值:无.7.void SetData(char*szData)功能:按字符串格式设置采集数

45、据.参数:字符串数据值.返回值:无.8.void GetData(char*szData)功能:按字符串格式取得上一次用 SetData()设置的采集数据.参数:存放最近一次设置的采集数据(字符串型数值)的字符串指针.缓冲区长度应不小于 32.返回值:无.举例:char szData32;pItem-GetData(szData);9.void SetPrivateData(unsigned short offset,long lPrivateData);功能:设置私有数据.参数:offset,私有数据的偏置,03;lPrivateData,长整型私有数据.返回值:无.备注:Ioscan 自动

46、为每个 CItem 实例分配了一块由 4 个整型数(32 位)组成的程序员私有数据空间供程序员使用.程序员除了用这部分私有数据区保存数值外,也可以分配新的内存空间,然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,正确释放新分配的内存空间.举例:char*pBuf=new charMAXCMDLEN;pItem-SetPrivateData(3,(long)pBuf);10.long GetPrivateData(unsigned short offset)16功能:取得私有数据.参数:offset,私有数据的偏置,03;lPrivateData,长整型私有数据.返回值:整型私有数据

47、.备注:Ioscan 自动为每个 CItem 实例分配了一块由 4 个整型数(32 位)组成的程序员私有数据空间供程序员使用.程序员除了用这部分私有数据区保存数值外,也可以分配新的内存空间,然后将内存指针保存在私有数据区内,但不要忘记,在程序退出前,正确释放新分配的内存空间.11.CPacket*GetPacket()功能:取得本连接项类所归属的数据包指针.参数:无返回值:本数据项所归属的数据包指针.举例:CPacket*pPacket=pItem-GetPacket();12.CDevice*GetDevice()功能:取得本连接项所归属的设备指针.参数:无返回值:本连接项所归属的设备指针.

48、13.CManager*GetManager()功能:取得 Ioscan 管理器指针.参数:无返回值:Ioscan 管理器指针.14.void SetHisData(HisInsDatStru*pHisInsDatStru,int nCount)功能:按浮点型格式设置历史数据参数:无返回值:无Cpacket 类CPacket 类提供了对数据包对象的一组操作方法.一个数据包对象包含一个或多个数据项对象.CPacket 类的声明如下:class CPacket:public CObjectpublic:virtual int GetItemCount()=0;virtual void SetRea

49、dOnly(BOOL bAttribute=TRUE)=0;virtual void SetWriteOnly(BOOL bAttribute=TRUE)=0;int GetItemCount()功能:取得本数据包内数据项的个数.参数:无.返回值:本数据包内数据项的个数.举例:int nItemCnt=pPacket-GetItemCount();2.int AddItem(CItem*pItem);功能:按先后顺序加入数据连接项.参数:加入数据包的数据项指针.返回值:本数据包内数据项的个数.举例:if(pPacket-GetItemCount()=0)pPacket-AddItem(pIte

50、m);3.void InsertItem(CItem*pItem,unsigned short nIndex)功能:按指定位置加入数据连接项.参数:pItem,加入数据包的数据项指针.nIndex,加入的数据项在数据包内的序号(从0 开始).返回值:本数据包内数据项的个数.4.CItem*GetItem(int nIndex);功能:按序号取得数据连接项.参数:nIndex,数据项在数据包内的序号(从 0 开始).返回值:数据项指针.举例:for(int i=0;i GetItemCount();i+)CItem*pItem=pPacket-GetItem(i);.5.void SetRead

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁