*************** Сложные примеры *************** .. contents:: Содержание: :depth: 2 Пример: Комбинированные выражения и побитовые операции ====================================================== Этот пример демонстрирует сложные арифметические и логические выражения, включая побитовые сдвиги (``SHL``, ``SHR``). .. code-table:: 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 ================================= Этот пример показывает использование всех типов циклов. .. code-table:: 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 Пример: Использование встроенных математических функций ======================================================= Этот пример использует различные встроенные математические функции. .. code-table:: 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. .. code-table:: 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. .. code-table:: 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. .. code-table:: 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. .. code-table:: 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. .. code-table:: 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. .. code-table:: 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 Пример: Комбинированное использование таймеров, счетчиков и детекторов фронтов ============================================================================== Этот пример показывает совместное использование различных функциональных блоков. .. code-table:: 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 Пример: Адресация переменных устройства ======================================= Этот пример показывает, как объявлять и использовать переменные, привязанные к аппаратным портам устройства. .. code-table:: 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 .. seealso:: * :doc:`simple_examples` - для простых примеров. * :doc:`operators` - для изучения операторов. * :doc:`math` - для изучения математических функций. * :doc:`conversion` - для изучения функций преобразования. * :doc:`timers` - для изучения таймеров. * :doc:`counters` - для изучения счетчиков. * :doc:`edge_detection` - для изучения детекторов фронтов. * :doc:`flip_flops` - для изучения триггеров.