🎭 虚拟地址系统
虚拟地址允许 Snet 在没有真实硬件的情况下模拟设备数据。它们在 ReadAsync 管道中由 AddressHandler.ExecuteDispose() 在实际 I/O 发生之前拦截。
AddressType 枚举
每个 AddressDetails 都有一个 AddressType:
| 值 | 含义 |
|---|---|
Reality |
真实设备地址 -- 实际 I/O |
| 虚拟类型 | 模拟数据 -- 在 I/O 之前拦截 |
5种虚拟地址类型
参数通过 AddressName 中的花括号传递,例如 "MyPoint{500}":
| 类型 | 语法 | 示例 |
|---|---|---|
VirtualStatic |
{pointName} |
"MyPoint" -- 固定值(创建时生成一次,永不改变) |
VirtualDynamic_Random |
{pointName}{interval} |
"MyPoint{500}" -- 每 500 毫秒生成一个新随机值 |
VirtualDynamic_RandomScope |
{pointName}{interval,min^max} |
"MyPoint{200,0^100}" -- 每 200 毫秒生成 [0,100] 范围内的随机值 |
VirtualDynamic_Order |
{pointName}{interval,step} |
"MyPoint{1000,0.5}" -- 每 1000 毫秒递增 0.5 |
VirtualDynamic_OrderScope |
{pointName}{interval,step,min^max} |
"MyPoint{500,1,0^100}" -- 0、1、2... 到达 100 后循环 |
所有间隔值都会校验最小值 10 毫秒,防止 CPU 空转。
1. VirtualStatic(虚拟静态)
返回一个固定的常量值。配置一次,永不改变。
var address = new AddressDetails
{
AddressName = "MyPoint", // 固定值(创建时生成一次,永不改变)
AddressType = AddressType.VirtualStatic
};
2. VirtualDynamic_Random(虚拟动态随机)
按配置的间隔返回数据类型范围内的新随机值。
var address = new AddressDetails
{
AddressName = "MyPoint{500}", // 每 500 毫秒生成新随机值
AddressType = AddressType.VirtualDynamic_Random
};
3. VirtualDynamic_RandomScope(虚拟动态范围随机)
返回指定最小-最大范围内的随机值。
var address = new AddressDetails
{
AddressName = "MyPoint{200,0^100}", // 每 200 毫秒生成 [0, 100] 范围内的随机值
AddressType = AddressType.VirtualDynamic_RandomScope
};
4. VirtualDynamic_Order(虚拟动态顺序)
按配置的间隔和步长顺序递增返回值。
var address = new AddressDetails
{
AddressName = "MyPoint{1000,0.5}", // 每 1000 毫秒递增 0.5
AddressType = AddressType.VirtualDynamic_Order
};
5. VirtualDynamic_OrderScope(虚拟动态范围顺序)
在指定的最小-最大范围内按序列返回值,到达边界后循环。
var address = new AddressDetails
{
AddressName = "MyPoint{500,1,0^100}", // 0, 1, 2, ..., 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 |
