Сложные примеры
Пример: Комбинированные выражения и побитовые операции
Этот пример демонстрирует сложные арифметические и логические выражения, включая побитовые сдвиги (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
|
См. также
Простые примеры - для простых примеров.
Операторы языка ST - для изучения операторов.
Математические функции - для изучения математических функций.
Функции преобразования типов - для изучения функций преобразования.
Таймеры - для изучения таймеров.
Счетчики - для изучения счетчиков.
Обнаружение фронтов - для изучения детекторов фронтов.
Триггеры - для изучения триггеров.