Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 28

Тема: Оператор MOVE в owen logic

  1. #11

    По умолчанию А если нужно оставлять "старое" значение, то есть ни одно новое не надо?

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Написать свой, всего 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.

  2. #12

    По умолчанию

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

  3. #13
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,574

    По умолчанию

    Цитата Сообщение от pro100nik Посмотреть сообщение
    А если нужно оставлять "старое" значение, то есть ни одно новое не надо? Я знаю, что выход пере запишется последним активным, что например не даст возможность перезаписывать с "экрана" или из канала modbus. Так что это не аналог MOVE.
    вместо else GetEquip := 0; записать старое значение и будет выполнено Ваше пожелание
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  4. #14

    По умолчанию

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

  5. #15
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    9,434

    По умолчанию

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

    https://owen.ru/forum/showthread.php...l=1#post376273

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

    32 Т-триггера + управление из нескольких мест(по сети).PNG
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  6. #16
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,574

    По умолчанию

    Цитата Сообщение от pro100nik Посмотреть сообщение
    Ответ: то, что придёт по модбасу будет затёрто "записать старое значение(else GetEquip := 0)".
    ..
    Я считал что Вы понимаете код, который Вам предложили, Enable это переменная что с какого то направления пришло изменение, далее через кейс присваивается изменённое значение, если изменений нет, то берется значение с предыдущей итерации, что не так?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #17

    По умолчанию

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

    Да и в целом, картами Карно описываются и комбинационные схемы и автоматы состояний (триггеры, счётчики...).
    Делаете внятное описание алгоритма, составляете карты Карно, реализуете на FBD или ST.

    Если не в состоянии выполнить задание - откажитесь (от выполнения и оплаты) и скажите, что на форуме Овен можно найти исполнителей. Главное, объясните, что специально для Вас вредители-производители не реализовали "киллер-фичу".

  8. #18
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,899

    По умолчанию

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

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

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

  9. #19

    По умолчанию

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

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

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

  10. #20

    По умолчанию

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

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Похожие темы

  1. Owen Logic 2.1 нет экспорта устройства в Owen Cloud.
    от Григори в разделе Среда программирования OWEN Logic
    Ответов: 4
    Последнее сообщение: 12.10.2022, 19:33
  2. Добавление аварийных ситуаций в Owen Logic на ПР200 для отображения в Owen Cloud.
    от Григори в разделе Среда программирования OWEN Logic
    Ответов: 6
    Последнее сообщение: 07.07.2022, 11:09
  3. ПО OWEN Logic !!!
    от Ельцов Андрей в разделе Программируемые реле
    Ответов: 3
    Последнее сообщение: 11.10.2011, 15:33
  4. OWEN Logic 1.2.0.14b
    от Ельцов Андрей в разделе Программируемые реле
    Ответов: 40
    Последнее сообщение: 21.02.2011, 14:16
  5. OWEN Logic 1.1.0.11b
    от Ельцов Андрей в разделе Программируемые реле
    Ответов: 58
    Последнее сообщение: 12.10.2010, 20:55

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •