Задать вопрос
@AkillHardCore

Как выгружать большое колчичество тегов OPCUA клиентом?

Добрый день.
Вот код opcua clientа:

import asyncio
import sys
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.Semaphore(value=1000)
from asyncua import Client as ClientASY
url = "opc.tcp://127.0.0.1:49320"

async def create_tags_dict(path, client):
    tag_list = dict()
    list = await client.get_node(path).get_variables()
    for i in list:
        tag_list[i.nodeid.Identifier] = i
    return tag_list

async def get_value_from_dict(address, client):
    value = await client.get_node(address).get_value()
    return value

async def main():
    async with ClientASY(url=url) as clientAsy:
        node_path = "ns=2;s=TEST.PLC1"
        Tags_List = await create_tags_dict(node_path, clientAsy)  # Формируется примерно 1.5секунд
        await asyncio.sleep(2)

        tasks = []  # список с тасками для выгрузки значений тегов
        for key, value in Tags_List.items():
            tasks.append(asyncio.create_task(get_value_from_dict(value, clientAsy)))
        RESULT = await asyncio.gather(*tasks)

        while True:
            for result in RESULT:
                print(result)
       await asyncio.sleep(3)


if __name__ == "__main__":
asyncio.run(main())

Вопрос вот в чем: в Tags_List я щзаписываю все теги из node_path = "ns=2;s=TEST.PLC1", там находится примерно 19000 тегов.
Далее я формирую список "tasks" с тасками для получения значения тегов и затем записываю результат тасков в RESULT.
Хоть все делается асинхронно, все равно очень долго, RESULT формируется примерно за 4 секунды.
Что я делаю не так? Или сама библиотека не способна работать быстрее?
  • Вопрос задан
  • 111 просмотров
Подписаться 1 Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 1
@va_k
Могу сказать то, что вы неправильно используете семафор. Вот ссылка asyncio.Semaphore. Соответственно объект семафора вы должны брать в вашей функции get_value_from_dict.
Попробуйте поиграться со значением семафора попробовать поставить разные значения для ограничения параллельных запросов.
Потом конечно нужно глянуть нет ли метода получения значения нескольких тегов за раз, это сильно помогло бы уменьшить кол-во запросов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы