Отлично. Работает. Упрощенный вариант тоже (который мне больше понравился). Огромное спасибо!
Вид для печати
Очередной вопрос: в ПР100 есть 6 цифровых входов I1,...,I6. ПР100 в режиме модбас мастер. Нужно сформировать сетевую слейв переменную Err_MB целого типа по следующему алгоритму.
Если все входы равны 0, то Err_MB = 0. Если хотя бы один вход стал равен 1, то переменная Err_MB должна стать равна номеру входа, на котором появился 1.
При этом важно, что бы в переменной Err_MB должен зафиксироваться номер первого сработавшего входа. Т.е. если сначала сработал вход I3, а потом вход I5, то Err_MB должна остаться = 3.
Более того, как только Err_MB изменилась из 0 в номер сработавшего входа, то изменить ее в 0 потом можно только слейвом (по модбас).
Не до конца ясно, как должно работать в тех или иных случаях, например должно ли сбрасываться при наличии активных аварий(ошибок), у меня можно сбросить и следующая авария(ошибка) появится только после пропадании всех и возникновении вновь или логика при одновременном нажатии более одного входа(у меня приоритет у более старшего входа), короче, наверно примерно так:
Вложение 52197
Вложение 52198
Сергей0308, спасибо огромное, практически то, что нужно. Особенно интересно решение с приоритетами при одновременном нажатии более одного входа. Вот только не пойму назначение переменной IN1_8.
Если я понял правильно, то в OUT_w формируется код аварии (от 1 до 8). Как правильно сбрасывать это код в 0? Записью 0 в локальную переменную Q ? Или формированием некоторого значения (какого ?) в IN1_8 ?
Какова связь между срабатыванием входов и значением переменной IN1_8 ?
Насколько я смог понять, Вы хотели сбрасывать код ошибки(1-8) только по сети?!
В данном случае, для примера ПР200(мастер) считывает 51 регистр модуля дискретного ввода(слейв) и если на его первом входе появляется "1" сбрасывает значение ошибки в "0". Можно одним регистром передавать до 16 дискретных сигналов! Короче, сброс происходит значением "1" в сетевой переменной IN1_8, так как такой весовой коэффициент у первого входа(нулевого бита), у второго входа(первого бита) это будет "2" у третьего входа - "4", у четвёртого входа - "8", у пятого входа - "16", у шестого входа - "32", у седьмого входа - "64" и у восьмого входа - "128", если сброс сделать с этих входов, всё!
Для передачи кода ошибки(диапазона 0-6) достаточно задействовать три бита(диапазон 0-7)!
Сергей0308, спасибо за пояснение. Я понял назначение данной переменной в Вашем примере.
Может Вы планировали обойтись одной сетевой переменной?
Если куда Вы посылаете код ошибки и откуда его сбрасываете - одно устройство и достаточно "умное", например ПР, то можно обойтись и одной переменной, мастер читает и пишет эту переменную, например так:
Вложение 52244
Вложение 52245
Сергей0308, еще раз спасибо! Тоже интересный вариант. Меня сейчас заботит несколько другой аспект, который пока не получается реализовать. Хочется, что бы код ошибки (OUT_w) можно сбросить в 0 при наличии активных аварий (ошибок) и следующая ошибка появится сразу же после сброса, если есть любые активные аварии на входах. Например, если по времени последовательно расписать так (ti - момент времени i):
t1: вход I5 = 1, OUT_w = 5 - сработал вход I5, код ошибки = 5
t2: вход I7 = 1 - сработал вход I7
t3: вход I5 = 0 - вход I5 сброшен
t4: OUT_w = 0 - сброс кода ошибки
t5: OUT_w = 7 - код ошибки = 7, т.к. вход I7 активен.
Так же должно работать, если мы сбрасываем код ошибки, а вход I5 все еще активен.
Тогда наверно как-то так:
Вложение 52272
Вы, наверно, в первый раз с логикой сталкиваетесь?
Вложение 52273
Прошу помощи. Мною написан алгоритм управления котлом, при симуляции и на пр200 все работает, но при выключении питания на пр и последующем его запуске прибор включается но алгоритм не запускается. Алгоритм запускается по кнопке пуск выходная переменная которой назначена энергонезависимой. Прошу совета как сделать чтобы при откл. питания и его появлении алгоритм запускался сам. Спасибо всем откликнувшимся.
Вероятно Вы используете RS-триггер из ОЛ, он не обладает энергонезависимостью.
Может лучше Вам поставить тумблер вместо кнопок, хотя бы временно, пока не разберётесь с энергонезависимыми RS-триггерами, а то систему отопления разморозите и себя заморозите, короче, думаю тумблер решит ваши проблемы на ближайшую перспективу!
Скрин проекта прикрепляю:
Напишите необходимую логику работы, в смысле включения с кнопок и внешней аварии, мне проще сделать чем разбираться в вашей лабуде! Зачем для тумблера передний фронт? И выхода подпишите, чтобы понятно было!
И совсем забываю спросить: у Вас тоже кнопка на клаве сломалась, что скриншоты делает?
Так ответил преведущий собеседник на мой вопрос почему он экран фотографирует!
Сергей добрый вечер! Видно я не один кто экран фоткает))) логика на самом деле простая: имеется котел и насос, а также два датчика один датчик температуры ntc 10, а второй датчик давления и две кнопки пуск и стоп. При нажатии кнопки пуск, насос запускается сразу, а котел запускается с задержкой во времени которую можно задавать с экрана ПР-200. При нажатии кнопки стоп котел отключается сразу, а насос отключается с задержкой по времени, длительность которой также можно изменять с экрана ПР-200. Управление нагревом и охлаждением котла осуществляется по средствам датчика ntc10 по гистерезису, уставку которого также можно менять с экрана ПР-200. При срабатывании сигнала аварии, от датчика давления( превышении нижнего порога) происходит отключение котла и насоса, но насос выключается с той задержкой при которой происходило его включении, при этом кнопки пуск и стоп остаются не активны, а на экран ПР-200 поступает сообщение авария, при снятие сигнала авария происходит включение насоса с задержкой уже прописанной ранее и затем включение котла. И ВАЖНО при пропадании питания на ПР-200 и последующем его появлении, т. е. включении ПР алгоритм запускался сам по программе кнопки пуск, сначала насос с его задержкой потом котел.
У Вас противоречиво описано, короче, наверно как-то так:
Вложение 52299
Вложение 52300
Да, и поправите коэффициент для датчика!
Да и насчёт фотографирования, я не знаю вашего возраста, поэтому не могу точно определить это старческий маразм или врождённый, короче, надеюсь Вы не плёночным фотоаппаратом фотографируете с последующим оцифровыванием, уже хорошо или могло быть хуже!
Сергей Спасибо попробую. По поводу маразма вы зря, ноут на работе там нет интернета поэтому и с фоткал с тел. А подключать бук через тел. Заходить на форум скидывать скрин в условиях ограниченного времени и неподходящих условий (не все работают в офисах и дома) это было бы точно как вы выразились-маразм. Да и годков мне 36, работаю в сфере строительство. Прошу прощения за орфографию опять с тел. Пишу)))
Добрый день, на работе админы установили ISA сервер и теперь OWEN Logic не видит интернет и, соответственно, библиотеки (обновления). Какие порты открыть админам, чтобы программа увидела инет?
Уважаемые знатоки, объясните пожалуйста (если можно с примерами) в чем смысл настройки "Запись в конце цикла", особенно для сетевых переменных, и когда ее нужно применять. В руководстве пользователя Owen Logic ну очень скупо о ней говорится.
Alex469 это сложновато объяснить. Программа это простыня FB, которая выполняется последовательно, и возможно переменная, в которую вы записали данные, участвует на этой простыне еще в каком-то месте и вам ну очень надо, чтобы она не изменилась, пока вся простыня FB не выполнится.
Задам вопрос более конкретно. В проекте ПР100 выступает в качестве модбас мастера. Имеется еще 3 слейва. Все аппараты связаны по RS485 (modbus RTU). В проекте один из слейвов панель оператора. Среди прочего мастер должен считать целочисленное значение с панели оператора (сетевая переменная O_Gen_Power_Setting_MB, в настройках переменной указана только функция чтения 03, функции записи нет) и передать без обработки в другой слейв (сетевая переменная GenPower_MB, в настройках переменной указаны функции чтения 03 и записи 10). Чтение O_Gen_Power_Setting_MB осуществляется с использованием "Запуск чтения". Запись в GenPower_MB осуществляется с использованием "Запись по изменению". Кроме этого в проекте достаточно много других сетевых переменных и, соответственно, куча других обменов между мастером и слейвами. Вопрос: нужно ли указывать для сетевой переменной GenPower_MB "Запись в конце цикла" ? Если нужно, то почему?
Здравствуйте!
Начал изучать Owen Logic. Как сделать переход между экранами?
В учебных видео список переходов появлялся сразу при создании нового экрана, но в новых версиях, похоже, что-то изменилось.
У меня так:
Вложение 52672
А в видео так:
Вложение 52673
Увидел, нужно было в контекстном меню группы экранов выбрать "редактировать группу" и затем настраивать экраны в окне группы.
С первого раза оказалось не очевидно, спасибо за быстрый ответ!
Добрый день.
Нужно передать несколько (например, 10) булевых переменных из ПР200 в облако и у части из них менять значения.
Вариант 1 - просто 10 булевых переменных.
Вариант 2 - упаковать битовой маской в целочисленный в ПР200, в облаке сделать 10 переменных с одним адресом, но разными битовыми масками для каждой.
Вопрос 1. Будет ли экономия трафика/уменьшение задержек в варианте 2, то есть, будет ли переменная запрашиваться 1 раз и парситься в облаке на 10 переменных, или же будет 10 раз запрашиваться с применением своей битовой маски к каждому запросу?
Вопрос 2. Имеет ли это практический смысл, если передача через Ethernet, на трафик пофиг? В варианте 1 код читать понятнее, всё прозрачно.
Вопрос 3. Может я что-то упускаю и есть более простые способы для решения подобной задачи?
У Вас вариантов нет. В слейве ПР200 с булевыми переменными не работает.
Ну я бы так не утверждал, не знаю как там облако, ПР в слейве может работать с битами, но я за передачу полноценными регистрами, облако вроде может все это разделять.
Тут https://www.youtube.com/watch?v=NMTvVy9ABVc информация по работе с битами и другие особенности.
В этом ролике https://www.youtube.com/watch?v=kOo4INKt8Nw где-то с середины показано почему плохо использовать битовые регистры по сети особенно если их много, целочисленные в режиме 0/1 ничем от передачи одного бита не отличается, даже если трафик не играет роли, то быстродействие будет страдать.
Обязательно упаковать в 1 переменную, например 512, но битовой маской получится только читать.
Чтобы записывать, то надо к ним обращаться чтением записью 01 и 15 функцией из облака по адресам булевых переменных. Тоесть для адреса 512 (200h) адреса будут 2000h, 2001h .. 200fh, где младший разряд это номер бита, начиная с нуля.
Экономии трафик не будет, поскольку пр200 не поддерживает групповые запросы и чтение каждого бита будет идти отдельной командой.
Если вы будете по одной булевой переменной в каждый регистр класть, то извините это 10 регистров, между прочим, всего из 64.
Насчёт наглядности непонятно. В конце поляны делаете упаковщик/распаковщик и работаете с булевыми переменными как обычно. Нюанс только один + всё булевы переменные превращаются в энергонезависимые
Спасибо. Понятно всё.
Добрый день.
Вроде подобный вопрос уже видел, но не помню, к чему там в итоге пришли, а найти сейчас не смог.
Есть кратковременное событие на входе ПР200 (секунду, например, длится) и соответствующая ему переменная (значения 0 или 1).
Хочу иметь возможность, если нужно, смотреть в какое время оно наступало. Завел в облако.
Облако опрашивает, например, раз в 5 секунд. То есть, если событие наступило и пропало между опросами - я его не вижу.
Ок, я могу сделать задержку события, например, секунд на 10. Тогда событие при нормальных условиях будет зафиксировано опросом из облака.
Но если в это время пропадет связь, я не увижу, что событие было.
Как я понял, в слейве ПР никак не может узнать, что с нее что-то считали. (Ни битов, что прочитано было, ни статистика RS485 недоступна, ничего. Облако само ничего не пишет. И в итоге взвести флаг и сбросить его после прочтения я не могу.)
Ок, я могу сделать в облаке событие на потерю связи с устройством + какой-то журнал в ПР. Тогда если потеря связи меньше 10 секунд, я увижу событие в облаке, если больше 10 секунд, я увижу событие о потери связи и потом прочитаю журнал локально.
Выглядит приемлемо, но как-то коряво.
Вопрос. Я что-то упустил и есть более легкий путь?