SetMonitoringMode
每个 MonitoredItem 有 3 种 monitoring mode:
pub enum MonitoringMode {
Disabled = 0,
Sampling = 1,
Reporting = 2,
}
| Mode | 服务端采样 | 服务端推送 | 用途 |
|---|---|---|---|
Disabled (0) | × | × | 完全停 (不采也不推) |
Sampling (1) | ✓ | × | 采样但不推 (记历史 / 死区计算) |
Reporting (2, 默认) | ✓ | ✓ | 正常运作 |
前置阅读
- 想停整条订阅 (而不是逐 MI) 看下面
set_publishing_enabled. - 修改采样参数请看 Modify.
批量切
pub fn Subscription::set_monitoring_mode(
&self,
mode: MonitoringMode,
mi_handles: &[u32],
) -> Result<Vec<StatusCode>, OpcUaError>;
use darra_opcua::MonitoringMode;
// 临时停止全部采集 (例如设备维护期间)
let all_handles: Vec<u32> = vec![h1, h2, h3, h4];
let statuses = sub.set_monitoring_mode(MonitoringMode::Disabled, &all_handles)?;
for (h, st) in all_handles.iter().zip(statuses.iter()) {
if !st.is_good() { eprintln!("MI {} stop failed: {}", h, st); }
}
单 MI 切
pub fn Subscription::set_mode(
&self,
monitored_item_handle: u32,
mode: MonitoringMode,
) -> Result<StatusCode, OpcUaError>;
sub.set_mode(h, MonitoringMode::Disabled)?; // 暂停某个 MI
sub.set_mode(h, MonitoringMode::Reporting)?; // 恢复
整条订阅启停 (set_publishing_enabled)
如果想停整条订阅 (而不是逐 MI), 用 set_publishing_enabled:
pub fn Subscription::set_publishing_enabled(&self, enabled: bool) -> StatusCode;
sub.set_publishing_enabled(false); // 暂停整条订阅推送
// ... 维护期间 ...
sub.set_publishing_enabled(true); // 恢复
三种粒度对比
| 粒度 | API | 适用 |
|---|---|---|
| 整条订阅 | sub.set_publishing_enabled(b) | 临时全停 (维护) |
| 一批 MI | sub.set_monitoring_mode(mode, &handles) | 部分模块停 |
| 单 MI | sub.set_mode(handle, mode) | 精细控制 |
| 完全删除 | sub.remove(handle) / drop sub | 永久不要了 |
错误
| StatusCode | 原因 |
|---|---|
BAD_MONITORED_ITEM_ID_INVALID | 句柄已 remove / 失效 |
BAD_SUBSCRIPTION_ID_INVALID | 订阅已被清理 |
BAD_TOO_MANY_OPERATIONS | 单次请求项过多 |
注意
Disabled模式仍占服务端资源 (订阅条目本身), 只是不采样不推送- 想完全释放, 用
sub.remove(h)删除该 MI - mode 切换是
&self借用 (内部走 RPC, 不改本地配置)