====== arctrm ======
Модуль ''arctrm'' предназначен для периодического архивирования температурных значений в базе данных Firebird. На текущий момент значения считываются только из тегов модулей ''promauto.termo5''. В дальнейшем возможно расширение поддержки других модулей термометрии.
Модуль сохраняет:
* температурные срезы по подвескам с актуальными данными;
* сведения о подвесках;
* события запуска архива, изменения состояния связи с устройствами и потери актуальности данных подвесок.
Сам модуль не выполняет обмен с оборудованием. Данные и состояние связи он получает из тегов других модулей.
[[doc:jroboplc:modules:arctrm_dev]]
===== Конфигурация =====
Пример настройки:
plugin.arctrm:
module.arctrm:
database: db
schema: AT
period: 5s
size: 1000000
sensorCount: 6
promauto.termo5:
mytrm1:
p0: 231 силос, корпус 2
p5: 232 силос, корпус 2
mytrm2:
p1: 401 силос, корпус 4
==== Параметры ====
^ Параметр ^ По умолчанию ^ Описание ^
| ''database'' | ''db'' | Имя модуля базы данных. Модуль должен использовать Firebird. |
| ''schema'' | ''AT'' | Префикс таблиц базы данных. |
| ''period'' | ''1h'' | Период сохранения архива. Поддерживаются суффиксы ''ms'', ''s'', ''m'', ''h'', ''d''. |
| ''size'' | ''1000000'' | Максимальное количество строк в таблице ''TEMPER''. |
| ''sensorCount'' | ''6'' | Количество датчиков в каждой подвеске. |
| ''promauto.termo5'' | — | Список модулей-источников и настроенных подвесок. |
Значения ''size'', ''period'' и ''sensorCount'' должны быть больше нуля.
==== Настройка устройств ====
Ключ первого уровня в секции ''promauto.termo5'' является именем модуля-источника тегов. Ключ подвески состоит из произвольного первого символа и числового номера. Например, из ключа ''p5'' модуль получает номер подвеса ''5''.
Для каждой подвески создаются ссылки на теги:
:Pdv.T0
:Pdv.T1
...
:Pdv.T
Актуальность данных подвески определяется по тегу:
:Pdv.Time
Данные считаются актуальными, если ссылка на тег существует, а его значение находится в диапазоне от ''0'' до ''600'' включительно.
Состояние связи с устройством определяется по тегу:
:SYSTEM.ErrorFlag
===== Принцип работы =====
После подключения к базе модуль автоматически:
- создаёт необходимые таблицы и индексы;
- добавляет отсутствующие колонки ''T0...Tn'' в таблицу ''TEMPER'';
- синхронизирует справочник подвесок;
- загружает дату последней архивной записи;
- записывает событие запуска архива.
На каждом рабочем цикле модуль сначала проверяет ''Pdv.Time'' каждой подвески. Значения датчиков считываются только для подвесок с актуальными данными. Время архивного среза берётся с сервера базы данных и округляется вниз до границы периода ''period''.
Если наступил новый период, в ''TEMPER'' записывается по одной строке для каждой подвески с актуальными данными. Для подвески с отсутствующим тегом ''Time'' или значением вне диапазона ''0...600'' строка не создаётся. При превышении лимита ''size'' удаляются строки с наименьшими значениями ''ID''.
===== База данных =====
^ Таблица ^ Назначение ^
| ''PODVES'' | Справочник подвесок: имя и описание. |
| ''TEMPER'' | Архив температурных срезов. Содержит ''PODVES_ID'', ''DT'' и динамические колонки ''T0...Tn''. |
| ''EVENTLOG'' | Журнал запуска архива, изменения состояния связи с устройствами и потери актуальности данных подвесок. |
Основные связи:
PODVES.ID <- TEMPER.PODVES_ID
Одна строка ''TEMPER'' содержит значения всех датчиков одной подвески за один архивный период.
===== Значения датчиков =====
Обычные значения записываются без изменения. Ошибочные состояния сохраняются в тех же колонках ''T0...Tn'' как специальные числа.
^ Значение ^ Состояние ^
| ''3010'' | Значение ниже допустимого диапазона — короткое замыкание. |
| ''3011'' | Значение выше допустимого диапазона — обрыв. |
| ''3013'' | Тег датчика не найден — ''NOLINK''. |
Допустимый диапазон обычного значения: от ''-1000'' до ''2000'' включительно.
===== События =====
^ Код ^ Событие ^
| ''0'' | Ссылка на ''SYSTEM.ErrorFlag'' не найдена. |
| ''1'' | Связь с устройством потеряна: ''SYSTEM.ErrorFlag = true''. |
| ''3'' | Данные подвески неактуальны: ссылка на ''Pdv.Time'' не найдена или значение находится вне диапазона ''0...600''. |
| ''99'' | Связь с устройством установлена. |
| ''100'' | Инициализация архивации. |
Для событий состояния устройства в поле ''MESSAGE'' записывается имя устройства, для события неактуальных данных — имя подвески в формате ''.'', для события инициализации — пустая строка.
Событие состояния устройства записывается только при изменении его состояния. Событие неактуальных данных формируется при первой потере актуальности, записывается при наступлении следующего архивного периода и не повторяется до восстановления актуальности и её следующей потери.
===== Теги модуля =====
^ Тег ^ Тип ^ Описание ^
| ''connected'' | boolean | Установлен, когда модуль подключён к базе и рабочий цикл выполняется без ошибки. |
===== Диагностика =====
Метод ''getInfo()'' возвращает краткую строку состояния, например:
devices=2 podves=3 sensors=18 cursize=30 last=2026-07-23 00:16:50
^ Поле ^ Описание ^
| ''devices'' | Количество настроенных устройств. |
| ''podves'' | Общее количество подвесок. |
| ''sensors'' | Общее количество датчиков. |
| ''nolinkSensors'' | Количество датчиков без ссылки; выводится только при ненулевом значении. |
| ''cursize'' | Текущий размер таблицы ''TEMPER'', учтённый модулем. |
| ''last'' | Дата и время последнего архивного периода или ''never''. |
При отсутствии подключения в начало строки добавляется ''NOT CONNECTED!''. Если модуль выключен, возвращается ''disabled''.
===== Ограничения =====
* Поддерживается только Firebird.
* Значение ''sensorCount'' является общим для всех подвесок.
* Таблица ''EVENTLOG'' автоматически не очищается.
* Удаление архивных строк выполняется по ''ID'', а не по дате ''DT''.