====== wessvr ====== Модуль архивации весовых данных. Предназначен для замены старого архиватора (wessvr.exe). Данный модуль требует включения в задачу. Поддерживает работу со следующими модулями: ^Название в wesclient^Название в БД^Периферийный модуль^ |**Standard** |standard |[[doc:jroboplc:modules:peripherial:wessvr_adapter]] | |Gelios |gelios |[[doc:jroboplc:modules:peripherial:promauto_gelios_flow]] | |Gelios.Maslo2v2 |gelios.maslo2v2|[[doc:jroboplc:modules:peripherial:promauto_gelios_maslo2v2]] | Рекоммендуется во всех случаях использовать универсальный модуль [[doc:jroboplc:modules:peripherial:wessvr_adapter]]. В системе может быть более одного одновременно работающих модулей wessvr с разными svrnamе. Один модуль может содержать несколько устройств. Устройства - это весы и прочи ее оборудование, данные которых подлежат архивации. Список устройств и их конфигурация содержится в базе данных (таблица ''MODULES''). Как и в старом wessvr значения счетчиков накапливаются в оперативных таблицах ''MAIN'' и ''MAINHR'', после чего сбрасываются в архивы STAT и STATHR по одному из событий: * наступление нового периода (смена или час) * изменение в таблице MODULES одного из значений IDPROD, IDBRIG или IDBATCH. * откат счетчиков ===== Основные отличия от старого wessvr ===== * Уменьшено количество транзакций на цикл. Выборочно устанавливается режим одна транзакция на цикл, либо подтверждение после обработки каждого устройство (параметр ''singleTransaction''). * Отображение отката счетчиков в архивах ''STAT'' и ''STATHR'' отдельной записью и пометкой в поле ''SETBACK''. Пример ситуации: Диапазон счетчика веса = 1000. Значение SWEND откатывается с 950 на 50. Расчет веса при откате: 100 = 1000 - 950 + 50. | SWBEG| SWEND| WES|SETBACK| +-------+-------+-------+-------+ | 750| 950| 200| 0| | 950| 50| 100| 1| | 50| 450| 400| 0| Реальный пример:
{{:doc:jroboplc:modules:wessvr_setback_case.png?direct&200|}} * Настраиваемые таблицы архивирования. Помимо стандартных MAIN/STAT и MAINHR/STATHR можно сделать архивацию через любое количество минут. * В ''MAIN''ы добавлено поле ''PERIOD''. * Возможность отключать передачу значения в WesSvrState устройства. * Автоматическое создание базы данных при ее отсутствии. ===== Конфигурация ===== plugin.wessvr: enable: on module.wessvr: svrname: wessvr database: db schema: zlak singleTransaction: on wesSvrStateEnabled: on arctables: - main: MAIN stat: STAT interval: 0 - main: MAINHR stat: STATHR interval: 60 - main: MAIN5M stat: STAT5M interval: 5 ===== Параметры ===== ^ Параметр ^ Умолчание ^ Описание ^ |**svrname**| '''' |Имя сервера архивации для определения "своих" устройств в базе данных | |**database**| ''db'' |Модуль базы данных ([[doc:jroboplc:modules:database]]) | |**schema**| '''' |Имя схемы (для firebird это префикс имен метаданных). Оставить пустым при обычном переходе со старого wessvr | |**singleTransaction**| ''on'' |Одна транзакция на цикл ''on'' или подтверждение после каждого устройства ''off'' | |**wesSvrStateEnabled**| ''on'' |Разрешение записи в теги WesSvrState устройств | |**ignoreZeroStat**| ''off'' |Игнорировать нулевые записи в таблицы типа Stat при изменении у модуля ''IDPROD'', ''IDBRIG'', ''IDBATCH''. Нулевые записи - те у которых вес и кол-во навесок равны нулю | |**tagsources**| '''' |//Deprecated! Определения модулей источников тегов полностью автоматизировано.// \\ Список модулей, предоставляющих теги устройств. Требуется в случае, если архивируемое устройство не находится непосредственно в системе, а импортируется посредством другого модуля, например, [[doc:jroboplc:modules:rpclient]] | |**arctables**| '''' |Список параметров таблиц архивирования. По умолчанию настроены стандартные для старого wessvr пары MAIN/STAT и MAINHR/STATHR. Если данных параметр используется, то умолчание перекрывается новой конфиграцией | ^ **arctables** ^^^ |**main**| '''' |Имя оперативной таблицы | |**stat**| '''' |Имя архивной таблицы | |**interval**| ''0'' |Интервал архивирования. Возможные значения:
0 - смена
от 0 до <60 - минуты
от 60 до <1440 - часы
1440 - сутки | ===== arctables по умолчанию ===== Если ''arctables'' не указать явно, то будет использована следующая конфигурация: arctables: - main: MAIN stat: STAT interval: 0 - main: MAINHR stat: STATHR interval: 60 ===== Теги ===== ^Имя тега ^Описание ^ |Connected |Состояние работы модуля. Нормальное значение ''on'', иначе архивация не выполняется из-за отсутствия подключения к базе данных или ошибки при инициализации (подробности смотреть в log-файлах) | Для каждого устройства создается набор тегов. Теги начинаются с имени устройства (для примера далее используется имя устройства WFST): ^Имя тега ^Описание ^ |WFST.state |Cостояние архивации:
0 - OK
1 - нет связи
2 - ошибка целостности (CRC16)
3 - данные не достоверны
4 - нет данных (теги не найдены)
99 - старт архивации| |Далее для каждого вида архива, определенном в ''arctables'' (пример для ''MAIN'')|| |WFST.MAIN.period |Значение поля ''PERIOD'' | |WFST.MAIN.pertype |Значение поля ''PERTYPE'' | |WFST.MAIN.wes |Значение ''WES'' за текущий период. Данные суммируются из двух таблиц ''MAIN'' и ''STAT''. | |WFST.MAIN.wnum |Значение ''WNUM'' за текущий период. Данные суммируются из двух таблиц ''MAIN'' и ''STAT''. | ===== Расчет текущей производительности ===== Существует два способа получения текущей производительности, определяемые в ''MODULES.OUTCALCMODE'', равное 0 по умолчанию. При значении 0 текущая производительность считывается из тега Output. При значении > 0 текущая производительность расcчитывается на основе поступающих данных текущего веса. Полученная производительность, записываемая в ''ARCVAL.SUMWES'', является средним значением за период ''MODULES.ARCOUTTIME'' (секунды). Периодичность записи в ''ARCVAL'' установливается в ''MODULES.ARCOUTPER'' (секунды). ===== Запись статуса ===== Как и везде, в таблице ''ARCSTATUS'' для обратной совместимости оставлены старые названия полей. Назначение полей следующее: * NOCONNECT - связь с модулем: * 0 - ОК * >0 - отсутствует * NOOPC - не используется * NODATA - статус архивации * 0 - OK * 1 - нет связи * 2 - ошибка целостности (CRC16) * 3 - данные не достоверны * 4 - нет данных (теги не найдены) * 99 - старт архивации * 100 - архивация отключена ===== Отключение записи статуса ===== Иногда значения полей ''STATUS1..5'' изменяются сильно часто, что делает архивацию статуса малоинформативной. Например, ранние версии весового блока Гелиос в State отображали не только текущий режим, но и стадию дозирования. Для предотвращения подобной ситуации в таблице ''MODULES'' есть поле ''ARCSTATUS_OFF'', по умолчанию равное 0. Если требуется не реагировать на изменение какого-либо поля ''STATUS1..5'' необходимо взвести соответствующий бит этого поля. Например, при значении 1, изменение STATUS1 не повлечет добавление новой записи в таблицу ''ARCSTATUS''. При значении 0x1F все изменения в ''STATUS1..5'' игнорируются. ===== Запись простоев ===== Простоем модуля называется временной интервал между двумя последовательно выполненными отвесами, значение которого превышает заданное предельное время (порог простоя). Для фиксации простоев модуля предназначена таблица ''STATIDLE''. Порог простоя задается в ''MODULES.TIMEIDLE'' отдельно по каждому модулю. Если задан 0, то фиксация простоев не выполняется. **Принцип работы**\\ 1. При старте считывается время последнего отвеса из ''ARCVAL.DT''.\\ 2. Ожидание фиксации нового отвеса в ''ARCVAL''.\\ 2. После фиксации отвеса в ARCVAL вычисляется интервал между временами последнего и текущего отвесов\\ 3. Если полученное значение превышает порог простоя, то создается запись в ''STATIDLE''\\ 4. Время текущего отвеса запоминается как время последнего отвеса.\\ 5. Переход к п.2.\\ ===== Предотвращение "миллионов" ===== Для предотвращения "миллионов" (больших значений в ''MAIN''/''STAT'') используются две проверки ''StepBack'' и ''BigDeltaWes''. ''StepBack'' - защита от отката назад. Если значение счетчика веса или отвесов изменилось и стало меньше чем предыдущие, то выдерживается пауза 60 секунд. ''BigDeltaWes'' - защита от слишком большого увеличения значения веса. Если значение счетчика веса увеличилось на более чем допустимое, то выдерживается время 60 секунд. Допустимое значение задается в поле ''MODULES.WESINCMAX'' командой: m:wmax Для удобства определения ''WESINCMAX'' можно использовать команду ''m:wmaxlist'': run>wessvr:wmaxlist run> IDM DESCR WESINCMAX LASTWES DELTAWES 1:WHIGH 250000 49953 49620 2:WFST 250000 29982 29900 3:WSCN 250000 20002 20040 4:WVHZ 250000 52436 51477 5:WOTR 250000 25329 25170 12:WEL1 250000 8312 9200 13:WEL2 250000 8996 10005 14:WBKKA 250000 29852 29740 15:WSHZA 250000 15062 14990 16:WSHMA 250000 24994 25000 17:WSHBA 250000 50123 44950 20:WBFAS 250000 0 2002 22:WBKAR 250000 10125 20200 23:WELV 5000000 911000 898000 24:WSHBB 250000 0 45420 OK run>wessvr:wmax 12 50000 run>OK В выводе команды ''m:wmaxlis'' две правые колонки подсказывают, какое должно быть значение в ''WESINCMAX'', и обозначают следующее: * ''LASTWES'' - среднее значение поля ''LASTWES'' последних 10 записей в таблице ''ARCVAL'' * ''DELTAWES'' - наименьшая разница между значениями поля ''SUMWES'' последних 10 записей в таблице ''ARCVAL'' Рекомендуется устанавливать значение ''WESINCMAX'' раз в 5-10 большим, чем значение заданной дозы весов. Если значение ''WESINCMAX'' не установлено (равен 0 или null), то оно рассчитывается во время работы автоматически (последнее изменение веса, умноженное на 5). ===== Переходный импорт данных ===== Для перехода со старого архиватора wessvr.exe на новый требуется перенести данные из старой базы данных в новую, создаваемою автоматически модулем ''wessvr''. Описание действий по шагам: * создать два модуля ''database'' для подключения к новой (не существующей) и старой (существующей) базам данных. plugin.database: module.db: type: firebird dbname: /database/wes_fb30.fdb properties: encoding: WIN1251 module.dbold: type: firebird dbname: /database/old_wes_fb30.fdb properties: encoding: WIN1251 plugin.wessvr: module.wessvr: database: db plugin.task: module.taskmain: modules: - db - wessvr * запустить систему и выполнить команды: wessvr:import dbold reload wessvr Данный способ перехода является рекомендуемым, т.к. новая база будет избавлена от ненужных артефактов, накопленных годами. Также в новой базе оптимизированы индексы некоторых таблиц. Другой способ перехода - использовать старую базу. При этом потребуется добавить поле ''PERIOD'' типа ''integer'' в таблицы ''MAIN'' и ''MAINHR''. ===== Удаление старых STAT-записей ===== В архивных таблицах ''STAT'' и ''STATHR'' данные сохраняются без циклической перезаписи, и таким образом постоянно накапливаются. Для удаления ненужных данных используется команда ''w:sweep ''. Пример использования: wessvr:sweep 2016 Данная команда, посылаемая модулю с именем ''wessvr'', удаляет все записи старше 2016 года включительно. ===== Хранимые процедуры ===== ==== FETCH_STAT ==== Для удобства построения отчетов в старом варианте весовой базы данных имеются хранимые процедуры ''GET_STAT'' и ''GET_STATHR''. Они имеются и в новой версии базы данных, создаваемой автоматически модулем ''wessvr''. Однако теперь вместо них рекомендуется использовать более эффективную универсальную процедуру FETCH_STAT: CREATE PROCEDURE FETCH_STAT ( TBLNAME varchar(64), PERBEG integer, PEREND integer, MNAME0 varchar(16), ... MNAME9 varchar(16), ANDTEXT varchar(200) = '') returns ( PERIOD integer, WES0 bigint, ... WES9 bigint) На входе необходимо указать имя таблицы (''STAT'', ''STATHR'' и т.д), период выборки включительно и имена устройств. Например, почасовая выборка за месяц: select * from FETCH_STAT('STATHR', 2017110100, 2017113123, 'WHIGH', 'WFST', 'WSCN', 'WOTR', 'WFDR', '', '', '', '', '') В параметре ''ANDTEXT'' можно задать дополнительное условие выборки, например: select * from FETCH_STAT('STATHR', 2017110100, 2017113123, 'WHIGH', 'WFST', 'WSCN', 'WOTR', 'WFDR', '', '', '', '', '', 'and idprod=7') ==== FETCH_MAIN ==== Данная процедура служит для удобства отображения текущих данных из таблицы MAIN. Проблема в том, что данные за текущую смену могут частично уже находится в STAT, например, из-за смены продукта, обнуления счетчика и т.д. Процедура ''FETCH_MAIN'' позволяет отобразить суммарные текущие данные простым запросом. Сигнатура процедуры: CREATE PROCEDURE FETCH_MAIN ( TBLMAIN varchar(64), TBLSTAT varchar(64), WHERETEXT varchar(200)) returns ( IDM integer, NAME varchar(16), DESCR varchar(32), DTBEG timestamp, PERIOD bigint, WES bigint, WNUM bigint) Пример использования: select * from FETCH_MAIN('MAINHR','STATHR', 'where md.name=''WHIGH'' or md.name=''WFST'' order by md.descr') В ''WHEREHTEXT'' можно указать любое дополнительное условие ''WHERE'', а также задать сортировку ''ORDER BY'', используя алиасы таблиц: * MD. - ''MODULES'' * M. - ''MAIN'' * S. - ''STAT'' ==== FETCH_STAT_SUM ==== Процедура предназначена для построения итоговых отчетов за период времени. Данные возвращаются одной записью. CREATE PROCEDURE FETCH_STAT_SUM ( TBLNAME varchar(64), PERBEG integer, PEREND integer, WNAME0 varchar(16) = '', ... WNAME9 varchar(16) = '', ANDTEXT varchar(200) = '') returns ( DESCR0 varchar(32), ... DESCR9 varchar(32), DTBEG0 timestamp, ... DTBEG9 timestamp, DTEND0 timestamp, ... DTEND9 timestamp, WES0 bigint, ... WES9 bigint, WNUM0 bigint, ... WNUM9 bigint) ==== FETCH_MAIN_SUM ==== Процедура предназначена для построения отчетов за текущий период времени. Данные возвращаются одной записью. CREATE PROCEDURE FETCH_MAIN_SUM ( TBLMAIN varchar(64), TBLSTAT varchar(64), WNAME0 varchar(16) = '', ... WNAME9 varchar(16) = '', WHERETEXT varchar(200) = '') returns ( DESCR0 varchar(32), ... DESCR9 varchar(32), DTBEG0 timestamp, ... DTBEG9 timestamp, WES0 bigint, ... WES9 bigint, WNUM0 bigint, ... WNUM9 bigint) ==== FETCH_ARCVAL_LAST ==== Процедура предназначена для построения отчетов о текущей производительности: CREATE PROCEDURE FETCH_STAT_SUM ( WNAME0 varchar(16) = '', ... WNAME9 varchar(16) = '') returns ( DESCR0 varchar(32), ... DESCR9 varchar(32), DT0 timestamp, ... DT9 timestamp, OUTWES0 double precision, ... OUTWES9 double precision) ==== Предотвращение миллионов при физической замене устройства ==== Иногда работающий в учете весовой блок выходит из строя, и на его место ставят другой блок с таким же сетевым адресов, но с совершенно другими значениями суммарных счетчиков. Как результат, через некоторое время в отчетах появляются некорректные данные - "миллионы". Данную ситуацию можно предотвратить, если у периферийного устройства, есть серийный (уникальный) номер, и если он меняется в процессе работы, то ''wessvr'' расценивает это как замену устройства, сбрасывает накопленные данные в STAT и меняет состояние текущих счетчиков в MAIN. Серийный номер отслеживается в теге ''SYSTEM.SN'' типа ''STRING'' в следующих устройствах: * [[doc:jroboplc:modules:peripherial:wessvr_adapter]] * [[doc:jroboplc:modules:peripherial:promauto_gelios_flow]] Помимо серийного номера в данных устройствах отслеживается тег ''Replacement'' типа ''BOOL'', при установке которого ''wessvr'' действует аналогичным образом, как при изменении серийного номера. Записи STAT, которые образовались в результате данной ситуации, имеют в поле ''SETBACK'' значение 2.