设为首页
收藏本站
PLC技术网
开启辅助访问
切换到宽版
登录
注册哦
只需一步,快速开始
微信扫码登录
门户
Portal
论坛
BBS
导读
排行榜
积分充值
帖子
搜索
本版
文章
帖子
用户
PLC论坛-全力打造可编程控制器专业技术论坛
»
论坛
›
控制专题
›
『高级语言/组态软件/触摸屏』
›
C# 上位机实现高效示波器功能
返回列表
发新帖
C# 上位机实现高效示波器功能
[复制链接]
44535
|
0
|
2024-12-24 14:27:41
|
显示全部楼层
|
阅读模式
前言
如何用C#去做一个示波器功能,这里的示波器主要是用于单片机的调试。下面,我主要分享一下做示波器的一些心得。这里示波器是用WinForm做的,了解到有很多开源的曲线控件,比如:chart,Oxyplot,scottplot,hslcontrols等,当然还有一些收费的曲线控件,这里就不一一说了。同时,自己画一个曲线图也是可以的。最开始学习别人的示波器制作,如下:
正文原理这个示波器的原理1、首先定义在示波器界面代码里或者自己创建一个缓存数据的类,在定义静态的队列用来缓存数据,这里四个通道,则是4个队列 public static volatile Queue<int> quedata1 = new Queue<int>(dataCountMax);//通道1数据
public static volatile Queue<int> quedata2 = new Queue<int>(10001);
public static volatile Queue<int> quedata3 = new Queue<int>(10001);
public static volatile Queue<int> quedata4 = new Queue<int>(10001);2、在接收数据的地方先出一个数据,再进一个数据 FrmScope.quedata1.Dequeue();
FrmScope.quedata1.Enqueue(comData.data1);
FrmScope.quedata2.Dequeue();
FrmScope.quedata2.Enqueue(comData.data2);
FrmScope.quedata3.Dequeue();
FrmScope.uedata3.Enqueue(comData.data3);
FrmScope.quedata4.Dequeue();
FrmScope.quedata4.Enqueue(comData.data4);3、打开示波器界面时,先将队列填满for (int i = 0; i < dataCountMax; i++)
{
if (quedata1.Count < dataCountMax)
{
quedata1.Enqueue(0);
quedata2.Enqueue(0);
quedata3.Enqueue(0);
quedata4.Enqueue(0);
}
}4、将队列转化为数组赋值给自己画好的控件进行定时刷新,只要保证每个数据自己的采样时间间隔一样,波形应该就很完美if (ScopeRun)
{
QueToArray(quedata1, arrScope1);
QueToArray(quedata2, arrScope2);
QueToArray(quedata3, arrScope3);
QueToArray(quedata4, arrScope4);
}
Invalidate();//刷新显示 由于自己做的一个调试软件通道特别多,而且没有固定的通道,需要做到随意添加曲线的功能,并且还由于美观原因就没有采用这种做法。于是,我去学习了一下scottplot和Oxyplot控件,学习发现,对于动态曲线,Oxyplot控件显示的更好且操作更方便,Scottplot在静态曲线上则更有优势,数据可达百万级别。经过甄别,我选择了Oxyplot控件。示波器大致界面(这里我自己做的模拟数据方便展示):
思路
1、首先我们先和上方一样,肯定要定义一个数据缓存的队列。不过,我们这里先定义了一个曲线实体类,用来存储数据,定义了一个公共类来缓存曲线以及索引曲线的名字,队列采用的是阻塞队列(生产者与消费者问题)。
2、模拟一下生产数据,存入队列
3、在另一个线程里面不断去索引所添加的曲线,自己可以封装一下添加和删除曲线的方法,这里就不展示了。
就这样,示波器功能就完成了。我采用阻塞队列这种方式去显示实时波形,不知道还有没有别的方法去实现,有好的见解可以评论区留言。注意当然,上面做的过程中还有一些错误得必坑:1、我存储的时候不存储时间可以不?我觉得实际过程中如果横坐标为点的个数的话,那你曲线采样的时间则是消费者的延时时间,特别是在出现故障再次恢复曲线时会出现时间间隔导致波形问题。2、遍历曲线之前要先转化为list,不要在foreach里面去tolist,当你添加曲线时偶尔会报错。
3、消费者的时间可以往短了放,因为你横坐标为时间,不会影响实际的波形。4、就是多线程里this.Invok的问题了,千万不要为了省事情,while循环里面先套个Invoke再说,这样是会耗时间的,只要针对你需要委托的地方用就行,别乱用。
总结
C# 上位机软件不仅实现了基本的示波器功能,还提供了丰富的扩展特性,极大地方便了在研发、测试和维护过程中对电信号的监测与分析。最后如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
作者:磊磊吖
出处:cnblogs.com/zhuiyine/p/18601179声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!
END
方便大家交流、资源共享和共同成长纯技术交流群,需要加入的小伙伴请扫码,并备注【加群】
推荐阅读
.NET 高性能、低内存的CSV导出开源库
.NET 支持多平台高效通用 Socket 通信框架
C# 跨平台机器视觉与机器学习的强大开源库
开源 .NET 分布式实时计算框架,支持二次开发
Plotly.NET 为 .NET 打造的强大开源交互式图表库
觉得有收获?不妨分享让更多人受益
关注「DotNet技术匠」,共同提升技术实力
收藏
点赞
分享
在看
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
注册哦
x
回复
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册哦
本版积分规则
发表回复
回帖后跳转到最后一页
北岛李工
回复楼主
返回列表
『运动控制/工业总线』
『机器视觉/AI/IoT/机器人论坛』
『高级语言/组态软件/触摸屏』
『操作系统xp/xin7/win10/linux』