首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[C#] 解析N个正泰电能表PD666

[C#] 解析N个正泰电能表PD666

作者头像
科控物联
发布2026-03-19 14:44:56
发布2026-03-19 14:44:56
400
举报

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

PD666的类;方便自己COPY

代码语言:javascript
复制
/// <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校验码)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科控物联 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档