Я написал код для клиента OPC UA, который имеет 10 подписок, каждая из которых обрабатывает 3 идентификатора узла. Несмотря на то, что отслеживаемые элементы создаются для каждого идентификатора узла, подписка получает значение только от последнего идентификатора узла в каждой подписке
public static void main(String[] args) throws Exception {
OpcUaClient client = OpcUaClient.create("opc.tcp://KCT-L-610:53530/OPCUA/SimulationServer"); // Update with your Prosys OPC UA Server endpoint
client.connect().get();
// Create 10 subscriptions, each handling 3 tags
for (int i = 0; i < 10; i++) {
createSubscription(client, i);
}
// Sleep to allow subscriptions to run and collect data
Thread.sleep(10000); // Example: run for 10 seconds before completing
client.disconnect().get();
}
private static void createSubscription(OpcUaClient client, int subscriptionIndex) throws Exception {
// Create a new subscription every time
UaSubscription subscription = client.getSubscriptionManager().createSubscription(1000.0).get();
// Define the 3 tags (nodes) to monitor for this subscription
List readValueIds = newArrayList(
new ReadValueId(new NodeId(3, 1007 + subscriptionIndex * 3), AttributeId.Value.uid(), null, QualifiedName.NULL_VALUE), // Tag 1 for Subscription
new ReadValueId(new NodeId(3, 1008 + subscriptionIndex * 3), AttributeId.Value.uid(), null, QualifiedName.NULL_VALUE), // Tag 2 for Subscription
new ReadValueId(new NodeId(3, 1009 + subscriptionIndex * 3), AttributeId.Value.uid(), null, QualifiedName.NULL_VALUE) // Tag 3 for Subscription
);
// Create a MonitoringParameters object for the subscription
MonitoringParameters parameters = new MonitoringParameters(
subscription.nextClientHandle(),
1000.0, // Sampling interval: 1 second
null, // No filter, use default
uint(10), // Queue size
true // Discard oldest value if queue is full
);
// Create requests for the monitored items
List requests = newArrayList();
for (ReadValueId readValueId : readValueIds) {
requests.add(new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters));
}
// Create the monitored items and set a callback for value updates
//UaSubscription.ItemCreationCallback onItemCreated = (item, id) -> item.setValueConsumer((item1, value) -> onSubscriptionValue(item1, value, subscriptionIndex));
UaSubscription.ItemCreationCallback onItemCreated = (item, id) -> {
item.setValueConsumer((item1, value) -> onSubscriptionValue(item1, value, subscriptionIndex));
};
// Create monitored items and process
List items = subscription.createMonitoredItems(
TimestampsToReturn.Both,
requests,
onItemCreated
).get();
for (UaMonitoredItem item : items) {
if (item.getStatusCode().isGood()) {
logger.info("Subscription {}: Monitored item created for nodeId={}", subscriptionIndex, item.getReadValueId().getNodeId());
} else {
logger.warn("Subscription {}: Failed to create item for nodeId={} (status={})", subscriptionIndex, item.getReadValueId().getNodeId(), item.getStatusCode());
}
}
}
private static void onSubscriptionValue(UaMonitoredItem item, DataValue value, int subscriptionIndex) {
// This method is called when the monitored item value is updated
logger.info("Subscription {}: Received value for nodeId={}: {}", subscriptionIndex, item.getReadValueId().getNodeId(), value.getValue());
}
и вот какой результат я получил
14:56:45.402 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 0: Received value for nodeId=NodeId{ns=3, id=1009}: Variant{value=0.0}
14:56:45.403 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 0: Received value for nodeId=NodeId{ns=3, id=1009}: Variant{value=-1.618126}
14:56:45.403 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 0: Received value for nodeId=NodeId{ns=3, id=1009}: Variant{value=-2.0}
14:56:45.413 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 1: Received value for nodeId=NodeId{ns=3, id=1012}: Variant{value=0.1333334}
14:56:45.417 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 1: Received value for nodeId=NodeId{ns=3, id=1012}: Variant{value=27.0}
14:56:45.417 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 1: Received value for nodeId=NodeId{ns=3, id=1012}: Variant{value=0.0}
14:56:45.417 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 1: Received value for nodeId=NodeId{ns=3, id=1012}: Variant{value=28.0}
14:56:45.427 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 2: Received value for nodeId=NodeId{ns=3, id=1015}: Variant{value=-5.235019}
14:56:45.427 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 2: Received value for nodeId=NodeId{ns=3, id=1015}: Variant{value=0.209057}
14:56:45.427 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 2: Received value for nodeId=NodeId{ns=3, id=1015}: Variant{value=-4.472503}
14:56:45.427 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 2: Received value for nodeId=NodeId{ns=3, id=1015}: Variant{value=0.0}
Подробнее здесь: https://stackoverflow.com/questions/793 ... le-nodeids
Проблема с подпиской, обрабатывающей несколько идентификаторов узлов. ⇐ JAVA
Программисты JAVA общаются здесь
1735221986
Anonymous
Я написал код для клиента OPC UA, который имеет 10 подписок, каждая из которых обрабатывает 3 идентификатора узла. Несмотря на то, что отслеживаемые элементы создаются для каждого идентификатора узла, подписка получает значение только от последнего идентификатора узла в каждой подписке
public static void main(String[] args) throws Exception {
OpcUaClient client = OpcUaClient.create("opc.tcp://KCT-L-610:53530/OPCUA/SimulationServer"); // Update with your Prosys OPC UA Server endpoint
client.connect().get();
// Create 10 subscriptions, each handling 3 tags
for (int i = 0; i < 10; i++) {
createSubscription(client, i);
}
// Sleep to allow subscriptions to run and collect data
Thread.sleep(10000); // Example: run for 10 seconds before completing
client.disconnect().get();
}
private static void createSubscription(OpcUaClient client, int subscriptionIndex) throws Exception {
// Create a new subscription every time
UaSubscription subscription = client.getSubscriptionManager().createSubscription(1000.0).get();
// Define the 3 tags (nodes) to monitor for this subscription
List readValueIds = newArrayList(
new ReadValueId(new NodeId(3, 1007 + subscriptionIndex * 3), AttributeId.Value.uid(), null, QualifiedName.NULL_VALUE), // Tag 1 for Subscription
new ReadValueId(new NodeId(3, 1008 + subscriptionIndex * 3), AttributeId.Value.uid(), null, QualifiedName.NULL_VALUE), // Tag 2 for Subscription
new ReadValueId(new NodeId(3, 1009 + subscriptionIndex * 3), AttributeId.Value.uid(), null, QualifiedName.NULL_VALUE) // Tag 3 for Subscription
);
// Create a MonitoringParameters object for the subscription
MonitoringParameters parameters = new MonitoringParameters(
subscription.nextClientHandle(),
1000.0, // Sampling interval: 1 second
null, // No filter, use default
uint(10), // Queue size
true // Discard oldest value if queue is full
);
// Create requests for the monitored items
List requests = newArrayList();
for (ReadValueId readValueId : readValueIds) {
requests.add(new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters));
}
// Create the monitored items and set a callback for value updates
//UaSubscription.ItemCreationCallback onItemCreated = (item, id) -> item.setValueConsumer((item1, value) -> onSubscriptionValue(item1, value, subscriptionIndex));
UaSubscription.ItemCreationCallback onItemCreated = (item, id) -> {
item.setValueConsumer((item1, value) -> onSubscriptionValue(item1, value, subscriptionIndex));
};
// Create monitored items and process
List items = subscription.createMonitoredItems(
TimestampsToReturn.Both,
requests,
onItemCreated
).get();
for (UaMonitoredItem item : items) {
if (item.getStatusCode().isGood()) {
logger.info("Subscription {}: Monitored item created for nodeId={}", subscriptionIndex, item.getReadValueId().getNodeId());
} else {
logger.warn("Subscription {}: Failed to create item for nodeId={} (status={})", subscriptionIndex, item.getReadValueId().getNodeId(), item.getStatusCode());
}
}
}
private static void onSubscriptionValue(UaMonitoredItem item, DataValue value, int subscriptionIndex) {
// This method is called when the monitored item value is updated
logger.info("Subscription {}: Received value for nodeId={}: {}", subscriptionIndex, item.getReadValueId().getNodeId(), value.getValue());
}
и вот какой результат я получил
14:56:45.402 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 0: Received value for nodeId=NodeId{ns=3, id=1009}: Variant{value=0.0}
14:56:45.403 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 0: Received value for nodeId=NodeId{ns=3, id=1009}: Variant{value=-1.618126}
14:56:45.403 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 0: Received value for nodeId=NodeId{ns=3, id=1009}: Variant{value=-2.0}
14:56:45.413 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 1: Received value for nodeId=NodeId{ns=3, id=1012}: Variant{value=0.1333334}
14:56:45.417 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 1: Received value for nodeId=NodeId{ns=3, id=1012}: Variant{value=27.0}
14:56:45.417 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 1: Received value for nodeId=NodeId{ns=3, id=1012}: Variant{value=0.0}
14:56:45.417 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 1: Received value for nodeId=NodeId{ns=3, id=1012}: Variant{value=28.0}
14:56:45.427 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 2: Received value for nodeId=NodeId{ns=3, id=1015}: Variant{value=-5.235019}
14:56:45.427 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 2: Received value for nodeId=NodeId{ns=3, id=1015}: Variant{value=0.209057}
14:56:45.427 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 2: Received value for nodeId=NodeId{ns=3, id=1015}: Variant{value=-4.472503}
14:56:45.427 [milo-shared-thread-pool-3] INFO c.m.o.MultipleSubscriptionExample - Subscription 2: Received value for nodeId=NodeId{ns=3, id=1015}: Variant{value=0.0}
Подробнее здесь: [url]https://stackoverflow.com/questions/79309221/issue-with-subscription-handling-multiple-nodeids[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия