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

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