编辑
2025-02-18
C# 应用
00
请注意,本文编写于 77 天前,最后修改于 77 天前,其中某些信息可能已经过时。

目录

产品介绍
通信配置
硬件连接
通信参数设置
数据读取示例
读取三相电压
读取三相电流
读取总有功电能
读取功率因数
NModbus4
注意事项
错误处理

产品介绍

ADF400L系列多用户电能表支持Modbus TCP协议通信,通过以太网接口可以实现远程数据读取。该系列电表最多支持:

  • 12路三相或36路单相直接接入测量
  • 12路三相互感器接入测量
  • 直接接入和互感器接入的混合测量

通信配置

硬件连接

  • 通信接口:以太网接口(CE功能)
  • 通信协议:Modbus TCP

通信参数设置

通过寄存器配置:

  • 使能CE以太网:地址0x0964,写入1使能
  • 通信协议选择:地址0x0908,写入0选择Modbus协议

数据读取示例

读取三相电压

C#
// 读取三相电压(0.1V) const ushort UA_ADDR = 0x033F; // A相电压 const ushort UB_ADDR = 0x0340; // B相电压 const ushort UC_ADDR = 0x0341; // C相电压 // 读取结果需除以10转换为V double Ua = ReadHoldingRegister(UA_ADDR) / 10.0; double Ub = ReadHoldingRegister(UB_ADDR) / 10.0; double Uc = ReadHoldingRegister(UC_ADDR) / 10.0;

读取三相电流

C#
// 读取三相电流(0.01A) const ushort IA_ADDR = 0x0342; // A相电流 const ushort IB_ADDR = 0x0343; // B相电流 const ushort IC_ADDR = 0x0344; // C相电流 // 读取结果需除以100转换为A double Ia = ReadHoldingRegister(IA_ADDR) / 100.0; double Ib = ReadHoldingRegister(IB_ADDR) / 100.0; double Ic = ReadHoldingRegister(IC_ADDR) / 100.0;

读取总有功电能

C#
// 读取总有功电能(0.01kWh) const ushort TOTAL_ENERGY_ADDR_L = 0x035E; // 低位地址 const ushort TOTAL_ENERGY_ADDR_H = 0x035F; // 高位地址 // 读取两个寄存器 ushort lowWord = ReadHoldingRegister(TOTAL_ENERGY_ADDR_L); ushort highWord = ReadHoldingRegister(TOTAL_ENERGY_ADDR_H); // 组合为32位值 uint rawValue = ((uint)lowWord << 16) | highWord ; // 应用互感器变比 ushort pt = ReadHoldingRegister(0x0951); // PT变比 ushort ct = ReadHoldingRegister(0x0952); // CT变比 // 计算实际电能值(kWh) double actualEnergy = (rawValue / 100.0) * pt * ct;

这里的高低位一定注意,与我习惯的高位在前不现,它是低位在前。

读取功率因数

C#
// 读取总功率因数(0.001) const ushort PF_ADDR = 0x034D; // 读取结果需除以1000 double powerFactor = ReadHoldingRegister(PF_ADDR) / 1000.0;

NModbus4

C#
try { ushort numInputs = 2; ushort[] inputs = master.ReadHoldingRegisters(tableId, startAddress, numInputs); // 获取两个寄存器的值 ushort word1 = inputs[0]; // 第一个字 ushort word2 = inputs[1]; // 第二个字 uint value1 = ((uint)word1 << 16) | word2; sb.AppendLine($" 原始值: Word1=0x{word1:X4}, Word2=0x{word2:X4}"); } catch (Exception ex) { sb.AppendLine($"{description}[0x{startAddress:X4}] 读取错误: {ex.Message}"); }

以下截图,我是测试出来的数据。

image.png

image.png

注意事项

  1. 数据读取前确保以太网功能已使能
  2. 注意数据单位转换
  3. 读取电能值时需考虑互感器变比
  4. 确保通信地址正确(每个相邻互感器接入用户和三相用户的地址间隔为3,每个单相用户的地址间隔为1)
  5. 表号的取值应为(1、37、73....)

错误处理

常见故障排查:

  1. 无法通讯时:
    • 检查网络连接是否正常
    • 确认以太网功能是否使能
    • 验证通信参数设置是否正确
  2. 数据异常时:
    • 检查数据单位换算是否正确
    • 验证互感器变比设置
    • 确认寄存器地址是否正确

通过以上配置和示例代码,可以实现对ADF400L系列多用户电能表的数据读取和监控。

本文作者:rick

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!