跳到主要内容

Modify

前置阅读

sub.Modify(...)

修改 Subscription 的发布参数 (ModifySubscription 服务):

public ModifySubscriptionResult Modify(
double publishingIntervalMs,
uint lifetimeCount = 1200,
uint maxKeepAliveCount = 50,
uint maxNotificationsPerPublish = 0,
byte priority = 0);
参数含义
publishingIntervalMs新发布间隔
lifetimeCount多少个 publish 周期没收到 PublishRequest 就清理订阅
maxKeepAliveCount没新数据时多久发一次空 KeepAlive
maxNotificationsPerPublish单次 Publish 最多发多少条通知, 0 = 不限
priority优先级

返回 ModifySubscriptionResult, 字段 RevisedPublishingIntervalMs / RevisedLifetimeCount / RevisedMaxKeepAliveCount 是服务端实际生效值.

var rev = sub.Modify(publishingIntervalMs: 1000, lifetimeCount: 600, maxKeepAliveCount: 30);
Console.WriteLine($"Revised publishing interval = {rev.RevisedPublishingIntervalMs}ms");

sub.ModifyMonitoredItems(requests)

批量修改 MI 采样参数 (ModifyMonitoredItems 服务):

public IReadOnlyList<ModifyMonitoredItemResult> ModifyMonitoredItems(
IReadOnlyList<MonitoredItemModifyRequest> requests);

MonitoredItemModifyRequest 字段:

字段默认说明
MonitoredItemHandle本地 MI 句柄
SamplingIntervalMs-1-1 = 跟订阅, 0 = 尽快
QueueSize1服务端缓冲队列长度
DiscardOldesttruetrue = 丢最旧, false = 丢最新

返回 ModifyMonitoredItemResult:

字段说明
Status修改结果
RevisedSamplingIntervalMs服务端实际采样间隔
RevisedQueueSize服务端实际队列大小
var requests = miHandles.Select(h => new MonitoredItemModifyRequest
{
MonitoredItemHandle = h,
SamplingIntervalMs = 50,
QueueSize = 10,
DiscardOldest = true
}).ToList();
var results = sub.ModifyMonitoredItems(requests);

sub.ModifyItem(...) 单 MI 简化版

public ModifyMonitoredItemResult ModifyItem(
uint monitoredItemHandle,
double samplingIntervalMs,
uint queueSize = 1,
bool discardOldest = true);
var r = sub.ModifyItem(handle, samplingIntervalMs: 50);
Console.WriteLine($"Revised sampling = {r.RevisedSamplingIntervalMs}ms");

QueueSize 与 DiscardOldest

服务端为每个 MI 维护一个先进先出队列. 当客户端 Publish 来不及取时, 队列满了:

  • DiscardOldest = true (默认) → 丢最旧, 保留最新
  • DiscardOldest = false → 丢最新, 保留最旧

QueueSize = 1 (默认) 只保留最新值, 适合"实时显示"; QueueSize = N (N > 1) 适合"采样不能漏"的高频数据.

下一步