Modify (C)
前置阅读
- 创建订阅请看 Create.
- 整条订阅启停 / 单 MI 启停请看 SetMonitoringMode.
DarraUa_Subscription_Modify
修改订阅的发布参数 (ModifySubscription 服务):
DARRA_OPCUA_API DarraUa_Status DARRA_OPCUA_CALL DarraUa_Subscription_Modify(
DarraUa_SubscriptionHandle h,
double new_publishing_interval_ms,
uint32_t new_lifetime_count,
uint32_t new_max_keep_alive_count,
uint32_t new_max_notifications_per_publish,
uint8_t new_priority,
/* out */ double* revised_publishing_interval_ms,
/* out */ uint32_t* revised_lifetime_count,
/* out */ uint32_t* revised_max_keep_alive_count);
revised_* 是服务端实际生效值 (服务端可能 revise 调整). 任意 out 指针可为 NULL 表示忽略.
double rev_pub = 0.0;
uint32_t rev_life = 0;
uint32_t rev_ka = 0;
DarraUa_Subscription_Modify(
sub,
/*new_publish*/ 1000.0,
/*new_lifetime*/ 600,
/*new_max_ka*/ 30,
/*new_max_notif*/ 0,
/*new_priority*/ 0,
&rev_pub, &rev_life, &rev_ka);
printf("Revised publishing = %.1f ms, lifetime = %u, max_ka = %u\n",
rev_pub, rev_life, rev_ka);
DarraUa_Subscription_ModifyMonitoredItems
批量修改 MI 采样参数 (ModifyMonitoredItems 服务):
typedef struct {
uint32_t mi_handle;
double sampling_interval_ms; /* -1 = 跟订阅 */
uint32_t queue_size; /* >= 1 */
int32_t discard_oldest; /* 1 = 丢最旧, 0 = 丢最新 */
} DarraUa_MonitoredItemModifyRequest;
DARRA_OPCUA_API DarraUa_Status DARRA_OPCUA_CALL DarraUa_Subscription_ModifyMonitoredItems(
DarraUa_SubscriptionHandle h,
const DarraUa_MonitoredItemModifyRequest* requests,
uint32_t count,
DarraUa_Status* out_results,
double* out_revised_sampling_intervals,
uint32_t* out_revised_queue_sizes);
out_* 数组均由调用方按 count 分配, 任一可为 NULL 表示忽略.
DarraUa_MonitoredItemModifyRequest reqs[3] = {
{ mis[0], 50.0, 10, 1 },
{ mis[1], 50.0, 10, 1 },
{ mis[2], 50.0, 10, 1 },
};
DarraUa_Status results[3] = { 0 };
double rev_sample[3] = { 0 };
uint32_t rev_queue[3] = { 0 };
DarraUa_Subscription_ModifyMonitoredItems(sub, reqs, 3,
results, rev_sample, rev_queue);
for (int i = 0; i < 3; ++i) {
printf("mi=%u status=%s revised_sample=%.1f revised_queue=%u\n",
reqs[i].mi_handle, DarraUa_StatusName(results[i]),
rev_sample[i], rev_queue[i]);
}
QueueSize 与 DiscardOldest
服务端为每个 MI 维护一个先进先出队列. 当客户端 Publish 来不及取时, 队列满了:
discard_oldest = 1(默认) → 丢最旧, 保留最新discard_oldest = 0→ 丢最新, 保留最旧
queue_size = 1 (默认) 只保留最新值, 适合"实时显示"; queue_size = N (N > 1) 适合"采样不能漏"的高频数据.
何时用 Modify 而不是删除重建
| 场景 | 推荐 |
|---|---|
| 改 publishingInterval / lifetime / sampling | _Modify / _ModifyMonitoredItems (省 RPC, 不丢通知) |
| 完全更换 NodeId / Attribute | 删 + 重建 (Modify 不能换 NodeId) |
| 临时停一个 MI | SetMonitoringMode (Disabled), 比删除轻量 |