跳到主要内容

Modify

前置阅读

sub.modify(...)

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

pub fn Subscription::modify(
&mut self,
publishing_interval_ms: f64,
lifetime_count: u32,
max_keep_alive_count: u32,
max_notifications: u32,
priority: u8,
) -> Result<ModifySubscriptionResult, OpcUaError>;
参数含义
publishing_interval_ms新发布间隔
lifetime_count多少个 publish 周期没收到 PublishRequest 就清理订阅
max_keep_alive_count没新数据时多久发一次空 KeepAlive
max_notifications单次 Publish 最多发多少条通知, 0 = 不限
priority优先级

返回 ModifySubscriptionResult:

pub struct ModifySubscriptionResult {
pub revised_publishing_interval_ms: f64,
pub revised_lifetime_count: u32,
pub revised_max_keep_alive_count: u32,
}

revised_* 字段是服务端实际生效值. SDK 内部已同步更新本地 publishing_interval_ms() 缓存.

let mut sub = s.create_subscription(500.0)?;
let rev = sub.modify(1000.0, 600, 30, 0, 0)?;
println!("Revised publishing interval = {}ms", rev.revised_publishing_interval_ms);
&mut self

modify&mut self, 因为内部要更新 publishing_interval_ms_bits 原子缓存.


sub.modify_monitored_items(requests)

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

pub fn modify_monitored_items(
&self,
requests: &[MonitoredItemModifyRequest],
) -> Result<Vec<ModifyMonitoredItemResult>, OpcUaError>;

MonitoredItemModifyRequest 字段:

pub struct MonitoredItemModifyRequest {
/// 本地 MI 句柄 (从 add_node / add_many 拿到).
pub monitored_item_handle: u32,
/// 新采样间隔 (ms). -1.0 = 跟随订阅; 0.0 = 尽快.
pub sampling_interval_ms: f64,
/// 新队列长度 (>= 1).
pub queue_size: u32,
/// true = 队列满时丢最旧, false = 丢最新.
pub discard_oldest: bool,
}

返回 ModifyMonitoredItemResult:

pub struct ModifyMonitoredItemResult {
pub status: StatusCode,
pub revised_sampling_interval_ms: f64,
pub revised_queue_size: u32,
}
use darra_opcua::MonitoredItemModifyRequest;

let reqs: Vec<MonitoredItemModifyRequest> = mi_handles.iter().map(|h| {
MonitoredItemModifyRequest {
monitored_item_handle: *h,
sampling_interval_ms: 50.0,
queue_size: 10,
discard_oldest: true,
}
}).collect();
let results = sub.modify_monitored_items(&reqs)?;

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

pub fn modify_item(
&self,
monitored_item_handle: u32,
sampling_interval_ms: f64,
queue_size: u32,
discard_oldest: bool,
) -> Result<ModifyMonitoredItemResult, OpcUaError>;
let r = sub.modify_item(h, 50.0, 1, true)?;
println!("Revised sampling = {}ms", r.revised_sampling_interval_ms);

QueueSize 与 DiscardOldest

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

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

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

错误

StatusCode原因
BAD_MONITORED_ITEM_ID_INVALID句柄已 remove / 失效
BAD_TOO_MANY_OPERATIONS单次请求项过多
BAD_SUBSCRIPTION_ID_INVALID订阅已被清理

下一步