Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: адрессация

  1. #1

    По умолчанию адрессация

    при обкатке программы возник вопрос. операцию присвоения адреса входа плк (посредством Move) входной величине созданного функционального блока Fb где лучше осуществить, внутри самого функционального блока или же в главной программе откуда он вызывается? все входа на Fb в гл. программе Prg тоже есть.
    спасибо.

  2. #2

    По умолчанию

    немного непонятно, но если вопрос стоит ли заносить глобальные переменные (а переменные из конфигурации глобальные априори) в блоки или присваивать на входы в основной программе - мое имхо в основной программе одназначна.
    Немного не понял с move

  3. #3

    По умолчанию

    Мне надо, чтобы входная переменная в одном из созданных мною FB считывала значение напрямую с адреса. Попытался в разделе объявлений её объявить как
    var_input
    ten % AT ID 0.2.0:REAL;
    cкомпилировал -он заругался: то ему нужно двоеточие поставить перед %, то неправильная inicial variable, то неизвестный тип переменной.
    Вобщем пришлось с помощью MOVE c аналового входа присваивать значение входу FB.
    Конечно было бы проще с прямой адрессацией, но почему-то не получается?
    И ещё вопрос. С помошью MOVE можно ли из других функциональных блоков или других частей программы значения локальных переменных перемещать или это действует только в пределах одного блока?
    И в чём принципиальная разница если я измеренную величину попытаюсь сохранить либо объявив её как Retain, либо отправив по адресу например %AT MD14 ?
    спасибо

  4. #4

    По умолчанию

    1) В фб пишем
    FUNCTION_BLOCK ddd
    VAR_INPUT
    aa AT %I* :BOOL;
    END_VAR
    VAR_OUTPUT
    bb:BOOL;
    END_VAR
    VAR
    END_VAR
    2) В Var_config создаем

    PLC_PRG.g.aa AT %IX0.0.0:BOOL;

    где PLC_PRG.g - имя экземпляра ФБ типа ddd
    Часто задаваемые вопросы по кодесис
    1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
    2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie

  5. #5

    По умолчанию

    AT % а не наоборот... Ну и работайте с именем а не с адресом - сильно правильнее
    var
    var1 AT % ... : BOOL;
    end_var

  6. #6

    По умолчанию

    спасибо! с адресацией понятно, а что скажите по остальным вопросам насчёт Move и сохранения полученной переменной?см. выше

  7. #7

    По умолчанию

    1. Я бы почитал документацию по CoDeSys и понял чем различается Retain и маркерная память.
    2. Локальная переменная на то и локальная, что действует в одной подпрограмме. В другой подпрограмме может быть локальная переменная с таким же именем - и это 2 разных переменных. Если Вы уже понимаете, что у Вас будут подпрограммы - не стесняйтесь делать для них входящие и выходящие переменные: надо данные из другого куска передать: var_input, надо результат в основную программу вернуть - var_output.
    В разделе примеров есть пример создания подпрограмм и вызова из основной программы.

  8. #8

    По умолчанию

    спасибо за предыдущие советы. возникли ещё вопросы. Во время обкатки проекта (см. вложения) возникает следующая ситуация . По короткой команде TRUE (следом FALSE) start_zero (global_var) запускается блок измерения среднего значения веса за единицу времени mix:STATISTICS_REAL. Время произвольное. По короткой (TRUE следом FALSE) команде stop в гланой программе PLC_PRG c помощью блока MOVE выходные величины FB mix записываются в память меркеров (см. var_retain). Дальнейшее измерение идёт с учётом этих величин. И всё бы ничего, только вот после выключения ПЛК эти величины показывают какую-то чушь. Например до выключения всё нормально:
    MN = 0.2254406;
    MX = 2.326654;
    AVG = 1.361449.
    после выключения и повторного включения ПЛК:
    MN =2.337515e-32;
    MX = -1.032399e+017;
    AVG = 1.762714e+033.
    Такое ощущение, что проведённые измерения не сохраняются даже после того как их объявил retain.
    А мне эти величины нужны сохранёнными, что пользоваться ими в дальнейшем либо как константами, либо как коэффициэнтами, даже если ПЛК будет выключен несколько месяцев.
    ЧТО Я ДЕЛАЮ НЕ ТАК??? Может есть другой способ сохранения этих величин? Заранее благодарю.
    Вложения Вложения

  9. #9

    По умолчанию

    Многое не так делаете...
    1. В Вашей подпрограмме сохранение никогда и не будет - у Вас переменная mem будет true в любом случае до конца цикла (до низа поля программы). В начале следующего прохода она уже опять будет равно false...
    2. Не делайте Retain внутри блока, если Вы не уверенны, что в момент пропадания питания блок будет вызываться из основной программы. Да и в принципе Retain я бы делал в основной программе.
    3. Объявляйте их просто Retain - не заносите в маркерную память.
    4. Адрес переменной AT %... недопустим!!!!!!!!!!!!!!!!!!!

    Начните с простого - создайте простую программу без подпрограмм, и задайте в ней пару переменных типа Retain. Как сохранятся- двигайтесь дальше.

  10. #10

    По умолчанию

    Програмка, которую я выставил, очень усечённая версия. В ней уже существуют другие подпрограмки. mem потому и объявлена глобальной, что действует и в другом блоке и включается только на период одного цикла. А вообще мне просто нужно единовременно измерить (режим калибровки) средний вес ленты весового дозатора за один оборот ленты и использовать его в последующих вычислениях.
    Как я теперь понимаю - меркерная память действует только в динамическом режиме, во время работы программы?
    А почему сам адрес-то не допустим? Компилятор не ругается вроде.

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

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