智能電錶採集
# Smart之智能電錶採集
# 1. 說明
範例採用通訊埠通訊協議,使用DLT-645/2007規約採集智能電能表中的電能數據。
電能表是用來測量電能的儀表,又稱電度表,火表,千瓦小時表,指測量各種電學量的儀表。
電能表在低電壓(不超過500伏)和小電流(幾十安)的情況下,可直接接入電路進行測量。一般的家用電路是以這種方式接入電能表進行電費計量的。在高電壓或大電流的情況下,電能表不能直接接入線路,需配合電壓互感器或電流互感器使用。工廠的電能表通常會使用這種方式進行測量。
目前市面上使用的絕大多數數字液晶顯示屏電能表均有RS485的通訊介面,其介面顯示如下圖。除了用於連線電路的接線柱外,還包含了RS485介面的接線柱,用於與計算機進行連線。範例中使用的電能表通過RS485通訊介面與計算機連線,計算機向該電能表發送讀取電能數據的指令,電能表對應返回數據,計算機進行解析后顯示讀取的結果數值。我們可以將讀取到的數值寫入至資料庫中實現能源分析的功能。
通過範例學習,可以掌握DLT-645/2007電能表的通訊方式,並結合Smart中的TMeter元件實現電能數據的採集。
# 2. 設計明細
開啟Smart智慧控制平臺,分別加入下插圖之控制元件。或者通過點選功能表欄[檔案]
-[打開專案]
選擇專案打開該範例。
①:TMeter元件,控制元件名稱為Meter
。
②:TImage元件,控制元件名稱為Image1
。
③:TiLedRound元件,控制元件名稱為iLedRound1
。
④:TiSevenSegmentAnalog元件,控制元件名稱為digiShow
。
⑤:TiEdit元件,控制元件名稱為iEdit
。
⑥:TListView元件,控制元件名稱為lvItem
。
⑦:TEdit元件,控制元件名稱為edtMeterAddress
。
⑧:TButton元件,控制元件名稱為btnAdd
。
⑨:TEdit元件,控制元件名稱為edtInterval
⑩:TButton元件,控制元件名稱為btnApply
。
(11):TListView元件,控制元件名稱為lvLog
。
Main窗體屬性設定
Caption
:主窗體標題,設定為智能電錶採集
。ClientHeight
:窗體客戶區高度=633
。ClientWidth
:窗體客戶區寬度=1026
。
①Meter屬性設定
BaudRate
:設定通訊速率,設定為br2400
。DataBits
:設定通訊的數據位數,設定為db8
。DeviceName
:設定設備的埠號,此處需設定為設備連線的埠名稱。 點選Picture
屬性右側的[...]
按鈕,打開檔案上傳界面,點選[Load...]
從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]
載入圖片。
②Image1屬性設定
Align
:設定控制元件的對齊方式,此處設定為alClient
,該控制元件在pnMeter控制元件中客戶區對齊。Stretch
:設定控制元件中的圖片拉伸對齊,設定為True
。Picture
:設定圖片。點選Picture
屬性右側的[...]
按鈕,打開檔案上傳界面,點選[Load...]
從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]
載入圖片。
③iLEDRound屬性設定
Height
:設定控制元件高度,設定為24
。Width
:設定控制元件寬度,設定為24
。ActiveColor
:設定LED啟用時顯示的顏色,設定為clRed
。
④digiShow屬性設定
使用滑鼠右鍵點選該控制元件,在右鍵選項中選擇[Edit]
,打開設定界面,界面中的內容可按照下圖進行設定,設定完成後點選[OK]
按鈕儲存設定。
- ⑥lvItem屬性設定
Align
:設定控制元件對齊方式,設定為alClient
,即設定為在Panel界面區域內客戶區對齊。ViewStyle
:設定控制元件的檢視型別,設定為vsReport
。
使用滑鼠右鍵點選該控制元件,在選項中選擇[Columns Editor]
,打開列區編輯器。列區中顯示目前顯示的內容,其中設定各個項的Width
屬性分別為100
,150
,120
。
- (11)lvLog屬性設定
Align
:設定控制元件對齊方式,設定為alClient
,即設定為在Panel界面區域內客戶區對齊。ViewStyle
:設定控制元件的檢視型別,設定為vsReport
。
使用滑鼠右鍵點選該控制元件,在選項中選擇[Columns Editor]
,打開列區編輯器。列區中顯示目前顯示的內容,其中設定各個項的Width
屬性分別為120
,50
,80
,120
。
# 3. 程式設計
# 3.1. 程式初始設定
該程式啟動時,將採集的時間間隔讀取至編輯框中。
constructor TMyHandler.Create(AOwner: TComponent);
begin
FThis :=TBaseForm(AOwner);
FThis.edtInterval.Text := IntToStr(FThis.Meter.Interval);
end;
2
3
4
5
# 3.2. 事件設定
- ⑧btnAdd-OnClick事件
點選[新增]
按鈕,新增專案,並執行採集。
procedure TMyHandler.btnAddClick;
var
vMeterItem:TMeterItem;
vItem: TListItem;
begin
vMeterItem := TMeterItem(FThis.Meter.MeterList.Add);
vMeterItem.Address := FThis.edtMeterAddress.Text;
vMeterItem.Caption := '電錶';
vMeterItem.Code := FThis.edtMeterAddress.Text;
vMeterItem.MeterType := DLT645_2007;
vItem := FThis.lvItem.Items.Add;
vItem.Caption := FThis.edtMeterAddress.Text;
vItem.SubItems.Add(FThis.edtMeterAddress.Text);
vItem.SubItems.Add('電錶');
vItem.SubItems.Add(FThis.edtMeterAddress.Text);
FThis.Meter.Enabled := true;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- ①Meter-OnReceiveData事件
當接收到數據資訊時,顯示內容。
procedure TMyHandler.MeterReceiveData;
var
lvitem:Tlistitem; //此處一定要預定義臨時記錄儲存變數.
begin
if FThis.lvLog.Items.Count > 12 then
FThis.lvLog.Items.Clear;
lvitem:=FThis.lvLog.Items.add;
//FThis.lvLog.Items.BeginUpdate;
lvitem.Caption:=AItem.Code;
lvitem.SubItems.Add(AItem.Caption);
//lvitem.SubItems.Add(AItem.Address);
lvitem.SubItems.Add(AItem.Value1);
lvitem.SubItems.Add(FormatDateTime('c',now));
FThis.iEdit.Value := AItem.Address;
FThis.digiShow.Value := StrToFloat(AItem.Value1);
FThis.iLEDRound1.Active := not FThis.iLEDRound1.Active;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- ⑩btnApply-OnClick事件
點選[應用]
按鈕,設定採集時間間隔。
procedure TMyHandler.btnApplyClick;
begin
if StrToInt(FThis.edtInterval.Text) < 0 then
begin
ShowMessage('輸入的數據不符合要求,請重新輸入');
exit;
end;
FThis.Meter.Interval := StrToInt(FThis.edtInterval.Text);
end;
2
3
4
5
6
7
8
9
# 4. 運行結果
使用滑鼠點選工具欄運行(Run),測試運行結果。
通過工具欄儲存,將程式儲存為 sdb 專案檔案。
點選[新增]
按鈕,新增儀表資訊,並開啟採集功能。修改採集間隔時間,點選[應用]
按鈕,修改採集的時間間隔。