虚拟地址系统 - Snet Docs

🎭 虚拟地址系统

虚拟地址允许 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 开发 VirtualStaticVirtualDynamic_Random
测试读取解析逻辑 VirtualStatic(已知值)
模拟传感器波动 VirtualDynamic_RandomScope
逐步测试 VirtualDynamic_Order
带递增负载的压力测试 VirtualDynamic_OrderScope