翻譯|使用教程|編輯:龔雪|2024-03-26 10:35:18.597|閱讀 109 次
概述:本教程主要介紹如何創(chuàng)建一個(gè)具有高速DAQ圖表的DAQ系統(tǒng)應(yīng)用程序,歡迎下載最新組件體驗(yàn)哦~
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷售中 >>
相關(guān)鏈接:
LightningChart.NET完全由GPU加速,并且性能經(jīng)過(guò)優(yōu)化,可用于實(shí)時(shí)顯示海量數(shù)據(jù)-超過(guò)10億個(gè)數(shù)據(jù)點(diǎn)。 LightningChart包括廣泛的2D,高級(jí)3D,Polar,Smith,3D餅/甜甜圈,地理地圖和GIS圖表以及適用于科學(xué)、工程、醫(yī)學(xué)、航空、貿(mào)易、能源和其他領(lǐng)域的體繪制功能。
在上文中(點(diǎn)擊這里回歸>>)介紹了什么是高速數(shù)據(jù)采集圖以及項(xiàng)目概述、系統(tǒng)設(shè)置等,本文將繼續(xù)介紹Visual Studio項(xiàng)目、具體的代碼審查等,持續(xù)關(guān)注獲取完整版教程哦~
現(xiàn)在讓我們使用Visual Studio,使用LightningChart可視化工具和使用Visual Studio的主要區(qū)別在于,我們將能夠分析和實(shí)驗(yàn)源代碼中的許多特性。在LC可視化器中,選擇Hi Speed DAQ圖表并運(yùn)行示例:
在窗口的右上方區(qū)域,您將看到以下選項(xiàng):
對(duì)于試用SDK,我們可以使用WPF框架。在點(diǎn)擊要使用的框架后,需要指定一個(gè)文件夾來(lái)創(chuàng)建項(xiàng)目:
最后將創(chuàng)建Hi Speed DAQ圖表項(xiàng)目,打開(kāi)Visual Studio并準(zhǔn)備執(zhí)行數(shù)字信號(hào)處理濾波器應(yīng)用程序。
主代碼將被封裝在MainWindow.xaml.cs中,這里可以找到UI控件的代碼。
在代碼內(nèi)部我們將檢查兩個(gè)方法,它們會(huì)創(chuàng)建正確繪制高速DAQ圖表所需的屬性。交互式的示例是建立各種用戶控件,來(lái)操縱和改變Hi Speed DAQ圖表的視覺(jué)屬性。生成這個(gè)圖不需要這些控件,因此重點(diǎn)關(guān)注負(fù)責(zé)生成對(duì)象的代碼。
該方法將創(chuàng)建Hi Speed DAQ圖表對(duì)象,該對(duì)象將顯示在XAML框架中。我們需要?jiǎng)?chuàng)建一個(gè)lightningchart類型對(duì)象,這個(gè)構(gòu)造函數(shù)將允許創(chuàng)建圖表的實(shí)例、指定圖表的類型、并訪問(wèn)不同的屬性。
//Create new chart _chart = new LightningChart(); //Disable rendering, strongly recommended before updating chart properties _chart.BeginUpdate(); //Chart name _chart.ChartName = "High-speed DAQ chart";
BeginUpdate函數(shù)將允許停止繪制圖表,這將允許設(shè)置想要自定義的屬性。只要更新沒(méi)有關(guān)閉,圖表就不會(huì)顯示所做的更改,這將有助于圖表構(gòu)建的性能。
//Reduce memory usage and increase performance _chart.ViewXY.DropOldSeriesData = true; _chart.ViewXY.DropOldEventMarkers = true;
上述屬性將幫助我們減少內(nèi)存使用,消除值小于x軸最小值的數(shù)據(jù)序列。建議將這些屬性設(shè)置為“true”,因?yàn)樗鼈冇兄趯?shí)時(shí)監(jiān)控圖表的性能。
_chart.ViewXY.XAxes[0].Maximum = 10; _chart.ViewXY.XAxes[0].SweepingGap = 2; _chart.ViewXY.XAxes[0].ScrollMode = XAxisScrollMode.Sweeping; _chart.ViewXY.XAxes[0].Title.Text = "Time";
我們正在構(gòu)造的圖表是XY型的,這意味著有兩個(gè)軸和兩個(gè)維度。要配置軸,只需要使用XAxes/YAxes屬性并指定軸索引。我們可以有多個(gè)x軸和y軸,但在本例中將只有一個(gè)x軸(因此使用索引0)。
最大值表示x軸的最大值,掃描間隙是圖表寬度的百分比,用于掃描圖表。本示例的ScrollMode是sweeping,但可以使用scrolling, stepping, triggering, 或 none類型。
_chart.Title.Font = new WpfFont("Segoe UI", 20f, true, false); _chart.Title.Align = ChartTitleAlignment.TopRight; _chart.Title.Offset.SetValues(-10, 14);
title屬性是指數(shù)據(jù)采集系統(tǒng)應(yīng)用圖表的主要文本或名稱,可以配置它的文本樣式、位置和對(duì)齊方式。
for (int channel = 0; channel < _chanelCount; channel++) { //New y-axis AxisY axisY = new AxisY(_chart.ViewXY) { Minimum = -50, Maximum = 50 }; axisY.MiniScale.Visible = false; axisY.MajorDivTickStyle.Alignment = Alignment.Far; axisY.MajorDivTickStyle.Color = Colors.Gray; axisY.MinorDivTickStyle.Alignment = Alignment.Far; axisY.MinorDivTickStyle.Color = Colors.Gray; axisY.MajorGrid.Visible = gridVisible; axisY.MinorGrid.Visible = gridVisible; axisY.Title.Visible = false; axisY.Units.Visible = true; axisY.Units.Color = Colors.OrangeRed; axisY.Units.Text = "μV"; axisY.Units.Font = new WpfFont("Lucida console", 12f, true, false); axisY.Units.VerticalAlign = YAxisTitleAlignmentVertical.Bottom; axisY.Units.HorizontalAlign = YAxisTitleAlignmentHorizontal.Right; axisY.AutoDivSeparationPercent = 10; axisY.Units.Angle = 30; axisY.Units.Shadow.Style = TextShadowStyle.Off; axisY.LabelsColor = Colors.White; axisY.Alignment = AlignmentHorizontal.Right; _chart.ViewXY.YAxes.Add(axisY);
在上面的代碼塊中,我們可以觀察到y(tǒng)軸配置。該配置在一個(gè)循環(huán)中執(zhí)行,該循環(huán)將為_(kāi)chanelCount變量中指定的通道數(shù)量創(chuàng)建一個(gè)y軸。對(duì)于每個(gè)y軸,我們將創(chuàng)建一條稱為series的線,這將表示信號(hào)數(shù)據(jù)。
SampleDataBlockSeries series = new SampleDataBlockSeries(_chart.ViewXY, _chart.ViewXY.XAxes[0], axisY); _chart.ViewXY.SampleDataBlockSeries.Add(series); series.Color = DefaultColors.SeriesForBlackBackgroundWpf[channel % DefaultColors.SeriesForBlackBackgroundWpf.Length]; series.AllowUserInteraction = false; series.ScrollModePointsKeepLevel = 1;
現(xiàn)在要?jiǎng)?chuàng)建一條常數(shù)線,常數(shù)線固定在y軸上,并表示為信號(hào)數(shù)據(jù)上方的水平線。
ConstantLine cls = new ConstantLine(_chart.ViewXY, _chart.ViewXY.XAxes[0], axisY); cls.Title.Text = "Constant line"; cls.Title.Visible = false; cls.LineStyle.Color = Color.FromArgb(150, 255, 192, 0); cls.Behind = true; cls.LineStyle.Width = 2; cls.AllowUserInteraction = false; cls.Value = 0; _chart.ViewXY.ConstantLines.Add(cls);
現(xiàn)在我們將為信號(hào)創(chuàng)建一個(gè)游標(biāo),行系列游標(biāo)可以通過(guò)X坐標(biāo)跟蹤值來(lái)對(duì)行系列數(shù)據(jù)進(jìn)行可視化分析。
LineSeriesCursor cursor1 = new LineSeriesCursor(_chart.ViewXY, _chart.ViewXY.XAxes[0]) { ValueAtXAxis = 1 }; cursor1.LineStyle.Width = 5; Color color = Colors.OrangeRed; cursor1.LineStyle.Color = Color.FromArgb(180, color.R, color.G, color.B); cursor1.FullHeight = true; cursor1.SnapToPoints = true; cursor1.Style = CursorStyle.PointTracking; cursor1.TrackPoint.Color1 = Colors.Yellow; cursor1.TrackPoint.Color2 = Colors.Transparent; cursor1.TrackPoint.Shape = Shape.Circle; _chart.ViewXY.LineSeriesCursors.Add(cursor1);
SignalGenerator組件可用于實(shí)時(shí)生成信號(hào),信號(hào)是由不同波形的和產(chǎn)生的。多個(gè)SignalGenerator組件可以使用父子關(guān)系鏈接起來(lái),以產(chǎn)生同步的多通道輸出。
private void CreateSignalGenerators() { int channelCount = int.Parse(textBoxChannelCount.Text); int samplingFrequency = int.Parse(textBoxFreq.Text); //Generator per channel _generators = new SignalGenerator[channelCount]; for (int i = 0; i < channelCount; i++) { string name = "Ch " + (i + 1).ToString(); //Create and initialize generator SignalGenerator generator = new SignalGenerator { GeneratorName = name }; generator.WaveformSines.Clear(); generator.WaveformRandomNoises.Clear(); generator.SamplingFrequency = samplingFrequency; generator.OutputInterval = 2; generator.ThreadType = ThreadType.Timer;
現(xiàn)在我們將為標(biāo)志創(chuàng)建形狀,將創(chuàng)建正弦、正方形和三角形,它們會(huì)被添加到信號(hào)(SignalGenerator)中。
foreach (SineComponent sc in RandomizeSineWaveformComponents()) { generator.WaveformSines.Add(sc); } foreach (SquareComponent sqc in RandomizeSquareWaveformComponents()) { generator.WaveformSquares.Add(sqc); } foreach (TriangleComponent tc in RandomizeTriangleWaveformComponents()) { generator.WaveformTriangles.Add(tc); }
為了創(chuàng)建多個(gè)表單,我們將使用WaveFormComponents函數(shù),它將返回一個(gè)包含隨機(jī)數(shù)量元素的列表。
// Sine Component private List<SineComponent> RandomizeSineWaveformComponents() { List<SineComponent> listSines = new List<SineComponent>(); int counter = (int)(4.0 * rand.NextDouble()); for (int i = 0; i < counter; i++) { SineComponent sineComp = new SineComponent { Amplitude = rand.NextDouble() * 20.0, DelayMs = rand.NextDouble() * 1000.0, Frequency = rand.NextDouble() * 10.0, Offset = 0, Enabled = true }; listSines.Add(sineComp); } return listSines; // Square Component private List<SquareComponent> RandomizeSquareWaveformComponents() { List<SquareComponent> listSquares = new List<SquareComponent>(); int counter = (int)(4.0 * rand.NextDouble()); for (int i = 0; i < counter; i++) { SquareComponent squareComp = new SquareComponent { Amplitude = rand.NextDouble() * 20.0, DelayMs = rand.NextDouble() * 1000.0, Frequency = rand.NextDouble() * 10.0, Offset = 0, //set in range 0.1...0.9 Symmetry = 0.1 + rand.NextDouble() * 0.8, Enabled = true }; listSquares.Add(squareComp); // Trangle Component private List<TriangleComponent> RandomizeTriangleWaveformComponents() { List<TriangleComponent> listTriangles = new List<TriangleComponent>(); int counter = (int)(4.0 * rand.NextDouble()); for (int i = 0; i < counter; i++) { TriangleComponent triangleComp = new TriangleComponent { Amplitude = rand.NextDouble() * 20.0, DelayMs = rand.NextDouble() * 1000.0, Frequency = rand.NextDouble() * 10.0, Offset = 0, Symmetry = 0.1 + rand.NextDouble() * 0.8, //set in range 0.1...0.9 Enabled = true }; listTriangles.Add(triangleComp); } return listTriangles;
最后,在前一步?jīng)]有產(chǎn)生波形的情況下,我們產(chǎn)生噪聲信號(hào)。
if (generator.WaveformSines.Count + generator.WaveformSquares.Count + generator.WaveformTriangles.Count == 0) { SineComponent sineComp = new SineComponent { Amplitude = 20.0, DelayMs = 0, Frequency = 5, Offset = 0, Enabled = true }; generator.WaveformSines.Add(sineComp); RandomNoiseComponent noiseComp = new RandomNoiseComponent { Amplitude = 2.0, Offset = 0, Enabled = true }; generator.WaveformRandomNoises.Add(noiseComp); } _generators[i] = generator;
數(shù)據(jù)采集系統(tǒng)的應(yīng)用是當(dāng)今一個(gè)非常有趣和重要的話題,數(shù)據(jù)采集系統(tǒng)應(yīng)用程序遠(yuǎn)程傳輸數(shù)據(jù)。傳輸?shù)礁咚貲AQ圖表的數(shù)據(jù)是由傳感器產(chǎn)生的,這些傳感器集中在我們希望分析的源的類型上。DAQ(數(shù)據(jù)采集)是一種工具,它允許我們操作通過(guò)這些傳感器獲得的數(shù)據(jù)。
使用LightningChart.NET,您將有可能生成自己的數(shù)據(jù)采集系統(tǒng)應(yīng)用程序圖表,無(wú)論是出于好奇還是專業(yè)工作,都不必?fù)?dān)心從頭開(kāi)始構(gòu)建。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)