[9459] OPC сервер в ЛЭРС УЧЕТ

Реализовать OPC-UA сервер в ЛЭРС УЧЕТ. Это даст больше возможностей для интеграции с другими системами. У многих пользователей есть желание использовать полученные в ЛЭРС УЧЕТ данные для решения задач в других программах, но нет возможности программировать. OPC-UA открытая спецификация и имеет много opensource реализаций для любых платформ.

Добрый день!

Для интеграции мы реализовали REST API, который уже поддерживается множеством систем, а так же позволяет писать простые скрипты для интеграции.

Поддержка OPC UA непосредственно в сервере не планируется. Она может быть реализована как стороннее приложение, работающее с основным сервером через интерфейс REST API.

Мы добавим эту идею в копилку, но пока без конкретной версии. Кроме того, стоит отметить, что такую интеграцию можем сделать не только мы, но и сторонние разработчики, используя наш REST API.

Очень жду данный функционал. Это позволит с легкостью использовать полученные с приборов данные в различных SCADA-системах.

Добрый день!
Писать скрипты могут не все. Простыми скриптами не напишешь чтение и обработку данных по событию или с заданной периодичностью. Вот, к примеру, типичный сценарий: получаем фактические данные с приборов(по запросу, по подписке, с интервалом), пишем их в указанную базу и решаем наши задачи(сравнение с расчетными данными, калибровка модели, анализ и т.д.) Про OPC зашел разговор, так как под него есть уже готовые решения, которые раскладывают полученные данные по базам. Вполне можно обойтись и без OPC, если у вас будет реализована такая фича.

Скрипты как раз позволят решить задачу в пару строк. Тот же python позволит легко выгрузить данные из REST API ЛЭРС в любую базу. Другое дело, что не все знают как это делается. Мы можем написать пример такого скрипта, который можно будет адаптировать под любую задачу. Но для этого нужно подробнее знать ваше задание.

Тоже поддерживаю появление OPC. Скрипты далеко не всегда могут решить задачу, причем проблемы организационные. Периодически встает задача использовать данные из ЛЭРСа в SCADA. И если нет OPC, то:
• нередко на еще этапе подготовки решения заказчик отказывается от ЛЭРСа из-за нежелания иметь самописный код, этот код ведь тоже нужно сопровождать;
• реализация проекта увеличивается по времени и по стоимости;
• к реализации проекта привлекаются дополнительные люди;
• более того, через какой-то период, после обновления ЛЭРСа, именно эта стыковка и сломается, т.к. персонал заказчика уже и забыл про эту стыковку, и придется спешно восстанавливать работу.

1 лайк

Умельцы уже что-то сообразили на тему OPC UA если интересно пишите на iipokupatop@gmail.com

Всем дорого дня! Не подскажите - компания ЛЭРС снизошла до запросов рядового АСУТП-шника? OPC UA быть? Может быть стороння разработка появилась?

Сервер OPC UA, который получает текущие значения t1,t2,m1,p1 с демо сервера лэрс учёт.
Bearer токен в коде действителен до 12.12.25, если будете использовать со своим сервером необходимо создать отдельного пользователя и в АРМ оператора сформировать токен с необходимым сроком действия.

код на Python
import json
import asyncio
import requests
from asyncua import Server

# Функция для извлечения значения из JSON
def get_value_from_json(json_data, parameter):
    for item in json_data.get("values", []):
        if item.get("dataParameter") == parameter:
            return item.get("value", None)
    return None

# Функция для получения данных через REST API
def fetch_data_from_api():
    url = "https://my.lers.ru/api/v1/Data/MeasurePoints/686/Consumption/Last"
    token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiZGVtbyIsIkFjY291bnRJZCI6IjExNiIsIlRva2VuVmVyc2lvbiI6IjIiLCJBcHBsaWNhdGlvbiI6Im9wY3VhIiwiVG9rZW5JZCI6IjgxNDcwIiwiUmVxdWlyZUVsZXZhdGlvbiI6IjEiLCJuYmYiOjE3MzMzOTIwNDQsImV4cCI6MTc2NTUzMjg0NCwiaXNzIjoiTEVSUyBBTVIgU2VydmVyIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDoxMDAwMCJ9.ckgJLMNFDgfuoWyXvdqGiJyeDBFzwuFP4E7XpVSZDyY"

    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json"
    }

    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()  # Выбрасывает исключение для HTTP ошибок
        return response.json()
    except requests.RequestException as e:
        print(f"Ошибка при запросе к API: {e}")
        return {}

async def run_opcua_server():
    # Создаем сервер
    server = Server()
    await server.init()

    # Устанавливаем адрес сервера
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

    # Устанавливаем основные параметры
    server.set_server_name("REST_lers_to_OPCUA")

    # Регистрируем пространство имен
    namespace = await server.register_namespace("REST_lers_to_OPCUA")

    # Создаем объект для JSON значений
    json_object = await server.nodes.objects.add_object(namespace, "lers_Values")

    # Добавляем переменные
    t_in_var = await json_object.add_variable(namespace, "T_in", 0.0)
    t_out_var = await json_object.add_variable(namespace, "T_out", 0.0)
    m_in_var = await json_object.add_variable(namespace, "M_in", 0.0)
    p_in_var = await json_object.add_variable(namespace, "P_in", 0.0)

    # Запускаем сервер
    async with server:
        print("OPC UA Server запущен на opc.tcp://127.0.0.1:4840/freeopcua/server/")
        while True:
            # Получаем данные с REST API
            data = fetch_data_from_api()

            # Обновляем значения из JSON
            t_in_value = get_value_from_json(data, "T_in")
            t_out_value = get_value_from_json(data, "T_out")
            m_in_value = get_value_from_json(data, "M_in")
            p_in_value = get_value_from_json(data, "P_in")

            # Устанавливаем значения в OPC UA переменные
            if t_in_value is not None:
                await t_in_var.write_value(t_in_value)
            if t_out_value is not None:
                await t_out_var.write_value(t_out_value)
            if m_in_value is not None:
                await m_in_var.write_value(m_in_value)
            if p_in_value is not None:
                await p_in_var.write_value(p_in_value)

            # Логируем обновленные значения
            print(f"Обновлено: T_in={t_in_value}, T_out={t_out_value}, M_in={m_in_value}, P_in={p_in_value}")

            # Задержка перед следующим обновлением
            await asyncio.sleep(60)  # Обновление каждые 60 секунд

# Запуск основного цикла
if __name__ == "__main__":
    try:
        asyncio.run(run_opcua_server())
    except KeyboardInterrupt:
        print("Остановка сервера...")

Для работы необходим сам Python, и библиотеки requests и asyncua.
Будут вопросы - готов ответить.
my_lers_opc.zip (1,9 КБ)