智能电表采集
# 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 项目文件。

点击[添加]
按钮,添加仪表信息,并开启采集功能。修改采集间隔时间,点击[应用]
按钮,修改采集的时间间隔。