发布时间:2026/9/2 7:29:15
从零搭建工业控制系统(十九):图表可视化——LiveCharts2集成 图表可视化LiveCharts2集成这是「从零搭建工业控制系统」系列第19篇。前面讲了数据存储这篇讲数据展示——怎么用LiveCharts2在WPF里画实时图表。为什么选LiveCharts2工业系统需要实时图表——气体流量趋势、压力变化曲线、温度走势。WPF自带的图表控件没有得用第三方。选型时对比了几个库优点缺点LiveCharts2WPF原生、开源、实时更新好文档少OxyPlot功能全、成熟API复杂、实时更新慢ScottPlot性能好WPF支持弱自己画Canvas完全可控工作量大选LiveCharts2的原因实时更新做得好。工业数据每秒都在变图表要跟着变。LiveCharts2用ObservableCollection绑定数据变了图表自动更新不用手动刷新。基本折线图最简单的实时折线图lvc:CartesianChartSeries{Binding SeriesCollection}/publicObservableCollectionISeriesSeriesCollection{get;}new();// 初始化SeriesCollection.Add(newLineSeriesdouble{ValuesnewObservableCollectiondouble(),Name通道A流量,StrokenewSolidColorPaint(SKColors.SteelBlue),FillnewSolidColorPaint(SKColors.SteelBlue.WithAlpha(50))});添加数据点varvalues(ObservableCollectiondouble)SeriesCollection[0].Values;values.Add(currentFlow);数据点加了图表自动更新。不用调 InvalidateVisual不用手动刷新。多通道同时显示气体流量有多个通道需要同时画在一张图上foreach(varchannelinchannels){SeriesCollection.Add(newLineSeriesdouble{ValuesnewObservableCollectiondouble(),Namechannel.Name,StrokenewSolidColorPaint(channel.Color)});}每条线一个Series颜色区分。图例自动生成。性能优化数据点控制这是最大的坑。实时图表每秒加一个点跑一天就是86400个点。图表渲染8万个点会卡。解决办法限制数据点数量。privateconstintMAX_POINTS300;// 最多300个点privatevoidAddDataPoint(ObservableCollectiondoublevalues,doublenewValue){values.Add(newValue);if(values.CountMAX_POINTS){values.RemoveAt(0);// 移除最老的点}}300个点相当于5分钟的数据每秒一个点。操作员看趋势不需要看一整天的数据看最近几分钟就够了。如果要看历史数据从数据库查用单独的历史图表展示不影响实时图表的性能。性能优化渲染降频另一个性能问题数据每秒更新但图表不需要每秒重绘。人眼分辨不出60fps以上的变化。privateDateTime_lastUpdateDateTime.MinValue;privateconstintUPDATE_INTERVAL_MS200;// 200ms更新一次privatevoidOnDataReceived(doublevalue){if((DateTime.Now-_lastUpdate).TotalMillisecondsUPDATE_INTERVAL_MS)return;_lastUpdateDateTime.Now;AddDataPoint(values,value);}200ms更新一次每秒5帧足够看趋势了。CPU占用从30%降到5%。轴配置时间轴用日期格式lvc:CartesianChartlvc:CartesianChart.XAxeslvc:AxisLabeler{Binding TimeSpanLabeler}//lvc:CartesianChart.XAxeslvc:CartesianChart.YAxeslvc:AxisName流量(sccm)MinLimit0//lvc:CartesianChart.YAxes/lvc:CartesianChartY轴设了MinLimit0流量不会显示负数。踩坑记录坑1数据点太多卡顿一开始没限制数据点数量跑了两小时后图表卡得动不了。加了MAX_POINTS限制后解决。坑2图表不释放内存页面切换后图表还在后台更新。需要在页面卸载时清空SeriesCollection取消订阅数据源。坑3轴标签格式化时间轴默认显示秒数操作员看不懂。自定义Labeler改成HH:mm:ss格式。本篇小结概念关键做法实时绑定ObservableCollection自动更新多通道每条线一个Series数据点限制最多300个点FIFO渲染降频200ms更新一次轴配置自定义Labeler和范围实时图表的核心控制数据量。点太多会卡更新太快会卡。限制点数降频更新是关键。下期预告第20篇MVVM消息传递机制图表讲完了下篇讲ViewModel之间怎么通信——消息机制、弱引用、避免内存泄漏。

相关新闻

2026/9/2 7:29:15

嵌入式三温区酒柜:家庭饮品与轻食存储的场景化解决方案

你有没有遇到过这样的场景:朋友来家里聚会,想从冰箱里拿瓶冰镇啤酒,却发现啤酒和蔬菜挤在一起,拿取不便;想开瓶红酒助兴,又担心冰箱的震动和温度波动影响了酒的口感;夏天想随时喝到冰爽的饮料&a…

2026/9/2 7:29:14

1.电机停稳后重启仍过流?PWM寄存器的“隐形坑”及解决方案

在电机控制开发中,你是否遇到过这种情况:电机已经完全停稳,按下启动按钮却瞬间触发过流保护?很多人第一反应是电机没停干净,但真正容易被忽略的,往往是PWM寄存器里的“旧指令”。本文将结合视频中的核心原理…

2026/9/2 7:39:15

从零构建高可用Python机器人框架:插件化架构与事件驱动设计详解

简介:DPbot是一款面向Python开发者与自动化运维人员的轻量级机器人框架,聚焦于企业微信、QQ、Telegram等主流平台的Bot快速开发与插件化扩展,解决多场景下重复性消息处理、定时任务调度与AI能力集成等实际问题。资源包共150个文件&#xff0c…

2026/9/2 7:39:15

SpringBoot整合RocketMQ-毒丸消息还要无限重试吗

RocketMQ 毒丸消息治理:何时停止重试并进入隔离技术背景: RocketMQ 消费失败后重试能够抵抗短暂故障,但对格式永久错误、业务前置条件永远不成立的消息,继续重试只会反复占用消费资源,这类消息通常被称为毒丸消息。企业…

2026/9/2 7:39:15

Python爬虫实现SEO页面巡检:TDK抓取与死链排查实战

简介:利用Python进行SEO数据分析的自动化工具资源,适合SEO专员、网站运营人员以及Python爬虫初学者。资源包内共6个文件,包含可直接运行的exe程序、说明类txt文档、实用htm导航页以及ini配置文件,整体仅786KB,轻量易部…

2026/9/2 7:39:15

知识图谱与推荐系统融合的药物靶点预测:从原理到Python实现

简介:本资源是一套面向计算机及相关专业本科生的课程设计与期末大作业实战项目,聚焦药物-靶点相互作用预测这一生物信息学典型任务,融合知识图谱构建与推荐系统建模两大核心技术。压缩包共40个文件,含9个核心Python脚本&#xff0…

2026/9/2 7:39:15

一台一千瓦的新中波台

▲图注:一座刚建起来的中波台。塔高120米,发射机1千瓦,覆盖目标是脚下这一个县。在"中波正在关停"这个说法流行了十几年之后,一份环境影响报告书的封面下面,建设性质那一栏写着两个字:新建。这是…

2026/9/2 7:34:15

备份一个网页代码

openDB.html<!DOCTYPE html><html lang"zh-cn"> <head><meta charset"utf-8" /><title>开放数据集</title><meta name"keywords" content"开放 数据库 数据集"><meta name"descrip…

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出&#xff0c;第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器&#xff0c;出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台&#xff0c;直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/1 8:27:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流&#xff1a;为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历&#xff1a;明明传感器本身性能很好&#xff0c;信号输出却一塌糊涂——噪声大、漂移明显、重复性差&#xff0c;怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/1 7:04:43

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起&#xff0c;其实就是嵌入式开发里最常遇到的一类需求&#xff1a;用一块不算贵的 MCU&#xff0c;同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控&#xff0c;主频…

2026/9/2 0:03:41

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/2 0:03:41

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

这次我们来看一个很实用的 DeepSeek 落地场景&#xff1a;用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务&#xff0c;标题写得很直白&#xff0c;但背后其实是一整套可以复用的技术流程&#xff1a;字幕解析、模型调用、批量…

2026/9/2 0:03:41

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

当你家里摆着一台天猫精灵&#xff0c;却总希望语音助手偶尔“不正经”一点&#xff0c;不用官方腔回答问题&#xff0c;而是张口就接几句搞笑段子&#xff0c;会是什么体验&#xff1f;我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱&#xff0c;而是直…

2026/9/2 1:15:22

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/2 1:15:22

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…