




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VB绘制实时曲线2010-09-14 09:28:30 作者:佚名 来源: 浏览次数:56在工控制软件中,实时曲线的绘制用途非常的广泛,它可以很直观的显示出监控数据的变化值和变化趋势。在VB中实现曲线的绘制有很多种方法,本文介绍一种非常简单的方法来实现实时曲线的绘制。在VB中实现实时曲线的绘在工控制软件中,实时曲线的绘制用途非常的广泛,它可以很直观的显示出监控数据的变化值和变化趋势。在VB中实现曲线的绘制有很多种方法,本文介绍一种非常简单的方法来实现实时曲线的绘制。在VB中实现实时曲线的绘制,要利用VB的PictureBox(图像)控件,和画线函数line(x1,y1)-(x2,y2)。PictureBox控件,可以作为一个“容器”,在它的里面可以包含很多的对象。也可以执行很多VB的内部函数。要实现实时曲线的绘制,肯定要有外部实时数据的输入,这里假设是有一个数据从计算机的串口输入 定义该数据变量为DataFromCom。实时曲线反映的就是该数据。打开VB6.0中文版,新建一个项目和窗体,修改窗体的属性,将“Heigh”修改为:8000,“Width”修改为在窗体中放如一个PictureBox控件。然后重新定义PictureBox控件的一些基本属性,在VB中选中PictureBox控件,直接在它的属性框中,修改一些属性参数。“名称”改为Pic。 “AutoRedraw”改为:True。“BackColor”改为:&H00004000&(墨绿色背景颜色)。”Heigh”改为:5000。“Width”改为:8000。如图1所示:然后要重新定义PictureBox控件的坐标系。图像框的默认坐标系,是从左上角开始的,不符合我们的画线要求。修改坐标系的目的是让曲线从图像框的左边正中间,开始画线。修改图像框的坐标系,这里定义一个过程PicScale(),代码如下:Private Sub PicScale(picX As PictureBox)picX.Scale (0, PicX.ScaleHeight)-(picX.ScaleWidth, -PicX.ScaleHeight) End Sub一般的实时曲线显示的时候在屏幕的正中间有一条基准线,这里也要画出这条基准线,用一个过程PicMidleLine()来实现,代码如下:Private Sub PicMidleLine( picX As PictureBox)picX.Line (0, 0)-(picX.ScaleWidth, 0), vbGreen 画出中线End Sub要画一条实时曲线,坐标轴的设定很重要,在这里把X轴设定为时间轴,Y轴设定为数据轴。对应X轴我们定义一个时间变量TimeCount,TimeCount会随着时间逐渐递增,每次递增,对应着一个从串口读过来的数据DataFromCom,这样图像框中的(x,y)坐标点实际上就对应着(TimeCount,DataFromCom)如果只是当TimeCount发生变化时就在图像框上画一个点,就只需调用VB中的画像素的函数point(x,y),这里x,y为所画的点的坐标。单这样画出来的是一个个不连续的点。我们想要的是实时的连续的曲线,所以要调用VB中的画线的函数line(x1,y1)-(x2,y2),这里(x1,y1)(x2,y2)为所要画的线的起点和终点的坐标。只要把上次串口读过来的数据(这里把它定义为变量DataFromComLast)和现在串口读过来的数据(DataFromCom)和TimeCount相对应,调用line(x1,y1)-(x2,y2)函数就可以在图像框中画出实时的曲线了。把它写成一个过程如下面的代码:Private Sub DrawRealLine(picX As PictureBox, TimeCountX As Integer, DataFromComX As Integer, DataFromComLastX As Integer)If TimeCountX - 1 0 ThenpicX.Line (TimeCountX - 1, DataFromComLastX)-(TimeCountX, DataFromComX), vbWhiteEnd IfEnd Sub有了三个过程就可以在图像框中画出一条实时的曲线了。DrawRealLine()过程中的picX.Line (TimeCountX - 1, DataFromComLastX)-(TimeCountX, DataFromComX), vbWhite所画线的起始点和结束点都是以像素为单位的,这样以来如果不改变的话,画出来的线将是一个屏幕上像素相连的很密的曲线,通过调整line(x1,y1)-(x2,y2)中的x的值,就可以画出分布密度不一样的曲线,这里为了在屏幕上能够看到不是很密的曲线我们把x乘以一个系数10,修改为:picX.Line (TimeCountX - 1) * 10, DataFromComLastX)-(TimeCountX * 10, DataFromComX), vbWhite这比较容易在屏幕上看到稀疏的曲线。由于是仅仅讲解如何画出实时的曲线,读者的计算机上未必有和串口相连的设备,这里用一个定时器控件来模拟从串口读过来的数据。在窗体上放入一个Timer控件,修改Timer控件的属性为:“Enable”该为True,“Interval”改为300。双击Timer控件在它的过程中,添加代码后如下:Private Sub Timer1_Timer()DataFromComLast = DataFromComRandomizeDataFromCom = 3000 * RndTimeCount = TimeCount + 1DrawRealLine Pic, TimeCount, DataFromCom, DataFromComLastEnd Sub这样在运行后就可以看到我们想要的实时曲线了,如下图:图 2下面是完整的代码:Option ExplicitDim DataFromCom As Integer 从串口读过来的实时值Dim DataFromComLast As Integer 上次的串口值Dim TimeCount As IntegerPrivate Sub Form_Load()PicScale Pic 调整图像框的坐标系PicMidleLine Pic 在图像框中画一条中线End SubPrivate Sub PicScale(picX As PictureBox) 调整图像框的坐标系picX.Scale (0, picX.ScaleHeight)-(picX.ScaleWidth, -picX.ScaleHeight)End SubPrivate Sub PicMidleLine(picX As PictureBox) 在图像框中画一条中线picX.Line (0, 0)-(picX.ScaleWidth, 0), vbGreen 画出中线End SubPrivate Sub DrawRealLine(picX As PictureBox, TimeCountX As Integer, DataFromComX As Integer, DataFromComLastX As Integer)If TimeCountX - 1 0 ThenpicX.Line (TimeCountX - 1) * 10, DataFromComLastX)-(TimeCountX * 10, DataFromComX), vbWhiteEnd IfEnd SubPrivate Sub Timer1_Timer()DataFromComLast = DataFromComRandomizeDataFromCom = 3000 * RndTimeCount = TimeCount + 1DrawRealLine Pic, TimeCount, DataFromCom, DataFromComLast 画出实时的曲线本文转自紫苹果电脑网()原文地址:/a/2010/0914/19633.htmlpicturebox不够大怎么办?大家看下吧!谢谢大家好,我想请问一下,我想在picturebox里面把我采样到的数据绘成波形图,我用了给picturebox加滚动条的办法,“画一个PictureBox,采用VB提供的默认名字Picture1, 再在Picture1上面画一个PictureBox,默认名字为Picture2,设置:Picture2.AutoSize=TRUE;接着,加上水平滚动条,默认名字分别为:HScroll1;再在Picture2上绘图”但是,我有问题,就是我用了滚动条后,画到7个字节多一点的数据的时候,再拖动滚动条已经不可以了,它已经到头了,而我要画的数据有几千字节,差的很多呢。详细点说,我画一个字节要用4000,而滚动条好像最大是32767,(是这样的吗?),我的图只能绘一点点,由谁知道这个问题可以怎么解决啊?是画图的代码有问题吗?希望大家能够帮我看看,出出主意吧!Private Sub form_load()Picture1.AutoRedraw = TruePicture1.AutoSize = FalsePicture2.AutoRedraw = TruePicture2.AutoSize = TruePicture2.Left = 0Picture2.Top = 0Picture2.Width = Picture1.WidthPicture2.Height = Picture1.HeightHScroll1.Min = 0HScroll1.Max = Picture2.Width 我看网上的例子是HScroll1.Max = Picture2.Width - Picture1.Width,但要用这句滚动条就不滚动了If HScroll1.Max 0 ThenpicX.Width = picX.Width + 1000 我是用这两句来增加picture2的大小,以便于放下我要画的图picX.Line (TimeCountX - 1) * 500, DataFromComLastX)-Step(500, 0), vbRedpicX.Line -(TimeCountX * 500, DataFromComX), vbRedpicX.Line -Step(500, 0), vbRedpicX.Left = picX.Left + 1000End IfEnd Sub画图过程,八位数据,SCL,SDA线的时序显示Private Sub draw(temp1%)Dim Scl0%, Scl1%, Scl2%Dim Sda0%, Sda1%, Sda2%Dim Scl00%Dim Sda00%Scl0 = (temp1 And &H80) / 128Scl00 = Scl0Sda0 = (temp1 And &H40) / 64Sda00 = Sda0Scl1 = (temp1 And &H20) / 32Sda1 = (temp1 And &H10) / 16Scl2 = (temp1 And &H8) / 8Sda2 = (temp1 And &H4) / 4SclLast = Scl3SdaLast = Sda3Scl3 = (temp1 And &H2) / 2Sda3 = (temp1 And &H1)TimeCounter = TimeCounter + 1If Scl0 = 0 ThenScl00 = 2500ElseScl00 = 3000End IfIf SclLast = 0 ThenSclLast = 2500ElseSclLast = 3000End Ifdrawpicture Form2.Picture2, TimeCounter, Scl00, SclLastTimeCounter2 = TimeCounter2 + 1If Sda0 = 0 ThenSda00 = 1000ElseSda00 = 1500End IfIf SdaLast = 0 ThenSdaLast = 1000ElseSdaLast = 1500End Ifdrawpicture Form2.Picture2, TimeCounter2, Sda00, SdaLastSclLast = Scl0TimeCounter = TimeCounter + 1If Scl1 = 0 ThenScl00 = 2500ElseScl00 = 3000End IfIf SclLast = 0 ThenSclLast = 2500ElseSclLast = 3000End Ifdrawpicture Form2.Picture2, TimeCounter, Scl00, SclLastSdaLast = Sda0TimeCounter2 = TimeCounter2 + 1If Sda1 = 0 ThenSda00 = 1000ElseSda00 = 1500End IfIf SdaLast = 0 ThenSdaLast = 1000ElseSdaLast = 1500End Ifdrawpicture Form2.Picture2, TimeCounter2, Sda00, SdaLastSclLast = Scl1TimeCounter = TimeCounter + 1If Scl2 = 0 ThenScl00 = 2500ElseScl00 = 3000End IfIf SclLast = 0 ThenSclLast = 2500ElseSclLast = 3000End Ifdrawpicture Form2.Picture2, TimeCounter, Scl00, SclLastSdaLast = Sda1TimeCounter2 = TimeCounter2 + 1If Sda2 = 0 ThenSda00 = 1000ElseSda00 = 1500End IfIf SdaLast = 0 ThenSdaLast = 1000ElseSdaLast = 1500End Ifdrawpicture Form2.Picture2, TimeCounter2, Sda00, SdaLastSclLast = Scl2TimeCounter = TimeCounter + 1If Scl3 = 0 ThenScl00 = 2500ElseScl00 = 3000End IfIf SclLast = 0 ThenSclLast = 2500ElseSclLast = 3000End Ifdrawpicture Form2.Picture2, TimeCounter, Scl00, SclLastSdaLast = Sda2TimeCounter2 = TimeCounter2 + 1If Sda3 = 0 ThenSda00 = 1000ElseSda00 = 1500End IfIf SdaLast = 0 ThenSdaLast = 1000ElseSdaLast = 1500End Ifdrawpicture Form2.Picture2, TimeCounter2, Sda00, SdaLastEnd SubDim px(121, 2) As Single, py(121, 2) As SingleDim col As IntegerDim pl As IntegerPrivate Sub Command1_Click()If Timer1.Enabled = True ThenCommand1.Caption = 暂停Timer1.Enabled = FalseElseCommand1.Caption = 开始Timer1.Enabled = TrueEnd IfEnd SubPrivate Sub Form_Load()HScroll1.Value = 900Picture1.Scale (900, 0)-(1200, 300)End SubPrivate Sub HScroll1_Change()Picture1.Clsnum = HScroll1.ValuePicture1.Scale (900 - (900 - num), 0)-(1200 - (900 - num), 300)If pl = 2 ThenFor l = 0 To 2Picture1.PSet (px(0, l), py(0, l) For i = 1 To col Picture1.Line -(px(i - 1, l), py(i - 1, l), QBColor(l * 2) Next i Next l End IfEnd SubPrivate Sub Timer1_Timer()Picture1.ClsIf col 31 ThenFor u = 0 To 2For i = col To col x = 900 + 10 * i y = 50 + 50 * u + Rnd * 20 px(i, u) = x py(i, u) = y Next i Next u col = col + 1 pl = pl + 1 ElseIf col = 2 Then For w = 0 To 2 Picture1.PSet (px(0, w), py(0, w) For i = 1 To col Picture1.Line -(px(i - 1, w), py(i - 1, w), QBColor(w * 2) Next i Next w End If End Sub Private Sub Form_Load()ht = TextHeight(0)Pic1.ScaleWidth = 3600Pic2.Top = Pic1.Top - 50Pic2.Left = Pic1.Left - Pic2.Widthymax = Pic1.ScaleHeightxmax = Pic1.ScaleWidthLabel1.Height = htLabel1.Top = ymax - htLabel2.Top = ymax - htLabel3.Top = ymax - htLabel1.Width = TextWidth(12:00:00)Label2.Width = TextWidth(12:00:00)Label3.Width = TextWidth(12:00:00)End SubVB使用ADODB操作数据库下面是我所掌握的使用ADO对数据库操作的一些常用方法,主要是提供给初学者作为参考,有不对的地方请指正。如有补充不胜荣幸准备工作 =Dim conn As New ADODB.Connection 创建一个 Connection 实例,在这里使用New等于将Dim和Set合并为一段代码执行 Dim rs As ADODB.Recordset 创建一个 Recordset 实例,不使用New 是因为,经常需要重复使用Set,因此没必要在这里使用 Dim CnStr As String, Sql As String 创建两个字符串变量分别存放两个集合的SQL语句代码段1、装载数据库(不属于Recordset集合) = Dim FileNamw$, DbIp$, DbName$, DbUser$, DbPw$ 以上5个字符串变量分别表示文件路径和文件名、数据库地址、数据库名、数据操作员用户名、操作员密码FileName = App.Path & 数据库名 DbIp = 数据库地址 DbName = 数据库名 DbUser = 数据操作员用户名 DbPw = 操作员密码 以上变量根据数据库类型的不同而不同,有可能只需要1至两个变量1)连接Access数据库: - CnStr = PROVIDER=microsoft.jet.oledb.3.51;persist security info =false;data source= & FileName & ;Jet OLEDB:Database Password= & DbPw2)连接Oracle数据库: - CnStr = PROVIDER=MSDAORA.1;Password= & DbPw & ;User ID= & DbUser & ;Data Source= & FileName & ;Persist Security Info=True其中: PASSWORD: 密码 User ID: 用户号 Data Source: 数据库名 Persist Security Info: Provider:3)连接VF的DBF库: - CnStr = PROVIDER=MSDASQL.1;Persist Security Info=False;Driver=Microsoft Visual FoxPro Driver;UID= & DbUser & ;SourceDB= & FileName & ;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;4)连接SQL的数据库 - CnStr = PROVIDER=MSDataShape;Data PROVIDER=MSDASQL;uid= & DbUser & ;pwd= & DbPw & ;DRIVER=SQL Server;DATABASE= & DbName & ;WSID=GQSOFT;SERVER= & DbIP也可以使用这段简易代码 CnStr = Provider=SQLOLEDB;Data Source= & DbIp & ;DATABASE= & DbName & ;UID= & DbUser & ;pwd= & DbPwConn.Open cnstr 使用 Connection 集合的 Open 方法 与数据库建立连接2、Recordset集合的常用方法 =1)打开一个表 -Sql = select * from 表名 SQL查询语句 Set rs = New ADODB.Recordset 新建一个实例 rs.Open Sql, conn 使用 Open 方法打开数据库中的一个表注意,这种打开方式只能使用 rs.MoveNext (即,向后移动行坐标)而不能像其他方向,并且不能修改数据内容 rs.Open Sql, conn,1 虽然只加了个“1”,但这种方法可以向任何方向移动行坐标。 以下参数代表了这个可选值的含义 0 = adOpenForwardOnly (默认值)打开仅向前类型游标。 1 = adOpenKeyset 打开键集类型游标。 2 = adOpenDynamic 打开动态类型游标。 3 = adOpenStatic 打开静态类型游标。 虽然使用以上方法可以可以实现行坐标(游标)的任意移动,但是仍然无法写入数据。因此需要进一步的对Open 方法进行完善rs.Open Sql, conn, 1, 3 后面的3是确定读写权限的以下参数代表了这个可选值的含义 1 = adLockReadOnly (默认值)只读 不能改变数据。 2 = adLockPessimistic 保守式锁定(逐个) 在编辑时立即锁定数据源的记录。 3 = adLockOptimistic 开放式锁定(逐个) 只在调用 Update 方法时才锁定记录。 4 = adLockBatchOptimistic 开放式批更新 用于批更新模式(与立即更新模式相对)。 2)读写数据 - 增加一行记录并对新记录的内容进行修改并保存可以如下写法 rs.AddNew 增加一行记录 rs(.)=. 数据读写操作 . rs.UpDate 保存写入资料,如果使用只读权限,则不能使用这个方法rs.Close 这个方法用来关闭你所代开的表,如果不使用这个方法也可以,但是数据库仍然认为你在对标进行锁定,可造成数据库负担过重2、对数据进行筛选和排序 = Sql = select * from 表名 SQL查询语句 以上为打开一个表的所有内容Sql = select top
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小区美容院合伙经营合同5篇
- 快递员招聘合同范本
- 轻钢结构合同范本
- 福建省公民出国旅游合同2篇
- 街舞机构续费合同范本
- 医院地坪采购合同范本
- 入团申请书高中生(5篇)
- 培优补差工作计划怎么写(5篇)
- 志愿者的英文题目及答案
- 项目评审合同示例
- 大学物理第三版课后习题答案详解
- 现代测试与分析技术绪论
- 第七章-大学生爱情心理
- GB/T 990-1991带式输送机托辊基本参数与尺寸
- 计量检定员考试题库计量基础知识
- 毒理学第三章化学毒物在体内的生物转运和生物转化
- 《小学英语教学研究》近年考试真题参考题库(含答案)
- 网络与信息安全巡检表
- 《路由与交换技术》课程教学大纲
- 北师大版八年级数学上册教案(全册完整版)教学设计含教学反思
- 国家自然科学基金联合申报协议书
评论
0/150
提交评论