C

解決科技看今朝 2024-06-10 08:49:14

曲線功能幾乎是所有上位機的標配功能。C#上位機實現曲線功能可以借助多種控件實現。比如可以使用自帶的chart控件。

圖1 chart控件

除了自帶的chart控件外,還有開源免費的OxyPlot、LiveChart等控件。

圖2 OxyPlot

其中LiveChart屬于後起之秀,相對來說,曲線的表現更加美觀一些。

圖3 LiveChart

在我們的C#上位機項目實例中,使用的是OxyPlot控件。在我們提供的標准案例中,曲線的刷新是手動觸發。也就是點擊按鈕時根據開始時間和結束時間從數據庫中抓取數據,然後刷新曲線。它的代碼如下。

var lst = DAL.DBOperation.Query<PowerModel>(x => x.DT >= DT1.Value && x.DT <= DT2.Value, null);var lineSer = chart.Model.Series[0] as LineSeries;lineSer.Title += $"<{cmbTags.Text.Trim()}>";for (int i = 0; i < lst.Count; i++){ lineSer.Points.Add(new DataPoint(DateTimeAxis.ToDouble(lst[i].DT), lst[i].Current1));}

曲線的展示效果如下。

圖4 展示效果

上面代碼中,每次刷新時加載了時間範圍內的全部數據點。如果數據量不大倒也沒什麽關系。如果數據量很大的話就會導致刷新一次耗時較長,影響用戶體驗。所以對于實時曲線我們需要在每次刷新時只加載新的數據點。所以對于曲線的實時刷新,我們還需要進行優化。下面是優化後的代碼。

var lst = DAL.DBOperation.Query<PowerModel>(x => x.DT >LastDT && x.DT <= DateTime.Now, null);var lineSer = chart.Model.Series[0] as LineSeries;lineSer.Title += $"<{cmbTags.Text.Trim()}>";LastDT = DateTime.Now;for (int i = 0; i < lst.Count; i++){ lineSer.Points.Add(newDataPoint(DateTimeAxis.ToDouble(lst[i].DT), lst[i].Current1));}if((chart.Model.Series[0] asLineSeries).Points.Count > 300) (chart.Model.Series[0] as LineSeries).Points.RemoveAt(0); chart.InvalidatePlot(true);

代碼優化的思路是每次刷新時記錄下刷新時間,下次根據時間差從數據庫中抓取新增的數據添加到曲線控件中。

在上面代碼的後面我們還對chart控件展示的數據點數量進行了控制。如果數據點大于我們設定的數量將移除時間比較早的數據點。這樣可以保證曲線控件在自動刷新時不至于卡頓。上面的代碼中我們設置的數據點數量是300。當數據點大于300時,左邊的數據點將被移除。

0 阅读:0

解決科技看今朝

簡介:感謝大家的關注