如何进行工业实时曲线绘制(50分)

  • 主题发起人 主题发起人 南柯一梦
  • 开始时间 开始时间

南柯一梦

Unregistered / Unconfirmed
GUEST, unregistred user!
初涉数据采集,遇到难题:绘制工业实时曲线
要求:多通道显示
构思:用PaintBox绘图。
现不知道如何控制时实显示,哪位大侠做过的,可否指点一二!有相关代码或程序最好,我的QQ:67663233,恳请大家不吝赐教!
 
在delphi中,这种图都是用dbchart画的,
有关这方面的资料,估计在任何一本delphi书中都可以看到
如果要我说话太多,一两句话说不清
 
我偿试过用chart,不能满足客户显示要求,一屏要画16条曲线,而且自定义内容较多,有分析成份在里面,所以决定自己画了!
 
TeeChart不行么?
 
Teechart不行,显示效果达不到要求,我不知道如何在这里贴图,如果可以的,我可以把要求的界面贴上来
 
可以把数据先画到一个bm:tbitmap对象上,然后响应paintbox.onpaint事件,在事件中写
代码 paintbox.canvas.draw(bm,0,0),当更新数据时会重画bm和调用paintbox.onpaint刷新
显示.
yuan_aoi@163.com
 
大体上明白了一点儿,我先研究吧,如果能分享几行代码就更好了!
 
大问题解决了,用了大哥的方法后,原来的paintbox是透明的,后面我用了一张image的背景画网格,现在用了大哥的方法后,网格没有了,应该是paintbox背景成了白色的了吧
 
我设置 了bitmap为透明,不知道什么原因,现在paintbox当波形画到最右端即画满一屏后,波形要继续向右推进,就像心电头那东西一样,左边要消去一个点,右边增加一个点,我不知道原来波形如何擦除,所以波形就叠加到原来的波形上了!
 
自己帮忙顶一下,希望朋人关注!
 
起始PaintBox本身就是一画布,PaintBox.Canvas.moveto(x1,y1)+PaintBox.Canvas.lineto(x2,y2)。就可以实现从某点画线到某点了。
paintbox的坐标原点是它的左上,和我们现实中的习惯有些不一样。
所以需要转换。还有要考虑到实际坐标和显示坐标的比例,(也就是放大缩小多少倍的关系)。
如果你的画波形的速度要求很高,需要用到双缓冲!
清除画布设置一下画布的底色,重新去画波形,不过可能会有闪烁的哦!
 
with frmMain.PaintBox2.Canvas do begin
Brush.Color := Meter[0].BkColor;
FillRect(ClipRect);
end;
 
1. 这些都是属于比较基础的计算机图形(图像)显示技术;
2. 如果是整屏(整窗口)刷新, 建议使用先在后台内存中画图, 再拷贝到前面的方法;
3. 如果在一个窗口中,修改局部点、线, 则应该使用内存数据+异或等图像显示的方法:
具体就是记住每次画的点、线的数据, 下次要更新, 先删除旧的,画出新的即可;
 
我现在想到一个思路:就是每画一个点判断该点是否到了画布最右端。如果到了最右端,则将屏幕数据保存下来,当下一次画点时,先处理保存的屏幕数据,将最新的一个数据放进保存的屏幕数据中,且移除最老的点,数据处理完成后,用异或方法擦除原有的屏幕,再用新数据重绘屏幕,这样的话,当只要有一屏满的话,我就要做此项工作,这样就浪费时间和资源,不知道还有没有更好的办法!
谢谢大家关注我的问题!
 
我也用到paintbox做工控的曲线,共同学习
我找到一段代码,加我qq:87971840
 
用动态数组/内存流来保存所需要绘制图形的数据(点,和点时刻,也就是x,y的实际值,也可以存放点在屏幕上显示的x,y坐标)。
用两个‘指针’一个指向是屏幕开始点,一个指向屏幕结束点(最后的那个点),画线时判断最后那个点 x>=paintbox.clientWidth 成立时,第一个指针+1。(另一个指针是你画点时inc)。
两个指针始终保持屏幕上起始和终止点的位置。
这样以后你写平移波形代码时还可以用的到。
 
谢谢你的提示,现在有这个问题,当x>=paintbox.clientWidth 成立时,屏幕上原有的波形全部要更新(点的位置),更新后,原波形如何清除,是不是还得保存原来的屏幕数据,然后当x>=paintbox.clientWidth 成立时,用异或擦除,然后重绘?
 
异或不是很好的方法,(比如你的窗体的Paintbox控件部分被某个窗口遮挡了,Paintbox就会出现空白部分,这时你如何去补画)。
检测到x>=Paintbox.clientwidth成立后
with frmMain.PaintBox2.Canvas do begin
Brush.Color := Meter[0].BkColor;
FillRect(ClipRect);
end;
接下来在画栅格
for i:=p1 to p2 do
循环画你的点。


如果你的画点周期>500毫秒甚至更小一点。上面的方法完全可以实现你需要的功能。处理好,也感觉不到闪烁。
如果周期很短,那就要另找他法,用双缓冲。
 
有关双缓冲 在大富翁里很多富翁都有笔记/问题。就不多缚述了。
 
我这里有一个绘制工业实时曲线控件,包函源代码。如果有意:联系方法:wenrui_2002@sina.com QQ:272248270
 
后退
顶部