Вход

Просмотр полной версии : Оператор MOVE в owen logic



Borobeska
24.11.2022, 10:38
Добрый день!

Не могу найти арифметический оператор "move" для owen logic. Есть ли он в сторонних библиотеках или его альтернатива?

melky
24.11.2022, 10:42
SEL, на его базе делаете Move, вроде других решений нет.

Dimensy
24.11.2022, 10:55
Так просто, соединяете линией и все. Или вам нужна запись по сигналу?

Borobeska
25.11.2022, 02:45
Да, нужна запись по сигналу. С hmi приходит сигнал и в нее записываются значения из ПР.
Присвоение значения одной переменной другой соответствующего типа.

Через SEL сработало, спасибо!

AlexAnder11
05.07.2023, 09:23
а как быть если условия три и больше? При первом условии записать одно значение в переменную, при втором другое, при третьем - третье и т.д.

melky
05.07.2023, 09:45
AlexAnder11 расположение элементов каскадом приводит к требуемому выбору условия.

Сергей0308
05.07.2023, 10:56
а как быть если условия три и больше? При первом условии записать одно значение в переменную, при втором другое, при третьем - третье и т.д.

Примерно как-то так:

68648

AlexAnder11
05.07.2023, 12:21
спасибо за совет, решил вопрос, написав функцию на ST используя оператор ветвления

Эдуард_Н
05.07.2023, 14:07
спасибо за совет, решил вопрос, написав функцию на ST используя оператор ветвления

поделитесь.

kondor3000
05.07.2023, 14:29
поделитесь.

Написать свой, всего 2 минуты надо, например 68652


function GetEquip: udint;
var_input
Enable : bool ;
State : udint;
C00,C01,C02,C03,C04,C05 : udint;
end_var
if Enable then
case State of
0: GetEquip := 0; //
1: GetEquip := C01;
2: GetEquip := C02;
3: GetEquip := C03;
4: GetEquip := C04;
5: GetEquip := C05;

else GetEquip := 0; //
end_case
else GetEquip := 0;
end_if
end_function

pro100nik
21.07.2025, 16:05
Написать свой, всего 2 минуты надо, например 68652


function GetEquip: udint;
var_input
Enable : bool ;
State : udint;
C00,C01,C02,C03,C04,C05 : udint;
end_var
if Enable then
case State of
0: GetEquip := 0; //
1: GetEquip := C01;
2: GetEquip := C02;
3: GetEquip := C03;
4: GetEquip := C04;
5: GetEquip := C05;

else GetEquip := 0; //
end_case
else GetEquip := 0;
end_if
end_function


А если нужно оставлять "старое" значение, то есть ни одно новое не надо? Я знаю, что выход пере запишется последним активным, что например не даст возможность перезаписывать с "экрана" или из канала modbus. Так что это не аналог MOVE.

pro100nik
13.11.2025, 14:15
Кто-то нашел решение реализации функционала MOVE для значений или SET/RESET битовых переменных? PS: fSEL и триггеры это не то, так как переменную можно записать из разных мест в разное время!!!

capzap
13.11.2025, 14:41
А если нужно оставлять "старое" значение, то есть ни одно новое не надо? Я знаю, что выход пере запишется последним активным, что например не даст возможность перезаписывать с "экрана" или из канала modbus. Так что это не аналог MOVE.

вместо else GetEquip := 0; записать старое значение и будет выполнено Ваше пожелание

pro100nik
13.11.2025, 17:08
вместо else GetEquip := 0; записать старое значение и будет выполнено Ваше пожелание

Я именно так и сделал.
Но представьте, что эта-же переменная записывается не только в коде но и по модбасу. В этом случае как понять, что нужно обновить эту переменную? Ответ: то, что придёт по модбасу будет затёрто "записать старое значение(else GetEquip := 0)".
Естественно уже сделан костыль - в модбасе появляется лишняя битовая переменная активная если нужно "принять данные" по модбасу. Но для это на "той" стороне пришлось делать целый цирк с этой лишней битовой переменной.
А поскольку эта переменная является уставкой то её нужно менять не только из кода или по модбасу, но и необходимо иметь возможность устанавливать с экрана контроллера. То есть появляется уже третий источник изменения. И тут уже опять "цирковое жонглирование переменными" для синхронизации актуальности данных.
Эти проблемы не возникают там, где есть MOVE/MEMSET и т.п..

Сергей0308
13.11.2025, 17:58
Я именно так и сделал.
Но представьте, что эта-же переменная записывается не только в коде но и по модбасу. В этом случае как понять, что нужно обновить эту переменную? Ответ: то, что придёт по модбасу будет затёрто "записать старое значение(else GetEquip := 0)".
Естественно уже сделан костыль - в модбасе появляется лишняя битовая переменная активная если нужно "принять данные" по модбасу. Но для это на "той" стороне пришлось делать целый цирк с этой лишней битовой переменной.
А поскольку эта переменная является уставкой то её нужно менять не только из кода или по модбасу, но и необходимо иметь возможность устанавливать с экрана контроллера. То есть появляется уже третий источник изменения. И тут уже опять "цирковое жонглирование переменными" для синхронизации актуальности данных.
Эти проблемы не возникают там, где есть MOVE/MEMSET и т.п..

Да уж, очень странно, в смысле, я здесь изменял значения из нескольких мест и никаких проблем не возникало:

https://owen.ru/forum/showthread.php?t=26216&p=376273&viewfull=1#post376273

Можно добавить и изменение с экрана, никаких проблем не возникнет, короче, мне кажется у Вас талант, в смысле, можете Вы создать проблему на ровном месте, у меня так не получается!
Да, чуть не забыл, всё само синхронизируется, само - собой.

86716

capzap
13.11.2025, 19:00
Ответ: то, что придёт по модбасу будет затёрто "записать старое значение(else GetEquip := 0)".
..
Я считал что Вы понимаете код, который Вам предложили, Enable это переменная что с какого то направления пришло изменение, далее через кейс присваивается изменённое значение, если изменений нет, то берется значение с предыдущей итерации, что не так?

Dimensy
13.11.2025, 20:46
А я не понял, что автору требуется? Специально открыл справку в Codesys



MOVE
Присвоение значения одной переменной другой соответствующего типа. В графических редакторах CFC и LD существует возможность управлять разрешением работы блока (разрешать илиз апрещать операцию) с помощью входов EN/EN0. В FBD этого делать нельзя

В Лоджике FBD. Но читаем дальше



Пример ST:
ivar2 := MOVE(ivar1);
( ! Аналогичный результат дает: ivar2 := ivar1; )


Так что требуется то?

FPavel
13.11.2025, 21:02
Я именно так и сделал.
Но представьте, что эта-же переменная записывается не только в коде но и по модбасу. В этом случае как понять, что нужно обновить эту переменную? Ответ: то, что придёт по модбасу будет затёрто "записать старое значение(else GetEquip := 0)".
Естественно уже сделан костыль - в модбасе появляется лишняя битовая переменная активная если нужно "принять данные" по модбасу. Но для это на "той" стороне пришлось делать целый цирк с этой лишней битовой переменной.
А поскольку эта переменная является уставкой то её нужно менять не только из кода или по модбасу, но и необходимо иметь возможность устанавливать с экрана контроллера. То есть появляется уже третий источник изменения. И тут уже опять "цирковое жонглирование переменными" для синхронизации актуальности данных.
Эти проблемы не возникают там, где есть MOVE/MEMSET и т.п..

Ввод уставки с местной панели и от вышестоящей системы (панели оператора, облака...) можно выполнять в одну и ту же сетевую переменную. Так незамысловато получится реализация "кто последний - тот и папа".

Изменение той же уставки из алгоритма - кроме случая ограничения значения в корректном диапазоне или откат к предыдущему корректному значению - это некорректно, т.к. полностью дискредитирует весь смысл ввода параметра оператором. Зачем вводить, если алгоритм изменит на собственное значение?

Поэтому, нужно сначала понять, что требуется реализовать.

pro100nik
14.11.2025, 17:26
Просьба обратить внимание что требуется "Оператор 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", но вижу, что сообществу это не интересно, а интересно раскритиковать того, кто реально видит необходимость(смысл) в этом.

FPavel
14.11.2025, 18:46
Просьба обратить внимание что требуется "Оператор 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", но вижу, что сообществу это не интересно, а интересно раскритиковать того, кто реально видит необходимость(смысл) в этом.
Для записи из трёх разных мест:
- из Modbus и с экрана - в одну и ту же сетевую переменную
- в значение по умолчанию - при помощи fSel
86738

И пример - с той самой сетевой переменной.

Dimensy
14.11.2025, 18:48
Я, в свое время, делал программу для вентиляции где можно было выбирать алгоритм - работать по приточному датчику или по датчику в помещении. Переменная уставки на экране была одна и использовалась в зависимости от алгоритма.
Может автору что-то в этом роде надо?

capzap
14.11.2025, 23:06
Просьба обратить внимание что требуется "Оператор MOVE в owen logic" а не Codesys.
не считайте что квадратик move каким то образом не расходует процессорное время, если он будет сделан разработчиком ОЛ, а не программистом проекта


Условно задача: Есть переменная SetPoint. Необходимо реализовать её запись из трёх разных мест
попытайтесь использовать вложение
ЗЫ в коде другой метод, не про папу, а "кто первый встал того и тапки"

ПС: не надо писать про "отказ от задачи" и про деньги - это выставляет вас в не очень хорошем свете. За деньги можно и фигню впарить: работает=плати.
покажите свою реализацию, чтоб отбить у форумчан желание предложить Вам поменять профессию

ПСПС: "записать старое значение(else GetEquip := 0)" я это понял прекрасно. Но это не работает, если нужно "поймать" момент когда GetEquip == 0
раскройте мысль про поймать момент

1exan
15.11.2025, 12:01
не считайте что квадратик move каким то образом не расходует процессорное время, если он будет сделан разработчиком ОЛ, а не программистом проекта


попытайтесь использовать вложение
ЗЫ в коде другой метод, не про папу, а "кто первый встал того и тапки"

покажите свою реализацию, чтоб отбить у форумчан желание предложить Вам поменять профессию

раскройте мысль про поймать момент

Какой смысл переменной OLD_SP в примере?
Интересно кстати работает симуляция - выход принимает все промежуточные значения цикла., на реальной ПР так-же?

Валенок
15.11.2025, 13:07
вариант от capzap упростил и учел необходимость инициализаций.
не думаю что нужно будет 100500 точек (хотя не проблема и в таком виде), но если подопрет то можно и цикл

capzap
15.11.2025, 13:49
Какой смысл переменной OLD_SP в примере?

Ее я сам вставил, потому что то, как написала Алиса меня не устраивало, даже без теста

kondor3000
15.11.2025, 15:48
Мой вариант автоматического изменения 3 (от 1 до 3) переменных из разных мест + уставка (инициализация уставки) 86744
и возможность по Enable установить её в любое время. Enable с авто сбросом.
А также возможность изменения уставки и её применение по Enable (аналог MOVE).
Версия Owen Logic2.10.367

Vadik2881
21.01.2026, 14:33
Ребята, подскажите. С помощью sel сделал move.
Но значение обнуляется после отключения питания. Как вообще запоминать данные в owen logic?

Dimensy
21.01.2026, 15:39
Ребята, подскажите. С помощью sel сделал move.
Но значение обнуляется после отключения питания. Как вообще запоминать данные в owen logic?

Если у вас det1_1 энергонезависимая, от тогда так
87616

Vadik2881
21.01.2026, 16:49
во блин, а чёт так можно было?!))) Огромное спасибо!