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