Обновлены вспомогательные файлы и скрипты
This commit is contained in:
@@ -0,0 +1,668 @@
|
||||
# PLC_Library — API Reference (для использования LLM/ИИ)
|
||||
|
||||
> Формат: справочник интерфейсов (аналог API-документации). Для каждого POU указаны: тип, путь в дереве проекта, входы/выходы с типами, значениями по умолчанию и назначением, а также краткое описание поведения и особые примечания. Тела реализации (код) намеренно не включены — только то, что нужно, чтобы **вызвать** блок правильно.
|
||||
>
|
||||
> Язык: CoDeSys 3.5, Structured Text (ST).
|
||||
> Скармливайте этот файл ИИ вместо исходников — этого достаточно, чтобы сгенерировать корректные вызовы блоков библиотеки.
|
||||
|
||||
---
|
||||
|
||||
## Индекс
|
||||
|
||||
- [Filters — Фильтры](#filters--фильтры)
|
||||
- [Fastwel — Модули ввода/вывода](#fastwel--модули-вводавывода)
|
||||
- [Преобразование значений](#преобразование-значений)
|
||||
- [Общие — Common](#общие--common)
|
||||
- [Дискретные сигналы / кнопки / таймеры](#дискретные-сигналы--кнопки--таймеры)
|
||||
- [Пороговые сигналы / гистерезис](#пороговые-сигналы--гистерезис)
|
||||
- [Статус аналоговых сигналов](#статус-аналоговых-сигналов)
|
||||
- [Диагностика связи](#диагностика-связи)
|
||||
- [Регулирование](#регулирование)
|
||||
- [Структуры данных (очереди/стеки)](#структуры-данных-очередистеки)
|
||||
- [Иное](#иное)
|
||||
- [Structs](#structs)
|
||||
- [Общие правила / соглашения библиотеки](#общие-правила--соглашения-библиотеки)
|
||||
|
||||
---
|
||||
|
||||
## Filters — Фильтры
|
||||
`Path: Filters`
|
||||
|
||||
### ExpRunAverage — FUNCTION : REAL
|
||||
Экспоненциальное скользящее среднее с постоянным коэффициентом.
|
||||
|
||||
```
|
||||
FUNCTION ExpRunAverage : REAL
|
||||
VAR_INPUT
|
||||
In : REAL; // входное значение
|
||||
Old : REAL; // предыдущее значение EMA (нужно хранить самому вызывающему)
|
||||
K : REAL; // коэффициент сглаживания [0..1], чем больше — тем быстрее реакция
|
||||
END_VAR
|
||||
```
|
||||
Формула: `Out := (1-K)*Old + K*In`. Без внутреннего состояния — вызывающий код сам хранит `Old` между циклами.
|
||||
|
||||
### ExpRunAverageAdaptive — FUNCTION : REAL
|
||||
Как `ExpRunAverage`, но коэффициент переключается на увеличенный `K2`, если скачок входа больше `Delta` (быстрая реакция на резкие изменения).
|
||||
|
||||
```
|
||||
FUNCTION ExpRunAverageAdaptive : REAL
|
||||
VAR_INPUT
|
||||
In : REAL;
|
||||
Old : REAL;
|
||||
K1 : REAL; // обычный коэффициент
|
||||
Delta : REAL; // порог |In-Old| для переключения на K2
|
||||
K2 : REAL; // ускоренный коэффициент (обычно K2 > K1)
|
||||
END_VAR
|
||||
```
|
||||
|
||||
### RunMiddleArifm — FUNCTION_BLOCK
|
||||
Скользящее среднее арифметическое по кольцевому буферу (собственное состояние, хранит буфер сам).
|
||||
|
||||
```
|
||||
FUNCTION_BLOCK RunMiddleArifm
|
||||
VAR_INPUT
|
||||
In : REAL; // входное значение
|
||||
N : INT := 32; // размер окна усреднения, диапазон 0..32
|
||||
RST : BOOL; // TRUE => переинициализация буфера текущим In
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Y : REAL; // результат — скользящее среднее
|
||||
END_VAR
|
||||
```
|
||||
Особенность: при `RST` или на первом скане буфер заполняется значением `In`, а `Y := In`.
|
||||
|
||||
### MultipleClick — FUNCTION_BLOCK
|
||||
Детектор серии кликов кнопки (одиночный/двойной/тройной).
|
||||
|
||||
```
|
||||
FUNCTION_BLOCK MultipleClick
|
||||
VAR_INPUT
|
||||
In : BOOL; // сигнал кнопки
|
||||
TimeToWait : TIME := T#500MS; // макс. пауза между нажатиями, после — фиксация результата
|
||||
TimeRelease : TIME := T#0S; // время удержания результата на выходах
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Click1 : BOOL; // TRUE — зафиксирован 1 клик
|
||||
Click2 : BOOL; // TRUE — зафиксировано 2 клика
|
||||
Click3 : BOOL; // TRUE — зафиксировано 3 клика
|
||||
Click : WORD; // число нажатий (0, если результат уже "отпущен")
|
||||
END_VAR
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Fastwel — Модули ввода/вывода
|
||||
`Path: Fastwel`
|
||||
Преобразование "сырых" значений АЦП/кодов модулей Fastwel в физические единицы и обратно.
|
||||
|
||||
### AIM721_AI — FUNCTION : REAL
|
||||
```
|
||||
FUNCTION AIM721_AI : REAL
|
||||
VAR_INPUT
|
||||
ADC : DINT; // код АЦП
|
||||
END_VAR
|
||||
```
|
||||
АЦП → 0…20 мА (коэффициент модуля AIM721).
|
||||
|
||||
### AIM722_AI — FUNCTION : REAL
|
||||
```
|
||||
FUNCTION AIM722_AI : REAL
|
||||
VAR_INPUT
|
||||
ADC : DINT;
|
||||
END_VAR
|
||||
```
|
||||
АЦП → 0…20 мА (коэффициент модуля AIM722, отличается от AIM721).
|
||||
|
||||
### AIM723_AI — FUNCTION : REAL
|
||||
```
|
||||
FUNCTION AIM723_AI : REAL
|
||||
VAR_INPUT
|
||||
ADC : DINT;
|
||||
END_VAR
|
||||
```
|
||||
АЦП → 4…20 мА.
|
||||
|
||||
### AIM726_AI — FUNCTION : REAL
|
||||
```
|
||||
FUNCTION AIM726_AI : REAL
|
||||
VAR_INPUT
|
||||
ADC : DWORD; // код АЦП (DWORD!)
|
||||
END_VAR
|
||||
```
|
||||
АЦП → 0…40 В.
|
||||
|
||||
### AIM727_AI — FUNCTION : REAL
|
||||
```
|
||||
FUNCTION AIM727_AI : REAL
|
||||
VAR_INPUT
|
||||
ADC : DINT; // код АЦП (DINT — отличие от AIM726)
|
||||
END_VAR
|
||||
```
|
||||
АЦП → 0…40 В.
|
||||
|
||||
### AIM791_AI — FUNCTION : REAL
|
||||
```
|
||||
FUNCTION AIM791_AI : REAL
|
||||
VAR_INPUT
|
||||
ADC : WORD;
|
||||
RANGE : BYTE := 0; // 0=0..5мА; 1=0..20мА; 2=4..20мА
|
||||
END_VAR
|
||||
```
|
||||
Универсальный вход, диапазон выбирается `RANGE`. Значение по умолчанию `RANGE` вне 0/1/2 → возвращает `0.0`.
|
||||
|
||||
### AIM730_AO — FUNCTION : WORD
|
||||
```
|
||||
FUNCTION AIM730_AO : WORD
|
||||
VAR_INPUT
|
||||
DAC : REAL; // миллиамперы
|
||||
RANGE : BYTE; // 0=0..20мА; 1=4..20мА
|
||||
END_VAR
|
||||
```
|
||||
мА → код ЦАП. При `RANGE=1` и `DAC<4` принудительно возвращает код, соответствующий 4 мА.
|
||||
|
||||
### AIM731_AO — FUNCTION : WORD
|
||||
```
|
||||
FUNCTION AIM731_AO : WORD
|
||||
VAR_INPUT
|
||||
DAC : REAL; // вольты
|
||||
RANGE : BYTE; // 0 = -10..+10В; 1 = 0..+10В
|
||||
END_VAR
|
||||
```
|
||||
Вольты → код ЦАП модуля AIM731.
|
||||
|
||||
### DIM764_DI — FUNCTION : REAL
|
||||
```
|
||||
FUNCTION DIM764_DI : REAL
|
||||
VAR_INPUT
|
||||
IN : DWORD; // период/интервал от модуля, единицы АЦП
|
||||
RANGE : BYTE; // 0=Period; 1=Interval
|
||||
END_VAR
|
||||
```
|
||||
Возвращает частоту в Гц. При `IN=0` и `RANGE=0` — возвращает 0 (защита от деления на 0).
|
||||
|
||||
### AIM725_Status — FUNCTION_BLOCK
|
||||
Формирование статуса аналогового канала с гистерезисом/задержками + диагностика по битам статуса модуля.
|
||||
|
||||
```
|
||||
FUNCTION_BLOCK AIM725_Status
|
||||
VAR_INPUT
|
||||
Input : REAL; // контролируемое значение
|
||||
fail_hi : REAL := 3.402823466E+38;
|
||||
delta_fail_hi : REAL := 0;
|
||||
time_fail_hi : TIME := T#0S;
|
||||
warn_hi : REAL := 3.402823466E+38;
|
||||
delta_warn_hi : REAL := 0;
|
||||
time_warn_hi : TIME := T#0S;
|
||||
warn_low : REAL := -3.402823466E+38;
|
||||
delta_warn_low : REAL := 0;
|
||||
time_warn_low : TIME := T#0S;
|
||||
fail_low : REAL := -3.402823466E+38;
|
||||
delta_fail_low : REAL := 0;
|
||||
time_fail_low : TIME := T#0S;
|
||||
time_no_signal : TIME := T#0S;
|
||||
Modul_status : BYTE; // байт диагностики модуля АЦП (побитовые флаги ошибок канала)
|
||||
Chanel_num : BYTE; // номер канала модуля (1 или 2) — выбирает, какие биты Modul_status проверять
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Status : AnalogValueState; // итоговый статус (см. раздел Structs)
|
||||
T_mod : INT; // Input, приведённое к INT; -500 при no_signal
|
||||
END_VAR
|
||||
```
|
||||
Приоритет статусов: `no_signal > fail_hi > fail_low > warn_hi > warn_low > normal`.
|
||||
`no_signal` срабатывает если: `Input <= -200`, либо соответствующие биты `Modul_status` (зависящие от `Chanel_num`), либо биты 2/3 (общие ошибки модуля).
|
||||
|
||||
---
|
||||
|
||||
## Преобразование значений
|
||||
`Path: Преобразование значений`
|
||||
|
||||
### DW_TO_REAL — FUNCTION : REAL
|
||||
```
|
||||
FUNCTION DW_TO_REAL : REAL
|
||||
VAR_INPUT
|
||||
X : DWORD;
|
||||
END_VAR
|
||||
```
|
||||
**Побитовая** реинтерпретация DWORD как REAL через указатель (`ADR`) — НЕ конвертация значения. Платформозависимо.
|
||||
|
||||
### REAL_TO_DW — FUNCTION : DWORD
|
||||
```
|
||||
FUNCTION REAL_TO_DW : DWORD
|
||||
VAR_INPUT
|
||||
X : REAL;
|
||||
END_VAR
|
||||
```
|
||||
Обратная операция к `DW_TO_REAL`. Побитовая реинтерпретация.
|
||||
|
||||
### DWORD_OF_2WORD — FUNCTION : DWORD
|
||||
```
|
||||
FUNCTION DWORD_OF_2WORD : DWORD
|
||||
VAR_INPUT
|
||||
W1 : WORD; // старшее слово, биты 16..31 результата
|
||||
W0 : WORD; // младшее слово, биты 0..15 результата
|
||||
END_VAR
|
||||
```
|
||||
|
||||
### WORD_OF_DWORD — FUNCTION : WORD
|
||||
```
|
||||
FUNCTION WORD_OF_DWORD : WORD
|
||||
VAR_INPUT
|
||||
in : DWORD; // исходное значение
|
||||
N : BYTE; // 0 = младшее слово (биты 0..15), 1 = старшее (биты 16..31)
|
||||
END_VAR
|
||||
```
|
||||
|
||||
### Norm_real — FUNCTION : REAL
|
||||
Линейная нормировка (масштабирование по двум опорным точкам).
|
||||
```
|
||||
FUNCTION Norm_real : REAL
|
||||
VAR_INPUT
|
||||
X : REAL; // входное (ненормированное) значение
|
||||
X1 : REAL; // точка 1, вход
|
||||
Y1 : REAL; // точка 1, выход
|
||||
X2 : REAL; // точка 2, вход
|
||||
Y2 : REAL; // точка 2, выход
|
||||
END_VAR
|
||||
```
|
||||
Если `X2=X1` — возвращает `Y1` (защита от деления на 0).
|
||||
|
||||
### NTC_termistor_T — FUNCTION : REAL
|
||||
Перевод сопротивления NTC-термистора в температуру (уравнение Beta).
|
||||
```
|
||||
FUNCTION NTC_termistor_T : REAL
|
||||
VAR_INPUT
|
||||
Res : REAL; // измеренное сопротивление
|
||||
R0 : REAL; // сопротивление при температуре T0
|
||||
T0 : REAL; // опорная температура, °C
|
||||
b : REAL; // коэффициент Beta термистора
|
||||
END_VAR
|
||||
```
|
||||
Возвращает температуру в °C. При `Res<=0`, `R0<=0` или `b=0` возвращает `0.0`.
|
||||
|
||||
---
|
||||
|
||||
## Общие — Common
|
||||
`Path: Общие`
|
||||
|
||||
### Дискретные сигналы / кнопки / таймеры
|
||||
|
||||
#### Button_acceleration — FUNCTION_BLOCK
|
||||
Ускоренное изменение значения при удержании кнопки (для регулировки уставок и т.п.).
|
||||
```
|
||||
FUNCTION_BLOCK Button_acceleration
|
||||
VAR_INPUT
|
||||
Button : BOOL;
|
||||
D_0 : REAL := 0; // приращение при одиночном (коротком) нажатии
|
||||
T_W_1 : TIME := T#0S; // время до начала "короткого удержания"
|
||||
T_D_1 : TIME := T#200MS; // шаг приращения при коротком удержании
|
||||
D_1 : REAL := 0; // величина приращения на шаге T_D_1
|
||||
T_W_2 : TIME := T#0S; // время до начала "длинного удержания"
|
||||
T_D_2 : TIME := T#200MS; // шаг приращения при длинном удержании
|
||||
D_2 : REAL := 0; // величина приращения на шаге T_D_2
|
||||
Zeroes : BOOL := FALSE; // если TRUE — обнулять Out, когда |Out| < |D_0|
|
||||
END_VAR
|
||||
VAR_IN_OUT
|
||||
Out : REAL; // изменяемое значение (передаётся и изменяется по ссылке!)
|
||||
END_VAR
|
||||
```
|
||||
⚠️ Нет `VAR_OUTPUT` — результат только через `VAR_IN_OUT Out`.
|
||||
|
||||
#### Pulse_Switch — FUNCTION_BLOCK
|
||||
```
|
||||
FUNCTION_BLOCK Pulse_Switch
|
||||
VAR_INPUT
|
||||
Switch_ctrl : BOOL;
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Switch_on : BOOL; // импульс 500мс при фронте 0->1
|
||||
Switch_off : BOOL; // импульс 500мс при фронте 1->0
|
||||
END_VAR
|
||||
```
|
||||
|
||||
#### TONOF — FUNCTION_BLOCK
|
||||
Комбинированная задержка включения (TON) + выключения (TOF) для одного сигнала.
|
||||
```
|
||||
FUNCTION_BLOCK TONOF
|
||||
VAR_INPUT
|
||||
IN : BOOL;
|
||||
T_ON : TIME := T#0S; // задержка появления TRUE на Q
|
||||
T_OFF : TIME := T#0S; // задержка снятия TRUE с Q
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Q : BOOL;
|
||||
END_VAR
|
||||
```
|
||||
|
||||
#### TOF_RST — FUNCTION_BLOCK
|
||||
Таймер выключения (TOF) с принудительным сбросом.
|
||||
```
|
||||
FUNCTION_BLOCK TOF_RST
|
||||
VAR_INPUT
|
||||
IN : BOOL;
|
||||
PT : TIME; // задержка выключения
|
||||
RST : BOOL; // немедленный сброс Q и таймера, приоритет над IN
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Q : BOOL;
|
||||
ET : TIME; // текущее время таймера
|
||||
END_VAR
|
||||
```
|
||||
|
||||
#### TP_RST — FUNCTION_BLOCK
|
||||
Одиночный импульс (TP) с принудительным сбросом.
|
||||
```
|
||||
FUNCTION_BLOCK TP_RST
|
||||
VAR_INPUT
|
||||
IN : BOOL; // фронт 0->1 запускает импульс (повторный фронт во время импульса игнорируется)
|
||||
PT : TIME; // длительность импульса
|
||||
RST : BOOL; // немедленно прерывает импульс
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Q : BOOL;
|
||||
ET : TIME;
|
||||
END_VAR
|
||||
```
|
||||
|
||||
#### BLINK_LMP — FUNCTION_BLOCK
|
||||
Управление лампой по коду состояния.
|
||||
```
|
||||
FUNCTION_BLOCK BLINK_LMP
|
||||
VAR_INPUT
|
||||
State : WORD := 0; // 0=выкл; 1=вкл; 2/3/4=мигание с частотой 1/2/3
|
||||
Inp_BL_1 : BOOL := FALSE; // внешний "пульсар" (меандр) частоты 1
|
||||
Inp_BL_2 : BOOL := FALSE; // частоты 2
|
||||
Inp_BL_3 : BOOL := FALSE; // частоты 3
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
LMP : BOOL;
|
||||
END_VAR
|
||||
```
|
||||
|
||||
#### BUZZER_CTRL — FUNCTION_BLOCK
|
||||
Управление звонком/зуммером по коду состояния с отключением звука (временным и перманентным).
|
||||
```
|
||||
FUNCTION_BLOCK BUZZER_CTRL
|
||||
VAR_INPUT
|
||||
State : WORD := 0; // 0=выкл;1=вкл;2/3/4=мигание частота1/2/3
|
||||
Sound_off : BOOL; // кнопка отключения звука
|
||||
Inp_BL_1 : BOOL := FALSE; // пульсар частоты 1
|
||||
Inp_BL_2 : BOOL := FALSE; // пульсар частоты 2
|
||||
Inp_BL_3 : BOOL := FALSE; // пульсар частоты 3
|
||||
PermanentOFF_Enable : BOOL := FALSE; // разрешить перманентное отключение звука
|
||||
T_PermanentOFF : TIME := T#10S; // время удержания Sound_off для перманентного откл.
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
BUZZER : BOOL;
|
||||
END_VAR
|
||||
```
|
||||
|
||||
#### CONFIRMATION — FUNCTION_BLOCK
|
||||
Логика квитирования аварии (лампы + звонок).
|
||||
```
|
||||
FUNCTION_BLOCK CONFIRMATION
|
||||
VAR_INPUT
|
||||
Alarm : BOOL; // авария активна
|
||||
ControlState_On : BOOL; // управление ведётся с данного поста
|
||||
Sound_Off : BOOL; // сигнал снятия звука
|
||||
Confirmation : BOOL; // сигнал квитирования
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Lamp_Alarm_C : WORD; // код для лампы аварии (0/1/2)
|
||||
Lamp_Confirmation_C : WORD; // код для лампы квитирования (0/1)
|
||||
Buzzer_C : WORD; // код для зуммера (0/2)
|
||||
END_VAR
|
||||
```
|
||||
Коды ламп совместимы с входом `State`/`Inp_BL_*` блоков `BLINK_LMP`/`BUZZER_CTRL` (2 = "мигание частота 1").
|
||||
|
||||
### Пороговые сигналы / гистерезис
|
||||
|
||||
#### HYST — FUNCTION_BLOCK
|
||||
Гистерезисный компаратор с раздельными порогами включения/выключения (прямая и обратная логика).
|
||||
```
|
||||
FUNCTION_BLOCK HYST
|
||||
VAR_INPUT
|
||||
In : REAL; // контролируемое значение
|
||||
ON : REAL; // порог срабатывания
|
||||
OFF : REAL; // порог возврата
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Q : BOOL; // состояние компаратора
|
||||
win : BOOL; // TRUE — значение внутри зоны гистерезиса (неопределённая зона)
|
||||
END_VAR
|
||||
```
|
||||
Если `ON >= OFF` — прямая логика (растущий сигнал включает); если `ON < OFF` — обратная (падающий сигнал включает).
|
||||
|
||||
#### ALARM_1 — FUNCTION_BLOCK
|
||||
Контроль выхода `X` за диапазон `[LO_1..HI_1]` с гистерезисом.
|
||||
```
|
||||
FUNCTION_BLOCK ALARM_1
|
||||
VAR_INPUT
|
||||
X : REAL;
|
||||
LO_1 : REAL;
|
||||
HI_1 : REAL;
|
||||
HYS : REAL; // полный гистерезис (берётся ±HYS/2 от границы)
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Q1_LO : BOOL; // X ниже LO_1
|
||||
Q1_HI : BOOL; // X выше HI_1
|
||||
END_VAR
|
||||
```
|
||||
|
||||
#### ALARM_2 — FUNCTION_BLOCK
|
||||
То же, для двух независимых диапазонов одновременно.
|
||||
```
|
||||
FUNCTION_BLOCK ALARM_2
|
||||
VAR_INPUT
|
||||
X : REAL;
|
||||
LO_1, HI_1 : REAL;
|
||||
LO_2, HI_2 : REAL;
|
||||
HYS : REAL;
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Q1_LO, Q1_HI : BOOL;
|
||||
Q2_LO, Q2_HI : BOOL;
|
||||
END_VAR
|
||||
```
|
||||
|
||||
#### ALARM_3 — FUNCTION_BLOCK
|
||||
То же, для трёх диапазонов одновременно.
|
||||
```
|
||||
FUNCTION_BLOCK ALARM_3
|
||||
VAR_INPUT
|
||||
X : REAL;
|
||||
LO_1, HI_1 : REAL;
|
||||
LO_2, HI_2 : REAL;
|
||||
LO_3, HI_3 : REAL;
|
||||
HYS : REAL;
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Q1_LO, Q1_HI : BOOL;
|
||||
Q2_LO, Q2_HI : BOOL;
|
||||
Q3_LO, Q3_HI : BOOL;
|
||||
END_VAR
|
||||
```
|
||||
|
||||
### Статус аналоговых сигналов
|
||||
|
||||
#### STATUS_ANALOG_M — FUNCTION_BLOCK
|
||||
Статус аналогового значения REAL с гистерезисом возврата и задержками срабатывания по каждому уровню; поддерживает принудительную установку статуса извне.
|
||||
```
|
||||
FUNCTION_BLOCK STATUS_ANALOG_M
|
||||
VAR_INPUT
|
||||
Input : REAL;
|
||||
fail_hi : REAL := 3.402823466E+38;
|
||||
delta_fail_hi : REAL := 0;
|
||||
time_fail_hi : TIME := T#0S;
|
||||
warn_hi : REAL := 3.402823466E+38;
|
||||
delta_warn_hi : REAL := 0;
|
||||
time_warn_hi : TIME := T#0S;
|
||||
warn_low : REAL := -3.402823466E+38;
|
||||
delta_warn_low : REAL := 0;
|
||||
time_warn_low : TIME := T#0S;
|
||||
fail_low : REAL := -3.402823466E+38;
|
||||
delta_fail_low : REAL := 0;
|
||||
time_fail_low : TIME := T#0S;
|
||||
no_signal : REAL := -3.402823466E+38;
|
||||
delta_no_signal : REAL := 0;
|
||||
time_no_signal : TIME := T#0S;
|
||||
In_fail_hi : BOOL := FALSE; // принудительно выставить статус fail_hi
|
||||
In_warn_hi : BOOL := FALSE;
|
||||
In_warn_low : BOOL := FALSE;
|
||||
In_fail_low : BOOL := FALSE;
|
||||
In_no_signal : BOOL := FALSE;
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Status : AnalogValueState;
|
||||
END_VAR
|
||||
```
|
||||
Приоритет: `no_signal > fail_hi > fail_low > warn_hi > warn_low > normal`. Возврат из состояния — при пересечении порога `± delta_*`, срабатывание — с задержкой `time_*` (TON).
|
||||
|
||||
#### STATUS_ANALOG_M_I — FUNCTION_BLOCK
|
||||
Полный аналог `STATUS_ANALOG_M`, но все пороги/входное значение типа **INT**, а не REAL. Сигнатура идентична по составу переменных (см. выше), только типы `Input`, `fail_hi`, `delta_fail_hi`, `warn_hi`, `delta_warn_hi`, `warn_low`, `delta_warn_low`, `fail_low`, `delta_fail_low`, `no_signal`, `delta_no_signal` — `INT` (диапазон по умолчанию ±32767/-32768).
|
||||
|
||||
### Диагностика связи
|
||||
|
||||
#### Status_SU_Connect — FUNCTION_BLOCK
|
||||
Контроль связи по "сердцебиению" (сигнал должен периодически менять состояние).
|
||||
```
|
||||
FUNCTION_BLOCK Status_SU_Connect
|
||||
VAR_INPUT
|
||||
HeartBit : BOOL; // меняющийся сигнал от удалённого устройства
|
||||
T_Pulse : TIME; // макс. допустимая длительность одного состояния HeartBit
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
ERROR_CONNECT : BOOL; // TRUE — HeartBit не менялся дольше T_Pulse
|
||||
END_VAR
|
||||
```
|
||||
|
||||
#### Status_Connect_Counter — FUNCTION_BLOCK
|
||||
Контроль связи по инкрементируемому счётчику от удалённого устройства.
|
||||
```
|
||||
FUNCTION_BLOCK Status_Connect_Counter
|
||||
VAR_INPUT
|
||||
Counter : WORD; // счётчик, инкрементируемый удалённым устройством
|
||||
T_Error : TIME; // время без изменений счётчика для фиксации обрыва связи
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
CounterIsChanged : BOOL; // TRUE в цикле, где счётчик изменился
|
||||
ERROR_CONNECT : BOOL; // TRUE — счётчик не менялся дольше T_Error
|
||||
END_VAR
|
||||
```
|
||||
|
||||
### Регулирование
|
||||
|
||||
#### PIDcontrol — FUNCTION_BLOCK
|
||||
ПИД-регулятор с фильтрацией D-составляющей, зоной нечувствительности, антивиндапом и ручным режимом.
|
||||
```
|
||||
FUNCTION_BLOCK PIDcontrol
|
||||
VAR_INPUT
|
||||
ProcessVariable : REAL := 0.0; // измеренное значение (обратная связь)
|
||||
Setpoint : REAL := 0.0; // уставка
|
||||
Kp : REAL := 0.001; // пропорциональный коэффициент
|
||||
Ki : REAL := 0.001; // интегральный коэффициент
|
||||
Kd : REAL := 0.0; // дифференциальный коэффициент
|
||||
Kdf : REAL := 1.0; // коэффициент фильтра D-части (1/Tdf)
|
||||
DBmax : REAL := 0.01; // верхняя граница зоны нечувствительности (по ошибке)
|
||||
DBmin : REAL := -0.01; // нижняя граница зоны нечувствительности
|
||||
OutMax : REAL := 100.0; // верхний предел выхода
|
||||
OutMin : REAL := 0.0; // нижний предел выхода
|
||||
Ts : REAL := 0.1; // период дискретизации, с
|
||||
Manual : REAL := 25.0; // значение выхода в ручном режиме
|
||||
ManOn : BOOL := FALSE; // TRUE — ручной режим
|
||||
Reset : BOOL := FALSE; // сброс интегратора и D-части
|
||||
AntiWindup : BOOL := TRUE; // включить компенсацию накопления интегратора
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Out : REAL := 0.0; // выходной сигнал регулятора
|
||||
Err : REAL := 0.0; // текущая ошибка регулирования (Setpoint-ProcessVariable)
|
||||
OutLimited : BOOL := FALSE; // TRUE — выход ограничен (насыщение) или некорректны параметры
|
||||
END_VAR
|
||||
```
|
||||
Если `OutMin>=OutMax`, `DBmin>=DBmax` или `Ts<=0` — блок сразу выставляет `Out:=0`, `OutLimited:=TRUE` и выходит.
|
||||
|
||||
### Структуры данных (очереди/стеки)
|
||||
|
||||
Общая сигнатура для всех 4 блоков (`QUEUE_I16`, `QUEUE_I32`, `STACK_I16`, `STACK_I32`) — идентична, отличаются только ёмкость и дисциплина (FIFO/LIFO):
|
||||
|
||||
```
|
||||
FUNCTION_BLOCK <Имя>
|
||||
VAR_INPUT
|
||||
Din : INT; // значение для записи
|
||||
E : BOOL := TRUE; // включение блока (при FALSE — операции не выполняются)
|
||||
POP : BOOL; // извлечь элемент
|
||||
PUSH: BOOL; // добавить элемент
|
||||
RST : BOOL; // сброс (очистка)
|
||||
END_VAR
|
||||
VAR_OUTPUT
|
||||
Dout : INT; // извлечённое значение (при POP)
|
||||
EMPTY : BOOL := TRUE; // TRUE — пусто
|
||||
FULL : BOOL; // TRUE — заполнено (достигнут предел)
|
||||
END_VAR
|
||||
```
|
||||
|
||||
| Имя | Дисциплина | Ёмкость |
|
||||
|---|---|---|
|
||||
| `QUEUE_I16` | FIFO (очередь) | 16 элементов INT |
|
||||
| `QUEUE_I32` | FIFO (очередь) | 32 элемента INT |
|
||||
| `STACK_I16` | LIFO (стек) | 16 элементов INT |
|
||||
| `STACK_I32` | LIFO (стек) | 32 элемента INT |
|
||||
|
||||
Примечание: при одновременном `PUSH` и `POP` в одном скане — оба выполняются (POP обрабатывается первым в теле, затем PUSH).
|
||||
|
||||
---
|
||||
|
||||
## Иное
|
||||
`Path: Иное`
|
||||
|
||||
### DFS — PROGRAM
|
||||
Обход графа в глубину (Depth-First Search) по матрице смежности фиксированного размера.
|
||||
```
|
||||
PROGRAM DFS
|
||||
VAR_INPUT
|
||||
graph : POINTER TO ARRAY[1..n, 1..n] OF BOOL; // матрица смежности, редактируется извне: DFS.graph[i,j]
|
||||
connected : POINTER TO ARRAY[1..n] OF INT; // выход: список посещённых вершин (заполняется программой)
|
||||
Start : INT := 1; // вершина, с которой начинается обход
|
||||
END_VAR
|
||||
VAR CONSTANT
|
||||
n : INT := 12; // фиксированное количество вершин графа
|
||||
END_VAR
|
||||
```
|
||||
⚠️ Это **PROGRAM**, а не FUNCTION_BLOCK — не инстанцируется через `:` в декларации переменной, а копируется целиком в проект пользователя (как указано в исходном комментарии `Копировать в свою программу`). Использует `STACK_I16` внутри. Результат — заполненный массив `connected^[1..k-1]` с номерами вершин, достижимых из `Start`.
|
||||
|
||||
---
|
||||
|
||||
## Structs
|
||||
`Path: Structs`
|
||||
|
||||
### AnalogValueState — DUT (перечисление)
|
||||
```
|
||||
{attribute 'qualified_only'}
|
||||
{attribute 'strict'}
|
||||
TYPE AnalogValueState :
|
||||
(
|
||||
undefined := INT#0,
|
||||
normal := INT#1,
|
||||
warn_low := INT#2,
|
||||
fail_low := INT#3,
|
||||
warn_hi := INT#4,
|
||||
fail_hi := INT#5,
|
||||
no_signal := -INT#1
|
||||
) := undefined;
|
||||
END_TYPE
|
||||
```
|
||||
`qualified_only` — обращаться только как `AnalogValueState.normal` и т.п. (без квалификатора не компилируется).
|
||||
Используется как тип выхода `Status` в `AIM725_Status`, `STATUS_ANALOG_M`, `STATUS_ANALOG_M_I`.
|
||||
|
||||
---
|
||||
|
||||
## Общие правила / соглашения библиотеки
|
||||
|
||||
1. **Приоритет статусов** во всех блоках статуса аналоговых сигналов (`AIM725_Status`, `STATUS_ANALOG_M`, `STATUS_ANALOG_M_I`) одинаков:
|
||||
`no_signal > fail_hi > fail_low > warn_hi > warn_low > normal`.
|
||||
2. **Гистерезис срабатывания/возврата**: срабатывание уровня — по достижению порога с задержкой `time_*` (аналог TON), возврат — при пересечении `порог ± delta_*` (без задержки).
|
||||
3. Блоки `TOF_RST`/`TP_RST` — это стандартные МЭК TOF/TP с добавленным принудительным входом `RST` (сброс приоритетнее `IN`).
|
||||
4. `DW_TO_REAL`/`REAL_TO_DW` — это **не** преобразование значения (не `DWORD_TO_REAL`), а побитовая реинтерпретация памяти через указатель. Использовать только когда явно нужна побитовая переупаковка (например, чтение REAL-регистра Modbus, пришедшего как два WORD → DWORD → REAL).
|
||||
5. `QUEUE_I16`/`STACK_I16` — фиксированный размер 16 (`n:=15` внутри), `QUEUE_I32`/`STACK_I32` — размер 32. Чтобы изменить ёмкость — нужно менять исходник (константу `n` и объявление массива).
|
||||
6. `DFS` — не библиотечный вызываемый блок, а шаблон программы под конкретный размер графа (`n:=12`); предназначен для копирования и адаптации в проекте пользователя.
|
||||
7. Все входы с `VAR_IN_OUT` (только у `Button_acceleration.Out`) передаются **по ссылке** — вызывающая сторона должна сама объявить и инициализировать переменную, изменения применяются напрямую.
|
||||
8. Единицы времени — везде тип `TIME` (`T#...`), единицы физических величин указаны в комментариях к каждому входу/выходу (мА, В, Гц, °C, Ом, °C и т.д.).
|
||||
Reference in New Issue
Block a user