Разница между вызовом функционального блока в IEC61131-3

В чем разница между назначением параметра с помощью dot и помещением в виде массива в функциональный блок?

вот простой код в качестве примера.

Timer1(IN:=TRUE,PT:=T#2S);
IF Timer1.Q THEN
    i:=i+1;
    Timer1.IN:=FALSE;
END_IF

Timer2(IN:=TRUE,PT:=T#2S);
IF Timer2.Q THEN
    j:=j+1;
    Timer2(IN:=FALSE);
END_IF

Ожидалось, что Timer1 будет сброшено этим назначением Timer1.IN:=FALSE;, но ничего не произошло, хотя в коде отображается FALSE как значение в реальном времени!

введите здесь описание изображения

любая помощь будет оценена.


person asys    schedule 10.02.2021    source источник
comment
В чем проблема? Вы оставляете нам самим догадываться, в чем проблема. Если вы хотите, чтобы Timer1 вел себя так же, как Timer2, вам нужно сделать Timer1(IN:=FALSE) вместо Timer1.IN:=FALSE;;   -  person Jakob    schedule 10.02.2021
comment
@Jakob извините, я отредактирую в ближайшие несколько часов ..   -  person Amin Qassemi    schedule 10.02.2021
comment
@Jakob, так почему Timer1.IN:=FALSE неверен?   -  person Amin Qassemi    schedule 10.02.2021
comment
Потому что вы не вызываете функциональный блок Timer1 с IN = FALSE. Вы только назначаете его с IN = FALSE (но не выполняете его), а в следующем цикле вы снова назначаете его с IN = TRUE (а затем вызываете его). Таким образом, вы просто не сбрасываете функциональный блок. Обратите внимание, что вы вызываете не ФУНКЦИИ, а ФУНКЦИОНАЛЬНЫЕ БЛОКИ. Tc2_Standard.TON — это функциональный блок.   -  person Jakob    schedule 10.02.2021
comment
@Jakob, в чем преимущество этой нотации, когда она не запускает функциональный блок, а просто назначает его? это вызывает много проблем у программистов при устранении неполадок при использовании его в огромной программе.   -  person asys    schedule 10.02.2021
comment
@asys во многих промышленных схемах управления вам не обязательно вызывать FB каждый раз, когда вы получаете доступ и вводите или выводите переменную. Например, некоторые FB должны запускаться только один раз при каждом сканировании ПЛК и в определенном порядке (например, управление осями привода), но вам необходимо получить доступ к данным привода во многих местах программы. Кроме того, в вашем примере кода у вас есть IF Timer1.Q Then, который обращается к выходу Q, а не вызывает FB - это именно то, что вы хотите. Ваша жалоба на устранение неполадок и проблем основана на непонимании синтаксиса языка программирования.   -  person Scott    schedule 11.02.2021
comment
Хороший вопрос. Я также совершил ту же ошибку, предполагая, что присваивание входной переменной вызовет выполнение функционального блока. Как только вы это поймете, я думаю, это имеет смысл. Смотрите мой ответ ниже для объяснения.   -  person Roald    schedule 14.02.2021


Ответы (1)


Есть только два символа, которые имеют огромное значение между результатами: (). Скобки указывают, что функциональный блок вызывается, что означает, что часть реализации функционального блока выполняется.

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

Пример

Здесь я определяю функциональный блок с одним входом Increment и одним выходом Count. Каждый раз, когда вызывается функциональный блок, он запускает код в части реализации. Часть реализации увеличит текущий Count на Increment.

FUNCTION BLOCK FB_Counter 
VAR_INPUT
    Increment : UINT := 1;
END_VAR
VAR_OUTPUT
    Count : UINT := 0;
END_VAR

// Implementation part
Count := Count + Increment; 

Позвольте мне создать экземпляр counter этого функционального блока в программе Runner, чтобы мы могли видеть, что происходит, когда мы его вызываем.

PROGRAM Runner
VAR
    counter : FB_Counter;
END_VAR

counter(); // Count is set to 1 since the function block implementation is called
counter.Increment := 2; // Increment is set to 2, Count is still at 1 since the implementation of the function block is not called.
counter(); // Count is set to 3 since the implementation of the function block is now executed
counter(Increment:=1); // Increment is set back to 1 and the function block is called again, increasing the Count to 4.

Если вы пройдёте приведенный выше код, используя точку останова, вы увидите, что происходит на каждом этапе пути.

person Roald    schedule 14.02.2021