曲線功能幾乎是所有上位機的標配功能。C#上位機實現曲線功能可以借助多種控件實現。比如可以使用自帶的chart控件。
![](http://image.uc.cn/s/wemedia/s/upload/2024/da40a9d0a19a4c573de028709e84f1e9.jpg)
圖1 chart控件
除了自帶的chart控件外,還有開源免費的OxyPlot、LiveChart等控件。
![](http://image.uc.cn/s/wemedia/s/upload/2024/55c78dffa823675c7a40d46c4eed006f.jpg)
圖2 OxyPlot
其中LiveChart屬于後起之秀,相對來說,曲線的表現更加美觀一些。
![](http://image.uc.cn/s/wemedia/s/upload/2024/1f456c5811aaaca69c425c6bf455c15a.jpg)
圖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));}曲線的展示效果如下。
![](http://image.uc.cn/s/wemedia/s/upload/2024/b5eff31b96a96091aa9ddd585a50b648.jpg)
圖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時,左邊的數據點將被移除。
![](http://image.uc.cn/s/wemedia/s/upload/2024/9c29f7870657d61bfc9353f23d607ab6.png)