news 2026/4/16 0:50:14

基于.NET和C#构建光伏IoT物模型方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于.NET和C#构建光伏IoT物模型方案

一、目前国内接入最常见、最有代表性的 4 类光伏设备

二、华为 SUN2000 逆变器通讯报文示例

这是一个标准 Modbus TCP 请求报文

00 01 00 00 00 06 01 03 75 30 00 06

含义:

Modbus TCP 报文由两部分组成:

MBAP Header(7字节) + PDU(功能码 + 数据)

在光伏逆变器里,这类请求通常用于:

响应

这是一个标准的Modbus TCP 响应报文结构

00 01 00 00 00 0F 01 03 0C 09 C4 00 64 13 88 00 32

MBAP Header(7字节) + PDU(功能码 + 数据)

PDU数据解析

结合光伏业务的数值换算

厂家协议通常定义倍率(Scale)

最终物模型字段赋值示例

{ “dcVoltage”: 250.0, “dcCurrent”: 10.0, “dcPower”: 5.0, “internalTemp”: 50 }

三、示例代码

报文请求构造 → 响应报文解析 → 寄存器解码 → 光伏设备物模型组织

目标:

  • 协议层、解析层、物模型层解耦

  • 方便后续做多品牌 Adapter + 配置化映射

代码结构

1、Modbus TCP 请求报文构造

ModbusRequest.cs

/* by 01130.hk - online tools website : 01130.hk/zh/tuya.html */ public class ModbusRequest { public ushort TransactionId { get; set; } public byte UnitId { get; set; } public byte FunctionCode { get; set; } = 0x03; public ushort StartAddress { get; set; } public ushort Quantity { get; set; } public byte[] ToBytes() { var buffer = new List<byte>(); // Transaction ID buffer.AddRange(BitConverter.GetBytes(TransactionId).Reverse()); // Protocol ID (0x0000) buffer.Add(0x00); buffer.Add(0x00); // Length = UnitId + PDU ushort length = 1 + 1 + 2 + 2; buffer.AddRange(BitConverter.GetBytes(length).Reverse()); // Unit ID buffer.Add(UnitId); // PDU buffer.Add(FunctionCode); buffer.AddRange(BitConverter.GetBytes(StartAddress).Reverse()); buffer.AddRange(BitConverter.GetBytes(Quantity).Reverse()); return buffer.ToArray(); } }

2. Modbus TCP 响应解析

ModbusResponse.cs

/* by 01130.hk - online tools website : 01130.hk/zh/tuya.html */ public class ModbusResponse { public ushort TransactionId { get; set; } public byte UnitId { get; set; } public byte FunctionCode { get; set; } public byte ByteCount { get; set; } public byte[] Data { get; set; } }

ModbusParser.cs

public static class ModbusParser { public static ModbusResponse ParseResponse(byte[] response) { if (response.Length < 9) throw new Exception("Invalid Modbus response length"); var result = new ModbusResponse(); result.TransactionId = ReadUInt16(response, 0); ushort protocolId = ReadUInt16(response, 2); ushort length = ReadUInt16(response, 4); if (protocolId != 0) throw new Exception("Invalid Protocol ID"); result.UnitId = response[6]; result.FunctionCode = response[7]; result.ByteCount = response[8]; result.Data = response.Skip(9).Take(result.ByteCount).ToArray(); return result; } private static ushort ReadUInt16(byte[] buffer, int index) { return (ushort)((buffer[index] << 8) | buffer[index + 1]); } }

3. 寄存器解码(倍率 + 字节序)

RegisterDecoder.cs

public static class RegisterDecoder { public static ushort ReadUInt16(byte[] data, int registerIndex) { int offset = registerIndex * 2; return (ushort)((data[offset] << 8) | data[offset + 1]); } public static double ReadScaledValue( byte[] data, int registerIndex, double scale) { return ReadUInt16(data, registerIndex) / scale; } }

4、光伏设备物模型定义

PvThingModel.cs

public class PvThingModel { public double DcVoltage { get; set; } public double DcCurrent { get; set; } public double DcPower { get; set; } public double InternalTemperature { get; set; } public DateTime Timestamp { get; set; } = DateTime.UtcNow; }

5. 从响应到物模型的映射

public static class PvThingModelBuilder { public static PvThingModel FromModbus(ModbusResponse response) { var data = response.Data; return new PvThingModel { DcVoltage = RegisterDecoder.ReadScaledValue(data, 0, 10), // 30000 DcCurrent = RegisterDecoder.ReadScaledValue(data, 1, 10), // 30001 DcPower = RegisterDecoder.ReadScaledValue(data, 2, 1000), // 30002 InternalTemperature = RegisterDecoder.ReadUInt16(data, 3) // 30003 }; } }

6. 完整示例调用(Demo)

public class Demo { public static void Run() { // 1. 构造请求 var request = new ModbusRequest { TransactionId = 1, UnitId = 1, StartAddress = 30000, Quantity = 6 }; byte[] requestBytes = request.ToBytes(); // === 这里通常通过 TCP Socket 发送 requestBytes === // 2. 模拟接收到的响应报文 byte[] responseBytes = { 0x00,0x01,0x00,0x00,0x00,0x0F,0x01,0x03,0x0C, 0x09,0xC4,0x00,0x64,0x13,0x88,0x00,0x32 }; // 3. 解析响应 var response = ModbusParser.ParseResponse(responseBytes); // 4. 构建物模型 PvThingModel model = PvThingModelBuilder.FromModbus(response); Console.WriteLine($"DC Voltage: {model.DcVoltage} V"); Console.WriteLine($"DC Current: {model.DcCurrent} A"); Console.WriteLine($"DC Power: {model.DcPower} kW"); Console.WriteLine($"Temperature: {model.InternalTemperature} ℃"); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 9:05:26

React Native for OpenHarmony 实战:Sound 音频播放详解

React Native for OpenHarmony 实战&#xff1a;Sound 音频播放详解 摘要 本文深入探讨React Native在OpenHarmony平台上的音频播放实现方案。通过对比主流音频库react-native-sound和expo-av的适配表现&#xff0c;结合OpenHarmony音频子系统的特性&#xff0c;提供完整的音…

作者头像 李华
网站建设 2026/4/16 9:03:31

服务器搭建全攻略:步骤详解与注意事项,轻松上手服务器管理

服务器搭建基础概念 服务器搭建涉及硬件选择、操作系统安装、网络配置及安全设置。服务器是提供计算、存储或应用服务的核心设备&#xff0c;需根据需求选择物理服务器或云服务器。物理服务器适合高性能需求&#xff0c;云服务器弹性高、成本低。 硬件与云服务选择 物理服务…

作者头像 李华
网站建设 2026/4/2 6:19:52

35天,版本之子变路人甲:AI榜单太残酷!

o1从榜首暴跌至#56&#xff0c;Claude 3 Opus坠入#139。LMSYS榜单揭示残酷真相&#xff1a;大模型的「霸主保质期」只有35天&#xff01;这不是技术迭代&#xff0c;这是对所有应用层开发者的降维屠杀。 还记得OpenAI o1刚发布那会儿&#xff0c;整个科技圈那种近乎朝圣般的狂…

作者头像 李华
网站建设 2026/4/1 23:53:56

陶哲轩惊叹!数学奇点初现,AI首次给出人类无法企及的原创证明

数学奇点初现&#xff01;Gemini攻克全新数学定理&#xff0c;斯坦福大牛惊呼「想出来能吹一辈子」&#xff1b;陶哲轩预言数学家AI共生未来&#xff1b;Grok发现黎曼猜想新的隐蔽通道……汉语是人类语言的一种。比特是计算机的语言。而数学则是宇宙的语言。正如「现代物理学之…

作者头像 李华
网站建设 2026/3/25 11:28:25

django特色乡村综合服务平台设计与实现

目录Django特色乡村综合服务平台设计与实现摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;Django特色乡村综合服务平台设计与实现摘要 该平台基于Django框架开发&#xff0c;旨…

作者头像 李华