Modify
前置阅读
- 创建订阅请看 创建 Subscription.
- 整条订阅启停 / 单 MI 启停请看 SetMonitoringMode.
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) 适合"采样不能漏"的高频数据.