📐 地址模型
命名空间: Snet.Model.data | 类: Address, AddressDetails, AddressValue
地址模型系统定义了 Snet 如何在协议驱动和物理设备之间表示、配置和传输数据。三个类协同工作:Address(容器)、AddressDetails(点位配置)、AddressValue(带采集数据的点位)。
模型层次结构
Address -- 容器,含 SN + AddressArray(List<AddressDetails>)
AddressDetails -- 单个点位:地址名、数据类型、长度、编码、MQ 参数
└── AddressValue -- 继承 AddressDetails,增加 Quality、ResultValue、OriginalValue、Time
Address
用于一组读写地址点的顶层容器。
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
SN |
string |
Guid.ToUpperNString() |
唯一标识符(可存机台号、组名、车间、厂) |
AddressArray |
List<AddressDetails> |
— | 所有地址点位 |
CreationTime |
DateTime |
— | 创建时间 |
关键方法:CheckAddress() 验证无空地址名,RemoveVirtualAddress() 筛选仅 AddressType.Reality,GetRealityAddressCount() 统计实际地址数。
var address = new Address
{
SN = "Station1",
AddressArray = new List<AddressDetails>
{
new("温度", "40001", DataType.Int16),
new("湿度", "40002", DataType.Int16),
}
};
AddressDetails
单个点位的配置。独立类(不继承 Address)。
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
SN |
string |
Guid.ToUpperNString() |
唯一标识符 |
AddressName |
string |
— | 必填。 PLC 地址(如 "40001", "DB1.DBX0.0")。扩展数据时可为空 |
AddressAnotherName |
string? |
null |
地址别名 |
AddressPropertyName |
string? |
null |
地址属性名(对应实体字段名) |
AddressDescribe |
string? |
null |
描述说明 |
AddressDataType |
DataType |
String |
数据类型 |
AddressType |
AddressType |
Reality |
Reality=实际地址,VirtualDynamic_*=虚拟仿真 |
Length |
ushort |
1 |
数组长度;使用 Array 类型时按需调整 |
EncodingType |
EncodingType |
ANSI |
字符串编码 |
IsEnable |
bool |
true |
false=跳过此点位采集 |
AddressMqParam |
AddressMq? |
null |
MQ 转发配置 (ISns + Topic + ContentFormat) |
AddressParseParam |
AddressParse? |
null |
反射解析配置 |
AddressExtendParam |
object? |
null |
指定通信的扩展数据 |
多种构造函数:
// 最简
new AddressDetails("温度", "40001", DataType.Int16);
// 完整
new AddressDetails(sn, addressName, alias, propName, desc,
extendParam, mqParam, parseParam,
dataType, addressType, isEnable, length, encodingType);
AddressValue
继承 AddressDetails,增加数据质量和值字段。是 ReadAsync 返回的主要数据载体。
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
(所有 AddressDetails 属性) |
— | — | 继承的点位配置 |
Quality |
QualityType |
None (-1) |
数据质量枚举(见下方) |
ResultValue |
object? |
null |
解析后的值(经过类型转换/解析) |
OriginalValue |
object? |
null |
解析前的值(原始数据;未解析时与 ResultValue 一致) |
Message |
string |
— | 详细信息 |
Time |
DateTime |
DateTime.Now |
采集时间戳 |
关键方法:
GetDetails(out resultValue, out originalValue, out message, out time)→ 返回QualityTypeGetSimplify()→ 转为轻量级AddressValueSimplify传输模型(Protobuf 优化)SET(AddressDetails)/SET(value, source, time, bytesModel, msg, quality)→ 流式配置
完整构造函数:
new AddressValue(
quality: QualityType.Normal,
resultValue: 25.6f,
originalValue: rawBytes,
message: "成功",
time: DateTime.Now,
addressDetails: detail
);
QualityType 质量码枚举
枚举 QualityType : int,位于 Snet.Model.@enum 命名空间。每个值带有中文 [Description] 特性。
| 值 | 枚举 | Int | 描述 (EN) | 描述 (ZH) |
|---|---|---|---|---|
| -1 | None |
-1 | Not yet processed | 未经过处理 |
| 0 | Exception |
0 | Error / exception | 异常 |
| 1 | Normal |
1 | 正常 — 触发 MQ 自动转发 | 正常 |
| 2 | DataTypeError |
2 | Data type mismatch | 数据类型错误 |
| 3 | ParseUnknown |
3 | Parsed successfully but correctness unknown (also triggers MQ forward) | 数据经过解析,并且解析成功,无法得知数据的正确性 |
| 4 | ParseError |
4 | Parse failed | 解析错误 |
using Snet.Model.@enum;
if (value.Quality == QualityType.Normal)
Console.WriteLine("数据正常: " + value.ResultValue);
else if (value.Quality == QualityType.ParseUnknown)
Console.WriteLine("已解析但正确性未知: " + value.ResultValue);
else
LogHelper.Warning($"数据质量异常: {value.Quality}");
