跳到主要内容

Modify

前置阅读

sub.Modify(...)

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

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

返回 ModifySubscriptionResult:

struct ModifySubscriptionResult {
double revised_publishing_interval_ms = 0.0;
uint32_t revised_lifetime_count = 0;
uint32_t revised_max_keep_alive_count = 0;
};
auto rev = sub.Modify(/*publishing_interval_ms=*/1000.0,
/*lifetime_count=*/600,
/*max_keep_alive_count=*/30);
std::cout << "Revised publishing interval = "
<< rev.revised_publishing_interval_ms << " ms\n";

sub.ModifyMonitoredItems(requests)

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

std::vector<ModifyMonitoredItemResult> ModifyMonitoredItems(
std::vector<MonitoredItemModifyRequest> const& requests);

MonitoredItemModifyRequest 字段:

struct MonitoredItemModifyRequest {
uint32_t monitored_item_handle = 0;
double sampling_interval_ms = -1.0; // -1 = 跟订阅, 0 = 尽快
uint32_t queue_size = 1;
bool discard_oldest = true;
};

返回 ModifyMonitoredItemResult:

struct ModifyMonitoredItemResult {
Status status = Status::Bad;
double revised_sampling_interval_ms = 0.0;
uint32_t revised_queue_size = 0;
};
std::vector<MonitoredItemModifyRequest> reqs;
for (auto h : mi_handles) {
MonitoredItemModifyRequest r;
r.monitored_item_handle = h;
r.sampling_interval_ms = 50.0;
r.queue_size = 10;
r.discard_oldest = true;
reqs.push_back(r);
}
auto results = sub.ModifyMonitoredItems(reqs);

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

ModifyMonitoredItemResult ModifyItem(
uint32_t mi_handle,
double sampling_interval_ms,
uint32_t queue_size = 1,
bool discard_oldest = true);
auto r = sub.ModifyItem(handle, /*sampling_interval_ms=*/50.0);
std::cout << "Revised sampling = " << r.revised_sampling_interval_ms << " ms\n";

QueueSize 与 DiscardOldest

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

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

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

下一步