Сложные примеры

Пример: Комбинированные выражения и побитовые операции

Этот пример демонстрирует сложные арифметические и логические выражения, включая побитовые сдвиги (SHL, SHR).

PROGRAM ComplexExpression
VAR
    a : INT := 10;
    b : INT := 3;
    c : INT := 2;
    d : INT := 1;
    shift_amount : INT := 2;
    result1 : INT;
    result2 : BOOL;
END_VAR

    // Сложное арифметическое выражение с побитовым сдвигом
    result1 := a + SHL(b, shift_amount) * c - d; // 10 + (3 << 2) * 2 - 1 = 33

    // Сложное логическое выражение
    result2 := a > 5 AND NOT (b < 2) OR (c = d);

END_PROGRAM
        

Пример: Циклы WHILE, REPEAT и FOR

Этот пример показывает использование всех типов циклов.

PROGRAM LoopsExample
VAR
    counter_while : INT := 0;
    counter_for : INT;
    counter_repeat : INT := 0;
    sum : INT := 0;
    target : INT := 5;
END_VAR

    // Цикл WHILE
    WHILE counter_while < target DO
        counter_while := counter_while + 1;
        sum := sum + counter_while;
    END_WHILE;
    // sum = 15 (1+2+3+4+5)

    // Цикл FOR
    FOR counter_for := 1 TO target BY 1 DO
        sum := sum + counter_for;
    END_FOR;
    // sum = 30 (15 + 1+2+3+4+5)

    // Цикл REPEAT
    REPEAT
        counter_repeat := counter_repeat + 1;
        sum := sum + counter_repeat;
    UNTIL counter_repeat >= target
    END_REPEAT;
    // sum = 45 (30 + 1+2+3+4+5)

END_PROGRAM
        

Пример: Использование встроенных математических функций

Этот пример использует различные встроенные математические функции.

PROGRAM MathFunctionsExample
VAR
    angle_rad : REAL := 1.5708;    // ~90 градусов
    number : REAL := 2.718;
    result_sin : REAL;
    result_cos : REAL;
    result_ln : REAL;
    result_exp : REAL;
    result_limit : REAL;
    result_abs : REAL;
    result_sqrt : REAL;
END_VAR

    result_sin := SIN(angle_rad);     // Синус ~1.0
    result_cos := COS(0.0);           // Косинус = 1.0
    result_ln := LN(number);          // Натуральный логарифм ~1.0
    result_exp := EXP(1.0);           // Экспонента ~2.718
    result_limit := LIMIT(0, 15, 10); // result_limit = 10
    result_abs := ABS(-5.5);          // result_abs = 5.5
    result_sqrt := SQRT(25.0);        // result_sqrt = 5.0

END_PROGRAM
        

Пример: Использование таймера TON

Этот пример показывает использование таймера включения TON.

PROGRAM TimerTONExample
VAR
    ton1 : TON;
    start_button : BOOL;
    motor_output : BOOL;
    elapsed_time : TIME;
END_VAR

    // Задержка включения 5 секунд
    ton1(IN := start_button, PT := T#5s);
    motor_output := ton1.Q;
    elapsed_time := ton1.ET;

    // Включение мотора через 5 секунд после нажатия
    IF motor_output THEN
        // Мотор включен
    ELSE
        // Мотор выключен, ожидаем 5 секунд
    END_IF;

END_PROGRAM
        

Пример: Использование счетчика CTU

Этот пример показывает использование инкрементного счетчика CTU.

PROGRAM CounterCTUExample
VAR
    ctu1 : CTU;
    pulse_input : BOOL;
    reset_button : BOOL;
    count_value : WORD;
    target_reached : BOOL;
END_VAR

    // Счет до 10
    ctu1(CU := pulse_input, RESET := reset_button, PV := 10);
    count_value := ctu1.CV;
    target_reached := ctu1.Q;

    IF target_reached THEN
        // Счет достиг 10
    END_IF;

END_PROGRAM
        

Пример: Использование детектора фронта R_TRIG

Этот пример показывает использование детектора переднего фронта R_TRIG.

PROGRAM EdgeTriggerExample
VAR
    r_trig1 : R_TRIG;
    sensor_input : BOOL;
    event_counter : INT := 0;
END_VAR

    r_trig1(CLK := sensor_input);

    IF r_trig1.Q THEN
        event_counter := event_counter + 1; // Счетчик событий
    END_IF;

END_PROGRAM
        

Пример: Использование триггера SR

Этот пример показывает использование триггера с доминантой SET.

PROGRAM SRExample
VAR
    sr1 : SR;
    start_button : BOOL;
    stop_button : BOOL;
    output_state : BOOL;
END_VAR

    sr1(SET := start_button, RESET := stop_button);
    output_state := sr1.Q;

    // Выход включается по start_button
    // Выключается по stop_button (только если start_button = FALSE)

END_PROGRAM
        

Пример: Комбинированное использование PROGRAM и FUNCTION_BLOCK

Этот пример показывает, как PROGRAM может использовать FUNCTION_BLOCK.

PROGRAM MainProgram
VAR
    pid1 : PIDController;         // Экземпляр FUNCTION_BLOCK
    setpoint : REAL := 100.0;
    actual : REAL := 95.0;
    control_output : REAL;
    integral_part : REAL;
END_VAR

    // Вызов FUNCTION_BLOCK
    pid1(setpoint := setpoint,
         process_value := actual,
         kp := 1.5,
         ki := 0.1,
         kd := 0.05);

    control_output := pid1.output;
    integral_part := pid1.integral_part;

END_PROGRAM

FUNCTION_BLOCK PIDController
VAR_INPUT
    setpoint : REAL;
    process_value : REAL;
    kp : REAL := 1.0;
    ki : REAL := 0.1;
    kd : REAL := 0.05;
END_VAR
VAR_OUTPUT
    output : REAL;
    integral_part : REAL;
END_VAR
VAR
    previous_error : REAL := 0.0;
    integral : REAL := 0.0;
END_VAR
VAR_TEMP
    error : REAL;
END_VAR

    error := setpoint - process_value;
    integral := integral + error;
    output := kp * error + ki * integral;
    integral_part := integral;
    previous_error := error;

END_FUNCTION_BLOCK
        

Пример: Использование FUNCTION с несколькими выходными параметрами

Этот пример показывает функцию, возвращающую несколько значений через VAR_OUTPUT.

PROGRAM FunctionWithOutputs
VAR
    success : BOOL;
    avg : REAL;
    max : REAL;
    min : REAL;
END_VAR

    success := CalculateStatistics(value1 := 10.0,
                                   value2 := 20.0,
                                   value3 := 15.0,
                                   average := avg,
                                   max_value := max,
                                   min_value := min);

END_PROGRAM

FUNCTION CalculateStatistics : BOOL
VAR_INPUT
    value1 : REAL;
    value2 : REAL;
    value3 : REAL;
END_VAR
VAR_OUTPUT
    average : REAL;
    max_value : REAL;
    min_value : REAL;
END_VAR
VAR_TEMP
    sum : REAL;
END_VAR

    sum := value1 + value2 + value3;
    average := sum / 3.0;

    max_value := value1;
    IF value2 > max_value THEN max_value := value2; END_IF;
    IF value3 > max_value THEN max_value := value3; END_IF;

    min_value := value1;
    IF value2 < min_value THEN min_value := value2; END_IF;
    IF value3 < min_value THEN min_value := value3; END_IF;

    CalculateStatistics := TRUE;

END_FUNCTION
        

Пример: Комбинированное использование таймеров, счетчиков и детекторов фронтов

Этот пример показывает совместное использование различных функциональных блоков.

PROGRAM CombinedExample
VAR
    // Таймер для генерации импульсов
    tp1 : TP;
    pulse_trigger : BOOL;
    pulse_output : BOOL;

    // Счетчик для подсчета импульсов
    ctu1 : CTU;
    count_value : WORD;
    target_reached : BOOL;

    // Детектор фронта для обработки достижения цели
    r_trig1 : R_TRIG;

    // Триггер для запоминания состояния
    rs1 : RS;
    reset_signal : BOOL;
    output_state : BOOL;
END_VAR

    // Генерация импульса длительностью 2 секунды
    tp1(IN := pulse_trigger, PT := T#2s);
    pulse_output := tp1.Q;

    // Подсчет импульсов
    ctu1(CU := pulse_output, RESET := reset_signal, PV := 5);
    count_value := ctu1.CV;
    target_reached := ctu1.Q;

    // Обработка достижения цели
    r_trig1(CLK := target_reached);

    // Запоминание события
    rs1(SET := r_trig1.Q, RESET := reset_signal);
    output_state := rs1.Q;

END_PROGRAM
        

Пример: Адресация переменных устройства

Этот пример показывает, как объявлять и использовать переменные, привязанные к аппаратным портам устройства.

PROGRAM DeviceAccessExample
VAR
    portin1 AT %DIN1 : BOOL;   // Прямой доступ к цифровому входу 1
    portin2 AT %DIN2 : BOOL;   // Прямой доступ к цифровому входу 2
    portout AT %DOUT1 : BOOL;  // Прямой доступ к цифровому выходу 1
    counter : INT := 0;
END_VAR

    // Логика: включить выход, если оба входа активны
    portout := portin1 AND portin2;

    // Счетчик срабатываний
    IF portin1 AND NOT portin2 THEN
        counter := counter + 1;
    END_IF;

END_PROGRAM
        

См. также