UniSet/ЗапускПроцесса

Материал из Etersoft wiki
Перейти к навигацииПерейти к поиску
Wackowiki-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была автоматически перемещена с old.wiki.etersoft.ru.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.


О запуске процесса

При своём запуске процесс должен инициализировать начальное состояние. В эту задачу входит:

  • инициализация управляемых данным процессом выходов;
  • инициализация внутренних переменных хранящих текущее состояние датчиков(входов);
  • возможно какие-то действия при запуске.


Для решения этого вопроса сейчас используется следующий подход:

При своём старте процесс (после получения SystemMessage::StartUp) заказывает все необходимые ему датчики.

При заказе (если не указано обратное) процессу сразу приходит сообщение SensorMessage и тем самым происходит начальная инициализация.

К плюсам такого подхода можно отнести то, что не надо писать специальную функцию инициализации, потомучто используется таже функция обработки, что и в работе.

Я бы сказал, что написать отдельно инициализацию может быть даже полезно. В конце концов инициализация - это не реакция на события /VitalyLipatov/

Как раз, по моему, не должна отличатся обработка события "изменения состояния входа" во время работы от "начальная инициализация состояния" во время старта.


К минусам относится то, что когда запускаются процессы на узле (например при запуске) происходит активный обмен сообщениями между процессами управления и процессами ввода/вывода, отвечающими за датчики. Хотя с другой стороны это нормально, и подобную нагрузку система должна выдерживать.


Если отказаться от функции askValue, то необходимо чётко выработать механизм начальной инициализации. При этом всё равно встаёт вопрос об использовании функции getValue, от которой хотели уйти.

Использовать askValue для заказа категорически нельзя в самой систем. getValue тоже не нужна, поскольку состояния приходят сами. Остаётся обеспечить, чтобы после запуске процесса ему были присланы состояния всех датчиков, и сам он знал, присланы они или нет.

В том-то вопрос и состоит. Чтобы процессу пришли сообщения об "актуальных" состояниях датчиков он должен как-то сообщить о своём старте ПРОЦЕССАМ ввода/вывода. При этом мы стремимся к тому, что процесс управления когда хочет узнать состояние датчика в общем случае не знает к какому процессу в/в принадлежит тот или иной датчик. Сейчас как раз используется самый удобный и простой механизм. Процесс запускается и при помощи askValue сообщает процессу в/в, что он запустился и необходимо прислать ему сообщение о текущем состоянии указанного входа. При этом не требуется никаких специальных сообщений. Каждый процесс запускается и получает текущее состояние необходимых ему для работы входов, а далее начинает его получать только при изменении состояния.


Принятые на данный момент решения:
  • при старте (получении StartUp) проходить по списку датчиков и (всё-таки) использовать для инициализации getValue (т.к. он по быстродействию не отличается от askValue)
  • в случае недоступности хотя-бы одного датчика делать попытки в течение заданного времени
  • инициализация должна происходить ДО регистрации. Т.е. пока не произойдёт успешной инициализации процесс не должен быть доступен другим




Возможно придётся усложнить информацию о датчике - значение, ID и ещё актуализирован он или нет. /VitalyLipatov/

Сейчас в сообщении (SensorMessage) содержится время последнего изменения состояния. Я так понимаю это и есть необходимая информация.