logo资料库

VB波形曲线图控件开发.pdf

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
《工业控制计算机》2006 年 19 卷第 5 期 29 基于 VB 的趋势图控件开发 Develop ment of Trend OCX Bas ed on Vis ual Bas ic 区志励 蔡晋辉 张光新 ( 杭州浙江大学控制科学与工程学系, 浙江 杭州 310027) 针对工控软件趋势图制作比较复杂的特点, 开发了基于 VB 的趋势图控件, 该控件不仅功能强大, 而且具有高通用性、易 摘 要 用性、可扩展性和实时性, 可以方便地嵌入到工控软件中。 关键词: 趋势图, OCX 控件, API 函数 Abs tract For the complexity of Trend component in indus try control s oftware,this paper pres ents a trend OCX bas ed on Vis ual time capability,eas y to us e and can be Bas ic which realized powerable function,has good univers alnes s ,extendibility,real mebedded into the s oftware. Keywords :trend,OCX,API functions 趋势图的制作比较复杂, 为每个软件专门制作趋势图会造 成大量重复劳动, 而使用趋势图控件能大大加快开发速度。本控 件以便携式数据采集显示软件为应用背景, 用于监控双稳态电 磁 阀 的 信 号 波 形, 显 示 高 频 采 样 数 据, 因 此 实 时 性 要 求 高 , 并 且 需要兼备实时和历史趋势显示功能。考虑到现有为数不多的趋 势图控件都存在着种种不足, 因此开发了基于 Vis ual Bas ic 的 趋 势 图 控 件, 在 满 足 显 示 实 时 性 、功 能 完 备 性 的 同 时 , 又 具 有 很 高的通用性、易用性和可扩展性。 1 控件功能的实现 趋势控件界面见图 1。在技术实现 上, 以 Picture 控 件 作 为 趋势显示视图, Line 控件作为坐标网格。横坐标刻度反映时间, 位 于 视 图 下 方; 纵 坐 标 刻 度 反 映 趋 势 数 据 值, 位 于 视 图 左 方 。4 个 滚 动 条 供 操 作 者 水 平 、垂 直 缩 放 、垂 直 平 移 和 水 平 平 移 波 形 , 滚动条的控制值在右下角动态显示。操作者通过双击下方各个 颜色块设置控件背景色、视图背景色、网格颜色、各条波形颜色, 并通过微调按钮控件设置各条波形的线宽。右下角的“暂停”按 钮具有暂停实时趋势显示功能。 图 1 控件界面 用 户 编 写 应 用 程 序 时 通 过 属 性 页 设 置 控 件 主 要 的 属 性 : ① 趋 势 类 型 TrendType 、 ② 视 图 宽 度 ShowWidth、 ③ 视 图 高 度 ShowHeight、④终点时 间 坐 标 His EndTime 、⑤时 间 坐 标 间 隔 His Inteval、⑥输 入 量 程 上 限 SetNormalTop 、⑦输 入 量 程 下 限 s etNormalLow、⑧纵 坐 标 显 示 下 限 Vubound 、⑨纵 坐 标 显 示 上 限 VLbound 。这些属性决定趋势显示的设置。 1.1 趋势的显示 本控件兼备实时 /历史趋势显示功能, 并能在同一视图中同 时显示多个趋势波形, 操作者者可以在控件界面上在线调整视 图设置, 例如波形颜色。 应用程序通过调用控件的 LoadTrendData 方 法 显 示 趋 势, 调用格式为: TrendOCX1.LoadTrendData(LineNo,Data()) 参数 LineNo 传入趋势波形 编 号 、Data () 传 入 趋 势 数 据 数 组。显示实时趋势时载入的数据作为原有趋势波形的延续, 而显 示历史趋势时载入的是整个视图的数据。 应用程序 通 过 设 置 控 件 属 性 TrendType 决 定 趋 势 图 类 型, 下 面 对 它 的 三 种 情 况(1- 实 时 , 2- 历 史 , 0- 复 位)分 别 介 绍 趋 势 显示的实现。 ( 1) 实时趋势显示 仿效示波器的特点, 当前点在视图右端显示, 随着时间的变 化整个波形动态地左移。其实现方法是: 1) 由 于 需 要 根 据 水 平 缩 放 滚 动 条 的 控 制 值 压 缩 波 形 , 因 此 把 输 入 的 趋 势 数 据 TrendDataIn () 按 水 平 缩 放 比 例 系 数 HorScale 抽样保存为显示数据数组。由于趋势数组的长度并不 总能被水平缩放系数整除, 因此最后要保存它的余数作为剩余 点数, 和下次调用 LoadTrendData 函数时, 传入的数据相组合。 2) 调用 WINDOWS 的 API 函数 BitBlt 把原有波形的像素进 行位块( Bit- Block) 转换后向左 偏 移 一 定 距 离( 同 时 显 示 多 个 趋 势 时, 这 一 步 骤 只 在 画 第 一 条 趋 势 波 形 时 调 用 ) , 并 清 空 腾 出 的 区域。原有波形的左移距离等于左移前的终点横坐标超出视图 宽度的部分。 3) 用抽样后的趋势数据绘制趋势曲线的具体算法是: ①把 上次绘图命令的曲线终点作为这次的起点。②把抽样得到的趋 势数据和垂直滚动条偏移量相加, 并由输入量程归一化成视图 高度范围, 作为趋势各点的纵坐标。③把要画的整条波形曲线分 解成首尾相接的多段直线, 循环调用 API 函数 LineTo 绘制分段 直线。每段直线两端点间横向距离 1 像素, 横坐标从起点开始依 次递增; 纵坐标由步骤②得出。④绘图结束保存终点坐标作为下 次绘图命令的曲线起点。 经测试, API 绘图函数的速度优于 VB 自带的绘图方法。通 过使用 API 函数, 本控件提高了绘图速度, 能更好地满足高速趋 势显示的实时性要求。 ( 2) 历史趋势显示 历史趋势的显示算法和实时趋势基本一致, 需要额外考虑 的问题是: 1) 除了用户调用 LoadTrendData 可以显示历史趋 势 外, 以
30 后通过改变控件属性导致视图设置发生改变时 ( 例如滚动条移 动) 控件内部也要自动刷新趋势。由于后一种情况下没有数据从 外界输入, 因此 LoadTrendData 传入的历史趋 势 数 据 将 被 保 存 在全局变量数组 His Data 中。 2) 每次绘图命令载入的趋势数组长度有可能超出视图宽度 能显示的范围。实时趋势的波形是动态平移的, 但历史趋势则无 法同时显示整个波形, 因此设置了平移滚动条, 这样就可以显示 其中任意一处的波形。 若 1.1 中抽样保存后的显示数据数组长度超出 视 图 宽 度 范 围, 则需要按视图宽度截取显示数据, 抽样起点取决于平移滚动 条的百分比控制值。若没有超出视图宽度范围, 则无需激活平移 滚动条, 显示数据数组可以直接使用。无论是哪一种情况, 只要 平移滚动条不移动, 整个波形的终点都锁定在视图右端, 这样做 的 好 处 是 与 实 时 趋 势 中 当 前 点 锁 定 视 图 右 端 的 做 法 相 一 致 , 在 以后显示时间坐标时算法可以统一, 简化程序的结构。 虽然实时和历史趋势的数据处理方法不一样, 但是由于采 用了模块化的思想, 所以最后显示调用的是同一子过程。 ( 3) 显示复位 实时趋势本身是不断刷新的, 因此不用复位, 但历史趋势在 以 下 这 些 情 况 下 则 必 须 复 位 , 复 位 的 功 能 是 清 屏 并 清 空 数 组 His Data : 1) 历史和实时趋势之间的切换。 2) 历史趋势的绘图设置发生改变。 3) 历史趋势的数据被重新载入。 实 现 复 位 的 方 法 是 在 应 用 程 序 中 令 控 件 属 性 TrendType = 0 使 LoadTrendData 的功能变为复位。 1.2 时间坐标的显示 基于 VB 的趋势图控件开发 时 间 坐 标 显 示 算 法 流程图见图 2。 1.3 其他功能 ( 1) 鼠标跟踪 当显示历史趋势时, 用 户 在 视 图 上 单 击 右 键 可以启动鼠标跟踪功能。 目 的 是 在 趋 势 图 上 跟 踪 显 示 鼠 标 所 在 点 的 时 间 坐 标 以 及 该 时 间 对 应 的 各条波形上的数据值。其 中 时 间 坐 标 的 推 算 前 面 已介绍, 参数值可以根据 该 点 在 趋 势 数 组 中 的 相 应位置读取。当同一视图 显示多条波形的时候, 为 了 保 持 控 件 界 面 的 紧 凑 和整洁, 控件通过输出属 性 把 各 个 跟 踪 值 传 给 应 用程序, 并通过 Rais eEvent 激发跟踪事件, 通知应用程序读取跟 踪值, 从而实现了可扩展性和易用性的统一。 图 2 时间坐标显示算法流程图 ( 2) 鼠标框选放大视图 该功能的实现原理是根据鼠标框选区域的大小和位置调整 滚动条, 其中难点在于控制平移滚动条使框选区域与视图左端 相吻合, 算法是: 平 移 滚 动 条 的 值= 框 选 区 域 在 整 个 趋 势 中 的 像 素 位 置 / 单 位像素对应的平移滚动条的控制值 本控件具有鼠标跟踪功能, 并且时间轴需要显示坐标, 因此 用户随时可以在视图上双击左键把视图复位到默认状态。 时间坐标显示的实现是本控件开发的一大重点和难点。 2 趋势图控件的应用 本控件设计了两种显示方式: 按点数显示和按时钟格式显 示( 精确到秒) 。用户根据需要输入趋势数据的终点 His EndTime ( 定义为 Variant 变量) 和相邻每两点时间间隔 His Interval, 控件 便能自动推算出视图上任一点的横坐标。 具体实现算法是: ( 1) 计算该点到趋势终点的点数距离。 1) 计 算 视 图 右 端 到 趋 势 终 点 的 点 数 距 离 , 当 平 移 滚 动 条 未 激 活 时 ( 未 出 现 数 组 长 度 超 过 视 图 宽 度 的 历 史 数 据 ) 它 为 0, 否 则它取决于平移滚动条的百分比控制值和未显示出来的趋势数 据数组长度。 2) 计 算 该 点 到 视 图 右 端 的 点 数 距 离, 它 取 决 于 水 平 缩 放 系 数和该点到视图右端的像素距离。 3) 以 上 两 步 算 出 的 两 个 点 数 距 离 相 加, 得 到 该 点 到 趋 势 终 点的点数距离。 ( 2) 用 Is Date 函 数 判 断 His EndTime 的 具 体 类 型 , 便 可 知 道用户选择的显示方式 1) 函 数 返 回 值 为 Fals e , 则 His EndTime 是 非 日 期 变 量 , 则 按点数显示。终点时间减去步骤(1)得到的点数距离便得到该点 的时间坐标。 2) 函数返回值为 True , 则 His EndTime 是日期变量, 按时钟 格式显示。由于需要进行时刻转化, 因此它比按点数显示更复 杂: ①步骤 1 得到的点数距离乘以相 邻 每 两 点 时 间 间 隔 His In- terval, 转化成时刻距离。②该时刻距离单位是秒, 还无法直接与 终点时间相加减, 因此把它再转化成日期变量。③用终点时间减 去该日期变量得到该点的时间坐标。 以下是该控件在便携式数据采集显示软件中的应用。 系统用 Art 公司的 USB2006 数据采集卡读取 6 个通道的数 据, 分别是 1 组电压, 1 组电流和 4 组温度, 每一个通道的采样频 率是 3kB /s , 共用了 3 个趋势图控件实时显示, 同时具有历史趋 势保存和显示的功能。该采集板卡 AD 精度为 12 位, AD 原始数 据 LSB 总宽度为=4096, 因此设置输入下限 NormalLow=0, 上限 NormalTop=4096; 量程为电压 0~500V、电流 0~5A、温度 0~ 50℃, 因此分别设置 3 个控件的纵坐标显示下限 LBound=0, 上 限 Ubound=500、5、50。可见由于把输入和输出上下限分开设置 并把量程换算放在控件内部, 用户使用十分方便。 为提高采样效率, 每次采样命令从采集卡读取的数据量高 达 1.6kB, 已远超出显示视图的像 素 宽 度, 但 仍 可 以 只 调 用 一 次 LoadTrendData 函数就正确地依次显示 8064 个点, 保证了程 序运行效率。应用程序中采样、显示和存盘用了三个子线程, 保 证了实时性。在实际使用中, 快速稳定地跟踪出了高频波形( 如 图) , 满足了应用要求。 3 结束语 本 文 介 绍 的 趋 势 图 控 件 实 现 了 同 时 显 示 多 个 趋 势 波 形 、在 线 调 整 视 图 设 置 、鼠 标 跟 踪 和 缩 放 、动 态 坐 标 显 示 等 强 大 功 能, 并具有高通用性、易用性、可扩展性和实时性, 达到了预期功能。 参考文献 [ 1] 李际.Windows 2000 API 超级宝典[M].北京: 人民邮电出版社, 2001 [ 2] 文远熔.使用 API 函数提高 VB 环境下绘制曲线 速 度[J ]. 重 庆 工 商 大 学学报, 2005, 22( 2) : 148- 152 [ 收稿日期: 2005.10.21]
分享到:
收藏