партнерский раздел
ФорумЭксплуатацияПомогите пожалуйста со скриптом, глючит.

Эксплуатация » Помогите пожалуйста со скриптом, глючит.

ДАНО: Орион Про - последней версии. Система без пульта С2000М. Реле которым управляем - СП1, централизованное управление включено.
Задача простейшая защелка на реле. Требуется При запуске скрипта если реле Отключено - включить, если реле включено то отключить.

Пытаюсь сделать простейший триггер, полдня долбался, переписал всё в 10 разных вариантах, но нормальной работы добится не смог... Срабатывает только один раз в одном направлении...
.
По шагам:
1)Перегружаешь БД в ОЗ,
2)запускаешь скрипт он нормально ВКЛючает отключенное реле.
3)Потом сколько не запускай этот скрипт реле не реагирует, но сообщения в логи пишуться (т.е скрипт отрабатывает) но почему-то не видит что состояние реле изменилось и всё так-же пытается включить реле.
4) Снова перезагружаешь БД в ОЗ.
5)запускаешь скрипт он нормально ОТКЛючает включенное реле.
6)Потом сколько не запускай этот скрипт реле не реагирует, но сообщения в логи пишуться (т.е скрипт отрабатывает) но почему-то не видит что состояние реле изменилось и всё так-же пытается Отключить реле.
7)Снова перезагружаешь БД в ОЗ.
9) Опять нормально включает но не отключает.

Т.е при первом запуске скрипта он нормально считывает состояние реле и отрабатывает тоже верно - изменяя состояние, но при повторном запуске скрипт не видит что состояние реле изменилось и всё так-же пытается его включить\выключить.

Ниже два варианта и оба одинаково себя ведут. Может я что неверно делаю. Подмогите советом. Или может более красивое решение есть?

************************************************** Вариант 1 ****************************************
Сценарий
Переменные
Перем РабочееМесто1;
Перем РабочиеМеста1;
Перем Компьютер1;
Перем Компьютеры1;
Перем Реле1;
НачалоСценария

Попытка
Компьютеры1 = СоздатьОбъект( "Компьютеры" );
Компьютер1 = Компьютеры1.ПолучитьПоИд(1);
РабочиеМеста1 = Компьютер1.РабочиеМеста();
РабочееМесто1 = РабочиеМеста1.ПолучитьПоТипуСетевогоМеста("Ядро");
Реле1 = РабочееМесто1.Выходы().ПолучитьПоИД( 143 );
Если не ПустоеЗначение( Реле1 ) Тогда
Сообщить( "Реле присутствует", 1 );
КонецЕсли;
Если Реле1.ЕстьСостояние( 402 ) == ИСТИНА Тогда
Реле1.Включить( "0" );
Иначе
Реле1.Выключить( "0" );
КонецЕсли;
Исключение Сообщить("Произошло исключение, шаг Команда включить",0);
КонецПопытки;
КонецСценария
************************************************** Вариант 1  END****************************************
/
/
************************************************** Вариант 2 ****************************************
Сценарий
Переменные
Перем РабочееМесто1;
Перем РабочиеМеста1;
Перем Компьютер1;
Перем Компьютеры1;
Перем Реле1;
//Перем Реле1состояние;
НачалоСценария

Попытка
Компьютеры1 = СоздатьОбъект( "Компьютеры" );
Компьютер1 = Компьютеры1.ПолучитьПоИд(1);
РабочиеМеста1 = Компьютер1.РабочиеМеста();
РабочееМесто1 = РабочиеМеста1.ПолучитьПоТипуСетевогоМеста("Ядро");
Реле1 = РабочееМесто1.Выходы().ПолучитьПоИД( 143 );
Если не ПустоеЗначение( Реле1 )
тогда
Сообщить( "Реле1 найдено", 1 );
КонецЕсли;
Если Реле1.ЗначениеСостояния() == 402
тогда
Реле1.Включить( "1" );
Сообщить( "Реле1 - Было=402, Включили", 1 );
Возврат(0);
Иначе
Если Реле1.ЗначениеСостояния() == 401
тогда
Реле1.Выключить( "1" );
Сообщить( "Реле1 - Было=401, Выключили", 1 );
Возврат(0);

КонецЕсли;
КонецЕсли;


Исключение Сообщить("Произошло исключение, шаг Команда включить",0);

КонецПопытки;
КонецСценария
************************************************** Вариант 2 END****************************************

3 года 5 месяцев назад

avatar
Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

7 ответов

Попробуйте так:
Если Реле1.ЕстьСостояние(402) Тогда
Реле1.Включить( "0" );
Иначе
Реле1.Выключить( "0" );

3 года 5 месяцев назад

avatar
И обязательно проверьте в настройках СП1 пункт "Сообщать об изменении состояния". Иначе Орион не видит изменения, только при перезапуске, когда запрашивает текущие состояния.

Тремасов Константин Александрович 3 года 5 месяцев назад

вот это самое главное)) только он называется "Вкл. события от реле" 

Волков Андрей 3 года 5 месяцев назад

Ну значит сейчас привели к одному названию. Ранее для разных версий, разных приборов было и "Формирование событий выхода" и то что написал выше, вот так и запомнил. Суть одна, разберется)

Тремасов Константин Александрович 3 года 5 месяцев назад

Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

Огромное спасибо.
Действительно галочки не стояли в "сообщать о состоянии".
.
Может еще подскажете как заставить БКИ работать нормально без С2000М ?
С монитора если раздел ставишь снимаешь то состояние лампочки не меняется, а если с кнопки панели то всё нормально.

3 года 5 месяцев назад

avatar
Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

Я про охранный раздел. если из ОЗ ставишь снимаешь на пульте индикация не меняется, если ставишь снимаешь с пульта то все нормально. БКИ 2,42 раздел прописан взят\снять охранный.
Исполнительные устройства кстати тоже кнопками БКИ только выключает, включить не получается. Хотя и в БКИ прописана кнопка как отк.вклю исполнителного устройства и реле прописано тоже и к считывателю тоже привязано.

3 года 5 месяцев назад

avatar
Попробуйте в инспекторе рабочего места поставить ДА напротив пунктов:
Включить трансляцию событий через С2000.
Включить трансляцию состояний через С2000.

Тремасов Константин Александрович 3 года 5 месяцев назад

Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

Так у меня нету в системе с2000. Орион-Про всем рулит.

3 года 5 месяцев назад

avatar
Так вы сами написали:
...если ставишь снимаешь с пульта то все нормально.

Все равно попробуйте.

Тремасов Константин Александрович 3 года 5 месяцев назад

Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

я имел ввиду БКИ, немного пока с терминами путаюсь..
Попробую.

3 года 5 месяцев назад

avatar
Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

Вопрос: Предположим я включаю выход РЕЛЕ1 коммандой "включить на время" на 1800сек и в течении этих 1800сек например через 900сек снова дам команду "включить на время 1800сек" таймер переустановится на 1800сек и отсчет пойдет заново или так и будет тикать оставшиеся 900 секунд? Или время ссуммируется до 2700сек?
 

3 года 5 месяцев назад

avatar
Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

Я потихоньку изучаю написание скриптов, но дается медленно.
Посоветуйте пожалуйста как лучше реализовать следующий сценарий, а то очень уж громоздко и некрасиво у меня получается.
Не могу в голове уложить логику.
.:
Дано:
1) 6 ШС с подключенными к ним ИК датчиками ШС1-ШС6
2) СП1
3) Кнопка для запуска цикла на ШС7 (при нажатии этой кнопки Орион-Про запускает выполнение этого скрипта).
.
Требуется при нажатии кнопки подключенной к ШС7 включить реле на СП1 и
а) запустить таймер отсчета 1800сек по окончанию  которого СП1 отключится автоматически.
б) контролировать во время работы таймера шлейфы ШС1-ШС6 и в случае сработки любого из них перезапустить таймер до стартовых 1800сек
в) если ШС1-ШС6 за время 1800сек не срабатывали по окончании отсчета 1800сек таймером выключить СП1, скрипт завершить.
г) если во время работы таймера будет опять нажата кнопка запустившая данный скрипт и подключенная к ШС7 -  остановить таймер, выключить СП1, завершить скрипт..

Ну с включением понятно, прописываю на ШС7 запуск скрипта который проверяет состояние выхода и либо включает его на 1800сек либо выключает если оно включено.
.
С первым и последним пунктами (а,г.) всё понятно:
а,г)
Если Реле1.ЕстьСостояние(402) Тогда
Реле1.Включить( "1800" );
Иначе
Реле1.Выключить( "0" );
.КонецЕсли
.
А вот дальше непонятно совсем...
б) Не могу придумать как это реализовать в теле скрипта, ведь ведь комманда включить уже прошла и цикл по идее завершен, реле само отсчитывает свое время. Как заставить скрипт ждать окончания таймера у реле и опрашивать ШС, да еще и перезапустить таймер при сработке???

Одна из проблем в том, что я не могу найти аналога переходу GOTO как в пакетных файлах.
Поправьте если я ошибаюсь -
1) Как я понял скрипт выполняется линейно от начала к концу и переход между уровнями как в пакетном файле типа bat или cmd по меткам не возможен?
2) Скрипт вообще может крутится в запущенном состоянии неограниченное время? Например в замкнутом цикле после его запуска? И не нарушит ли постоянно запущенный скрипт другого функционала?

3 года 5 месяцев назад

avatar
Я вот неуверен насчет повторной команды ВключитьНаВремя("0", "1800"). Сбросит или добавит еще. ШС7 понятно, скрипт у вас есть, только команда ВключитьНаВремя должна быть, у вас включить бесконечно с задержкой 1800. Для ШС1-6 написать свой скрипт, проверяем состояние реле1, если включено, то ВключитьНаВремя("0", "1800"). Привязать к нужным событиям нужных ШС.

Тремасов Константин Александрович 3 года 5 месяцев назад

Если привязать к ШС1-ШС6 свои скрипты, то при массовке в зоне видимости датчиков ИК они заDDOS-ят ядро Орион запусками скриптов. 5 человек прошло в зоне видимости датчиков по коридору = 30 запущеных скриптов.
Хотя может это и не страшно.
Завтра проверю как отрабатывает счетчик времени при повторном запуске, от этого буду отталкиваться.

Спасибо.
 

Константин Рогозин 3 года 5 месяцев назад

5 человек прошло в зоне видимости датчиков по коридору = 30 запущеных скриптов.

какие у вас хорошие ИК, людей в толпе считать умеют или это линейные счётчики?)) обычный то объёмник будет стоять в одной сработке пока видит движение всей толпы, т.е. один запущенный скрипт от одного ШС.
Не, ну если толпа движется строго по одному с соблюдением социальной дистанции, то даже в этом случае одновременных сценариев будет всё таки намного меньше 30 ))

Волков Андрей 3 года 5 месяцев назад

Ну если сценарий будет работать только на ПК, то проблем вроде быть не должно. Цикл с проверками чего надо плюс таймер на превышение 1800 и его обнуление по условию. Управление реле без задержки, т.е. бесконечные программы, т.к. рулим им из сценария. Ориона нет под рукой чтобы накидать.
Своими словами алгоритм такой:
1.   начало сценария;
2.   переменная "Время начала" = сейчас;
3.   реле1.Включить;
4.   начало цикла (while) с проверкой условия: "Время начала" + 1800 сек >= сейчас (если да, то выполняем тело цикла)
5.      если ШС1.состояние = нарушен то "время начала" = сейчас;
6.      повторяем строку 5 для всех ШС кроме ШС7
7.      если ШС7.состояние = нарушен то "время начала" = сейчас +1800 сек;
8.   конец цикла;
9.   реле1.выключить
10. конец сценария;

Налетов Константин 3 года 5 месяцев назад

Меня только смущает то, что ШС7 сам и запускает этот скрипт. п7 выключит скрипт, но Орион по нажатию запустит копию. Можно конечно отключать реле с задержкой а прив включении скрипта проверять состояние реле и если включено не продолжать работу...

Константин Рогозин 3 года 5 месяцев назад

Для исключения повторного запуска от ШС7 добавьте шаги: 
между 2 и 3 - ШС7.снять
между 9 и 10 - ШС7.взять
а также нужно предусмотреть небольшую задержку взятия данного ШС. Таким образом пока сценарий работает его повторный запуск становится невозможным.
Само собой, что запуск сценария по тревоге в ШС7.

Налетов Константин 3 года 5 месяцев назад

ШС7 кнопка которую нажимает оператор в любое время по мере надобности. Если мы ШС7 заблокируем на время выполнения скрипта то "шаг 7" не будет работать..
Сегодня не было времени поковыряться. Завтра попробую.

.
А случайно общих глобальных переменных для все системы нет? Чтобы из скрипта можно было туда флаг закинуть и все остальные скрипты его видели...Типа виртуального реле. Можно конечно файлом пользоваться в качестве "флага" но тоже свои минусы есть. С переменной было бы проще.

Константин Рогозин 3 года 5 месяцев назад

Если мы ШС7 заблокируем на время выполнения скрипта то "шаг 7" не будет работать.

Ну почему же? Тип ШС 4, ставил галку "Контроль отключенного входа" и в сценарии ловим состояние "Нарушение снятой зоны" (код 119). И вуаля!

Налетов Константин 3 года 5 месяцев назад

у каждого объекта есть Тег, сохраняется пока ядро не перезапущено. Попробуйте записать одним скриптом и считать другим.

Волков Андрей 3 года 5 месяцев назад

Вот откуда вы взяли -
" 2.   переменная "Время начала" = сейчас; "

Где найти полное описание языка и допустимых определений и констант. В PDF который с орионом идет "021 - Описание макроязыка сценариев ОРИОН_Scripts.pdf"
Толком ничего нет.

Константин Рогозин 3 года 5 месяцев назад

Вот откуда вы взяли

Я это придумал, это не реальная команда, а логический шаг объявления переменной и её инициализации.
В том алгоритме многое вообще за кадром, например получение объектов, таких как реле, шлейф, рабочее место и т.д.
Где найти полное описание языка

тута https://partners.bolid.ru/forum/forum_21366.html
 

Налетов Константин 3 года 5 месяцев назад

Эту документацию я и использую. Очень куцая и без нормальных описаний с примерами. Приходится все методом тыка и перебора проверять..
За 3 часа родил запускающий скрипт... И смех и грех. Пять строчек п мучений на кучу времени и всё из-за отсутствия нормальной документации..
Ну дальше будет проще.

Вопрос - как вывести в лог переменную? Я так и не смог победить эту заморочку

Вот пример скрипта которым я тег меняю при тестах скрипта который отлаживаю: Сценарий
Переменные
Перем РабочееМесто1;
Перем РабочиеМеста1;
Перем Компьютер1;
Перем Компьютеры1;
Перем Реле1;
Перем Реле1Тег;
//Перем ВремяНачала;
НачалоСценария


Попытка
Компьютеры1 = СоздатьОбъект( "Компьютеры" );
Компьютер1 = Компьютеры1.ПолучитьПоИд(1);
РабочиеМеста1 = Компьютер1.РабочиеМеста();
РабочееМесто1 = РабочиеМеста1.ПолучитьПоТипуСетевогоМеста("Ядро");
Реле1 = РабочееМесто1.Выходы().ПолучитьПоИД( 143 );
Реле1Тег = Реле1.Тег();
Если не ПустоеЗначение( Реле1Тег ) Тогда
Сообщить( "Проверка тега - какой-то Тег присутствует", 0 );
Сообщить( ТекущаяДата() + " " + ТекущееВремя() + " ", 0 );
Сообщить( Реле1.Тег() + " " , 0 );
//Сообщить( " " + Реле1Тег() + " " , 0 );
Реле1.ПоместитьВТег(402);
Сообщить( "тег - 402 разместили.", 1 );

Если Реле1.Тег() == 402 Тогда
Сообщить( "Реле Тег 402 Выход", 1 );
Иначе
Сообщить( "Реле Тег Не 402 Выход", 2 );
КонецЕсли;
КонецЕсли;
Исключение Сообщить("Произошло исключение, шаг Тег",0);
КонецПопытки;
КонецСценария

Дата и время выводятся нормально строкой - Сообщить( ТекущаяДата() + " " + ТекущееВремя() + " ", 0 );А вот Тег не могу вывести никак.
Сообщить( Реле1.Тег() + " " , 0 );
Сообщить( " " + Реле1Тег() + " " , 0 );

Как правильно это сделать?

И дайте пожалуйста реально рабочий пример использования цикла о котором шла речь, ну не понятно совсем как описать опрос шлейфов. Времени просто жуть как жалко сидеть параметры перебирать. Я саму структуру понять немогу.начало цикла (while) с проверкой условия: "Время начала" + 1800 сек >= сейчас (если да, то выполняем тело цикла)
5. если ШС1.состояние = нарушен то "время начала" = сейчас;
6. повторяем строку 5 для всех ШС кроме ШС7
7. если ШС7.состояние = нарушен то "время начала" = сейчас +1800 сек;
"время начала" это имеется ввиду эта функция
t = ПолучитьЧасы(t)*3600+ ПолучитьМинуты(t)*60+ ПолучитьСекунды(t);
или как-то по другому можно?
.
ШС1-ШС6 немогут быть поставленны на охрану ради использования этого скрипта, они могут писать "теги" при сработках, а вот как написать цикл это уже вопрос который меня мучает в данный момент. Точнее они должны ночью охранять, а на скрипт работать в любое время в независимости от того стоят они на охзране или нет.
.
Как я вижу систему
ШС1-ШС6 при сработке ставят себе тег "сработал", а закольцованный скрипт с определенным интервалом обходит теги и если сработка есть то обновляет счетчик и обнуляет Тег у датчика и так по кругу.

Нужен простой пример скрипта с циклом перебора тегов , дальше сам разгребу.

Константин Рогозин 3 года 5 месяцев назад

скорее всего Сообщить( Строка(Реле1.Тег()) + " " , 0 );

Волков Андрей 3 года 5 месяцев назад

Рогозин К., про содержательность документации и метод тыка полностью согласен. Равно как и про время затраченное на написание сценария. Когда впервые пишешь, то времени уходит много.
Болидовцы явно перемудрили с русификацией интерпретатора сценариев. Многим гораздо проще было бы работать на языке С/С++ (пускай и с русскоязычной структурой системы). Операторы, команды и прочие элементы языка лично мне проще воспринимать на англиЦком, а имена переменных и объектов структуры пускай будут на русском. При таком сочетании текст сценария будет гораздо читабельней (ИМХО). Это подтверждается даже тем, что болидовцы в инструкции прибегают к англоязычным аналогам для разъяснения сути оператора, например для оператора Попытка (Try).

Вас не поймёшь, то Вам нужен сценарий с ограничением по времени, по бесконечный.
Я бы с тэгами не связывался (по моему не надёжное это решение). 
Времени просто жуть как жалко сидеть параметры перебирать

То есть кто-то, кто Вам это напишет, должен потратить время, а Вы на всё готовенькое? Прикольно!

Пример цикла и опроса ШС, если будет время и желание, то напишу, но завтра. Может кто из готового пораньше выложит. Ну, а пока просто пример навскидку.  
Сценарий
Переменные
    Перем ВремяНачалаСценария;
    Перем Сейчас;
    Перем Реле1;
    Перем ШС1;
    Перем ШС7;
    Перем Интервал;

НачалоСценария

// тут инициализируем переменные ШС и Реле1 через элементы структуры (лень всё писать)

    ВремяНачалаСценария = ТекущееВремяДатаЧисло;
    Сейчас = ТекущееВремяДатаЧисло;
    Интервал = 1800;
    Реле1.Включить();
    ШС7.Снять();

    Пока ВремяНачалаСценария + Интервал >= Сейчас Цикл
        Если ШС1.ЕстьСостояние(119) Или ШС1.ЕстьСостояние(3) Тогда
            ВремяНачалаСценария = ТекущееВремяДатаЧисло;
        КонецЕсли;

        Если ШС7.ЕстьСостояние(119) Или ШС1.ЕстьСостояние(3) Тогда
            // условия выхода из цикла
            Интервал = 0;
            ВремяНачалаСценария = 0;
​        КонецЕсли;

        Сейчас = ТекущееВремяДатаЧисло;
    КонецЦикла;

    Реле1.Выключить();
​    ШС7.Взять();

КонецСценария


Только фиг знает, что за число возвращает функция ТекущееВремяДатаЧисло. Под это число надо подогнать параметр Интервал и дело в шляпе.

Налетов Константин 3 года 5 месяцев назад

Волков Андрей

Спасибо заработало. Это сильно облегчит отладку.
..
PS: Вот так и приходится изучать язык скриптов по "Полнейшей" документации....

Константин Рогозин 3 года 5 месяцев назад

Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

Добавить ответ

Для добавления сообщений на форуме вам необходимо зарегистрироваться и указать мобильный телефон в своем профиле (зачем?)

ПОКАЗАН

2344 раза

ЗАДАН

3 года 5 месяцев назад

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