Кто-то нашел решение реализации функционала MOVE для значений или SET/RESET битовых переменных? PS: fSEL и триггеры это не то, так как переменную можно записать из разных мест в разное время!!!
Я именно так и сделал.
Но представьте, что эта-же переменная записывается не только в коде но и по модбасу. В этом случае как понять, что нужно обновить эту переменную? Ответ: то, что придёт по модбасу будет затёрто "записать старое значение(else GetEquip := 0)".
Естественно уже сделан костыль - в модбасе появляется лишняя битовая переменная активная если нужно "принять данные" по модбасу. Но для это на "той" стороне пришлось делать целый цирк с этой лишней битовой переменной.
А поскольку эта переменная является уставкой то её нужно менять не только из кода или по модбасу, но и необходимо иметь возможность устанавливать с экрана контроллера. То есть появляется уже третий источник изменения. И тут уже опять "цирковое жонглирование переменными" для синхронизации актуальности данных.
Эти проблемы не возникают там, где есть MOVE/MEMSET и т.п..
Да уж, очень странно, в смысле, я здесь изменял значения из нескольких мест и никаких проблем не возникало:
https://owen.ru/forum/showthread.php...l=1#post376273
Можно добавить и изменение с экрана, никаких проблем не возникнет, короче, мне кажется у Вас талант, в смысле, можете Вы создать проблему на ровном месте, у меня так не получается!
Да, чуть не забыл, всё само синхронизируется, само - собой.
32 Т-триггера + управление из нескольких мест(по сети).PNG
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
А чем MOVE+EN отличается от IF+присвоение (из ST)?
Да и в целом, картами Карно описываются и комбинационные схемы и автоматы состояний (триггеры, счётчики...).
Делаете внятное описание алгоритма, составляете карты Карно, реализуете на FBD или ST.
Если не в состоянии выполнить задание - откажитесь (от выполнения и оплаты) и скажите, что на форуме Овен можно найти исполнителей. Главное, объясните, что специально для Вас вредители-производители не реализовали "киллер-фичу".
А я не понял, что автору требуется? Специально открыл справку в Codesys
В Лоджике FBD. Но читаем дальшеMOVE
Присвоение значения одной переменной другой соответствующего типа. В графических редакторах CFC и LD существует возможность управлять разрешением работы блока (разрешать илиз апрещать операцию) с помощью входов EN/EN0. В FBD этого делать нельзя
Так что требуется то?Пример ST:
ivar2 := MOVE(ivar1);
( ! Аналогичный результат дает: ivar2 := ivar1; )
Ввод уставки с местной панели и от вышестоящей системы (панели оператора, облака...) можно выполнять в одну и ту же сетевую переменную. Так незамысловато получится реализация "кто последний - тот и папа".
Изменение той же уставки из алгоритма - кроме случая ограничения значения в корректном диапазоне или откат к предыдущему корректному значению - это некорректно, т.к. полностью дискредитирует весь смысл ввода параметра оператором. Зачем вводить, если алгоритм изменит на собственное значение?
Поэтому, нужно сначала понять, что требуется реализовать.
Просьба обратить внимание что требуется "Оператор MOVE в owen logic" а не Codesys.
Условно задача:
Есть переменная SetPoint. Необходимо реализовать её запись из трёх разных мест:
1. Значение SetPoint может принимать значение "А" или "Б" при включении/установке дефолтного значения (тут изменение из кода ПЛК fSel на 4 входа с "возвратом" выходного значения на один из входов и переключателем "если не 1/2/3" то "возврат")
2. Значение SetPoint может меняться со SCADA (тут изменение по Модбасу - тут костыль с дополнительным битом актуальности переменной)
3. Значение SetPoint может меняться из поля ввода экрана (тут изменение с экрана - в целом "кто последний тот и папа" пришлось реализовать изменением последовательности операций присвоения)
ПС: не надо писать про "отказ от задачи" и про деньги - это выставляет вас в не очень хорошем свете. За деньги можно и фигню впарить: работает=плати.
ПСПС: "записать старое значение(else GetEquip := 0)" я это понял прекрасно. Но это не работает, если нужно "поймать" момент когда GetEquip == 0
ПСПСПС: задача решена костылями, без которых можно было обойтись при наличии MOVE/MEMSET и т.п.
ПСПСПСПС: в техподдержке ОВЕН признали, что оператора MOVE нет, что создание костылей вместо этой этой операции создаёт дополнительные накладные расходы процессорного времени. но не могут помочь с "условной" записью в переменную (переменная будет обновляться в каждом цикле программы тем или иным значением если она помещена на выход какого-либо блока).
была конечно надежда, что создан профессиональный функциональный блок "обновить переменную" "значением на входе блока" только если активен "вход EN", но вижу, что сообществу это не интересно, а интересно раскритиковать того, кто реально видит необходимость(смысл) в этом.