摘要:該文介紹了在Delphi中通過網絡傳輸下位機采集的數據,使用IXYPlot控件將數據實時以直觀的工控波形界面進行顯示的方法,并結合應用實例給出了數據顯示的應用程序。
關鍵詞:Delphi;實時數據;波形;顯示
中圖分類號:TP312文獻標識碼:A文章編號:1009-3044(2008)33-1386-02
The Method of Realizing Remote Data Wave Display by Delphi Programming
GONG Juan, WANG Huan-yan, YAN Hai-yan, XUE Zhi-liang
(Hunan Railway Profess Ional Technology College, Zhuzhou 412001, China)
Abstract: This paper presents the method that the internet transmits the data collected by the controller system in Delphi, and the IXPlot Controls display the real-time data by intuitionistic monitor and control interface. This paper exemplifies the data displaying application program.
Key words:Delphi; real-time data; wave; display
1 引言
在自動化控制應用中,經常要對系統中各類設備進行控制和診斷,因此我們要組成微機為上位機而單片機等為下位機的控制網絡。在通常的控制應用中,我們通過下位機采集并傳送控制設備的狀態信息如電流、電壓、壓力等等并以數字的形式實時顯示。但是,隨著自動化控制應用的發展和深入,很多應用需要將采集檢測到的離散的數據繪制成波形,用來對數據進行追蹤記錄和比較。如何通過簡單高效的方法方便快捷的將采集到的離散數據傳輸到上位機并繪制成波形呢?本文給出了利用IXYPlot控件將通過網絡傳輸采集的離散數據繪制成波形的方法,并給出了在Delphi環境下利用該控件將離散數據以波形形式實時顯示的應用實例。
2 實時數據的采集傳輸和顯示方法
在應用系統中,為了減少布線充分利用網絡系統優勢,通常采用下位機傳感器、IO通道等對模擬數據、數字量數據進行實時采集。采集到的數據由下位機根據協議的要求進行編碼處理后通過網絡發送給上位機,上位機接收到下位機傳來的數據后同樣根據通訊協議對接收到的數據進行解碼,并將解碼后的數據送給顯示系統,根據相應設置進行數據的顯示。
在數據顯示中我們設定縱坐標和橫坐標分別代表兩個不同的量,顯示出的波形則記錄了數據在隨橫坐標變化過程中的變化情況,從而由各離散數據繪制出相應的波形。根據應用的需要我們可以在一個界面上同時記錄多路數據,各路數據的波形以不同顏色進行區分,各路數據的位置可以隨意設定,數據顯示效果如圖1所示:

圖1 數據顯示效果
通過以上分析說明我們可以利用系統下位機就近對數據進行采集,利用網絡進行數據的傳輸,利用控件的編程和設計對數據進行顯示處理,簡單而高效的實現了將檢測的離散數據以波形的方式顯示。
3 數據顯示應用實例
下面通過一個具體實例來說明在Delphi6.0中實現工控數據顯示的方法。
1) 界面設計:
打開一個新的工程,在窗體上安排一個iXYPlot控件,將其Align屬性設為alClient,并設置好相關其它屬性,最后完成界面設計如圖2所示。

圖2 界面設計圖
2) 程序如下:
var
Main_FM: TMain_FM;
Drawgraph,DrawGraphID:Thandle;
implementation
{$R *.dfm}
//波形顯示線程;
Function F_DrawGraph:Longint;
Var
TempB1,temp2,temp3:Byte;
Begin
IF (Main_Fm.GET_SwitchLed.Active)Then //顯示按鈕激活
Begin
If main_fm.xvalue>main_fm.X_span then //滿一屏后,橫坐標右移
main_fm.iXYPlot.XAxis[0].Min :=main_fm.iXYPlot.XAxis[0].Min+Main_fm.X_add;
main_fm.iXYPlot.Channel[0].AddXY(main_fm.xvalue,Sin(0 )*Main_fm.SP1_para0+Trunc(Main_fm.
SP1_para1)); //繪制第一通道的波形(直線)
main_fm.iXYPlot.Channel[1].AddXY(main_fm.xvalue,Sin(main_fm.Xvalue )*Main_fm.SP2_para0+Trunc(Main_fm.SP2_para1));//繪制第2通道的波形(正弦波)
main_fm.iXYPlot.Channel[2].AddXY(main_fm.xvalue,cos(main_fm.Xvalue)*Main_fm.SP3_para0+Trunc(Main_fm.SP3_para1)) ;//繪制第3通道的波形(余弦波)
main_fm.iXYPlot.Channel[3].AddXY(main_fm.xvalue,Cos(0)*Main_fm.Curr_para0+Trunc(Main_fm.Curr_para1));//繪制第4通道的波形(直線)
main_fm.iXYPlot.Channel[4].AddXY(main_fm.xvalue,0*Main_fm.Acc_para0+Trunc(Main_fm.Acc_
para1)); //繪制第5通道的波形(直線)
main_fm.iXYPlot.Channel[5].AddXY(main_fm.xvalue,Sin(main_fm.Xvalue )*Main_fm.Daf_para0+T
runc(Main_fm.Daf_para1)); //繪制第6通道的波形(正弦波)
main_fm.xvalue:=main_fm.xvalue+Main_fm.X_add;//設置橫坐標移動的變化
End;
End;
procedure TMain_FM.GET_SwitchLedClick(Sender: TObject);
begin
IF Not GET_SWITCHLED.Active Then //判斷顯示按鈕沒有被激活
Begin
GET_SWITCHLED.CaptionFont.Color:=clLime;//改變顯示字體顏色
Main_fm.iXYPlot.ClearAllData ; //清除原有的顯示數據,為新數據顯示做好準備
Main_Fm.Xvalue :=0;//設置橫坐標初時值
Main_Fm.Time50MS.Enabled:=True; //激活定時器
End
Else
Begin
GET_SWITCHLED.CaptionFont.Color:=clRed; //更改顯示按鈕字體
Main_Fm.Time50MS.Enabled:=False;//關閉定時器;
End;
end;
procedure TMain_FM.Time50MSTimer(Sender: TObject);
begin
F_DrawGraph; //定時調用顯示刷新程序
end;
procedure TMain_FM.FormShow(Sender: TObject);
begin
Main_fm.X_span :=10;//設定顯示區域一屏能夠顯示的橫坐標的最大值
Main_fm.X_add:=0.01;//設定橫坐標沒刷新周期變化的增量
Main_fm.SP1_para0 :=12;//設定通道的數據放大比例
Main_fm.SP1_para1 :=110; //設定通道數據顯示縱坐標的基準位置
Main_fm.SP2_para0 :=20;//設定通道的數據放大比例
Main_fm.SP2_para1 :=90;//設定通道數據顯示縱坐標的基準位置
Main_fm.SP3_para0 :=20;//設定通道的數據放大比例
Main_fm.SP3_para1 :=70;//設定通道數據顯示縱坐標的基準位置
Main_fm.Curr_para0 :=0;//設定通道的數據放大比例
Main_fm.Curr_para1 :=90; //設定通道數據顯示縱坐標的基準位置
Main_fm.Acc_para0 :=3;//設定通道的數據放大比例
Main_fm.Acc_para1 :=70; //設定通道數據顯示縱坐標的基準位置
Main_fm.Daf_para0 :=35;//設定通道的數據放大比例
Main_fm.Daf_para1 :=35; //設定通道數據顯示縱坐標的基準位置
end;
4 結束語
以上方法筆者在多個開發項目中都曾采用,微機與分散的各下位機之間通過這種下位機采集數據、網絡傳輸的方式將多種離散的工控數據以波形的方式顯示出來,該方法在項目中使用效果良好,運行穩定可靠。
參考文獻:
[1] 溫錦山,唐柱鵬.Delphi串口及語音傳真高級編程[M].北京:北京航空航天大學出版社,2004.
[2] 黃軍.熊勇.Delphi 串口通信編程[M].北京:人民郵電出版社,2002.
[3] 段興.Delphi實用程序100例[M].北京:人民郵電出版社,2002.