注册 登录
编程论坛 VB6论坛

VB6.0 用mschart控件绘制多条动态曲线怎么做到 请指教 谢谢了

梦千殇 发布于 2015-01-06 14:37, 9565 次点击
VB6.0 用mschart控件绘制多条动态曲线怎么做到 请指教 谢谢了
1.工控的范围
2.用PLC获取4路模拟量动态显示曲线
3.数据已经获取
不知道启用mschart控件怎么实现 请高手指点 谢谢了
18 回复
#2
lianyicq2015-01-06 14:48
查了查百度http://wenku.baidu.com/link?url=UxLZQhPwod4QO2LoofC8o3f6jgKqtzkPpso4ReDlswKVj4c1lSrzToNdQP6Uvr_c0fscZb8410B6iciM9ZxVXWrZGM3V4FMSTJ8NMRYoXGy
不知动态的意思是不是每个采样周期读取一次PLC数据?如果是,建议用画点,画线的办法.
如果动态的意思是数据全都传到了PC,再每过一个时间间隔画一个数据点,也建议用画点,画线的办法.
如果只是把已有的数据一次画出来,那可以用mschart控件
#3
梦千殇2015-01-06 15:06
回复 2楼 lianyicq
动态的意思是 每一秒读一次plc的数据 mschart控件中也显示相应的曲线 也就是一秒钟加一个点 我用一条曲线绘制的图以完成 但不知怎么设置多条曲线显示 就是同时绘制多条 我这里需要四条曲线 您能帮忙吗 谢谢了
#4
lianyicq2015-01-06 15:10
这个是画两条,改变数据数组的维数.
http://wenku.baidu.com/link?url=VG_fUq66FN1MD6GuP9EvBValLqoVAH6GWGU5nUcFWiTg4iOAAjg_QlKyGi5gW7UgB9cOCweU2hdRA5D5VYc7BvDQGUx0ejZlYkU6zkvOSM_
#5
梦千殇2015-01-06 16:09
回复 4楼 lianyicq
这个例子我看过 不是动态的 我要用timer控件触发 接受
#6
lianyicq2015-01-06 16:36
没仔细研究过mschart控件,从它的使用方法看侧重于画静态图。如果必须用它,开辟一个数据区,存放串口来的数据,每个时间间隔收到PLC来的数据后,重画整个数据区。效率似乎不高。如果用画点画线的方法就容易多了,来一个数据画一个点或一条线,不用考虑以前的数据。
实际试了用MSCHART每隔一定时间重新画图,闪烁相当严重。和示波器显示不可同日而语。

[ 本帖最后由 lianyicq 于 2015-1-7 09:30 编辑 ]
#7
梦千殇2015-01-07 10:40
回复 6楼 lianyicq
现在不知道怎么实现 不知道怎么编程 我只做出了一条动态曲线(实时采集并实时显示的) 但不知道怎么再加 不清楚数组 怎么定义 并给mschart控件赋值
现在不考虑效率 只要能实时动态显示多条曲线就可以了 1秒钟采集一个点 一共采集600秒 我用的散点图类型  重点是数组的定义及赋值 以及给machart控件赋值  您这知道吗 求帮助 效率和画面闪烁不考虑
#8
lianyicq2015-01-07 10:49
回复 7楼 梦千殇
数组mydata(m,n).
第一排(1 ,0) 到(m,0)是横坐标值
第二排(1,1)到(m,1)是第一个曲线的纵坐标值
第三排(1,2)到(m,2)是第二个曲线的纵坐标值
以此类推
画一条曲线可以用散点,一条以上只能用line
给数组赋值可以直接赋值,也可以绑定数据库.

#9
梦千殇2015-01-07 10:52
回复 6楼 lianyicq
Dim mydata(600, 1)
Dim i As Single
Private Sub Form_Load()
With MSChart1
     .TitleText = "压强变化 kpa/s"
'    '设置图线的外观
    .Plot.SeriesCollection(1).Pen.Width = 30
       .Plot.SeriesCollection(1).Pen.Style = VtPenStyleSolid
        .Plot.SeriesCollection(2).Pen.Width = 30
       .Plot.SeriesCollection(2).Pen.Style = VtPenStyleSolid
        .Plot.SeriesCollection(3).Pen.Width = 30
       .Plot.SeriesCollection(3).Pen.Style = VtPenStyleSolid
      
      
'    '设置XY轴
    .Plot.Axis(VtChAxisIdX).ValueScale.Auto = False
    .Plot.Axis(VtChAxisIdY).ValueScale.Auto = False
    '// 设置最大值
    .Plot.Axis(VtChAxisIdX).ValueScale.Maximum = 600 '设置横轴标注最大值
    .Plot.Axis(VtChAxisIdY).ValueScale.Maximum = 1000 '设置纵轴标注最大值
    '// 设置最小值
    .Plot.Axis(VtChAxisIdY).ValueScale.Minimum = 400
    .Plot.Axis(VtChAxisIdX).ValueScale.Minimum = 0
    .Plot.Axis(VtChAxisIdX).ValueScale.MajorDivision = 6 'X轴主要网格数量
    .Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 6 'Y轴主要网格数量
    .Plot.Axis(VtChAxisIdX).ValueScale.MinorDivision = 0 'X轴次要网格数量
    .Plot.Axis(VtChAxisIdY).ValueScale.MinorDivision = 0 'Y轴次要网格数量
    .Plot.Axis(VtChAxisIdX).AxisGrid.MajorPen.Style = VtPenStyleDotted
    .Plot.Axis(VtChAxisIdY).AxisGrid.MajorPen.Style = VtPenStyleDotted
   ' .Plot.Axis(VtChAxisIdY).AxisTitle = "压强(kpa)"
       .Plot.Axis(VtChAxisIdX).AxisTitle = "时间(s)"
    MSChart1.Plot.AutoLayout = False
    MSChart1.Plot.UniformAxis = False
    MSChart1.chartType = VtChChartType2dXY '设置图形为二维散点图
'    MSChart1.ChartData = mydata
   
    'MSChart1.Backdrop.Fill.Style = VtFillStyleBrush
    'MSChart1.Backdrop.Fill.Brush.FillColor.Set 0, 0, 0
'   For i = 1 To 600
''   .Row = i
'   .RowLabel = i
'   Next
   
   
    End With
End Sub

Private Sub Timer1_Timer()

mydata(i, 0) = i
mydata(i, 1) = 700
MSChart1.ChartData = mydata
i = i + 1

    If i > 600 Then
    Timer1.Enabled = False
    Else
    Timer1.Enabled = True
    End If
End Sub
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录

这是我做的程序 只能动态显示一条曲线  显示多条 怎能定义数组 和 给mschart控件赋值
#10
lianyicq2015-01-07 11:01
回复 9楼 梦千殇
Dim mydata(600, 1) '若画两条1改为2。并为第二条曲线的纵坐标赋值,即mydata(0~600,2)
 MSChart1.chartType = VtChChartType2dXY '设置图形为二维散点图,此外改为二维折线图
#11
梦千殇2015-01-07 11:14
回复 8楼 lianyicq
按照你说的方法我又试了一下,程序如下:
Dim mydata(600, 2)
Dim i As Single
Private Sub Form_Load()
With MSChart1
     .TitleText = "压强变化 kpa/s"
'    '设置图线的外观
    .Plot.SeriesCollection(1).Pen.Width = 30
       .Plot.SeriesCollection(1).Pen.Style = VtPenStyleSolid
        .Plot.SeriesCollection(2).Pen.Width = 30
       .Plot.SeriesCollection(2).Pen.Style = VtPenStyleSolid
'        .Plot.SeriesCollection(3).Pen.Width = 30
'       .Plot.SeriesCollection(3).Pen.Style = VtPenStyleSolid
      
      
'    '设置XY轴
    .Plot.Axis(VtChAxisIdX).ValueScale.Auto = False
    .Plot.Axis(VtChAxisIdY).ValueScale.Auto = False
    '// 设置最大值
    .Plot.Axis(VtChAxisIdX).ValueScale.Maximum = 600 '设置横轴标注最大值
    .Plot.Axis(VtChAxisIdY).ValueScale.Maximum = 1000 '设置纵轴标注最大值
    '// 设置最小值
    .Plot.Axis(VtChAxisIdY).ValueScale.Minimum = 400
    .Plot.Axis(VtChAxisIdX).ValueScale.Minimum = 0
    .Plot.Axis(VtChAxisIdX).ValueScale.MajorDivision = 6 'X轴主要网格数量
    .Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 6 'Y轴主要网格数量
    .Plot.Axis(VtChAxisIdX).ValueScale.MinorDivision = 0 'X轴次要网格数量
    .Plot.Axis(VtChAxisIdY).ValueScale.MinorDivision = 0 'Y轴次要网格数量
    .Plot.Axis(VtChAxisIdX).AxisGrid.MajorPen.Style = VtPenStyleDotted
    .Plot.Axis(VtChAxisIdY).AxisGrid.MajorPen.Style = VtPenStyleDotted
   ' .Plot.Axis(VtChAxisIdY).AxisTitle = "压强(kpa)"
       .Plot.Axis(VtChAxisIdX).AxisTitle = "时间(s)"
    MSChart1.Plot.AutoLayout = False
    MSChart1.Plot.UniformAxis = False
    MSChart1.chartType = VtChChartType2dLine
    'VtChChartType2dXY '设置图形为二维散点图
'    MSChart1.ChartData = mydata
   
    'MSChart1.Backdrop.Fill.Style = VtFillStyleBrush
    'MSChart1.Backdrop.Fill.Brush.FillColor.Set 0, 0, 0
'   For i = 1 To 600
''   .Row = i
'   .RowLabel = i
'   Next
   
   
    End With
End Sub

Private Sub Timer1_Timer()

mydata(1, 0) = 0
mydata(i, 0) = i
mydata(1, 1) = 700
mydata(i, 1) = 700
mydata(1, 2) = 500
mydata(i, 2) = 500

MSChart1.ChartData = mydata
i = i + 1

    If i > 600 Then
    Timer1.Enabled = False
    Else
    Timer1.Enabled = True
    End If
End Sub
效果如下:
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录

不知道 是哪里的问题  就是图表显示的不清楚 我需要怎么改  谢谢了
#12
lianyicq2015-01-07 11:35
600个点太密了,你把代码中的所有的600改成20看看效果.
或者不画X格线: .Plot.Axis(VtChAxisIdX).AxisGrid.MajorPen.Style = VtPenStyleNull

[ 本帖最后由 lianyicq 于 2015-1-7 12:54 编辑 ]
#13
梦千殇2015-01-07 13:01
回复 12楼 lianyicq
我改成20个之后,效果好点了,但我必须要600个采集点,一秒钟一个,我需要采集10分钟的数据,我的程序:
Dim mydata(20, 2)
Dim i As Single
Private Sub Form_Load()
With MSChart1
     .TitleText = "压强变化 kpa/s"
'    '设置图线的外观
    .Plot.SeriesCollection(1).Pen.Width = 30
       .Plot.SeriesCollection(1).Pen.Style = VtPenStyleSolid
        .Plot.SeriesCollection(2).Pen.Width = 30
       .Plot.SeriesCollection(2).Pen.Style = VtPenStyleSolid
'        .Plot.SeriesCollection(3).Pen.Width = 30
'       .Plot.SeriesCollection(3).Pen.Style = VtPenStyleSolid
      
      
'    '设置XY轴
    .Plot.Axis(VtChAxisIdX).ValueScale.Auto = False
    .Plot.Axis(VtChAxisIdY).ValueScale.Auto = False
    '// 设置最大值
    .Plot.Axis(VtChAxisIdX).ValueScale.Maximum = 20 '设置横轴标注最大值
    .Plot.Axis(VtChAxisIdY).ValueScale.Maximum = 1000 '设置纵轴标注最大值
    '// 设置最小值
    .Plot.Axis(VtChAxisIdY).ValueScale.Minimum = 400
    .Plot.Axis(VtChAxisIdX).ValueScale.Minimum = 0
    .Plot.Axis(VtChAxisIdX).ValueScale.MajorDivision = 5 'X轴主要网格数量
    .Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 6 'Y轴主要网格数量
    .Plot.Axis(VtChAxisIdX).ValueScale.MinorDivision = 0 'X轴次要网格数量
    .Plot.Axis(VtChAxisIdY).ValueScale.MinorDivision = 0 'Y轴次要网格数量
    .Plot.Axis(VtChAxisIdX).AxisGrid.MajorPen.Style = VtPenStyleDotted
    .Plot.Axis(VtChAxisIdY).AxisGrid.MajorPen.Style = VtPenStyleDotted
   ' .Plot.Axis(VtChAxisIdY).AxisTitle = "压强(kpa)"
       .Plot.Axis(VtChAxisIdX).AxisTitle = "时间(s)"
    MSChart1.Plot.AutoLayout = False
    MSChart1.Plot.UniformAxis = False
    MSChart1.chartType = VtChChartType2dLine
    'VtChChartType2dXY '设置图形为二维散点图
'    MSChart1.ChartData = mydata
   
    MSChart1.Backdrop.Fill.Style = VtFillStyleBrush
    MSChart1.Backdrop.Fill.Brush.FillColor.Set 255, 255, 255
'   For i = 1 To 600
''   .Row = i
'   .RowLabel = i
'   Next

   .Refresh
   
   
    End With
End Sub

Private Sub Timer1_Timer()

mydata(1, 0) = 0
mydata(i, 0) = i
mydata(1, 1) = 700
mydata(i, 1) = 700
mydata(1, 2) = 500
mydata(i, 2) = 500

MSChart1.ChartData = mydata
i = i + 1

    If i > 20 Then
    Timer1.Enabled = False
    Else
    Timer1.Enabled = True
    End If
End Sub
效果如图:
只有本站会员才能查看附件,请 登录

我只做了两条曲线,但显示的是3条并且还不是从x=0处开始的,有办法改吗 还有 我需要600个点 有办法完善吗  谢谢了
如果vb6.0用mschart控件画多条动态曲线有弊病的话,还有别的更好的方法实现吗 谢谢了
#14
梦千殇2015-01-07 13:05
回复 12楼 lianyicq
采集600个点,不画x轴坐标的效果是这样的
只有本站会员才能查看附件,请 登录

底下有黑色道道 很难看
#15
lianyicq2015-01-07 13:20
三条线的原因
改      
 .Plot.SeriesCollection(1).Pen.Style = VtPenStyleNull

你该知道下边为什么是黑色吧.
在MSChart1.ChartData = mydata后增加

For temp = 1 To 601
MSChart1.Row = temp
MSChart1.RowLabel = ""
Next
就算没有黑道,也难看.建议用点或画线的办法.

[ 本帖最后由 lianyicq 于 2015-1-7 13:21 编辑 ]
#16
梦千殇2015-01-07 13:27
回复 15楼 lianyicq
我是刚接触vb的 以前有些基础基础也只限于课本上的东西 但没做过工程 不懂您说的用画点和线的方法是什么 您能指导一下吗 谢谢了
#17
lianyicq2015-01-07 13:46
现成的mschart控件是把数据往里装,显示格式不一定满足各种需求.
显示实时信号,可能会有幅值缩放,扫描时间设定,多通道操作等功能.
可以用PSET按你要求画点,比如坐标位置,点的颜色,点的大小.如果你用数据的纵坐标乘以一个可随时设定的幅值缩放的比例后点用PSET就更好了.
时间是横轴,也可以设定个扫描时间,比如一般以一个像素为间隔.如果设为十像素一个间隔,波形就被拉宽了.
你觉得PSET画出的波形不好看,是不连续的.就用LINE的方法.设定起点和终点的坐标,比如当前t秒对应点设为终点,t-1秒对应点设为起点.这样各点之间就用直线连上了.
可以参看前段时间有个画WAV波形的贴子.是用LINE实现的
#18
梦千殇2015-01-07 14:00
回复 17楼 lianyicq
line方法 是在picture控件中画吗 我之前见过例子 如果是的话 我就试着画画试试 谢谢您的帮助
#19
八云2018-03-20 00:22
回复 17楼 lianyicq
PSET画点,timer间隔设置为1ms,一条曲线数据多了以后,
几秒钟都画不完一条线,这种方式不适合曲线的动态显示。
1