Оптимизация производительности

Материал из WebHMI Wiki
Перейти к: навигация, поиск

Для понимания принципов работы WebHMI давайте разберем как работает ее ядро.

Схематично структуру ядра системы можно изобразить так:

WebHMI-диаграма.png

Ядро работает циклично. Это значит что все действия выполняются последовательно. Если на каком-то из этапов возникают задержки то это оказывает влияние на время выполнения всего цикла.

Давайте рассмотрим каждый из блоков этой диаграммы.

Сразу после загрузки системы выполняется чтение конфигурации проекта в оперативную память. В этот момент значения всех регистров сбрасываются в ноль, состояние всех событий выставляется в "не выполняется". Если пользователь вносит любое изменение в настройки регистров, соединений, событий, сценариев и т.д. то ядро после окончания текущего цикла заново перечитает конфигурацию. Все значения регистров еще раз сбросятся, события также прервутся. Поэтому изменение конфигурации проекта во время промышленной эксплуатации может вызывать прерывание событий и обнуление регистров которые находятся в энерго-зависимой памяти. Мы не рекомендуем изменять проект "на лету" без крайней на то необходимости.

Когда настройки проекта прочитаны ядро входит в главный цикл.

В начале цикла происходит запись новых значений в регистры. В системе есть специальная очередь для записи новых значений в регистры. Есть 2 способа записать данные в регистр - через API и через сценарии. В обоих случаях запись происходит не в тот момент когда поступает запрос (т.к. система может быть не готова к этому, например по RS-485 в данный момент уже идет обмен с ПЛК) а позже, в подходящее для этого время. Запрос на запись поступает в очередь. Все запросы на запись будут выполнены в начале следующего главного цикла.

Далее происходит чтение регистров из внешних устройств и внутренних регистров WebHMI. Регистры читаются группами. Группировка происходит по их Соединению. Например, если в проекте есть соединение с ПЛК Delta, ПЛК Siemens и внутренние регистры WebHMI то чтение будет выглядеть так:

1. Читаются все регистры из ПЛК Delta 2. Читаются все регистры из ПЛК Siemens 3. Читаются все внутренние регистры WebHMI

Внутренние регистры WebHMI читаются всегда последними (т.к. в них есть регистры C0, C1, C2... в которых хранятся ошибки чтения из остальных соединений).

Если для любого из соединений указана стабилизационная пауза то перед чтением группы регистров этого соединения произойдет соответствующая пауза. Это иногда необходимо для стабильной работы разнородных устройств на одной шине RS-485. Без этой паузы некоторый устройства могут не успеть определить начало кадра сообщения и пропускать первый пакет на чтение первого регистра.

Также у соединений есть настройка Таймаут. Это время, которое система будет ждать ответа от устройств на свой запрос. Если устройства не ответили за указанный промежуток времени или ответили не весь пакет данных то система будет считать что регистр не прочитался. Его значение будет выставдено в -1, а статус регистра в invalid. Также в этом случае система попробует прочитать этот регистр еще 2 раза.

Это значит что если нет связи с одним из внешних устройств то общее время опроса (минимальная длина главного цикла) увеличится на Timeout × Количество регистров в этом соединении × 3.

Пример. У нас есть подключение к ПЛК Delta SX2. Мы читаем из него 10 регистров на скорости 115200.