
显示N个电能表的信息,N要做到可配置。比如一个现场是6个电能表,只需要做参数配置如下。




PD666的类;方便自己COPY

/// <summary>
/// PD666电能表变量
/// </summary>
public class PD666Variable : NodeClass
{
public PD666Variable()
{
base.Name = "PD666";
}
/// <summary>
/// 从站号
/// </summary>
/// <param name="slave"></param>
public PD666Variable(byte slave)
{
Slave = slave;
}
/// <summary>
/// PD652别名
/// </summary>
public string Alias { get; set; }
/// <summary>
/// 网关IP
/// </summary>
public string Ip { get; set; }
/// <summary>
/// 站号
/// </summary>
public byte Slave { get; set; }
[Category("键盘参数")]
public float Addr { get; set; }
[Category("键盘参数")]
public float bAud { get; set; }
[Category("键盘参数")]
public float ClrE { get; set; }
/// <summary>
/// 电流互感器倍率 IrAt(1~9999)
/// </summary>
[Category("键盘参数")]
public float IRAT { get; set; }
[Category("键盘参数")]
public float net { get; set; }
[Category("键盘参数")]
public float Protocol { get; set; }
[Category("键盘参数")]
public float REV { get; set; }
[Category("键盘参数")]
public float UCode { get; set; }
/// <summary>
/// 电压互感器倍率 已经✖0.1处理 UrAt(*) (1~9999表示电压变比 0.1~999.9)
/// </summary>
[Category("键盘参数")]
public float UrAt { get; set; }
/// <summary>
/// 线电压数据,单位0.1V 测量值 U = URMSx(x=a、b、c)×(UrAt×0.1)×0.1
/// </summary>
[Category("线电压数据")]
[Description("线电压数据,单位0.1V")]
public float Uab { get; set; }
/// <summary>
/// 线电压数据,单位0.1V
/// </summary>
[Category("线电压数据")]
[Description("线电压数据,单位0.1V")]
public float Ubc { get; set; }
/// <summary>
/// 线电压数据,单位0.1V
/// </summary>
[Category("线电压数据")]
[Description("线电压数据,单位0.1V")]
public float Uca { get; set; }
/// <summary>
/// 相电压数据,单位 0.1V
/// </summary>
[Category("相电压数据")]
[Description("相电压数据,单位 0.1V")]
public float Ua { get; set; }
/// <summary>
/// 相电压数据,单位 0.1V
/// </summary>
[Category("相电压数据")]
[Description("相电压数据,单位 0.1V")]
public float Ub { get; set; }
/// <summary>
/// 相电压数据,单位 0.1V
/// </summary>
[Category("相电压数据")]
[Description("相电压数据,单位 0.1V")]
public float Uc { get; set; }
/// <summary>
/// 电流数据,单位 0.001A 测量值 IRMSx(x=a、b、c) ×IrAt×0.001
/// </summary>
[Category("电流数据")]
[Description("电流数据,单位 0.001A")]
public float Ia { get; set; }
/// <summary>
/// 电流数据,单位 0.001A
/// </summary>
[Category("电流数据")]
[Description("电流数据,单位 0.001A")]
public float Ib { get; set; }
/// <summary>
/// 电流数据,单位 0.001A
/// </summary>
[Category("电流数据")]
[Description("电流数据,单位 0.001A")]
public float Ic { get; set; }
/// <summary>
/// 线电压数据,单位0.1V
/// </summary>
[Category("线电压数据")]
[Description("线电压数据,单位0.1V")]
public float Uab测量值 => Uab * UrAt * 0.1f;
/// <summary>
/// 线电压数据,单位0.1V
/// </summary>
[Category("线电压数据")]
[Description("线电压数据,单位0.1V")]
public float Ubc测量值 => Ubc * UrAt * 0.1f;
/// <summary>
/// 线电压数据,单位0.1V
/// </summary>
[Category("线电压数据")]
[Description("线电压数据,单位0.1V")]
public float Uca测量值 => Uca * UrAt * 0.1f;
/// <summary>
/// 相电压数据,单位 0.1V
/// </summary>
[Category("相电压数据")]
[Description("相电压数据,单位 0.1V")]
public float Ua测量值 => Ua * UrAt * 0.1f;
/// <summary>
/// 相电压数据,单位 0.1V
/// </summary>
[Category("相电压数据")]
[Description("相电压数据,单位 0.1V")]
public float Ub测量值 => Ub * UrAt * 0.1f;
/// <summary>
/// 相电压数据,单位 0.1V
/// </summary>
[Category("相电压数据")]
[Description("相电压数据,单位 0.1V")]
public float Uc测量值 => Uc * UrAt * 0.1f;
/// <summary>
/// 电流数据,单位 0.001A
/// </summary>
[Category("电流数据")]
[Description("电流数据,单位 0.001A")]
public float Ia测量值 => Ia * IRAT * 0.001f;
/// <summary>
/// 电流数据,单位 0.001A
/// </summary>
[Category("电流数据")]
[Description("电流数据,单位 0.001A")]
public float Ib测量值 => Ib * IRAT * 0.001f;
/// <summary>
/// 电流数据,单位 0.001A
/// </summary>
[Category("电流数据")]
[Description("电流数据,单位 0.001A")]
public float Ic测量值 => Ic * IRAT * 0.001f;
/// <summary>
/// 有功功率,单位 W P = Px(x=t、a、b、c)×(UrAt×0.1)×IrAt×0.1
/// </summary>
[Category("有功功率")]
[Description("单位 W")]
public float Pt { get; set; }
/// <summary>
/// 有功功率,单位 W
/// </summary>
[Category("有功功率")]
[Description("单位 W")]
public float Pa { get; set; }
/// <summary>
/// 有功功率,单位 W
/// </summary>
[Category("有功功率")]
[Description("无功功率,单位 Var")]
public float Pb { get; set; }
/// <summary>
/// 有功功率,单位 W
/// </summary>
[Category("有功功率")]
[Description("")]
public float Pc { get; set; }
/// <summary>
/// 无功功率,单位 Var Q = Qx(x=t、a、b、c)×(UrAt×0.1)×IrAt×0.1
/// </summary>
[Category("无功功率")]
[Description("无功功率,单位 Var")]
public float Qt { get; set; }
/// <summary>
/// 无功功率,单位 Var
/// </summary>
[Category("无功功率")]
[Description("无功功率,单位 Var")]
public float Qa { get; set; }
/// <summary>
/// 无功功率,单位 Var
/// </summary>
[Category("无功功率")]
[Description("无功功率,单位 Var")]
public float Qb { get; set; }
/// <summary>
/// 无功功率,单位 Var
/// </summary>
[Category("无功功率")]
[Description("无功功率,单位 Var")]
public float Qc { get; set; }
/// <summary>
/// 有功功率,单位 W
/// </summary>
[Category("有功功率")]
[Description("单位 W")]
public float Pt测量值 => Pt * UrAt * IRAT * 0.1f;
/// <summary>
/// 有功功率,单位 W
/// </summary>
[Category("有功功率")]
[Description("单位 W")]
public float Pa测量值 => Pa * UrAt * IRAT * 0.1f;
/// <summary>
/// 有功功率,单位 W
/// </summary>
[Category("有功功率")]
[Description("无功功率,单位 Var")]
public float Pb测量值 => Pb * UrAt * IRAT * 0.1f;
/// <summary>
/// 有功功率,单位 W
/// </summary>
[Category("有功功率")]
[Description("")]
public float Pc测量值 => Pc * UrAt * IRAT * 0.1f;
/// <summary>
/// 无功功率,单位 Var
/// </summary>
[Category("无功功率")]
[Description("无功功率,单位 Var")]
public float Qt测量值 => Qt * UrAt * IRAT * 0.1f;
/// <summary>
/// 无功功率,单位 Var
/// </summary>
[Category("无功功率")]
[Description("无功功率,单位 Var")]
public float Qa测量值 => Qa * UrAt * IRAT * 0.1f;
/// <summary>
/// 无功功率,单位 Var
/// </summary>
[Category("无功功率")]
[Description("无功功率,单位 Var")]
public float Qb测量值 => Qb * UrAt * IRAT * 0.1f;
/// <summary>
/// 无功功率,单位 Var
/// </summary>
[Category("无功功率")]
[Description("无功功率,单位 Var")]
public float Qc测量值 => Qc * UrAt * IRAT * 0.1f;
/// <summary>
/// 视在功率,单位 VA
/// </summary>
[Category("视在功率")]
[Description("视在功率,单位 VA")]
public float St { get; set; }
/// <summary>
/// 视在功率,单位 VA
/// </summary>
[Category("视在功率")]
[Description("视在功率,单位 VA")]
public float Sa { get; set; }
/// <summary>
/// 视在功率,单位 VA
/// </summary>
[Category("视在功率")]
[Description("视在功率,单位 VA")]
public float Sb { get; set; }
/// <summary>
/// 视在功率,单位 VA
/// </summary>
[Category("视在功率")]
[Description("视在功率,单位 VA")]
public float Sc { get; set; }
[Category("视在功率")]
[Description("视在功率,单位 VA")]
public float St测量值 => St;
/// <summary>
/// 视在功率,单位 VA
/// </summary>
[Category("视在功率")]
[Description("视在功率,单位 VA")]
public float Sa测量值 => Sa;
/// <summary>
/// 视在功率,单位 VA
/// </summary>
[Category("视在功率")]
[Description("视在功率,单位 VA")]
public float Sb测量值 => Sb;
/// <summary>
/// 视在功率,单位 VA
/// </summary>
[Category("视在功率")]
[Description("视在功率,单位 VA")]
public float Sc测量值 => Sc;
/// <summary>
/// 功率因数 0-1000,固定格式 1.000
/// </summary>
[Category("功率因数")]
[Description("以(×0.001)处理")]
public float PFt { get; set; }
[Category("功率因数")]
[Description("以(×0.001)处理")]
public float PFa { get; set; }
[Category("功率因数")]
[Description("以(×0.001)处理")]
public float PFb { get; set; }
[Category("功率因数")]
[Description("以(×0.001)处理")]
public float PFc { get; set; }
/// <summary>
/// 电网频率,单位 0.01Hz
/// </summary>
[Category("电网频率")]
[Description("电网频率,单位 0.01Hz")]
public float Freq { get; set; }
/// <summary>
/// 正向有功电能,单位0.01kWh Ep = E× (UrAt×0.1)×IrAt
/// </summary>
[Category("电能")]
[Description("正向有功电能,单位0.01kWh")]
public float ImpEp { get; set; }
/// <summary>
/// 反向有功电能,单位0.01kWh
/// </summary>
[Category("电能")]
[Description("反向有功电能,单位0.01kWh")]
public float ExpEp { get; set; }
/// <summary>
///第1象限无功总电能
/// </summary>
[Category("电能")]
[Description("第一象限无功总电能")]
public float Q1Eq { get; set; }
/// <summary>
/// 第2象限无功总电能
/// </summary>
[Category("电能")]
[Description("第二象限无功总电能")]
public float Q2Eq { get; set; }
/// <summary>
///第3象限无功总电能
/// </summary>
[Category("电能")]
[Description("第3象限无功总电能")]
public float Q3Eq { get; set; }
/// <summary>
/// 第4象限无功总电能
/// </summary>
[Category("电能")]
[Description("第4象限无功总电能")]
public float Q4Eq { get; set; }
/// <summary>
/// 正向有功电能,单位0.01kWh
/// </summary>
[Category("电能")]
[Description("正向有功电能,单位0.01kWh")]
public float ImpEp测量值 => ImpEp * UrAt * IRAT;
/// <summary>
/// 反向有功电能,单位0.01kWh
/// </summary>
[Category("电能")]
[Description("反向有功电能,单位0.01kWh")]
public float ExpEp测量值 => ExpEp * UrAt * IRAT;
/// <summary>
///第1象限无功总电能
/// </summary>
[Category("电能")]
[Description("第一象限无功总电能")]
public float Q1Eq测量值 => Q1Eq * UrAt * IRAT;
/// <summary>
/// 第2象限无功总电能
/// </summary>
[Category("电能")]
[Description("第二象限无功总电能")]
public float Q2Eq测量值 => Q2Eq * UrAt * IRAT;
/// <summary>
///第3象限无功总电能
/// </summary>
[Category("电能")]
[Description("第3象限无功总电能")]
public float Q3Eq测量值 => Q3Eq * UrAt * IRAT;
/// <summary>
/// 第4象限无功总电能
/// </summary>
[Category("电能")]
[Description("第4象限无功总电能")]
public float Q4Eq测量值 => Q4Eq * UrAt * IRAT;
public float this[string name] => (float)GetType().GetProperty(name)!.GetValue(this);
public string ToJson()
{
return JsonConvert.SerializeObject(this, Formatting.Indented);
}
}
笔记:刚开始使用

后来利用计算属性更合理

ModBus协议地址表
参数地址 | 参数代号 | 参数说明 | 数据类型 | 数据长度Word | 读写属性 |
|---|---|---|---|---|---|
键盘参数(具体功能见编程参数说明,带(*)的参数实际值 = 通讯参数值 × 0.1) | |||||
0000H | REV. | 版本号 | 16位有符号 | 1 | R/W |
0001H | UCode | 编程密码 codE(1~9999) | 16位有符号 | 1 | R/W |
0002H | ClrE | 电能清零 CLr.E(1:电能清零) | 16位有符号 | 1 | R/W |
0003H | net | 网络选择(0:三相四线,1:三相三线) | 16位有符号 | 1 | R/W |
0006H | 电流互感器倍率 IrAt(1~9999) | 16位有符号 | 1 | R/W | |
0007H | 电压互感器倍率 UrAt(*)(1~9999表示电压变比 0.1~999.9) | 16位有符号 | 1 | R/W | |
000AH | Disp | 轮显时间(秒) | 16位有符号 | 1 | R/W |
000BH | B.LCD | 背光时间控制(秒) | 16位有符号 | 1 | R/W |
000CH | Endian | 单精度浮点大小端模式(0:ABCD;1:CDAB;2:BADC;3:DCBA;) | 16位有符号 | 1 | R/W |
0029H | RESERVED | 保留 | 16位有符号 | 1 | R/W |
002BH | RESERVED | 保留 | 16位有符号 | 1 | R/W |
002CH | Protocol | 协议切换(1:DL/T645-2007;2:n.2;5:n.1;6:E.1;7:o.1) | 16位有符号 | 1 | R/W |
002DH | 通讯波特率 bAud(0:1200;1:2400;2:4800;3:9600;4:19200) | 16位有符号 | 1 | R/W | |
002EH | 通讯地址 Addr(1~247) | 16位有符号 | 1 | R/W | |
二次侧电量数据 | |||||
2000H | Uab | 三相线电压数据,单位 V(×0.1V) | 单精度浮点 | 2 | R |
2002H | Ubc | 单精度浮点 | 2 | R | |
2004H | Uca | 单精度浮点 | 2 | R | |
2006H | Ua | 三相相电压数据,单位 V(×0.1V)(三相三线时无效) | 单精度浮点 | 2 | R |
2008H | Ub | 单精度浮点 | 2 | R | |
200AH | Uc | 单精度浮点 | 2 | R | |
200CH | Ia | 三相电流数据,单位 A(×0.001A) | 单精度浮点 | 2 | R |
200EH | Ib | 单精度浮点 | 2 | R | |
2010H | Ic | 单精度浮点 | 2 | R | |
2012H | Pt | 合相有功功率,单位 W(×0.1W) | 单精度浮点 | 2 | R |
2014H | Pa | A相有功功率,单位 W(×0.1W) | 单精度浮点 | 2 | R |
2016H | Pb | B相有功功率,单位 W(×0.1W)(三相三相时无效) | 单精度浮点 | 2 | R |
2018H | Pc | C相有功功率,单位 W(×0.1W) | 单精度浮点 | 2 | R |
201AH | Qt | 合相无功功率,单位 var(×0.1var) | 单精度浮点 | 2 | R |
201CH | Qa | A相无功功率,单位 var(×0.1var) | 单精度浮点 | 2 | R |
201EH | Qb | B相无功功率,单位 var(×0.1var)(三相三相时无效) | 单精度浮点 | 2 | R |
2020H | Qc | C相无功功率,单位 var(×0.1var) | 单精度浮点 | 2 | R |
|---|---|---|---|---|---|
2022H | St | 合相视在功功率,单位 VA(×0.1VA) | 单精度浮点 | 2 | R |
2024H | Sa | A相视在功功率,单位 VA(×0.1VA) | 单精度浮点 | 2 | R |
2026H | Sb | B相视在功功率,单位 VA(×0.1VA) | 单精度浮点 | 2 | R |
2028H | Sc | C相视在功功率,单位 VA(×0.1VA) | 单精度浮点 | 2 | R |
202AH | PFt | 合相功率因数(正数:感性,负数:容性)(×0.001) | 单精度浮点 | 2 | R |
202CH | PFa | A相功率因数(正数:感性,负数:容性)(三相三线时无效) (×0.001) | 单精度浮点 | 2 | R |
202EH | PFb | B相功率因数(正数:感性,负数:容性)(三相三相时无效) (×0.001) | 单精度浮点 | 2 | R |
2030H | PFc | C相功率因数(正数:感性,负数:容性)(三相三线时无效) (×0.001) | 单精度浮点 | 2 | R |
2044H | Freq | 频率,单位 Hz(×0.01Hz) | 单精度浮点 | 2 | R |
电 能 二 次 侧 数 据 | |||||
401EH | ImpEp | (当前)正向有功总电能 | 单精度浮点 | 2 | R |
4028H | ExpEp | (当前)反向有功总电能 | 单精度浮点 | 2 | R |
4032H | Q1Eq | (当前)第一象限无功总电能 | 单精度浮点 | 2 | R |
403CH | Q2Eq | (当前)第二象限无功总电能 | 单精度浮点 | 2 | R |
4046H | Q3Eq | (当前)第三象限无功总电能 | 单精度浮点 | 2 | R |
4050H | Q4Eq | (当前)第四象限无功总电能 | 单精度浮点 | 2 | R |
通讯读出的所有电量数据均为二次值,不含变比,负数以补码表示,具体转换方法见下表。 表 5
参数名称 | 转换公式 | 单位 | 参数项目 |
|---|---|---|---|
电压 | U = URMSx(x=a、b、c)×(UrAt×0.1)×0.1 | V | Ua,Ub,Uc,Uab,Ubc,Uca |
电流 | I = IRMSx(x=a、b、c) ×IrAt×0.001 | A | Ia,Ib,Ic |
有功功率 | P = Px(x=t、a、b、c)×(UrAt×0.1)×IrAt×0.1 | W | Pt,Pa,Pb,Pc |
无功功率 | Q = Qx(x=t、a、b、c)×(UrAt×0.1)×IrAt×0.1 | var | Qt,Qa,Qb,Qc |
功率因数 | PF = PFx(x= t、a、b、c)×0.001 | PFa,PFb,PFc,PFt | |
频率 | F = Freq×0.01 | Hz | F |
电能 | Ep = E× (UrAt×0.1)×IrAt | kWhkvarh | ImpEp,ExpEp,Q1Eq,Q2Eq,Q3Eq,Q4Eq |
注 1:电压互感器倍率为 1时,读电压互感器倍率寄存器 UrAt数据为 10。 注 2:单精度浮点采用的是标准 IEEE754格式,共 32位(4字节)。 5.3.2 数据抄读 假设电压变比为 6.6,电流变比为 20,单精度浮点大小端模式(0:ABCD,高字节在前,低字节 在后)读数据示例如下: u 读取 A相电压 Ua(2006H): 读命令帧:01 03 20 06 00 02 2F CA (十六进制,01为表地址,03为读命令,2006为 A相 相电压地址,0002为单精度浮点数据长度,2FCA为 CRC16校验码) 返 回 帧:01 03 04 45 09 70 00 1A FD (01为表地址,03为读命令,04为读寄存器返回 数据数量,45097000为数据(单精度浮点),1AFD为 CRC16校验码)
Ua 测 量 值 =0x45097000(单 精 度 浮 点 )× 电 压 变 比 × 0.1=2199(十 进 制 )× (66× 0.1) × 0.1=1451.34V。 u 读取 A相电流 Ia(200CH): 读命令帧:01 03 20 0C 00 02 0F C8 (十六进制,01为表地址,03为读命令,200C为 A相 电流地址,0002为单精度浮点数据长度,0FC8为 CRC16校验码) 返 回 帧:01 03 04 45 9C 38 00 3C D1 (01为表地址,03为读命令,04为读寄存器返回 数据数量,459C3800为浮点数据,3CD1为 CRC16校验码) Ia测量值=0x459C3800(单精度浮点)×电流变比×0.001=4999(十进制)×20×0.001=99.98A。 u 写电流变比 Irat(0006H): 写命令帧:01 10 00 06 00 01 02 00 0A 26 31 (十六进制,01为表地址,10为读命令, 0006为电流变比地址,0001为写寄存器数量,02为写寄存器数据长度,000A为电流变比数据(16 位有符号整型),2631为 CRC16校验码) 返 回 帧:01 10 00 06 00 01 E1 C8 (01为表地址,10为读命令,0006为电流变比地址, 0001为寄存器数量,E1C8为 CRC16校验码) u 写大小端模式设置(000CH): 西门子 PLC数据类型 Float遵循“高字节低地址,低字节高地址”的方式(即单精度浮点大 小端模式 3:DCBA),以下示例为将单精度浮点大小端模式改为 3:DCBA。 写命令帧:01 10 00 0C 00 01 02 00 03 E6 9D (十六进制,01为表地址,10为读命令, 000C为电流变比地址,0001为写寄存器数量,02为写寄存器数据长度,0003为大小端模式设置 数据(16位有符号整型),E6 9D为 CRC16校验码) 返 回 帧:01 10 00 0C 00 01 C1 CA (01为表地址,10为读命令,000C为电流变比地址, 0001为寄存器数量,C1 CA为 CRC16校验码)