Модуль управления процессом многокомпонентного дозирования. Предназначен для замены старого приложения kkormrcpsvr2.exe
. Данный модуль требует включения в задачу.
peripherial
не требует изменения программного кода модуля kkormsvr
.kkormrcpsvr2
. Также Kkormsvr
для выполнения задачи не требует наличия связи с неиспользуемыми дозаторами.kkormsvr
без прерывания выполнения задачи дозирования.
Например, в jrobo 1 работает roboplant
логика и выполняется опрос всех устройств ввода/вывода (peripherial
), в т.ч. и многокомпонентных дозаторов, а также работает модуль jrbustcp в режиме server
. В jrobo 2 работает модуль kkormsvr
, взаимодействуя с локальной, либо удаленной базой данных, а теги по дозаторам поставляются при помощи модуля jrbustcp в режиме client
. Использовать связку rpsvrtcp
и rpclient
недопустимо, т.к. данный протокол не поддерживает передачу тегов типа LONG
.
Структура базы данных осталась прежней Модель базы данных. При миграции старой системы на kkormsvr
НЕЛЬЗЯ работать непосредственно со старой базой как есть, а необходимо создать новую и сделать импорт.
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
Параметр | Умолчание | Описание |
---|---|---|
database | db | Модуль базы данных (database) |
lines | | Список линий |
dosers | | Список дозаторов, принадлежащих линии |
storages | | Список бункеров/питателей, принадлежащих дозатору |
lines | ||
linenum | 0 | Номер линии |
name | Line<linenum> | Название линии |
dosers | ||
name | | Имя дозатора. Используется для формирование имен тегов |
bind | <name> | Имя peripherial-модуля многокомпонентного дозатора |
grouplevel | 0 | Указывает принадлежность дозатора к группе с заданным уровнем опережения выполнения циклов. Отсчет уровня от нуля |
storages | ||
<addr> | Формат записи: stornum [, storname] , гдеaddr - адрес питателя в дозаторе (число) stornum - уникальный номер бункера (число), соответствующего питателю дозатора storname - название бункера (текст). Если не указывать, то будет Бункер <stornum> |
Имя тега | Тип данных | Доступ | Описание |
---|---|---|---|
kksvr.connected | BOOL | Подключение к базе данных. | |
Линия 1 | |||
kksvr.Line1.CycleCnt | INT | Количество выполненных полных циклов. | |
kksvr.Line1.CycleReq | INT | rw | Заданное количество циклов. |
kksvr.Line1.State | INT | Состояние линии: 0 - остановлено 1 - работа 2 - работа приостановлена 3 - ошибка: новая задача не распределилась между дозаторами 4 - ошибка: один из дозаторов не принял задачу |
|
kksvr.Line1.TaskId | INT | TaskId текущей задачи из таблицы KK_TASK . Если задача отсутствут, равно 0. |
|
kksvr.Line1.Receipt | STRING | Название рецепта текущей задачи. | |
kksvr.Line1.Reset | BOOL | rw | 1 - Сброс линии. |
kksvr.Line1.Suspend | BOOL | rw | 1 - Приостановить работу линии. 0 - возобновить. |
Линия 1 - Группа 0 | |||
kksvr.Line1.Group0.CycleCnt | INT | Количество выполненных циклов. | |
kksvr.Line1.Group0.State | INT | Состояние группы: 0 - остановлено 1 - подача дозаторам команды "Старт цикла". Ожидание готовности к установке задачи. 2 - установка задачи 3 - дозирование 4 - ошибка установки задачи одним из дозаторов. Какой именно дозатор - смотреть тег дозатора SendTask на отрицательное значение. |
|
Линия 1 - Группа 1 | |||
kksvr.Line1.Group1.CycleCnt | INT | —\\— | |
kksvr.Line1.Group1.State | INT | —\\— | |
Линия 1 - Дозатор d1 | |||
kksvr.d1.CurStorNum | INT | номер stornum текущего бункера |
|
kksvr.d1.CurStorName | STRING | название name текущего бункера |
|
kksvr.d1.CurProduct | STRING | название текущего загружаемого продукта | |
kksvr.d1.Error | INT | Текущая ошибка работы с дозатором (не путать с кодом ошибки самого дозатора): 0 - ошибки нет 1 - LINK - теги дозатора не найдены (проверить, есть ли теги, правильность параметра ''bind'') 2 - DISCONNECT - нет связи 3 - CRC - данные не достоверны 4 - TASKDIFFER - заданный вес в дозаторе отличается от заданного по рецепту |
|
kksvr.d1.ReqWeightZero | INT | =1, если суммарный заданный вес равен нулю, иначе =0 | |
kksvr.d1.Product1 | STRING | Название продукта, заданного по рецепту. | |
kksvr.d1.ReqWeight1 | LONG | Заданный вес по рецепту. | |
kksvr.d1.Product2 | STRING | —\\— | |
kksvr.d1.ReqWeight2 | LONG | —\\— | |
kksvr.d1.Product3 | STRING | —\\— | |
kksvr.d1.ReqWeight3 | LONG | —\\— | |
Линия 1 - Дозатор d2 | |||
kksvr.d2.CurStorNum | INT | —\\— | |
kksvr.d2.CurStorName | STRING | —\\— | |
kksvr.d2.CurProduct | STRING | —\\— | |
kksvr.d2.Error | INT | —\\— | |
kksvr.d1.ReqWeightZero | INT | —\\— | |
kksvr.d2.Product1 | STRING | —\\— | |
kksvr.d2.ReqWeight1 | LONG | —\\— | |
kksvr.d2.Product2 | STRING | —\\— | |
kksvr.d2.ReqWeight2 | LONG | —\\— | |
kksvr.d2.Product3 | STRING | —\\— | |
kksvr.d2.ReqWeight3 | LONG | —\\— |
Процесс приготовления комбикормовой смеси может происходить в несколько этапов.
Например, некоторые добавки могут предварительно дозироваться и смешиваться (в предсмесителе) отдельно от основной массы ингредиентов. Затем они выгружаются в основной смеситель одновременно с разгрузкой дозаторов, дозирующих основные ингредиенты.
В таком случае для ускорения цикла приготовления комбикормовой смеси целесообразно разрешить дозаторам, разгрузка которых происходит в предсмеситель, набирать продукт заранее. Т.е. если линия выполняет первый цикл дозирования - дозаторы основного смесителя выполняют первый цикл, то дозаторы предсмесителя могут выполнять первый и (если все они выгрузились) второй цикл дозирования.
Параметр grouplevel
определяет на сколько циклов дозирования группа может «обгонять» цикл дозирования линии.
В группу целесообразно объединять ДОЗАТОРЫ ОДНОВРЕМЕННО РАЗГРУЖАЕМЫЕ В ОДИН СМЕСИТЕЛЬ.
Для дозаторов группы которая заканчивает процесс приготовления комбикормовой смеси (или если группа одна) параметр grouplevel
должен быть равен 0.
Во время выполнения задачи каждое изменение значения суммарного счетчика дозатора (другими словами - отвес) фиксируется в базе данных в соответствующих таблицах с ссылкой на задачу и рецепт, по которому работает задача. Если же счетчики меняют значение, когда линия остановлена и выполняемых задач нет, то в этой ситуации создается задача с пустым рецептом, и уже к ней привязывается отвес. Пустой рецепт создается автоматически с названием «ДОЗИРОВАНИЕ ВНЕ ЗАДАЧИ (РУЧНОЕ)» и kk_receipt.id равным 0.
Также при фиксировании отвеса вне задачи указывается продукт, который в данный момент назначен соответствующему бункеру. Если продукт не указан, создается «НЕИЗВЕСТНЫЙ ПРОДУКТ» c kk_product.id равным 0.
Для перехода со старого архиватора kkormrcpsvr2
на новый требуется перенести данные из старой базы данных в новую, создаваемою автоматически модулем kkormsvr
. Описание действий по шагам:
database
для подключения к новой (не существующей) и старой (существующей) базам данных.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
kksvr:import dbold reload kksvr
Данный способ перехода является рекомендуемым, т.к. новая база будет избавлена от ненужных артефактов, накопленных годами. Также в новой базе добавлены таблицы оперативных данных и оптимизированы индексы некоторых таблиц.
В таблицах KK_TASK
, KK_TASKCONTENT
, KK_EXECUTE
, KK_OUTPUT
и KK_RASHOD
данные сохраняются без циклической перезаписи, и таким образом постоянно накапливаются. Для удаления ненужных данных используется команда w:sweep <year>
. Пример использования:
kksvr:sweep 2016
Данная команда, посылаемая модулю с именем kksvr
, удаляет все записи старше 2016 года включительно.