🎭 虚拟地址系统
虚拟地址允许 Snet 在没有真实硬件的情况下模拟设备数据。它们在 ReadAsync 管道中由 AddressHandler.ExecuteDispose() 在实际 I/O 发生之前拦截。
AddressType 枚举
每个 AddressDetails 都有一个 AddressType:
| 值 | 含义 |
|---|---|
Reality |
真实设备地址 -- 实际 I/O |
| 虚拟类型 | 模拟数据 -- 在 I/O 之前拦截 |
5种虚拟地址类型
1. VirtualStatic(虚拟静态)
返回一个固定的常量值。配置一次,永不改变。
var address = new AddressDetails
{
AddressName = "$VSTATIC_3.14", // 永远返回 3.14
AddressType = AddressType.VirtualStatic
};
2. VirtualDynamic_Random(虚拟动态随机)
每次读取时返回数据类型范围内的随机值。
var address = new AddressDetails
{
AddressName = "$VRANDOM", // 每次读取返回随机 Float 值
AddressType = AddressType.VirtualDynamic_Random
};
3. VirtualDynamic_RandomScope(虚拟动态范围随机)
返回指定最小-最大范围内的随机值。
var address = new AddressDetails
{
AddressName = "$VRANDOM_0_100", // 返回 0 到 100 之间的随机值
AddressType = AddressType.VirtualDynamic_RandomScope
};
4. VirtualDynamic_Order(虚拟动态顺序)
按固定序列顺序返回值。循环遍历预定义列表。
var address = new AddressDetails
{
AddressName = "$VORDER_1_2_3_4_5", // 循环遍历 1, 2, 3, 4, 5
AddressType = AddressType.VirtualDynamic_Order
};
5. VirtualDynamic_OrderScope(虚拟动态范围顺序)
在指定范围内按序列返回值。
var address = new AddressDetails
{
AddressName = "$VORDER_0_100_10", // 0, 10, 20, ..., 100,然后重复
AddressType = AddressType.VirtualDynamic_OrderScope
};
工作原理
在 ReadAsync 期间,管道检查每个 AddressDetails:
foreach (AddressDetails detail in address.AddressArray)
{
if (detail.AddressType == AddressType.Reality)
{
// 正常路径:构建协议帧,发送,接收,解析
result = await ReadFromDevice(detail);
}
else
{
// 虚拟路径:在内存中生成值
result = detail.ExecuteDispose(value, message);
}
}
过滤虚拟地址
Address 类提供了两个方法用于处理混合真实/虚拟场景:
// 移除所有虚拟地址,只保留真实地址
var realOnly = address.RemoveVirtualAddress();
// 统计有多少真实地址
int realCount = address.GetRealityAddressCount();
这通常用于订阅场景,只有真实地址才需要从设备轮询,而虚拟地址由应用程序在内存中更新。
使用场景
| 场景 | 虚拟类型 |
|---|---|
| 无硬件时的 UI 开发 | VirtualStatic 或 VirtualDynamic_Random |
| 测试读取解析逻辑 | VirtualStatic(已知值) |
| 模拟传感器波动 | VirtualDynamic_RandomScope |
| 逐步测试 | VirtualDynamic_Order |
| 带递增负载的压力测试 | VirtualDynamic_OrderScope |
