前言
调试硬件设备时,常面临无示波器可用的困境:设备无法移出产线,或实验室仪器被占用。此时,若能通过软件直接读取数据并绘制波形,将显著提升调试效率。
本文介绍一套模拟工业示波器的实现方案。该方案基于 WPF 和 DevExpress Charts 控件,界面风格复刻真实示波器操作面板,支持波形生成、参数调节及测量数据显示。虽当前采用模拟数据源,但底层架构已预留真实数据接口。
项目介绍
这是一款模拟工业示波器的桌面软件,UI 配色与交互逻辑均参考真实数字示波器。主界面划分为左右两区:左侧为参数控制面板,右侧集成波形显示区与测量数值面板。
技术层面采用 WPF + MVVM 模式,图表渲染依托 DevExpress Charts 组件。波形生成逻辑封装于 ViewModel 中,通过数据绑定实现界面实时更新,确保操作响应流畅。
本项目代码适用于学习 WPF 复杂布局、MVVM 数据绑定及工业软件界面设计,亦可作为真实示波器软件的原型参考。
项目功能
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
项目特点
MVVM 分层清晰:界面层仅负责布局与绑定,业务逻辑集中于 ViewModel,确保界面改动不影响核心逻辑。
DevExpress 图表专业:采用 DXChart 替代原生控件,内置十字光标、轴刻度及网格线,大幅减少样式代码编写。
实时数据绑定:波形数据集合绑定至图表,ViewModel 按采样率定时刷新,实现界面自动响应。
控件联动反馈:调节左侧参数时波形即时变化,无需额外确认操作。
暗色工业主题:背景、网格线及波形颜色均按真实示波器风格设计,适宜长时间观测。
测量参数自动计算:自动计算每个波形的峰峰值、有效值、频率和周期,免去手动读数繁琐。
项目技术
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
项目代码
MainWindow.xaml 关键结构
主界面采用左右分栏布局:左栏为参数设置面板,右栏为波形显示区。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 左栏:控制面板 -->
<Border Grid.Column="0" Background="#2D2D2D" CornerRadius="5" Padding="10">
<ScrollViewer>
<StackPanel>
<TextBlock Text="信号源设置" Foreground="White" FontSize="16"/>
<!-- 波形类型、频率、振幅、占空比、噪声 -->
<dxe:ComboBoxEdit EditValue="{Binding Settings.WaveType}"/>
<dxe:SpinEdit EditValue="{Binding Settings.Frequency}"/>
<!-- 省略其他控件 -->
</StackPanel>
</ScrollViewer>
</Border>
<!-- 右栏:波形显示 -->
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="120"/>
</Grid.RowDefinitions>
<Border Background="Black" CornerRadius="5">
<dxc:ChartControl DataSource="{Binding WavePoints}">
<dxc:XYDiagram2D>
<!-- X 轴:时间 -->
<!-- Y 轴:电压 -->
<dxc:LineSeries2D ArgumentDataMember="Time"
ValueDataMember="Value"
Brush="Yellow"/>
</dxc:XYDiagram2D>
</dxc:ChartControl>
</Border>
<!-- 底部:测量数值 -->
<Border Grid.Row="1">
<UniformGrid Columns="4">
<TextBlock Text="{Binding Vpp, StringFormat={}{0:F2} V}"/>
<TextBlock Text="{Binding Vrms, StringFormat={}{0:F2} V}"/>
<TextBlock Text="{Binding AvgFreq, StringFormat={}{0:F1} Hz}"/>
<TextBlock Text="{Binding Period, StringFormat={}{0:F6} s}"/>
</UniformGrid>
</Border>
</Grid>
</Grid>
ViewModel 核心逻辑
波形生成方法依据所选波形类型计算对应电压值。
private void GenerateWaveform()
{
var points = new List<WavePoint>();
double amplitude = Settings.Amplitude;
double frequency = Settings.Frequency;
double timeBase = Settings.TimeBase;
double samplingRate = Settings.SamplingRate;
int pointCount = (int)(timeBase * samplingRate * 2);
for (int i = 0; i < pointCount; i++)
{
double t = (double)i / samplingRate;
double value = 0;
switch (Settings.WaveType)
{
case WaveType.Sine:
value = amplitude * Math.Sin(2 * Math.PI * frequency * t);
break;
case WaveType.Square:
double duty = (double)Settings.DutyCycle / 100;
double period = 1 / frequency;
value = (t % period) / period < duty ? amplitude : -amplitude;
break;
case WaveType.Triangle:
double triPeriod = 1 / frequency;
double triPhase = (t % triPeriod) / triPeriod;
value = amplitude * (triPhase < 0.5 ? 4 * triPhase - 1 : 3 - 4 * triPhase);
break;
case WaveType.Sawtooth:
double sawPeriod = 1 / frequency;
double sawPhase = (t % sawPeriod) / sawPeriod;
value = amplitude * (2 * sawPhase - 1);
break;
}
// 叠加噪声
value += GenerateNoise(Settings.NoiseLevel);
points.Add(new WavePoint { Time = t, Value = value });
}
WavePoints = points;
CalculateMeasurements(points);
}
触发逻辑处理
触发模式用于控制波形仅在满足特定条件时绘制。
private bool CheckTrigger(double currentValue)
{
double level = Settings.TriggerLevel;
bool edgeMatched = false;
if (Settings.TriggerEdge == TriggerEdge.Rising)
edgeMatched = currentValue >= level;
elseif (Settings.TriggerEdge == TriggerEdge.Falling)
edgeMatched = currentValue <= level;
if (!edgeMatched) returnfalse;
switch (Settings.TriggerMode)
{
case TriggerMode.Auto:
returntrue;
case TriggerMode.Normal:
return _triggerArmed;
case TriggerMode.Single:
if (_triggerArmed)
{
_triggerArmed = false;
returntrue;
}
returnfalse;
default:
returnfalse;
}
}
项目效果
软件启动后,界面分为左右两区。左侧控制面板按功能分组(信号源、采样与时间轴、垂直系统与触发、控制按钮);右侧为波形显示区,黑色背景搭配黄色波形网格,右上角实时显示时间基准与垂直灵敏度。

调节左侧频率旋钮,右侧波形疏密即时变化;调节振幅,波形幅度同步响应。切换波形类型时形状实时更替,方波模式下占空比选项自动显现。
波形区域支持鼠标悬停查看十字光标读数,精确定位时间点电压值。红色虚线标示触发电平,左上角文字指示“已触发”或“等待触发”状态。

底部四个数值面板分别展示 Vpp、Vrms、频率和周期。运行时数值每秒更新,体验贴近真实示波器。
总结
本项目完整展示了工业风格桌面软件从界面到逻辑的实现路径。MVVM 模式实现解耦,DevExpress Charts 提供专业渲染能力,左侧参数面板的实时联动则是工业软件的典型特征。
对于学习 WPF 工业界面开发,本项目代码结构与风格极具参考价值。若接入真实波形数据源(如串口或 TCP 读取),仅需替换 GenerateWaveform 方法中的数据来源,即可将模拟示波器转化为真实的设备调试工具。

