Это старая версия документа.
Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/users/p/prom-auto/domains/prom-auto.ru/wiki/inc/parser/handler.php on line 1458
Warning: Declaration of syntax_plugin_tablecalc::handle($match, $state, $pos, &$handler) should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /home/users/p/prom-auto/domains/prom-auto.ru/wiki/lib/plugins/tablecalc/syntax.php on line 41
Warning: Declaration of syntax_plugin_tablecalc::render($mode, &$renderer, $data) should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /home/users/p/prom-auto/domains/prom-auto.ru/wiki/lib/plugins/tablecalc/syntax.php on line 72
Warning: Declaration of syntax_plugin_offline::handle($match, $state, $pos, &$handler) should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /home/users/p/prom-auto/domains/prom-auto.ru/wiki/lib/plugins/offline/syntax.php on line 60
Warning: Declaration of syntax_plugin_offline::render($format, &$renderer, $data) should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /home/users/p/prom-auto/domains/prom-auto.ru/wiki/lib/plugins/offline/syntax.php on line 67
Warning: preg_match(): Compilation failed: invalid range in character class at offset 3416 in /home/users/p/prom-auto/domains/prom-auto.ru/wiki/inc/parser/lexer.php on line 118
====== kkormsvr ====== Модуль управления процессом многокомпонентного дозирования. Предназначен для замены старого приложения ''kkormrcpsvr2.exe''. Данный модуль требует включения в задачу. ===== Поддерживаемые модули дозаторов ===== [[doc:jroboplc:modules:peripherial:promauto_gelios_dozkkmc]] ===== Основные отличия от kkormrcpsvr2.exe ===== * Опрос дозаторов и управление процессом дозирования выполняют независимые друг от друга модули. Добавление нового типа дозатора в ''peripherial'' не требует изменения программного кода модуля ''kkormsvr''. * Возможность работать как на сервере (старый вариант), так и в составе ПЛК с использованием сервера в качестве удаленного СУБД. Работа на одной аппаратной платформе с ПЛК позволяет отказаться от дискретных сигналов управления дозаторами без ущерба общей скорости дозирования. * Хранение оперативных данных в базе данных, т.е. там же где и хранятся все остальные данные. Старый вариант использовал для сохранения оперативных данных обычные файлы, что в случае сбоя может привести к рассинхронизации. Другой минус старого варианта при использовании на борту ПЛК - это частые операции записи в файл, что также является потенциально опасным. * Работа одной транзакцией на цикл, что гарантирует целостность данных и положительно влияет на производительность приложения. * Возможность отключения, включения и перезагрузки ''kkormsvr'' без прерывания выполнения задачи дозирования. * При потери связи с удаленным СУБД восстановление происходит автоматически без прерывания выполнения задачи дозирования. * Состав и именование тегов полностью обновлено. Новые теги кроме текущего состояния процесса также позволяют видеть названия рецептов и продуктов, выполнять сброс и приостановку работы линий. <note important>При работе с удаленными модулями дозаторов использовать протокол [[doc:jroboplc:modules:jrbustcp]]! </note> Например, в //jrobo 1// работает ''roboplant'' логика и выполняется опрос всех устройств ввода/вывода (''peripherial''), в т.ч. и многокомпонентных дозаторов, а также работает модуль [[doc:jroboplc:modules:jrbustcp]] в режиме ''server''. В //jrobo 2// работает модуль ''kkormsvr'', взаимодействуя с локальной, либо удаленной базой данных, а теги по дозаторам поставляются при помощи модуля [[doc:jroboplc:modules:jrbustcp]] в режиме ''client''. Использовать связку ''rpsvrtcp'' и ''rpclient'' недопустимо, т.к. данный протокол не поддерживает передачу тегов типа ''LONG''. Структура базы данных осталась прежней [[doc:jroboplc:modules:kkormsvr_db_model]]. При миграции старой системы на ''kkormsvr'' НЕЛЬЗЯ работать непосредственно со старой базой как есть, а необходимо создать новую и сделать [[doc:jroboplc:modules:kkormsvr#Переходный импорт данных|импорт]]. ===== Конфигурация ===== <code yaml> plugin.kkormsvr: module.kksvr: database: db lines: - linenum: 1 name: "Линия 1" dosers: - name: "d1" bind: "D001" grouplevel: 0 storages: 1: 101, Бункер 101 2: 102, Бункер 102 3: 103, Бункер 103 - name: "d2" storages: 1: 201 2: 202 3: 203 </code> ===== Параметры ===== ^ Параметр ^ Умолчание ^ Описание ^ |**database**| ''db'' |Модуль базы данных ([[doc:jroboplc:modules:database]]) | |**lines**| '''' |Список линий | |**dosers**| '''' |Список дозаторов, принадлежащих линии | |**storages**| '''' |Список бункеров/питателей, принадлежащих дозатору | ^lines ^^^ |**linenum**| ''0'' |Номер линии | |**name**| ''Line<linenum>'' |Название линии | ^dosers ^^^ |**name**| '''' |Имя дозатора. Используется для формирование имен тегов | |**bind**| ''<name>'' |Имя peripherial-модуля многокомпонентного дозатора | |**grouplevel**| ''0'' |Указывает принадлежность дозатора к группе с заданным уровнем опережения выполнения циклов. Отсчет уровня от нуля | ^storages ^^^ |**<addr>**| |Формат записи: ''**stornum [, storname]**'', где<html><br> addr - адрес питателя в дозаторе (число)<br> stornum - уникальный номер бункера (число), соответствующего питателю дозатора<br> storname - название бункера (текст).</html> Если не указывать, то будет //''Бункер <stornum>''// | ===== Теги ===== ^ Имя тега ^ Тип данных ^ Доступ ^ Описание ^ |kksvr.connected | BOOL | |Подключение к базе данных. | ^Линия 1 ^^^^ |kksvr.L1.CycleCnt | INT | |Количество выполненных полных циклов. | |kksvr.L1.CycleReq | INT | rw |Заданное количество циклов. | |kksvr.L1.State | INT | |<html>Состояние линии:<br> 0 - остановлено<br> 1 - работа<br> 2 - работа приостановлена<br> 3 - ошибка: новая задача не распределилась между дозаторами<br> 4 - ошибка: один из дозаторов не принял задачу<br> </html> | |kksvr.L1.TaskId | INT | |''TaskId'' текущей задачи из таблицы ''KK_TASK''. Если задача отсутствут, равно 0. | |kksvr.L1.Receipt | STRING | |Название рецепта текущей задачи. | |kksvr.L1.Reset | BOOL | rw |1 - Сброс линии. | |kksvr.L1.Suspend | BOOL | rw |1 - Приостановить работу линии. 0 - возобновить. | ^Линия 1 - Группа 0 ^^^^ |kksvr.L1.Group0.CycleCnt | INT | |Количество выполненных циклов. | |kksvr.L1.Group0.State | INT | |Состояние группы:<html><br> 0 - остановлено<br> 1 - подача дозаторам команды "Старт цикла". Ожидание готовности к установке задачи.<br> 2 - установка задачи<br> 3 - дозирование<br> 4 - ошибка установки задачи одним из дозаторов. Какой именно дозатор - смотреть тег дозатора SendTask на отрицательное значение. </html> | ^Линия 1 - Группа 1 ^^^^ |kksvr.L1.Group1.CycleCnt | INT | | ---\\--- | |kksvr.L1.Group1.State | INT | | ---\\--- | ^Линия 1 - Дозатор d1 ^^^^ |kksvr.L1.d1.CurStorNum | INT | | номер ''stornum'' текущего бункера | |kksvr.L1.d1.CurStorName | STRING | | название ''name'' текущего бункера | |kksvr.L1.d1.CurProduct | STRING | | название текущего загружаемого продукта | |kksvr.L1.d1.Error | INT | |Текущая ошибка работы с дозатором (не путать с кодом ошибки самого дозатора):<html><br> 0 - ошибки нет<br> 1 - LINK - теги дозатора не найдены (проверить есть ли теги и параметр ''bind'')<br> 2 - DISCONNECT - нет связи<br> 3 - CRC - данные не достоверны<br> 4 - TASKDIFFER - заданный вес в дозаторе отличается от заданного по рецепту </html> | |kksvr.L1.d1.stor1.Product | STRING | |Название продукта, заданного по рецепту. | |kksvr.L1.d1.stor1.ReqWeight | LONG | |Заданный вес по рецепту. | |kksvr.L1.d1.stor2.Product | STRING | | ---\\--- | |kksvr.L1.d1.stor2.ReqWeight | LONG | | ---\\--- | |kksvr.L1.d1.stor3.Product | STRING | | ---\\--- | |kksvr.L1.d1.stor3.ReqWeight | LONG | | ---\\--- | ^Линия 1 - Дозатор d2 ^^^^ |kksvr.L1.d2.CurStorNum | INT | | ---\\--- | |kksvr.L1.d2.CurStorName | STRING | | ---\\--- | |kksvr.L1.d2.CurProduct | STRING | | ---\\--- | |kksvr.L1.d2.Error | INT | | ---\\--- | |kksvr.L1.d2.stor1.Product | STRING | | ---\\--- | |kksvr.L1.d2.stor1.ReqWeight | LONG | | ---\\--- | |kksvr.L1.d2.stor2.Product | STRING | | ---\\--- | |kksvr.L1.d2.stor2.ReqWeight | LONG | | ---\\--- | |kksvr.L1.d2.stor3.Product | STRING | | ---\\--- | |kksvr.L1.d2.stor3.ReqWeight | LONG | | ---\\--- | [[doc:jroboplc:modules:kkormsvr_old_tags]] ===== Дозирование вне задачи ===== Во время выполнения задачи каждое изменение значения суммарного счетчика дозатора (другими словами - отвес) фиксируется в базе данных в соответствующих таблицах с ссылкой на задачу и рецепт, по которому работает задача. Если же счетчики меняют значение, когда линия остановлена и выполняемых задач нет, то в этой ситуации создается задача с пустым рецептом, и уже к ней привязывается отвес. Пустой рецепт создается автоматически с названием "ДОЗИРОВАНИЕ ВНЕ ЗАДАЧИ (РУЧНОЕ)" и kk_receipt.id равным 0. Также при фиксировании отвеса вне задачи указывается продукт, который в данный момент назначен соответствующему бункеру. Если продукт не указан, создается "НЕИЗВЕСТНЫЙ ПРОДУКТ" c kk_product.id равным 0. ===== Переходный импорт данных ===== Для перехода со старого архиватора wessvr.exe на новый требуется перенести данные из старой базы данных в новую, создаваемою автоматически модулем ''wessvr''. Описание действий по шагам: * создать два модуля ''database'' для подключения к новой (не существующей) и старой (существующей) базам данных.<code yaml> plugin.database: module.db: type: firebird dbname: /database/kkorm_fb30.fdb module.dbold: type: firebird dbname: /database/old_kkorm_fb30.fdb plugin.kkormsvr: module.kksvr: database: db plugin.task: module.taskmain: modules: - db - kksvr </code> * запустить систему и выполнить команды: <code> kksvr:import dbold reload kksvr </code> Данный способ перехода является рекомендуемым, т.к. новая база будет избавлена от ненужных артефактов, накопленных годами. Также в новой базе добавлены таблицы оперативных данных и оптимизированы индексы некоторых таблиц. ===== Удаление старых записей ===== В таблицах ''KK_TASK'', ''KK_TASKCONTENT'', ''KK_EXECUTE'', ''KK_OUTPUT'' и ''KK_RASHOD'' данные сохраняются без циклической перезаписи, и таким образом постоянно накапливаются. Для удаления ненужных данных используется команда ''w:sweep <year>''. Пример использования: kksvr:sweep 2016 Данная команда, посылаемая модулю с именем ''kksvr'', удаляет все записи старше 2016 года включительно.