遵循IEC的电能表通信程序的设计与实现_精品文档Word下载.doc
《遵循IEC的电能表通信程序的设计与实现_精品文档Word下载.doc》由会员分享,可在线阅读,更多相关《遵循IEC的电能表通信程序的设计与实现_精品文档Word下载.doc(6页珍藏版)》请在冰豆网上搜索。
energymeter;
communication;
objectmodel
1引言
为解决自动抄表系统、计量计费系统中的数据采集、计量仪表安装、维护,系统集成及保护投资等方面问题,国际电工委员会(IEC)制定了IEC62056系列国际标准《电能计量-用于抄表、费率和负荷控制的数据交换》[1],提出了一种新的电能表通信标准,它支持多种通信介质接入方式,其良好的系统互连性和互操作性是迄今为止较为完善的电能表通信标准。
本文遵循IEC62056标准,以电能表为实例,采用VC++6.0开发工具设计并实现了电能表通信程序,并在多功能电能表的数据采集中得到了应用。
2程序设计与实现
2.1程序流程图
本文以计算机对电能表的数据采集通信程序为例,程序流程图见图1。
2.2建立电能表的对象模型
实现计算机与电能表通信首先需要在计算机侧建立该电能表的对象模型。
假定需要采集电能表的数据有:
正向有功总电能底度值、正向无功总电能底度值、A相电压和A相电流,这些数据都可通过接口类库中的“寄存器”接口类来实现。
“寄存器”类共有3个属性:
逻辑名、值、倍率量纲和1个方法:
复位。
“逻辑名”属性表示该寄存器实例化对象的OBIS(OBjectIdentificationSystem)码;
“值”属性表示该寄存器保存的测量值或状态值;
“倍率和量纲”属性表示值属性的倍率和量纲。
“复位”方法可以对该寄存器的值清零。
图2演示了正向有功总电能底度值、正向无功总电能底度值数据是如何通过“寄存器”类来建立对象模型的,用类似方法同样可以建立A相电压、A相电流数据的对象模型。
表1列出了电能表对象模型中各对象的属性、方法及属性的取值。
以正向有功总电能底度值为例,其逻辑名为1.1.1.8.0.255,表示该对象代表能量类型为电能1、测量通道号为1、物理量类型为有功功率1、处理方法为积分值8、费率类型为总费率0、结算周期为与结算周期无关的底度值255的数据;
值的数据类型为64位整数,值的内容为40028;
倍率为10,量纲为Wh。
这些属性表示该电能表的正向有功总电能底度值为4.0028kWh。
同理,其余三个对象分别表示该电能表的正向无功总电能底度值为1.8562kvarh、A相电压为57.95V、A相电流为0.996A。
开始
建立电能表的对象模型
建立数据链路层连接
建立应用层连接
访问电能表的对象的属性和方法
断开连接
结束
图1电能表通信程序流程图
配置物理层通信参数
尽管正向有功总电能底度值、正向无功总电能底度值、A相电压和A相电流者4种数据都是通过“寄存器”接口类建模的,但由于其“值”属性的数据类型不同,所以在VC++6.0中需要分别通过C++类Energy_Register和Analog_Register来实现,详见以下源程序。
classEnergy_Register //电量寄存器C++类定义
{
public:
BYTELogical_Name[6];
//属性1:
逻辑名
__int64Value;
//属性2:
值
Scaler_UnitScalerUnit;
//属性3:
倍率和量纲
BOOLReset();
//方法:
复位
Energy_Register();
//构造函数
virtual~Energy_Register();
//析构函数
};
寄存器
倍率量纲
类
图2“寄存器”接口类及其实例
方法
属性
实例
对象
属性值
正向有功总电能底度值寄存器
逻辑名=1.1.1.8.0.255
值:
40028
倍率量纲:
10^-1Wh
正向无功总电能底度值寄存器
逻辑名=1.1.1.3.8.0.255
18562
10^-1varh
classAnalog_Register//模拟量寄存器C++类定义
//属性1:
__int32Value;
//属性2:
//属性3:
//方法:
Analog_Register();
//构造函数
virtual~Analog_Register();
//析构函数
Energy_RegisterDel_Act_Energy;
//正向有功总电能底度值对象
Energy_RegisterDel_Rea_Energy;
//正向无功总电能底度值对象
Analog_RegisterA_Voltage;
//A相电压对象
Analog_RegisterA_Current;
//A相电流对象
表1电能表的对象模型
接口类
属性1
属性2
属性3
(数据类型)值
正向有功总电能底度值
1.1.1.8.0.255
(Integer64)40028
10-1Wh
Reset
正向无功总电能底度值
1.1.3.8.0.255
(Integer64)18562
10-1varh
A相电压
1.1.32.7.0.255
(Integer32)5795
10-2V
A相电流
1.1.31.7.0.255
(Integer32)996
10-3A
2.3配置物理层通信参数
物理层采用RS485总线连接,计算机和电能表的物理层通信参数应配置相同,包括电能表高位HDLC地址、低位HDLC地址、计算机地址、通信波特率等。
2.4建立数据链路层连接
先由计算机发送SNRM报文,与电能表协商数据链路层参数,参数包括最大发送报文长度、最大接收报文长度、发送窗尺寸、接收窗尺寸等,电能表确认后返回UA报文,数据链路层连接建立成功。
计算机SNRM报文中的参数可省略,表示默认采用电能表UA报文中的参数。
计算机发送SNRM报文源程序如下。
//建立数据链路层连接
mCommand[0]=0x7E;
//帧头
mCommand[1]=0xA0;
//帧类型
mCommand[2]=0x0A;
//帧长度
//电能表高位HDLC地址
mCommand[3]=((ComPortSetup.LogDevAdd&
0x3f80)>
>
6)&
0xff;
mCommand[4]=((ComPortSetup.LogDevAdd&
0x7f)<
<
1)&
//电能表低位HDLC地址
mCommand[5]=((ComPortSetup.PhyDevAdd&
mCommand[6]=((((ComPortSetup.PhyDevAdd&
1))|0x01)&
//计算机HDLC地址
mCommand[7]=((((ComPortSetup.MasterAdd&
mCommand[8]=0x93;
//命令类型:
SNRM
FCS=GetFCS(&
(mCommand[1]),8);
//FCS校验和
mCommand[9]=FCS&
mCommand[10]=FCS>
8;
mCommand[11]=0x7E;
//帧尾
Send(mCommand,12);
//发送SNRM报文
2.5建立应用层连接
建立数据链路层连接之后可以建立应用层连接。
先由计算机发送应用连接请求(AARQ)报文,与电能表协商应用环境(如短名或逻辑名引用)、xDLMS环境(如COSEM一致性块)并使用已知的密码或HLS秘密进行身份验证,报文格式与数据链路层连接报文格式相同,报文内容依次为帧头、帧类型、帧长度、目的HDLC地址、源地址、I命令帧、HCS校验和、逻辑链路控制字节、AARQ标识、应用环境名称、发送方ACSE参数、身份验证机制名称、密码、用户信息标识、xDLMS-Initiate.request、FCS校验和、帧尾等。
电能表确认后返回应用连接响应(AARE)报文,应用层连接建立成功。
2.6访问电能表的对象的属性和方法
在建立应用层连接之后,就可以使用应用层提供的服务集访问电能表的对象的属性和方法。
在使用逻辑名(LN)引用时服务集为GET/SET/ACTION,在使用短名(SN)引用时服务集为READ/WRITE。
下面以短名引用方式读取表1中“正向有功总电能底度值”对象的属性为例,说明访问电能表对象属性的通信过程。
假设“正向有功总电能底度值”对象逻辑名映射的基本名为16进制C440,发送和接收报文的16进制原码及其解释如下:
计算机发送:
7EA0119575BEE498E6E600050102C440E67C7E
7EA0119575BEE498E6E600//HDLC帧前半部分(帧头、帧类型、帧长度、目的HDLC