Simple-Scada forum
Simple-Scada 2 => Ваши вопросы => Тема начата: Серега от 28 Февраля 2020, 09:32:41
-
Добрый день!
Новенькая головоломка прилетела от заказчика. Суть:
Есть сигнал HeartBit (не меняется - нет связи, меняется - есть связь) для каждого важного объекта.
3 клиента 1 сервер. Каждый клиент управляет своим привязанным объектом.
Если отвалился клиент/завис/случайно выключили остановить изменение HeartBit .
Далее объект видя, что HeartBit не меняется, подразумевает, что типа им никто не может управлять дает команду на останов сам себе.
В руководстве по скриптам в разделе "Работа с клиентами" как токовой функции о состоянии соответствующего клиента нет.
Да есть функция StartPing. Но с ее помощью можно отслеживать работу сети или сетевой карты компьютера на котором открыт клиент.
С компом может быть все в порядке, но клиент закрыт.
В общем можете подсказать:
1. Будете ли внедрять в будущем функцию о состоянии клиента, например состояния выключен/загружается=перегрузка/работа? Или она уже есть? Сервер же как то понимает кто подключен и когда отключается.
2. Как на данный момент можно решить задачку? Или только контролем через StartPing. Или опять не дочитал справку?
Жду Ваших вопросов и предложений.
-
Здравствуйте.
Для сервера скады каждый клиент уникален. Если клиент был подключен, затем на время отключился и снова подключился, то сервер распознает его как нового клиента. Обычные клиенты (не web) при подключении передают имя указанное в утилите настроек (https://simple-scada.com/help/manual/index.html?settings-simple-client.html#servset). В теории, по этому имени можно было бы идентифицировать клиента, но ничто не запрещает дать нескольким клиентам одинаковое имя. Поэтому по имени тоже нельзя достоверно отследить клиента. Единственным уникальным идентификатором является IP-адрес, поэтому можно использовать пинг, но он говорит о работе ПК, но не о работе клиента.
Будете ли внедрять в будущем функцию о состоянии клиента, например состояния выключен/загружается=перегрузка/работа?
В ближайшем будущем не планируем, это слишком уникальный запрос, который за последние 6 лет возник впервые. И в целом привязка работы оборудования к работе клиентов скады - это очень странная задача.
-
Ясно. Будем думать.
-
Добрый день!
В проекте все таки нужно нам отслеживать состояние клиента. Данная функция обеспечивает функциональную безопасность комплекса (как материальную так и людскую).
В ходе поиска решений наткнулся на недокументированную команду GetClientData:TM_ClientData.
1. Где почитать о ней?
2. С помощью GetClientName (или GetClientData.Name думаю то же) можно узнать имя клиента. Но там где его на мое личное мнение можно использовать в справке написано:
Важно! Данная функция не работает при вызове из события "OnDataChange", а также при вызове из системных типов событий "Запуск проекта", "Остановка проекта", "Выполнен SQL-запрос", "Прошла секунда", "Прошел час", "Отчет построен".
Только через универсальный, можете объяснить с чем это связано?
Как бы возникла мысль, что зная, например, количество подключенных клиентов и периодически проверяя их количество, зная их имена (в настройках можно задать различные) можно понять какой клиент отвалился.
3. Да понимаем, что запрос индивидуальный. Может подскажите какое-то решение? Или может быть расширите параметры класса GetClientData и добавите GetClientData.Status:Integer (например 0 - не подключен, 1 - работает/подключен, 2 - в ошибке и т.д.).
Жду вопросов и предложений!
-
Здравствуйте.
Функция GetClientData возвращает данные клиента: Имя, Web/обычный клиент, Имя пользователя, Путь к директории Simple-Scada. Данная функция почти не используется, т.к. практически нет задач, в которых ее использование будет необходимо. В этой теме (https://simple-scada.com/forum/index.php?topic=818.msg7017#msg7017) можно найти пример скрипта и описание задачи, для которой данная функция использовалась - см. это сообщение (https://simple-scada.com/forum/index.php?topic=818.msg7043#msg7043) и следующие за ним два сообщения. Применительно к Вашей задаче, данная функция не подходит и при вызове из системных типов скриптов она не будет работать, также как и GetClientName.
Только через универсальный, можете объяснить с чем это связано?
Работает не только через универсальный, а через любые скрипты вызванные клиентом, кроме системных типов событий перечисленных в предупреждении. Связано это с тем, что перечисленные скрипты вызываются сервером, а не клиентом и для них невозможно получить информацию о клиенте. При вызове, например скрипта OnClick, сервер может получить имя клиента, т.к. знает, что именно этот клиент вызвал скрипт. А в системных типах событий получить информацию о клиенте невозможно.
По поводу добавления возможности отслеживания состояния клиента отвечали в нашем предыдущем сообщении в этой теме, и на данный момент ничего не изменилось.