Очередной вопрос: в ПР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 потом можно только слейвом (по модбас).
Не до конца ясно, как должно работать в тех или иных случаях, например должно ли сбрасываться при наличии активных аварий(ошибок), у меня можно сбросить и следующая авария(ошибка) появится только после пропадании всех и возникновении вновь или логика при одновременном нажатии более одного входа(у меня приоритет у более старшего входа), короче, наверно примерно так:
Авария_3.PNG
Авария_3.owl
Последний раз редактировалось Сергей0308; 27.11.2020 в 02:38.
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.
Сергей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; 28.11.2020 в 20:23.
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.
Сергей0308, спасибо за пояснение. Я понял назначение данной переменной в Вашем примере.
Может Вы планировали обойтись одной сетевой переменной?
Если куда Вы посылаете код ошибки и откуда его сбрасываете - одно устройство и достаточно "умное", например ПР, то можно обойтись и одной переменной, мастер читает и пишет эту переменную, например так:
Авария_4.PNG
Авария_4.owl
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.
Сергей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 все еще активен.
Тогда наверно как-то так:
Авария_5.PNG
Вы, наверно, в первый раз с логикой сталкиваетесь?
Авария_5.owl
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.