Top.Mail.Ru
Размер шрифта
Цвет фона и шрифта
Изображения
Озвучивание текста
Обычная версия сайта
СкадаСистемы

+7 812 995-00-95
+7 812 995-00-95 Офис компании
Адрес
г. Санкт-Петербург, Торфяная дорога д. 7 лит. Ф, 6 этаж, офис 604
Режим работы
Пн. – Пт.: с 9:00 до 18:00
Задать вопрос
Продукты
  • Альфа платформа
    Альфа платформа
  • IEK DIGITAL
    IEK DIGITAL
  • SCADA SIMP Light
    SCADA SIMP Light
  • SCADA+
    SCADA+
  • Цифровая платформа ДатаПлат
    Цифровая платформа ДатаПлат
  • InfoWatch ARMA
    InfoWatch ARMA
  •  КИБЕРПРОТЕКТ
    КИБЕРПРОТЕКТ
  • CRYPTALLIT
    CRYPTALLIT
  • ГиперСфера
    ГиперСфера
  • ИНСОФТ
    ИНСОФТ
  • РУБЕЖ
    РУБЕЖ
Услуги
  • Календарь ближайших курсов СкадаСистемы
  • Техническая поддержка
    • Техническая поддержка ПО AVEVA (Wonderware)
    • Техническая поддержка ПО Атомик Софт (Альфа платформа)
    • Консультационная поддержка по работе ПО MasterSCADA
    • Техническая поддержка оборудования Rockwell Automation (Allen-Bradley)
    • Портал технической поддержки СкадаСистемы
  • Обучение
    • Курсы по программным продуктам AVEVA (Wonderware)
    • Курс по программному продукту "Альфа платформа"
    • Курсы по программному продукту "MasterSCADA 4D"
    • Курсы по программным продуктам "Rockwell Automation"
    • Курсы по программным продуктам CHINT «Chitic»
Решения
  • Отраслевые Решения
Компания
  • О компании
  • Сотрудники
  • Свидетельства и Сертификаты
  • Партнеры
  • Производители
  • Отзывы
  • Реквизиты
  • Специальная оценка условий труда
  • Вакансии
Контакты
Новости компании
    СкадаСистемы
    • Сертификаты
    • Отзывы
    • Контакты
    • Карта сайта
    • ...
      +7 812 995-00-95
      +7 812 995-00-95 Офис компании
      Заказать звонок
      E-mail
      scs@scadasystems.ru
      Адрес
      г. Санкт-Петербург, Торфяная дорога д. 7 лит. Ф, 6 этаж, офис 604
      Режим работы
      Пн. – Пт.: с 9:00 до 18:00
      Новости
      Интеллектуальный помощник
      Продукты
      • Альфа платформа
        Альфа платформа
      • IEK DIGITAL
        IEK DIGITAL
      • SCADA SIMP Light
        SCADA SIMP Light
      • SCADA+
        SCADA+
      • Цифровая платформа ДатаПлат
        Цифровая платформа ДатаПлат
      • InfoWatch ARMA
        InfoWatch ARMA
      •  КИБЕРПРОТЕКТ
        КИБЕРПРОТЕКТ
      • CRYPTALLIT
        CRYPTALLIT
      • ГиперСфера
        ГиперСфера
      • ИНСОФТ
        ИНСОФТ
      • РУБЕЖ
        РУБЕЖ
      Услуги
      • Календарь ближайших курсов СкадаСистемы
      • Техническая поддержка
        • Техническая поддержка ПО AVEVA (Wonderware)
        • Техническая поддержка ПО Атомик Софт (Альфа платформа)
        • Консультационная поддержка по работе ПО MasterSCADA
        • Техническая поддержка оборудования Rockwell Automation (Allen-Bradley)
        • Портал технической поддержки СкадаСистемы
      • Обучение
        • Курсы по программным продуктам AVEVA (Wonderware)
        • Курс по программному продукту "Альфа платформа"
        • Курсы по программному продукту "MasterSCADA 4D"
        • Курсы по программным продуктам "Rockwell Automation"
        • Курсы по программным продуктам CHINT «Chitic»
      Отраслевые решения
      • Отраслевые Решения
      Компания
      • О компании
      • Сотрудники
      • Свидетельства и Сертификаты
      • Партнеры
      • Производители
      • Отзывы
      • Реквизиты
      • Специальная оценка условий труда
      • Вакансии
      Блог
      Портал support
        Задать вопрос
        СкадаСистемы
        Новости
        Интеллектуальный помощник
        Продукты
        • Альфа платформа
          Альфа платформа
        • IEK DIGITAL
          IEK DIGITAL
        • SCADA SIMP Light
          SCADA SIMP Light
        • SCADA+
          SCADA+
        • Цифровая платформа ДатаПлат
          Цифровая платформа ДатаПлат
        • InfoWatch ARMA
          InfoWatch ARMA
        •  КИБЕРПРОТЕКТ
          КИБЕРПРОТЕКТ
        • CRYPTALLIT
          CRYPTALLIT
        • ГиперСфера
          ГиперСфера
        • ИНСОФТ
          ИНСОФТ
        • РУБЕЖ
          РУБЕЖ
        Услуги
        • Календарь ближайших курсов СкадаСистемы
        • Техническая поддержка
          • Техническая поддержка ПО AVEVA (Wonderware)
          • Техническая поддержка ПО Атомик Софт (Альфа платформа)
          • Консультационная поддержка по работе ПО MasterSCADA
          • Техническая поддержка оборудования Rockwell Automation (Allen-Bradley)
          • Портал технической поддержки СкадаСистемы
        • Обучение
          • Курсы по программным продуктам AVEVA (Wonderware)
          • Курс по программному продукту "Альфа платформа"
          • Курсы по программному продукту "MasterSCADA 4D"
          • Курсы по программным продуктам "Rockwell Automation"
          • Курсы по программным продуктам CHINT «Chitic»
        Отраслевые решения
        • Отраслевые Решения
        Компания
        • О компании
        • Сотрудники
        • Свидетельства и Сертификаты
        • Партнеры
        • Производители
        • Отзывы
        • Реквизиты
        • Специальная оценка условий труда
        • Вакансии
        Блог
        Портал support
          +7 812 995-00-95 Офис компании
          Заказать звонок
          E-mail
          scs@scadasystems.ru
          Адрес
          г. Санкт-Петербург, Торфяная дорога д. 7 лит. Ф, 6 этаж, офис 604
          Режим работы
          Пн. – Пт.: с 9:00 до 18:00
          СкадаСистемы
          Телефоны
          +7 812 995-00-95 Офис компании
          E-mail
          scs@scadasystems.ru
          Адрес
          г. Санкт-Петербург, Торфяная дорога д. 7 лит. Ф, 6 этаж, офис 604
          Режим работы
          Пн. – Пт.: с 9:00 до 18:00
          СкадаСистемы
          • Новости
          • Интеллектуальный помощник
          • Продукты
            • Продукты
            • Альфа платформа
            • IEK DIGITAL
            • SCADA SIMP Light
            • SCADA+
            • Цифровая платформа ДатаПлат
            • InfoWatch ARMA
            • КИБЕРПРОТЕКТ
            • CRYPTALLIT
            • ГиперСфера
            • ИНСОФТ
            • РУБЕЖ
          • Услуги
            • Услуги
            • Календарь ближайших курсов СкадаСистемы
            • Техническая поддержка
              • Техническая поддержка
              • Техническая поддержка ПО AVEVA (Wonderware)
              • Техническая поддержка ПО Атомик Софт (Альфа платформа)
              • Консультационная поддержка по работе ПО MasterSCADA
              • Техническая поддержка оборудования Rockwell Automation (Allen-Bradley)
              • Портал технической поддержки СкадаСистемы
            • Обучение
              • Обучение
              • Курсы по программным продуктам AVEVA (Wonderware)
              • Курс по программному продукту "Альфа платформа"
              • Курсы по программному продукту "MasterSCADA 4D"
              • Курсы по программным продуктам "Rockwell Automation"
              • Курсы по программным продуктам CHINT «Chitic»
          • Отраслевые решения
            • Отраслевые решения
            • Отраслевые Решения
          • Компания
            • Компания
            • О компании
            • Сотрудники
            • Свидетельства и Сертификаты
            • Партнеры
            • Производители
            • Отзывы
            • Реквизиты
            • Специальная оценка условий труда
            • Вакансии
          • Блог
          • Портал support
          Задать вопрос
          • Кабинет
          • 0 Корзина
          • +7 812 995-00-95 Офис компании
            • Телефоны
            • +7 812 995-00-95 Офис компании
          • г. Санкт-Петербург, Торфяная дорога д. 7 лит. Ф, 6 этаж, офис 604
          • scs@scadasystems.ru
          • Пн. – Пт.: с 9:00 до 18:00

          Главная
          —
          Блог
          —
          Технические статьи по Альфа платформе
          —Получение истории через Alpha RMap

          Получение истории через Alpha RMap

          Компонент Alpha.RMap отображает архив Alpha.Historian в виде таблиц PostgreSQL, поэтому историю сигналов можно забирать обычными SQL-запросами: в отчёты, в Excel, в стороннюю аналитику. Здесь есть одна тонкость: nodes_history — таблица виртуальная. За каждым обращением к ней стоит запрос к серверу истории, и результат зависит от того, как компонент подключён и как записаны условия.

          Если из материала «Использование компонента Alpha.RMap» вы узнали, как установить компонент, настроить его и выполнить первые SQL-запросы, то эта статья о том, что осталось за кадром знакомства. Она выросла из обращений в техническую поддержку: вопросы о чтении истории возникают регулярно, и почти всегда дело в одних и тех же нюансах. Разберём подключение Alpha.RMap к истории, работу со столбцами time и actualtime, выборку за период, последнее значение на момент времени и запрос по нескольким сигналам сразу.

          Подключение к истории: через модуль TCP Server

          Есть два способа получения истории: напрямую с TCP-порта Alpha.Historian (по умолчанию 4949) и через порт доступа к истории модуля TCP Server, работающего в составе Alpha.Server. Использовать нужно второй способ.

          При прямом подключении метка времени из условия запроса передаётся в Alpha.Historian в другом бинарном формате, и сервер истории воспринимает верхнюю границу периода не как конец диапазона, а как управляющий параметр чтения архива. В этом случае запрос с условием BETWEEN возвращает одну строку вместо тысяч, выполняется за десятки миллисекунд и не выдаёт ни одной ошибки. Как распознать такое поведение — в конце статьи.

          Порт доступа к истории задаётся в Alpha.DevStudio в свойствах модуля TCP Server, группа Настройки доступа к истории, свойство Номер TCP порта:

          Свойства модуля TCP Server: порт доступа к истории

          Через этот же модуль Alpha.RMap обычно уже читает оперативные значения (атрибут SourceTcpPort). Для истории в настройках сервера Alpha.RMap укажите адрес Alpha.Server и порт доступа к истории.

          CREATE SERVER history_server TYPE 'alpha.rmap.historian.rprovider' FOREIGN DATA WRAPPER rmap_fdw OPTIONS ( SourceLocation '127.0.0.1', SourceTcpPort '4388', HistorianLocation '127.0.0.1', HistorianTcpPort '4389', HistorianDB 'default' -- история событий (event_history) настраивается -- атрибутами AeHistorian* аналогичным образом );

          Куда подключён уже настроенный Alpha.RMap, видно прямо из PostgreSQL:

          SELECT srvname, srvoptions FROM pg_foreign_server;

          Если в srvoptions значится historiantcpport=4949, то есть порт самого Alpha.Historian, подключение идёт в обход модуля TCP Server. Перенастроить его можно без пересоздания сервера:

          ALTER SERVER history_server OPTIONS (SET historiantcpport '4389');
          Обратите внимание

          Соединение с сервером истории живёт в рамках сессии PostgreSQL. После изменения настроек закройте текущую сессию (в pgAdmin — окно Query Tool) и откройте новую, иначе запросы продолжат уходить по старому адресу.

          Таблицы и время

          История значений находится в таблице nodes_history, справочник сигналов — в таблице nodes. Типовой запрос соединяет их по паре идентификаторов NodeId и AppId, а сигнал выбирается по имени:

          SELECT n.tagname, h.valuint, h.time, h.actualtime, h.quality, h.recordtype FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId AND n.AppId = h.AppId WHERE n.TagName = 'Parameter';

          В nodes_history два столбца со временем. Time — метка времени записи в том виде, в каком её запрашивали. ActualTime — действительная метка времени значения. У записей внутри запрошенного периода они совпадают. Различаются они у граничных точек — записей с RecordType со значениями lbound и ubound, которые сервер истории добавляет к выборке за период. У такой записи Time равен границе периода, а ActualTime показывает, когда значение записано на самом деле.

          ✓
          Примечание

          Время в таблицах Alpha.RMap хранится по UTC. Если сервер работает в московском часовом поясе, событие 16:00 по местному времени попадёт в архив с меткой 13:00. Указывайте границы периодов в UTC, а текущее время получайте выражением now() AT TIME ZONE 'UTC'.

          Выборка за период

          Диапазон по столбцу time задаётся конструкцией BETWEEN:

          SELECT n.tagname, h.valuint, h.time, h.actualtime, h.recordtype FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId AND n.AppId = h.AppId WHERE n.TagName = 'Parameter' AND h.time BETWEEN timestamp '2026-07-17 13:16:00' AND timestamp '2026-07-17 13:30:00' ORDER BY h.time;

          В выборку попадают все записи периода плюс две граничные точки. В примере ниже период содержит 840 записей, а count возвращает 842: первая строка — lbound с временем ровно 13:16:00, последняя — ubound с временем 13:30:00.

          Выборка за период через BETWEEN: 842 записи с граничными точками

          Граничные точки удобны для трендов. Они дают значение сигнала на краях периода, даже если точно в эти секунды записей не было. Когда они не нужны, их можно отфильтровать:

          AND h.recordType != 'lbound' AND h.recordType != 'ubound'

          Тот же результат даёт пара строгих неравенств. Она возвращает только записи внутри периода, без граничных точек:

          AND h.time > timestamp '2026-07-17 13:16:00' AND h.time < timestamp '2026-07-17 13:30:00'

          Границы необязательно задавать парой. Условие только с верхней границей вернёт всю историю с начала архива до указанного момента, условие только с нижней — всё от момента до текущего времени:

          -- последние 30 минут AND h.time > (now() AT TIME ZONE 'UTC') - interval '30 minutes'

          Если верхняя граница периода оказалась в будущем, выборка ограничится текущим моментом. Архив отдаст всё, что успел накопить.

          Последнее значение на момент времени

          Частая задача в отчётах — значение сигнала на конец суток или смены. Достаточно верхней границы, обратной сортировки и LIMIT:

          SELECT h.time, h.actualtime, h.valuint FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId AND n.AppId = h.AppId WHERE n.TagName = 'Parameter' AND h.time < timestamp '2026-07-17 13:30:00' ORDER BY h.time DESC LIMIT 1;

          Последнее значение сигнала на момент времени

          Несколько сигналов в одном запросе

          Список тегов задаётся обычным IN:

          SELECT n.tagname, count(*) FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId AND n.AppId = h.AppId WHERE n.TagName IN ('Parameter', 'Parameter1') AND h.actualtime >= timestamp '2026-07-17 13:16:00' AND h.actualtime < timestamp '2026-07-17 13:30:00' GROUP BY n.tagname ORDER BY n.tagname;

          Выборка по двум сигналам через IN

          Работает и вариант с массивом: n.TagName = ANY (ARRAY['Parameter', 'Parameter1']::text[]). А когда по каждому сигналу нужны свои условия, например разные периоды, выборки объединяются через UNION ALL.

          ✓
          Примечание

          В версиях Alpha.RMap до 1.8.0 условия IN и ANY возвращали данные только по первому сигналу из списка. Если обновить компонент нельзя, объединяйте условия через OR либо собирайте результат из отдельных запросов через UNION ALL — эти варианты работают во всех версиях.

          Если запрос вернул одну строку вместо диапазона

          Так проявляет себя подключение в обход модуля TCP Server. Запросы выполняются без ошибок, но результат не совпадает с ожидаемым:

          • BETWEEN и пара неравенств по time возвращают одну запись или ноль;
          • условие только с верхней границей отдаёт самую старую запись архива;
          • ORDER BY h.time DESC LIMIT 1 приносит не последнее значение перед границей, а первое в архиве;
          • на большом диапазоне ответ приходит за десятки миллисекунд — архив в действительности не читается.

          Выглядит это, например, так: вместо 842 записей за период запрос вернул одну граничную точку, у которой actualtime указывает на самую старую запись архива:

          Результат запроса за период при подключении в обход модуля TCP Server

          Первым делом проверьте подключение через pg_foreign_server и переведите его на порт доступа к истории модуля TCP Server, как описано в начале статьи. Если сделать это прямо сейчас нельзя, помогут обходные приёмы. К примеру, работают условия, в которых верхняя граница не является константой при столбце time:

          -- верхняя граница по actualtime AND h.time > timestamp '2026-07-17 13:16:00' AND h.actualtime < timestamp '2026-07-17 13:30:00' -- верхняя граница выражением AND h.time <= now() AT TIME ZONE 'UTC' AND h.time + interval '0 seconds' < timestamp '2026-07-17 13:30:00'

          Надёжное решение при этом одно — правильное подключение: обходные приёмы лишь маскируют проблему, которая продолжит проявляться в других запросах.

          Заключение

          Работа с историей через Alpha.RMap сводится к нескольким правилам. Подключайте компонент к истории через порт доступа модуля TCP Server, а не напрямую к Alpha.Historian. Задавая границы периодов, помните, что время в таблицах хранится по UTC, а BETWEEN добавляет к выборке граничные точки lbound и ubound. Для выборки по нескольким сигналам используйте IN или ANY, на версиях до 1.8.0 — OR либо UNION ALL. И если запрос вернул одну строку вместо диапазона или самую старую запись вместо последней, не ищите проблему в данных — проверьте подключение через pg_foreign_server. Соблюдение этих правил избавляет от самой коварной категории ошибок: тех, что не сообщают о себе и молча искажают отчёты.

          ✓
          Примечание

          Подробнее в документации: Alpha.RMap 1.7 (ред. 2) > Приложения > Описание таблиц и Alpha.RMap 1.7 (ред. 2) > Приложения > Установка и настройка.

          Компонент Alpha.RMap отображает архив Alpha.Historian в виде таблиц PostgreSQL, поэтому историю сигналов можно забирать обычными SQL-запросами: в отчёты, в Excel, в стороннюю аналитику. Здесь есть одна тонкость: nodes_history — таблица виртуальная. За каждым обращением к ней стоит запрос к серверу истории, и результат зависит от того, как компонент подключён и как записаны условия.

          Если из материала «Использование компонента Alpha.RMap» вы узнали, как установить компонент, настроить его и выполнить первые SQL-запросы, то эта статья о том, что осталось за кадром знакомства. Она выросла из обращений в техническую поддержку: вопросы о чтении истории возникают регулярно, и почти всегда дело в одних и тех же нюансах. Разберём подключение Alpha.RMap к истории, работу со столбцами time и actualtime, выборку за период, последнее значение на момент времени и запрос по нескольким сигналам сразу.

          Подключение к истории: через модуль TCP Server

          Есть два способа получения истории: напрямую с TCP-порта Alpha.Historian (по умолчанию 4949) и через порт доступа к истории модуля TCP Server, работающего в составе Alpha.Server. Использовать нужно второй способ.

          При прямом подключении метка времени из условия запроса передаётся в Alpha.Historian в другом бинарном формате, и сервер истории воспринимает верхнюю границу периода не как конец диапазона, а как управляющий параметр чтения архива. В этом случае запрос с условием BETWEEN возвращает одну строку вместо тысяч, выполняется за десятки миллисекунд и не выдаёт ни одной ошибки. Как распознать такое поведение — в конце статьи.

          Порт доступа к истории задаётся в Alpha.DevStudio в свойствах модуля TCP Server, группа Настройки доступа к истории, свойство Номер TCP порта:

          Свойства модуля TCP Server: порт доступа к истории

          Через этот же модуль Alpha.RMap обычно уже читает оперативные значения (атрибут SourceTcpPort). Для истории в настройках сервера Alpha.RMap укажите адрес Alpha.Server и порт доступа к истории.

          CREATE SERVER history_server TYPE 'alpha.rmap.historian.rprovider' FOREIGN DATA WRAPPER rmap_fdw OPTIONS ( SourceLocation '127.0.0.1', SourceTcpPort '4388', HistorianLocation '127.0.0.1', HistorianTcpPort '4389', HistorianDB 'default' -- история событий (event_history) настраивается -- атрибутами AeHistorian* аналогичным образом );

          Куда подключён уже настроенный Alpha.RMap, видно прямо из PostgreSQL:

          SELECT srvname, srvoptions FROM pg_foreign_server;

          Если в srvoptions значится historiantcpport=4949, то есть порт самого Alpha.Historian, подключение идёт в обход модуля TCP Server. Перенастроить его можно без пересоздания сервера:

          ALTER SERVER history_server OPTIONS (SET historiantcpport '4389');
          Обратите внимание

          Соединение с сервером истории живёт в рамках сессии PostgreSQL. После изменения настроек закройте текущую сессию (в pgAdmin — окно Query Tool) и откройте новую, иначе запросы продолжат уходить по старому адресу.

          Таблицы и время

          История значений находится в таблице nodes_history, справочник сигналов — в таблице nodes. Типовой запрос соединяет их по паре идентификаторов NodeId и AppId, а сигнал выбирается по имени:

          SELECT n.tagname, h.valuint, h.time, h.actualtime, h.quality, h.recordtype FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId AND n.AppId = h.AppId WHERE n.TagName = 'Parameter';

          В nodes_history два столбца со временем. Time — метка времени записи в том виде, в каком её запрашивали. ActualTime — действительная метка времени значения. У записей внутри запрошенного периода они совпадают. Различаются они у граничных точек — записей с RecordType со значениями lbound и ubound, которые сервер истории добавляет к выборке за период. У такой записи Time равен границе периода, а ActualTime показывает, когда значение записано на самом деле.

          ✓
          Примечание

          Время в таблицах Alpha.RMap хранится по UTC. Если сервер работает в московском часовом поясе, событие 16:00 по местному времени попадёт в архив с меткой 13:00. Указывайте границы периодов в UTC, а текущее время получайте выражением now() AT TIME ZONE 'UTC'.

          Выборка за период

          Диапазон по столбцу time задаётся конструкцией BETWEEN:

          SELECT n.tagname, h.valuint, h.time, h.actualtime, h.recordtype FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId AND n.AppId = h.AppId WHERE n.TagName = 'Parameter' AND h.time BETWEEN timestamp '2026-07-17 13:16:00' AND timestamp '2026-07-17 13:30:00' ORDER BY h.time;

          В выборку попадают все записи периода плюс две граничные точки. В примере ниже период содержит 840 записей, а count возвращает 842: первая строка — lbound с временем ровно 13:16:00, последняя — ubound с временем 13:30:00.

          Выборка за период через BETWEEN: 842 записи с граничными точками

          Граничные точки удобны для трендов. Они дают значение сигнала на краях периода, даже если точно в эти секунды записей не было. Когда они не нужны, их можно отфильтровать:

          AND h.recordType != 'lbound' AND h.recordType != 'ubound'

          Тот же результат даёт пара строгих неравенств. Она возвращает только записи внутри периода, без граничных точек:

          AND h.time > timestamp '2026-07-17 13:16:00' AND h.time < timestamp '2026-07-17 13:30:00'

          Границы необязательно задавать парой. Условие только с верхней границей вернёт всю историю с начала архива до указанного момента, условие только с нижней — всё от момента до текущего времени:

          -- последние 30 минут AND h.time > (now() AT TIME ZONE 'UTC') - interval '30 minutes'

          Если верхняя граница периода оказалась в будущем, выборка ограничится текущим моментом. Архив отдаст всё, что успел накопить.

          Последнее значение на момент времени

          Частая задача в отчётах — значение сигнала на конец суток или смены. Достаточно верхней границы, обратной сортировки и LIMIT:

          SELECT h.time, h.actualtime, h.valuint FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId AND n.AppId = h.AppId WHERE n.TagName = 'Parameter' AND h.time < timestamp '2026-07-17 13:30:00' ORDER BY h.time DESC LIMIT 1;

          Последнее значение сигнала на момент времени

          Несколько сигналов в одном запросе

          Список тегов задаётся обычным IN:

          SELECT n.tagname, count(*) FROM nodes_history h JOIN nodes n ON n.NodeId = h.NodeId AND n.AppId = h.AppId WHERE n.TagName IN ('Parameter', 'Parameter1') AND h.actualtime >= timestamp '2026-07-17 13:16:00' AND h.actualtime < timestamp '2026-07-17 13:30:00' GROUP BY n.tagname ORDER BY n.tagname;

          Выборка по двум сигналам через IN

          Работает и вариант с массивом: n.TagName = ANY (ARRAY['Parameter', 'Parameter1']::text[]). А когда по каждому сигналу нужны свои условия, например разные периоды, выборки объединяются через UNION ALL.

          ✓
          Примечание

          В версиях Alpha.RMap до 1.8.0 условия IN и ANY возвращали данные только по первому сигналу из списка. Если обновить компонент нельзя, объединяйте условия через OR либо собирайте результат из отдельных запросов через UNION ALL — эти варианты работают во всех версиях.

          Если запрос вернул одну строку вместо диапазона

          Так проявляет себя подключение в обход модуля TCP Server. Запросы выполняются без ошибок, но результат не совпадает с ожидаемым:

          • BETWEEN и пара неравенств по time возвращают одну запись или ноль;
          • условие только с верхней границей отдаёт самую старую запись архива;
          • ORDER BY h.time DESC LIMIT 1 приносит не последнее значение перед границей, а первое в архиве;
          • на большом диапазоне ответ приходит за десятки миллисекунд — архив в действительности не читается.

          Выглядит это, например, так: вместо 842 записей за период запрос вернул одну граничную точку, у которой actualtime указывает на самую старую запись архива:

          Результат запроса за период при подключении в обход модуля TCP Server

          Первым делом проверьте подключение через pg_foreign_server и переведите его на порт доступа к истории модуля TCP Server, как описано в начале статьи. Если сделать это прямо сейчас нельзя, помогут обходные приёмы. К примеру, работают условия, в которых верхняя граница не является константой при столбце time:

          -- верхняя граница по actualtime AND h.time > timestamp '2026-07-17 13:16:00' AND h.actualtime < timestamp '2026-07-17 13:30:00' -- верхняя граница выражением AND h.time <= now() AT TIME ZONE 'UTC' AND h.time + interval '0 seconds' < timestamp '2026-07-17 13:30:00'

          Надёжное решение при этом одно — правильное подключение: обходные приёмы лишь маскируют проблему, которая продолжит проявляться в других запросах.

          Заключение

          Работа с историей через Alpha.RMap сводится к нескольким правилам. Подключайте компонент к истории через порт доступа модуля TCP Server, а не напрямую к Alpha.Historian. Задавая границы периодов, помните, что время в таблицах хранится по UTC, а BETWEEN добавляет к выборке граничные точки lbound и ubound. Для выборки по нескольким сигналам используйте IN или ANY, на версиях до 1.8.0 — OR либо UNION ALL. И если запрос вернул одну строку вместо диапазона или самую старую запись вместо последней, не ищите проблему в данных — проверьте подключение через pg_foreign_server. Соблюдение этих правил избавляет от самой коварной категории ошибок: тех, что не сообщают о себе и молча искажают отчёты.

          ✓
          Примечание

          Подробнее в документации: Alpha.RMap 1.7 (ред. 2) > Приложения > Описание таблиц и Alpha.RMap 1.7 (ред. 2) > Приложения > Установка и настройка.


          Сотрудники
          Инженер сопровождения и разработки ПО
          Михаил Железинский
          Написать сообщение
          Телефон
          8 (812) 995-00-95 (Доб.403)
          E-mail
          m.zhelezinskiy@scadasystems.ru
          • Комментарии
          Загрузка комментариев...
          Назад к списку

          • Технические статьи по Альфа платформе 7
          • Отраслевые статьи 3
          • Результаты тестирования ПО и ПЛК 2
          • Статьи по IT-инфраструктуре ПО 1
          Подписывайтесь
          на новости и акции
          Компания
          О компании
          Сотрудники
          Свидетельства и Сертификаты
          Партнеры
          Производители
          Отзывы
          Реквизиты
          Специальная оценка условий труда
          Вакансии
          Каталог
          Альфа платформа
          IEK DIGITAL
          SCADA SIMP Light
          SCADA+
          Цифровая платформа ДатаПлат
          InfoWatch ARMA
          КИБЕРПРОТЕКТ
          CRYPTALLIT
          ГиперСфера
          ИНСОФТ
          РУБЕЖ
          Услуги
          Календарь ближайших курсов СкадаСистемы
          Техническая поддержка
          Обучение
          +7 812 995-00-95
          +7 812 995-00-95 Офис компании
          Заказать звонок
          E-mail
          scs@scadasystems.ru
          Адрес
          г. Санкт-Петербург, Торфяная дорога д. 7 лит. Ф, 6 этаж, офис 604
          Режим работы
          Пн. – Пт.: с 9:00 до 18:00
          scs@scadasystems.ru
          г. Санкт-Петербург, Торфяная дорога д. 7 лит. Ф, 6 этаж, офис 604
          © 2026 ООО СкадаСистемы - Корпоративный сайт
          Политика обработки персональных данных
          0

          Заказ

          Очистить заказ

          Ваш заказ пуст

          Исправить это просто: выберите в каталоге интересующий товар и нажмите кнопку «В заказ»
          В каталог