SetMonitoringMode (C)
每个 MonitoredItem 有 3 种 monitoring mode:
| Mode 枚举 | 服务端采样 | 服务端推送 | 用途 |
|---|---|---|---|
DARRA_UA_MI_MODE_DISABLED (0) | × | × | 完全停 (不采也不推) |
DARRA_UA_MI_MODE_SAMPLING (1) | ✓ | × | 采样但不推 (记历史 / 死区计算) |
DARRA_UA_MI_MODE_REPORTING (2, 默认) | ✓ | ✓ | 正常运作 |
前置阅读
- 想停整条订阅 (而不是逐 MI) 看下面
SetPublishingMode. - 修改采样参数请看 Modify.
API
DARRA_OPCUA_API DarraUa_Status DARRA_OPCUA_CALL DarraUa_Subscription_SetMonitoringMode(
DarraUa_SubscriptionHandle h,
DarraUa_MonitoringMode mode,
const uint32_t* mi_handles,
uint32_t count,
DarraUa_Status* out_results);
mi_handles + count 描述目标 MI 集合, out_results 长度 ≥ count, 由调用方分配. 顶层返回值反映传输级状态; 单项状态在 out_results[i] 里.
/* 临时停止全部采集 (例如设备维护期间) */
uint32_t all_mis[100] = { /* ... */ };
DarraUa_Status results[100] = { 0 };
DarraUa_Subscription_SetMonitoringMode(
sub, DARRA_UA_MI_MODE_DISABLED, all_mis, 100, results);
for (int i = 0; i < 100; ++i)
if (!DARRA_UA_STATUS_IS_GOOD(results[i]))
printf("mi=%u failed: %s\n", all_mis[i], DarraUa_StatusName(results[i]));
/* 维护完恢复 */
DarraUa_Subscription_SetMonitoringMode(
sub, DARRA_UA_MI_MODE_REPORTING, all_mis, 100, results);
单 MI 切
C SDK 没有"单 MI 简化版", 数组长度传 1 即可:
uint32_t one[1] = { mi };
DarraUa_Status r[1] = { 0 };
DarraUa_Subscription_SetMonitoringMode(
sub, DARRA_UA_MI_MODE_DISABLED, one, 1, r);
整条订阅启停 (PublishingEnabled)
如果想停整条订阅 (而不是逐 MI), 用 _SetPublishingMode:
DARRA_OPCUA_API DarraUa_Status DARRA_OPCUA_CALL DarraUa_Subscription_SetPublishingMode(
DarraUa_SubscriptionHandle sub,
int32_t enabled);
DarraUa_Subscription_SetPublishingMode(sub, 0); /* 停 */
DarraUa_Subscription_SetPublishingMode(sub, 1); /* 恢复 */
enabled = 0 后, 服务端仍然采样, 但不推送; = 1 恢复推送.
三种粒度对比
| 粒度 | API | 适用 |
|---|---|---|
| 整条订阅 | _Subscription_SetPublishingMode | 临时全停 (维护) |
| 一批 MI | _Subscription_SetMonitoringMode(mode, handles, n) | 部分模块停 |
| 单 MI | 同上, n = 1 | 精细控制 |
| 完全删除 | _MonitoredItem_Delete(sub, mi) / _Subscription_Delete(sub) | 永久不要了 |