Modify
前置阅读
- 创建订阅请看 创建 Subscription.
- 整条订阅启停 / 单 MI 启停请看 SetMonitoringMode.
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_ms | float | 服务端实际发布间隔 |
revised_lifetime_count | int | 服务端实际 lifetime |
revised_max_keep_alive_count | int | 服务端实际 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_size | 1 | 服务端缓冲队列长度 |
discard_oldest | True | True = 丢最旧, False = 丢最新 |
ModifyMonitoredItemResult:
| 字段 | 类型 | 说明 |
|---|---|---|
status | StatusCode | 修改结果 |
revised_sampling_interval_ms | float | 服务端实际采样间隔 |
revised_queue_size | int | 服务端实际队列大小 |
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) 适合"采样不能漏"的高频数据.