跳到主要内容

Modify

前置阅读

sub.modify(...)

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

def modify(self,
publishing_interval_ms: float,
lifetime_count: int = 1200,
max_keep_alive_count: int = 50,
max_notifications_per_publish: int = 0,
priority: int = 0) -> ModifySubscriptionResult: ...
参数含义
publishing_interval_ms新发布间隔
lifetime_count多少个 publish 周期没收到 PublishRequest 就清理订阅
max_keep_alive_count没新数据时多久发一次空 KeepAlive
max_notifications_per_publish单次 Publish 最多发多少条通知, 0 = 不限
priority优先级 (0-255)

返回 ModifySubscriptionResult:

字段类型说明
revised_publishing_interval_msfloat服务端实际发布间隔
revised_lifetime_countint服务端实际 lifetime
revised_max_keep_alive_countint服务端实际 keepalive
rev = sub.modify(publishing_interval_ms=1000, lifetime_count=600, max_keep_alive_count=30)
print(f"Revised publishing interval = {rev.revised_publishing_interval_ms}ms")

sub.modify_monitored_items(requests)

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

def modify_monitored_items(
self,
requests: List[MonitoredItemModifyRequest]
) -> List[ModifyMonitoredItemResult]: ...

MonitoredItemModifyRequest 字段:

字段默认说明
monitored_item_handle本地 MI 句柄
sampling_interval_ms-1.0-1 = 跟订阅, 0 = 尽快
queue_size1服务端缓冲队列长度
discard_oldestTrueTrue = 丢最旧, False = 丢最新

ModifyMonitoredItemResult:

字段类型说明
statusStatusCode修改结果
revised_sampling_interval_msfloat服务端实际采样间隔
revised_queue_sizeint服务端实际队列大小
from darra_opcua import MonitoredItemModifyRequest

requests = [
MonitoredItemModifyRequest(
monitored_item_handle=h,
sampling_interval_ms=50,
queue_size=10,
discard_oldest=True)
for h in mi_handles
]
results = sub.modify_monitored_items(requests)

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

def modify_item(self,
monitored_item_handle: int,
sampling_interval_ms: float,
queue_size: int = 1,
discard_oldest: bool = True) -> ModifyMonitoredItemResult: ...
r = sub.modify_item(handle, sampling_interval_ms=50)
print(f"Revised sampling = {r.revised_sampling_interval_ms}ms")

queue_size 与 discard_oldest

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

  • discard_oldest = True (默认) → 丢最旧, 保留最新
  • discard_oldest = False → 丢最新, 保留最旧

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

下一步