---
title: "Руководство пользователя Библиотека Util"
product: "ALTA IDE"
document_number: "№ 1-RU-157591-1.7"
version: "1.7"
language: "ru"
source: "https://docs.owen.ru/product/alta-ide/doc/library_Util_stable"
pdf: "https://docs.owen.ru/download/pdf/VhIpa.rp_biblioteka+util_1-ru-157591-1.7.pdf"
generated: "2026-10-14"
---

# Руководство пользователя Библиотека Util

## Содержание

- [Цель документа](#topic-120382)
- [Установка библиотеки](#topic-120383)
- [Описание библиотеки Util](#topic-120384)
  - [Мониторы аналоговых сигналов](#topic-120385)
    - [HYSTERESIS](#topic-120386)
    - [LIMITALARM](#topic-120387)
  - [BCD преобразователи](#topic-120388)
    - [BCD_TO_INT](#topic-120389)
    - [INT_TO_BCD](#topic-120390)
  - [Битовые/байтовые функции и ФБ](#topic-120391)
    - [EXTRACT](#topic-120392)
    - [PACK](#topic-120393)
    - [PUTBIT](#topic-120394)
    - [UNPACK](#topic-120395)
  - [Регуляторы](#topic-120396)
    - [PD](#topic-120397)
    - [PID](#topic-120398)
    - [PID_FIXCYCLE](#topic-120399)
  - [Типы данных](#topic-120400)
    - [POINT](#topic-120401)
    - [GEN_MODE](#topic-120402)
  - [Манипуляторы функций](#topic-120403)
    - [CHARCURVE](#topic-120404)
    - [RAMP_INT](#topic-120405)
    - [RAMP_REAL](#topic-120406)
  - [Математические функции](#topic-120407)
    - [DERIVATIVE](#topic-120408)
    - [INTEGRAL](#topic-120409)
    - [LIN_TRAFO](#topic-120410)
    - [STATISTICS_INT](#topic-120411)
    - [STATISTICS_REAL](#topic-120412)
    - [VARIANCE](#topic-120413)
  - [Сигналы](#topic-120414)
    - [BLINK](#topic-120415)
    - [FREQ_MEASURE](#topic-120416)
    - [GEN](#topic-120417)
  - [Версия библиотеки Util](#topic-120418)
    - [Version_Util](#topic-120419)

<a id="topic-120382"></a>

## Цель документа

Библиотека Util содержит функциональные блоки, функции арифметических и логических операций, ПИД-регулятор, генератор импульсов и пр. Предназначена для ускорения и упрощения разработки, за счет использования готовых функций и блоков.

Данный документ содержит описание алгоритмов работы блоков, входные/выходные параметры и типы данных каждого блока, и предназначен для ознакомления с составом библиотеки.

Для полного понимания принципов работы в среде необходимо ознакомиться с руководством пользователя ALTA IDE.

<a id="topic-120383"></a>

## Установка библиотеки

Чтобы подключить библиотеку к проекту:

1. Откройте редактор **Менеджер библиотек** одним из способов:

- дважды нажмите ЛКМ на системную папку **Менеджер библиотек** в дереве проекта;

- или нажмите ПКМ на системную папку **Менеджер библиотек** в дереве проекта и выберите в контекстном меню пункт **Открыть**:

  ![Менеджер библиотек Открыть1](https://docs.owen.ru/book_img/2352/158428.png)

- В редакторе **Менеджер библиотек** откройте вкладку **Магазин**.

- Выберите библиотеку **Util** и нажмите кнопку **Подключить** на карточке библиотеки.

- Библиотека добавится в проект и отобразится на вкладке **Мои библиотеки** в редакторе **Менеджер библиотек**.

<a id="topic-120384"></a>

## Описание библиотеки Util

Библиотека Util содержит:

- [мониторы аналоговых сигналов](#topic-120385);
- [BCD преобразователи](#topic-120388);
- [битовые/байтовые функции и ФБ](#topic-120391);
- [регуляторы](#topic-120396);
- [типы данных](#topic-120400);
- [манипуляторы функций](#topic-120403);
- [математические функции](#topic-120407);
- [сигналы](#topic-120414);
- [версия библиотеки Util](#topic-120418).

<a id="topic-120385"></a>

### Мониторы аналоговых сигналов

<a id="topic-120386"></a>

#### HYSTERESIS

**Функциональный блок HYSTERESIS** — гистерезис.

![Hysteresis](https://docs.owen.ru/book_img/2352/157611.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | INT | Входное значение |
| HIGH | INT | Верхняя граница |
| LOW | INT | Нижняя граница |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | BOOL | Выход блока |

ФБ HYSTERESIS реализует функцию гистерезиса. Выход OUT становится TRUE, если входное значение IN меньше LOW. FALSE, если входное значение IN больше HIGH.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbHys<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>HYSTERESIS<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>aiValue<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>50<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?> <?Pub _font FontColor="#5DA35B"
?>//входное аналоговое значение<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>alarmHys<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>      <?Pub _font FontColor="#5DA35B"?>//результат ФБ<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbHys<?Pub /_font?> <?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>aiValue<?Pub /_font
?><?Pub _font FontColor="white"?>, LOW<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>40<?Pub /_font?><?Pub _font FontColor="white"?>, HIGH<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#FF99CC"?>60<?Pub /_font?><?Pub _font FontColor="white"
?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>alarmHys<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbHys<?Pub /_font?><?Pub _font FontColor="white"?>.OUT;<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120387"></a>

#### LIMITALARM

**Функциональный блок LIMITALARM** сигнализирует о нахождении входного значения в диапазоне нижней и верхней границы.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | INT | Входное значение |
| HIGH | INT | Верхняя граница |
| LOW | INT | Нижняя граница |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| O | BOOL | Выход блока<br>TRUE: Входное значение IN больше HIGH.<br>FALSE: остальное |

|   |   |   |
| --- | --- | --- |
| U | BOOL | Выход блока<br>TRUE: Входное значение IN меньше LOW.<br>FALSE: остальное |

|   |   |   |
| --- | --- | --- |
| IL | BOOL | Выход блока<br>TRUE: "O";<br>FALSE: "U" |

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbLim<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>LIMITALARM<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>aiValue<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>        <?Pub _font FontColor="#5DA35B"?>//входное значение<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>hiLim<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>        <?Pub _font FontColor="#5DA35B"?>//верхняя граница<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>loLim<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>        <?Pub _font FontColor="#5DA35B"?>//нижняя граница<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>alarmHigh<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>       <?Pub _font FontColor="#5DA35B"?>// TRUE, если IN &gt; HIGH (выход O)<?Pub /_font
?>
    <?Pub _font FontColor="#7B8DF7"?>alarmLow<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>       <?Pub _font FontColor="#5DA35B"?>// TRUE, если IN &lt; LOW (выход U)<?Pub /_font
?>
    <?Pub _font FontColor="#7B8DF7"?>inRange<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>       <?Pub _font FontColor="#5DA35B"?>// TRUE, если значение в диапазоне (выход IL)<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbLim<?Pub /_font?> <?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>aiValue<?Pub /_font
?><?Pub _font FontColor="white"?>, HIGH<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>hiLim<?Pub /_font?><?Pub _font FontColor="white"?>, LOW<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>loLim<?Pub /_font?><?Pub _font FontColor="white"
?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>alarmHigh<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbLim<?Pub /_font?><?Pub _font FontColor="white"?>.O;<?Pub /_font
?>    <?Pub _font FontColor="#5DA35B"?>// превышение верхнего предела<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>alarmLow<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?>  <?Pub _font FontColor="#7B8DF7"
?>fbLim<?Pub /_font?><?Pub _font FontColor="white"?>.U;<?Pub /_font
?>    <?Pub _font FontColor="#5DA35B"?>// ниже нижнего предела<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>inRange<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?>   <?Pub _font FontColor="#7B8DF7"
?>fbLim<?Pub /_font?><?Pub _font FontColor="white"?>.IL;<?Pub /_font
?>   <?Pub _font FontColor="#5DA35B"?>// в пределах диапазона<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120388"></a>

### BCD преобразователи

BYTE в формате BCD содержит целые числа в диапазоне от 0 до 99. Для каждого десятичного разряда используются четыре бита. Разряд десятков хранится в битах 4–7. Таким образом, формат BCD похож на шестнадцатеричное представление, с той простой разницей, что в BCD-байте могут храниться только значения от 0 до 99, тогда как шестнадцатеричный байт принимает значения от 0 до FF.

Пример:

```
Целое число 51 необходимо преобразовать в формат BCD:
5 в двоичном коде — 0101, 1 в двоичном коде — 0001,в результате получается 
BYTE 01010001 в BCD-коде, что соответствует значению 51 = 81.
```

<a id="topic-120389"></a>

#### BCD_TO_INT

**Функция BCD_TO_INT** — преобразует один байт в формате BCD в значение типа INT.

**Входные переменные**

| Имя | Тип данных | Описание |
| --- | --- | --- |
| B | BYTE | Значение в BCD-коде. Если значение не соответствует формату BCD, то выходное значение равно -1. |

**Выходные переменные**

| Имя | Тип данных | Описание |
| --- | --- | --- |
| BCD_TO_INT | INT | Значение типа INT для входного параметра B |

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#7B8DF7"?>i<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="#E7B639"?><?Pub /_font
?><?Pub _font FontColor="white"?>.BCD_TO_INT<?Pub /_font?><?Pub _font
FontColor="white"?>(<?Pub /_font?><?Pub _font FontColor="#FF99CC"
?>73<?Pub /_font?><?Pub _font FontColor="white"?>);<?Pub /_font?>  <?Pub _font FontColor="#5DA35B"?>// результат 49<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>k<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.BCD_TO_INT(<?Pub /_font
?><?Pub _font FontColor="#FF99CC"?>151<?Pub /_font?><?Pub _font
FontColor="white"?>);<?Pub /_font?> <?Pub _font FontColor="#5DA35B"
?>// результат 97<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>l<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.BCD_TO_INT(<?Pub /_font
?><?Pub _font FontColor="#FF99CC"?>15<?Pub /_font?><?Pub _font
FontColor="white"?>);<?Pub /_font?>  <?Pub _font FontColor="#5DA35B"
?>// выход: -1, т.к. значение не соответствует формату BCD*<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120390"></a>

#### INT_TO_BCD

**Функция INT_TO_BCD** — преобразует значение типа INT в байт в формате BCD.

**Входные переменные**

| Имя | Тип данных | Описание |
| --- | --- | --- |
| I | INT | Значение типа INT. Некорректное значение (<0 или >99) приводит к возврату 255 |

**Выходные переменные**

| Имя | Тип данных | Описание |
| --- | --- | --- |
| INT_TO_BCD | BYTE | Значение формата BCD для входного параметра I |

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#7B8DF7"?>i<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.INT_TO_BCD(<?Pub /_font
?><?Pub _font FontColor="#FF99CC"?>49<?Pub /_font?><?Pub _font
FontColor="white"?>);<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>// результат 73<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>k<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.INT_TO_BCD(<?Pub /_font
?><?Pub _font FontColor="#FF99CC"?>97<?Pub /_font?><?Pub _font
FontColor="white"?>);<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>// результат 151<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>l<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.INT_TO_BCD(<?Pub /_font
?><?Pub _font FontColor="#FF99CC"?>100<?Pub /_font?><?Pub _font
FontColor="white"?>);<?Pub /_font?>  <?Pub _font FontColor="#5DA35B"
?>// Ошибка! Выход: 255<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-120391"></a>

### Битовые/байтовые функции и ФБ

<a id="topic-120392"></a>

#### EXTRACT

**Функция EXTRACT** — возвращает бит с номером N значения X.

**Входные переменные**

| Имя | Тип данных | Описание |
| --- | --- | --- |
| X | DWORD | Входное значение |
| N | BYTE | Номер извлекаемого бита. Отсчёт начинается с 0 |

**Выходные переменные**

| Имя | Тип данных | Описание |
| --- | --- | --- |
| EXTRACT | BOOL | N-й бит значения X |

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#7B8DF7"?>FLAG<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.EXTRACT(X<?Pub /_font
?><?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?><?Pub _font
FontColor="#FF99CC"?>81<?Pub /_font?><?Pub _font FontColor="white"
?>, N<?Pub /_font?><?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?><?Pub _font FontColor="#FF99CC"?>4<?Pub /_font?><?Pub _font
FontColor="white"?>);<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>(*Результат: TRUE, так как 81 в двоичном 
виде 1010001, поэтому бит "4" равен 1*)<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>FLAG<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.EXTRACT(X<?Pub /_font
?><?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?><?Pub _font
FontColor="#FF99CC"?>33<?Pub /_font?><?Pub _font FontColor="white"
?>, N<?Pub /_font?><?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?><?Pub _font FontColor="#FF99CC"?>0<?Pub /_font?><?Pub _font
FontColor="white"?>);<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>(*Результат: TRUE, так как 33 в двоичном 
виде 100001, поэтому бит "0" равен 1*)<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-120393"></a>

#### PACK

**Функция PACK** — упаковывает биты B0…B7 в один байт.

**Входные переменные**

| Имя | Тип данных | Описание |
| --- | --- | --- |
| B0 | BOOL | Входной бит 0 |
| B1 | BOOL | Входной бит 1 |
| B2 | BOOL | Входной бит 2 |
| B3 | BOOL | Входной бит 3 |

|   |   |   |
| --- | --- | --- |
| B4 | BOOL | Входной бит 4 |
| B5 | BOOL | Входной бит 5 |
| B6 | BOOL | Входной бит 6 |
| B7 | BOOL | Входной бит 7 |

**Выходные переменные**

|   |   |   |
| --- | --- | --- |
| PACK | BYTE | Значение, сформированное из входов B0..B7 |

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code>
<?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>b0<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>TRUE;<?Pub /_font?>    <?Pub _font
FontColor="#5DA35B"?>// бит 0<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>b1<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>FALSE;<?Pub /_font?>   <?Pub _font
FontColor="#5DA35B"?>// бит 1<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>b2<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>TRUE;<?Pub /_font?>    <?Pub _font
FontColor="#5DA35B"?>// бит 2<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>b3<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>FALSE;<?Pub /_font?>   <?Pub _font
FontColor="#5DA35B"?>// бит 3<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>b4<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>FALSE;<?Pub /_font?>   <?Pub _font
FontColor="#5DA35B"?>// бит 4<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>b5<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>FALSE;<?Pub /_font?>   <?Pub _font
FontColor="#5DA35B"?>// бит 5<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>b6<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>FALSE;<?Pub /_font?>   <?Pub _font
FontColor="#5DA35B"?>// бит 6<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>b7<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>TRUE;<?Pub /_font?>    <?Pub _font
FontColor="#5DA35B"?>// бит 7<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>packed<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BYTE<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>        <?Pub _font FontColor="#5DA35B"?>// упакованный байт<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>packed<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.PACK(B0<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>b0<?Pub /_font?><?Pub _font FontColor="white"
?>, B1<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#7B8DF7"?>b1<?Pub /_font?><?Pub _font
FontColor="white"?>, B2<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>b2<?Pub /_font
?><?Pub _font FontColor="white"?>, B3<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>b3<?Pub /_font?><?Pub _font FontColor="white"?>, B4<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>b4<?Pub /_font?><?Pub _font FontColor="white"
?>, B5<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#7B8DF7"?>b5<?Pub /_font?><?Pub _font
FontColor="white"?>, 
B6<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>b6<?Pub /_font?><?Pub _font FontColor="white"
?>, B7<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#7B8DF7"?>b7<?Pub /_font?><?Pub _font
FontColor="white"?>);<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>// packed = 16#85 (1000_0101)<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-120394"></a>

#### PUTBIT

**Функция PUTBIT** — устанавливает значение указанного бита в переменной типа DWORD.

**Входные переменные**

| Имя | Тип данных | Описание |
| --- | --- | --- |
| X | DWORD | Изменяемое значение |
| N | BYTE | Позиция изменяемого бита, начиная с 0 |
| B | BOOL | Значение задаваемого бита |

**Выходные переменные**

| Имя | Тип данных | Описание |
| --- | --- | --- |
| PUTBIT | DWORD | Значение с изменённым битом |

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#7B8DF7"?>Var1<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>38<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>                           <?Pub _font FontColor="#5DA35B"?>// в двоичном виде: 100110<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>Var2<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.PUTBIT(<?Pub /_font
?><?Pub _font FontColor="#7B8DF7"?>Var1<?Pub /_font?><?Pub _font
FontColor="white"?>,<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>4<?Pub /_font?><?Pub _font FontColor="white"?>, TRUE);<?Pub /_font
?>   <?Pub _font FontColor="#5DA35B"?>// Результат: 54 = 2#110110<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>Var3<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.PUTBIT(<?Pub /_font
?><?Pub _font FontColor="#7B8DF7"?>Var1<?Pub /_font?><?Pub _font
FontColor="white"?>,<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>1<?Pub /_font?><?Pub _font FontColor="white"?>, FALSE);<?Pub /_font
?>  <?Pub _font FontColor="#5DA35B"?>// Результат: 36 = 2#100100<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120395"></a>

#### UNPACK

**Функциональный блок UNPACK** — преобразует один байт в 8 бит.

**Входные переменные**

| Имя | Тип данных | Описание |
| --- | --- | --- |
| B | BYTE | Входное значение |

**Выходные переменные**

|   |   |   |
| --- | --- | --- |
| B0 | BOOL | Выходной бит 0 |
| B1 | BOOL | Выходной бит 1 |
| B2 | BOOL | Выходной бит 2 |
| B3 | BOOL | Выходной бит 3 |
| B4 | BOOL | Выходной бит 4 |
| B5 | BOOL | Выходной бит 5 |
| B6 | BOOL | Выходной бит 6 |
| B7 | BOOL | Выходной бит 7 |

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code>
<?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>fbUnpack<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>UNPACK<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>Value<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font FontColor="#E7B639"
?>BYTE<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>16#85<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>     <?Pub _font FontColor="#5DA35B"
?>// 1000_0101<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>b0<?Pub /_font?><?Pub _font
FontColor="white"?>,<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>b1<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>b2<?Pub /_font?><?Pub _font FontColor="white"
?>,<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>b3<?Pub /_font
?><?Pub _font FontColor="white"?>,<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>b4<?Pub /_font?><?Pub _font FontColor="white"
?>,<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>b5<?Pub /_font
?><?Pub _font FontColor="white"?>,<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>b6<?Pub /_font?><?Pub _font FontColor="white"
?>,<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>b7<?Pub /_font
?><?Pub _font FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font
FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbUnpack<?Pub /_font?><?Pub _font
FontColor="white"?>(B<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>Value<?Pub /_font
?><?Pub _font FontColor="white"?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>b0<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbUnpack<?Pub /_font?><?Pub _font FontColor="white"?>.B0;<?Pub /_font
?>              <?Pub _font FontColor="#5DA35B"?>// TRUE<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>b1<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbUnpack<?Pub /_font?><?Pub _font FontColor="white"?>.B1;<?Pub /_font
?>              <?Pub _font FontColor="#5DA35B"?>// FALSE<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>b7<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbUnpack<?Pub /_font?><?Pub _font FontColor="white"?>.B7;<?Pub /_font
?>              <?Pub _font FontColor="#5DA35B"?>// TRUE<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120396"></a>

### Регуляторы

<a id="topic-120397"></a>

#### PD

**Функциональный блок PD** — PD регулятор.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| ACTUAL | REAL | Фактическое значение, измеренная величина |
| SET_POINT | REAL | Заданное значение, уставка |
| KP | REAL | Коэффициент пропорциональности P |
| TV | REAL | Постоянная времени дифференцирования D \[сек\]. Если задана как 0, то работает как P-регулятор |
| Y_MANUAL | REAL | Y устанавливается в это значение при MANUAL = TRUE |
| Y_OFFSET | REAL | Смещение (offset) регулирующего воздействия |
| Y_MIN | REAL | Минимальное значение регулирующего воздействия. Если ограничение не требуется, должно быть установлено в 0 |
| Y_MAX | REAL | Максимальное значение регулирующего воздействия. Если ограничение не требуется, должно быть установлено в 0 |
| MANUAL | BOOL | TRUE: ручной режим, Y не изменяется регулятором;<br>FALSE: Y формируется регулятором |
| RESET | BOOL | TRUE: устанавливает Y в значение Y_OFFSET |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Y | REAL | Управляющее воздействие |

|   |   |   |
| --- | --- | --- |
| LIMITS_ACTIVE | BOOL | TRUE: Y превысило заданные пределы Y_MIN, Y_MAX и ограничено этими значениями |

Представляет PD-регулятор.

PD-регулятор непрерывно вычисляет значение ошибки e(t) как разность между заданным значением (уставкой) и измеренной величиной. PD-регулятор формирует корректирующее воздействие на основе пропорциональной и дифференциальной составляющих (обычно обозначаемых P и D соответственно), что и определяет тип регулятора.

Параметры Y_OFFSET, Y_MIN и Y_MAX используются для преобразования регулирующего воздействия y в заданный диапазон. MANUAL может использоваться для переключения на ручной режим, RESET — для сброса регулятора. В нормальном режиме работы (MANUAL= FALSE и RESET = FALSE и LIMITS_ACTIVE = FALSE) регулятор вычисляет ошибку e(t) как разность SET_POINT — ACTUAL, формирует производную по времени![формула1](https://docs.owen.ru/book_img/2352/158638.png) и сохраняет эти значения внутренне.

Выход, то есть управляющее воздействие Y, вычисляется следующим образом: ![Формула2](https://docs.owen.ru/book_img/2352/158637.png)

Таким образом, помимо пропорциональной составляющей (P-части), на Y влияет и текущая скорость изменения ошибки (D-часть). Дополнительно Y ограничивается диапазоном, заданным Y_MIN и Y_MAX. Если Y выходит за эти пределы, LIMITS_ACTIVE устанавливается в TRUE. Если ограничение регулирующего воздействия не требуется, то Y_MIN и Y_MAX должны быть установлены в 0. При MANUAL = TRUE в Y записывается значение Y_MANUAL. PD-регулятор можно легко преобразовать в P-регулятор, установив TV = 0.

Для получения дополнительной информации см.: [PID](#topic-120398).

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbPD<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>PD<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>actual<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>45.0<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>// измеренное значение<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>setPoint<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>50.0<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>// уставка<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>yOut<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// выход регулятора<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>limits<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// признак ограничения<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbPD<?Pub /_font?><?Pub _font
FontColor="white"?>(<?Pub /_font?>
<?Pub _font FontColor="white"?>ACTUAL<?Pub /_font?>    <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>actual<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font
?>
<?Pub _font FontColor="white"?>SET_POINT<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>setPoint<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font
?>
<?Pub _font FontColor="white"?>KP<?Pub /_font?>        <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>2.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>TV<?Pub /_font?>        <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>12.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>Y_OFFSET<?Pub /_font?>  <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>Y_MIN<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>         <?Pub _font FontColor="#5DA35B"?>// нижнее ограничение выхода<?Pub /_font
?>
<?Pub _font FontColor="white"?>Y_MAX<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>100.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font
?>       <?Pub _font FontColor="#5DA35B"?>// верхнее ограничение выхода<?Pub /_font?>
<?Pub _font FontColor="white"?>MANUAL<?Pub /_font?>    <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="white"
?>FALSE,<?Pub /_font?>
<?Pub _font FontColor="white"?>RESET<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="white"
?>FALSE<?Pub /_font?>
<?Pub _font FontColor="white"?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>yOut<?Pub /_font?>      <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbPD<?Pub /_font?><?Pub _font FontColor="white"?>.Y;<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>limits<?Pub /_font?>    <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbPD<?Pub /_font?><?Pub _font FontColor="white"?>.LIMITS_ACTIVE;<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-120398"></a>

#### PID

**Функциональный блок PID** — ПИД-регулятор.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| ACTUAL | REAL | Фактическое значение, измеренная величина |
| SET_POINT | REAL | Заданное значение, уставка |
| KP | REAL | Коэффициент пропорциональности P |
| TN | REAL | Время интегрирования I \[сек\]. TN > 0, иначе регулятор не вычисляется |
| TV | REAL | Постоянная времени дифференцирования D \[сек\]. Если задана как 0, то работает как P-регулятор |
| Y_MANUAL | REAL | Y устанавливается в это значение при MANUAL = TRUE |
| Y_OFFSET | REAL | Смещение (offset) регулирующего воздействия |
| Y_MIN | REAL | Минимальное значение регулирующего воздействия |
| Y_MAX | REAL | Максимальное значение регулирующего воздействия |
| MANUAL | BOOL | TRUE: ручной режим, Y не изменяется регулятором;<br>FALSE: Y формируется регулятором |
| RESET | BOOL | TRUE: устанавливает Y в значение Y_OFFSET и сбрасывает интегральную часть |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Y | REAL | Управляющее воздействие |

|   |   |   |
| --- | --- | --- |
| LIMITS_ACTIVE | BOOL | TRUE: Y превысило заданные пределы Y_MIN, Y_MAX и ограничено этими значениями |
| OVERFLOW | BOOL | Переполнение в интегральной части |

Представляет ПИД-регулятор

![PID](https://docs.owen.ru/book_img/2352/157608.png)

ПИД-регулятор непрерывно вычисляет значение ошибки e(t) как разность между заданным значением (уставкой) и измеренной технологической величиной. ПИД-регулятор формирует корректирующее воздействие на основе пропорциональной, интегральной и дифференциальной составляющих (обычно обозначаемых P, I и D соответственно), что и определяет тип регулятора.

- P учитывает текущее значение ошибки. Например, если ошибка велика и положительна, выход регулятора также будет большим и положительным.
- I учитывает прошлые значения ошибки. Например, если текущий выход недостаточно велик, интеграл ошибки будет накапливаться со временем, и регулятор отреагирует увеличением воздействия.
- D учитывает возможные будущие тенденции ошибки на основе текущей скорости её изменения.

Поскольку PID-регулятор опирается только на измеряемую технологическую величину и не требует знания модели объекта, он широко применим. Настройкой трёх параметров модели PID-регулятор можно адаптировать под требования конкретного процесса. Реакцию регулятора можно описать через скорость отклика на ошибку, степень перерегулирования относительно уставки и выраженность колебаний системы. Использование PID-алгоритма не гарантирует оптимальное управление системой или даже её устойчивость.

Y_OFFSET, Y_MIN и Y_MAX используются для преобразования регулирующего воздействия Y в заданный диапазон. MANUAL может использоваться для переключения на ручной режим, RESET — для повторной инициализации регулятора. В нормальном режиме работы (MANUAL = RESET = LIMITS_ACTIVE = FALSE) регулятор вычисляет ошибку e (t) как разность SET_POINT — ACTUAL, формирует производную по времени![формула1](https://docs.owen.ru/book_img/2352/158640.png) и сохраняет эти значения внутренне.

Выход, то есть управляющее воздействие Y, в отличие от PD-регулятора содержит дополнительную интегральную составляющую и вычисляется следующим образом: ![Формула3](https://docs.owen.ru/book_img/2352/158639.png)

Таким образом, помимо пропорциональной части (P), на Y влияют и текущая скорость изменения ошибки (D), и история ошибки (I). PID-регулятор можно легко преобразовать в PI-регулятор, установив TV = 0. Из-за наличия интегральной части при некорректной параметризации возможно переполнение, если интеграл ошибки становится слишком большим. Для обеспечения безопасности предусмотрен логический выход OVERFLOW, который в этом случае принимает значение TRUE. Обычно это происходит, если система управления неустойчива из-за неверной параметризации. При этом регулятор будет остановлен и сможет быть активирован снова только после повторной инициализации.

> [!NOTE]
> **Примечание.** Пока активны ограничения регулирующего воздействия (Y_MIN, Y_MAX), интегральная часть будет подстраиваться так, как если бы история входных значений автоматически влияла на ограниченный выход. Если такое поведение нежелательно, возможен следующий обходной вариант: отключить ограничения в PID-регуляторе (Y_MIN>= Y_MAX) и вместо этого применить оператор LIMIT (стандарт IEC) к выходному значению Y.

> [!NOTE]
> **Примечание.** При изменении времени цикла не требуется повторно настраивать параметры регулятора (KP, TN, TV).

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbPID<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>PID<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>actual<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>45.0<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>// текущее значение<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>setPoint<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>50.0<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>// уставка<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>yOut<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// выход регулятора<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>limits<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// признак ограничения выхода<?Pub /_font
?>
    <?Pub _font FontColor="#7B8DF7"?>overflow<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// признак переполнения интегральной части<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbPID<?Pub /_font?><?Pub _font
FontColor="white"?>(<?Pub /_font?>
<?Pub _font FontColor="white"?>ACTUAL<?Pub /_font?>    <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>actual<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font
?>
<?Pub _font FontColor="white"?>SET_POINT<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>setPoint<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font
?>
<?Pub _font FontColor="white"?>KP<?Pub /_font?>        <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>2.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>TN<?Pub /_font?>        <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>10.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>TV<?Pub /_font?>        <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>1.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>Y_OFFSET<?Pub /_font?>  <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>Y_MIN<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>Y_MAX<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>100.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font
?>
<?Pub _font FontColor="white"?>MANUAL<?Pub /_font?>    <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="white"
?>FALSE,<?Pub /_font?>
<?Pub _font FontColor="white"?>RESET<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="white"
?>FALSE<?Pub /_font?>
<?Pub _font FontColor="white"?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>yOut<?Pub /_font?>      <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbPID<?Pub /_font?><?Pub _font FontColor="white"?>.Y;<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>limits<?Pub /_font?>    <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbPID<?Pub /_font?><?Pub _font FontColor="white"?>.LIMITS_ACTIVE;<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>overflow<?Pub /_font?>  <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbPID<?Pub /_font?><?Pub _font FontColor="white"?>.OVERFLOW;<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120399"></a>

#### PID_FIXCYCLE

**Функциональный блок PID_FIXCYCLE** — ПИД-регулятор, для которого время цикла можно задавать вручную.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| ACTUAL | REAL | Фактическое значение, измеренная величина |
| SET_POINT | REAL | Заданное значение, уставка |
| KP | REAL | Коэффициент пропорциональности P |
| TN | REAL | Время интегрирования I \[сек\]. TN > 0, иначе регулятор не вычисляется |
| TV | REAL | Постоянная времени дифференцирования D \[сек\]. Если задана как 0, то работает как P-регулятор |
| Y_MANUAL | REAL | Y устанавливается в это значение при MANUAL = TRUE |
| Y_OFFSET | REAL | Смещение (offset) регулирующего воздействия |
| Y_MIN | REAL | Минимальное значение регулирующего воздействия |
| Y_MAX | REAL | Максимальное значение регулирующего воздействия |
| MANUAL | BOOL | TRUE: ручной режим, Y не изменяется регулятором;<br>FALSE: Y формируется регулятором |
| RESET | BOOL | TRUE: устанавливает Y в значение Y_OFFSET и сбрасывает интегральную часть |
| CYCLE | REAL | Время между двумя вызовами, в секундах |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Y | REAL | Управляющее воздействие |

|   |   |   |
| --- | --- | --- |
| LIMITS_ACTIVE | BOOL | TRUE: Y превысило заданные пределы Y_MIN, Y_MAX и ограничено этими значениями |
| OVERFLOW | BOOL | Переполнение в интегральной части |

Представляет PID-регулятор, для которого время цикла можно задавать вручную.

PID-регулятор непрерывно вычисляет значение ошибки e(t) как разность между заданным значением (уставкой) и измеренной технологической величиной. PID-регулятор формирует корректирующее воздействие на основе пропорциональной, интегральной и дифференциальной составляющих (обычно обозначаемых P, I и D соответственно), что и определяет тип регулятора.

> [!NOTE]
> **Примечание.** Для быстрых задач с фиксированным циклом рекомендуется использовать PID_FIXCYCLE вместо PID, поскольку время цикла задаётся точно, тогда как PID может измерять время цикла лишь с точностью не больше миллисекунд. При очень коротких циклах (1 мс) это может приводить к нестабильной работе (см. [PID](#topic-120398)).

> [!NOTE]
> **Примечание.** При изменении времени цикла не требуется повторно настраивать параметры регулятора (KP, TN, TV).

Для получения дополнительной информации см. [PID](#topic-120398).

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbPID<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>PID_FIXCYCLE<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>actual<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>45.0<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>// текущее значение<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>setPoint<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>50.0<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>// уставка<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>cycle<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>0.01<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"
?>// время цикла, с (например, 10 мс)<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>yOut<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// выход регулятора<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>limits<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// признак ограничения выхода<?Pub /_font
?>
    <?Pub _font FontColor="#7B8DF7"?>overflow<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// признак переполнения интегральной части<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbPID<?Pub /_font?><?Pub _font
FontColor="white"?>(<?Pub /_font?>
<?Pub _font FontColor="white"?>ACTUAL<?Pub /_font?>    <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>actual<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font
?>
<?Pub _font FontColor="white"?>SET_POINT<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>setPoint<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font
?>
<?Pub _font FontColor="white"?>KP<?Pub /_font?>        <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>2.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>TN<?Pub /_font?>        <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>10.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>TV<?Pub /_font?>        <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>1.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>Y_OFFSET<?Pub /_font?>  <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>Y_MIN<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
<?Pub _font FontColor="white"?>Y_MAX<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>100.0<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font
?>
<?Pub _font FontColor="white"?>MANUAL<?Pub /_font?>    <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="white"
?>FALSE,<?Pub /_font?>
<?Pub _font FontColor="white"?>RESET<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="white"
?>FALSE<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font
?>
<?Pub _font FontColor="white"?>CYCLE<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>cycle<?Pub /_font?>
<?Pub _font FontColor="white"?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>yOut<?Pub /_font?>      <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbPID<?Pub /_font?><?Pub _font FontColor="white"?>.Y;<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>limits<?Pub /_font?>    <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbPID<?Pub /_font?><?Pub _font FontColor="white"?>.LIMITS_ACTIVE;<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>overflow<?Pub /_font?>  <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbPID<?Pub /_font?><?Pub _font FontColor="white"?>.OVERFLOW;<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120400"></a>

### Типы данных

<a id="topic-120401"></a>

#### POINT

Пользовательский тип данных **POINT** - это структура с двумя полями.

| Имя | Тип |
| --- | --- |
| X | DINT |
| Y | DINT |

POINT предназначен для хранения пары координат/значений X и Y, например, “точка” на плоскости, точка графика/характеристики и т.д.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code>
<?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>p<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>POINT<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"?>// переменная типа POINT (структура с полями X и Y)<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>p<?Pub /_font?><?Pub _font
FontColor="white"?>.X<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"?>1<?Pub /_font
?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font
FontColor="#5DA35B"?>// записать значение в поле X<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>p<?Pub /_font?><?Pub _font
FontColor="white"?>.Y<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"?>2<?Pub /_font
?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font
FontColor="#5DA35B"?>// записать значение в поле Y<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-120402"></a>

#### GEN_MODE

Пользовательский тип данных **GEN_MODE** — перечисление GEN_MODE задаёт режим (тип) генерируемого сигнала.

| Имя | Начальное значение |
| --- | --- |
| TRIANGLE | 0 |
| TRIANGLE_POS | 1 |
| SAWTOOTH_RISE | 2 |
| SAWTOOTH_FALL | 3 |
| RECTANGLE | 4 |
| SINUS | 5 |
| COSINUS | 6 |
| SINE | 7 |
| COSINE | 8 |

Пример:

см. [GEN](#topic-120417)

<a id="topic-120403"></a>

### Манипуляторы функций

<a id="topic-120404"></a>

#### CHARCURVE

**Функциональный блок CHARCURVE** — преобразование входного сигнала по характеристической кривой.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | INT | Входной сигнал |
| N | BYTE | Количество точек, задающих характеристическую кривую: 2 <= N<= 11 |

**Входные/выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| P | ARRAY\[0..10\] OF POINT | Массив точек для описания характеристической кривой |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | INT | Выходная переменная, содержит преобразованное значение |
| ERR | BYTE | 0: нет ошибки;<br>1: ошибка в P: неверная последовательность (полностью протестировано только если IN равно наибольшему значению X в P);<br>2: IN вне пределов P;<br>4: неверное N, количество точек вне допустимого диапазона 2..11 |

![Charcurve](https://docs.owen.ru/book_img/2352/157606.png)

Характеристическая кривая задаётся массивом POINT-ов, который содержит набор значений X и соответствующих им значений Y.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>CHARACTERISTIC_LINE<?Pub /_font
?><?Pub _font FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font
FontColor="#E7B639"?>util<?Pub /_font?><?Pub _font FontColor="white"
?>.<?Pub /_font?><?Pub _font FontColor="#E7B639"?>CHARCURVE<?Pub /_font
?><?Pub _font FontColor="white"?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>KL<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>ARRAY<?Pub /_font?><?Pub _font FontColor="white"?>[<?Pub /_font
?><?Pub _font FontColor="#FF99CC"?>0..10<?Pub /_font?><?Pub _font
FontColor="white"?>]<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>OF<?Pub /_font?>     <?Pub _font FontColor="#E7B639"?>util<?Pub /_font
?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>POINT<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="white"?>[<?Pub /_font?>
       <?Pub _font FontColor="white"?>(X<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0<?Pub /_font?><?Pub _font FontColor="white"?>, Y<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0<?Pub /_font?><?Pub _font FontColor="white"?>),<?Pub /_font?>
       <?Pub _font FontColor="white"?>(X<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>250<?Pub /_font?><?Pub _font FontColor="white"?>, Y<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#FF99CC"?>50<?Pub /_font?><?Pub _font FontColor="white"
?>),<?Pub /_font?>
       <?Pub _font FontColor="white"?>(X<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>500<?Pub /_font?><?Pub _font FontColor="white"?>, Y<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#FF99CC"?>150<?Pub /_font?><?Pub _font FontColor="white"
?>),<?Pub /_font?>
       <?Pub _font FontColor="white"?>(X<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>750<?Pub /_font?><?Pub _font FontColor="white"?>, Y<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#FF99CC"?>400<?Pub /_font?><?Pub _font FontColor="white"
?>),<?Pub /_font?>
       <?Pub _font FontColor="#FF99CC"?>7<?Pub /_font?><?Pub _font
FontColor="white"?>((X<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"?>1000<?Pub /_font
?><?Pub _font FontColor="white"?>, Y<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>1000<?Pub /_font?><?Pub _font FontColor="white"?>))];<?Pub /_font
?>
    <?Pub _font FontColor="#7B8DF7"?>COUNTER<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>                <?Pub _font
FontColor="#E7B639"?>INT<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>COUNTER<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>COUNTER<?Pub /_font?><?Pub _font FontColor="#EF7244"?>+<?Pub /_font
?><?Pub _font FontColor="#FF99CC"?>10<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?> <?Pub _font FontColor="#5DA35B"
?>//подает на CHARCURVE, например, постоянно растущий сигнал<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>CHARACTERISTIC_LINE<?Pub /_font?><?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>COUNTER<?Pub /_font
?><?Pub _font FontColor="white"?>, N<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>5<?Pub /_font?><?Pub _font FontColor="white"?>, P<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>KL<?Pub /_font?><?Pub _font FontColor="white"?>);<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-120405"></a>

#### RAMP_INT

**Функциональный блок RAMP_INT** — ограничение скорости изменения значения до заданного уровня.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | INT | Входное значение |
| ASCEND | INT | Ограничение нарастания: максимальное увеличение за интервал TIMEBASE.<br>Пример: ASCEND := 25 и TIMEBASE := T#1s => максимальное увеличение на 25 единиц в секунду |
| DESCEND | INT | Ограничение спада: максимальное уменьшение за интервал TIMEBASE (DESCEND > 0).<br>Пример: DESCEND := 20 и TIMEBASE := T#500ms => максимальное уменьшение на 20 единиц за 500 мс |
| TIMEBASE | TIME | Опорный интервал для ASCEND/DESCEND.<br>Если TIMEBASE = T#0s: ASCEND/DESCEND задаются на один вызов; иначе: ASCEND/DESCEND задаются на указанный интервал времени.<br>Если TIMEBASE = T#0s, то в этом случае TIMEBASE равна времени цикла задачи. Обычно это точно соответствует одному вызову функционального блока RAMP_INT.<br>**Примечание.** Если TIMEBASE меньше времени цикла задачи, это приведёт к нарушению теоремы отсчётов и может привести к потере информации в выходном сигнале |
| RESET | BOOL | Сброс функционального блока.<br>TRUE: останавливает внутренние вычисления и повторно инициализирует функциональный блок;<br>последнее вычисленное значение OUT сохраняется, чтобы продолжить вычисления с него при следующем запуске.<br>FALSE: выдаёт сглаженный входной сигнал на выход OUT |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | INT | Значение с ограниченной “рампой”. Значение сохраняется внутренне и используется для расчёта нарастания и спада входного сигнала |

Ограничение скорости изменения задаётся максимальным нарастанием ASCEND и максимальным спадом DESCEND, а также временем TIMEBASE, определяющим интервал времени, к которому относятся значения ASCEND и DESCEND.

![RAMP INT](https://docs.owen.ru/book_img/2352/157605.png)

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>Ramp<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>RAMP_INT<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>InValue<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>       <?Pub _font FontColor="#5DA35B"?>// входной сигнал (ступенька 0/100)<?Pub /_font
?>
    <?Pub _font FontColor="#7B8DF7"?>OutValue<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>       <?Pub _font FontColor="#5DA35B"?>// выход RAMP_INT<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>Toggle<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>      <?Pub _font FontColor="#5DA35B"?>// переключение входа<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#5DA35B"?>// Пример входного сигнала: переключение между 0 и 100<?Pub /_font?>
<?Pub _font FontColor="#99FFFF"?>IF<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>Toggle<?Pub /_font?> <?Pub _font
FontColor="#99FFFF"?>THEN<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>InValue<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>100<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>
<?Pub _font FontColor="#99FFFF"?>ELSE<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>InValue<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>
<?Pub _font FontColor="#99FFFF"?>END_IF<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>Ramp<?Pub /_font?><?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>InValue<?Pub /_font
?><?Pub _font FontColor="white"?>, ASCEND<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>25<?Pub /_font?><?Pub _font FontColor="white"?>, DESCEND<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#FF99CC"?>20<?Pub /_font?><?Pub _font FontColor="white"
?>, TIMEBASE<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#99FF99"?>T#1s<?Pub /_font?><?Pub _font
FontColor="white"?>, RESET<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="white"?>FALSE);<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>OutValue<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>Ramp<?Pub /_font?><?Pub _font FontColor="white"?>.OUT;<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120406"></a>

#### RAMP_REAL

**Функциональный блок RAMP_REAL** — ограничивает скорость изменения значения до заданного уровня.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | REAL | Входное значение |
| ASCEND | REAL | Максимальная положительная скорость изменения |
| DESCEND | REAL | Максимальная отрицательная скорость изменения. Значение не должно быть отрицательным |
| TIMEBASE | TIME | Опорный интервал для ASCEND/DESCEND.<br>Если TIMEBASE = T#0s: ASCEND/DESCEND задаются на один вызов;<br>иначе: ASCEND/DESCEND задаются на указанный интервал времени |
| RESET | BOOL | Сброс функционального блока |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | REAL | Значение с ограниченной скоростью изменения |

Функциональный блок аналогичен [RAMP_INT](#topic-120405), с той разницей, что входы IN, ASCEND, DESCEND и выход OUT имеют тип REAL. RAMP_REAL требует больше вычислительного времени, но выполняет расчёт точнее, чем RAMP_INT.

> [!NOTE]
> **Примечание.** Сброс функционального блока (RESET = TRUE) останавливает вычисления, при этом последнее вычисленное выходное значение OUT сохраняется. Если затем “рампа” снова запускается (RESET = FALSE), расчёт продолжится, начиная с этого последнего выходного значения.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>Ramp<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>RAMP_REAL<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>InValue<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>       <?Pub _font FontColor="#5DA35B"?>// входной сигнал (ступенька 0/100)<?Pub /_font
?>
    <?Pub _font FontColor="#7B8DF7"?>OutValue<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>       <?Pub _font FontColor="#5DA35B"?>// выход RAMP_REAL<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>Toggle<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>       <?Pub _font FontColor="#5DA35B"?>// переключение входа<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#5DA35B"?>// Пример входного сигнала: переключение между 0 и 100<?Pub /_font?>
<?Pub _font FontColor="#99FFFF"?>IF<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>Toggle<?Pub /_font?> <?Pub _font
FontColor="#99FFFF"?>THEN<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>InValue<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>100<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>
<?Pub _font FontColor="#99FFFF"?>ELSE<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>InValue<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>
<?Pub _font FontColor="#99FFFF"?>END_IF<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>Ramp<?Pub /_font?><?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>InValue<?Pub /_font
?><?Pub _font FontColor="white"?>, ASCEND<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>25.5<?Pub /_font?><?Pub _font FontColor="white"?>, DESCEND<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#FF99CC"?>20.5<?Pub /_font?><?Pub _font FontColor="white"
?>, TIMEBASE<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#99FF99"?>T#1s<?Pub /_font?><?Pub _font
FontColor="white"?>, 
RESET<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>FALSE);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>OutValue<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>Ramp<?Pub /_font?><?Pub _font FontColor="white"?>.OUT;<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120407"></a>

### Математические функции

<a id="topic-120408"></a>

#### DERIVATIVE

**Функциональный блок HYSTERESIS** — аппроксимация производной заданного значения по времени.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | REAL | Входное значение |
| TM | DWORD | Время с последнего вызова, в мс |
| RESET | BOOL | TRUE: OUT устанавливается в 0, а сохранённые значения устанавливаются в текущее входное значение IN |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | REAL | Производная |

Для расчёта записываются четыре последовательных значения, чтобы итоговая производная была максимально точной.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbDerivative<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>DERIVATIVE<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>rInput<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>       <?Pub _font
FontColor="#E7B639"?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"?>0.0<?Pub /_font
?><?Pub _font FontColor="white"?>;<?Pub /_font?>     <?Pub _font
FontColor="#5DA35B"?>// входной сигнал<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>dwTime<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>       <?Pub _font
FontColor="#E7B639"?>DWORD<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"?>100<?Pub /_font
?><?Pub _font FontColor="white"?>;<?Pub /_font?>    <?Pub _font
FontColor="#5DA35B"?>// время между вызовами, мс (пример: 100 мс)<?Pub /_font
?>
    <?Pub _font FontColor="#7B8DF7"?>xReset<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>       <?Pub _font
FontColor="#E7B639"?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="white"?>FALSE<?Pub /_font
?><?Pub _font FontColor="white"?>;<?Pub /_font?>   <?Pub _font
FontColor="#5DA35B"?>// сброс<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>rOut<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>         <?Pub _font
FontColor="#E7B639"?>REAL<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>            <?Pub _font FontColor="#5DA35B"?>// производная (выход)<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#5DA35B"?>// Пример изменения входного значения<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>rInput<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>rInput<?Pub /_font?><?Pub _font FontColor="#EF7244"?>+<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>1.0<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbDerivative<?Pub /_font?><?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>rInput<?Pub /_font
?><?Pub _font FontColor="white"?>, TM<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>dwTime<?Pub /_font?><?Pub _font FontColor="white"?>, RESET<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>xReset<?Pub /_font?><?Pub _font FontColor="white"
?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>rOut<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbDerivative<?Pub /_font?><?Pub _font FontColor="white"?>.OUT;<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120409"></a>

#### INTEGRAL

**Функциональный блок INTEGRAL** — приближённо вычисляет интеграл по времени.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | REAL | Входное значение |
| TM | DWORD | Время с последнего вызова, в мс |
| RESET | BOOL | TRUE: OUT устанавливается в 0, а OVERFLOW — в FALSE |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | REAL | Значение интеграла.<br>Вычисляется суммированием частичных интегралов IN \* TM |
| OVERFLOW | BOOL | TRUE: значение OUT вышло за диапазон переменных типа REAL;<br>функциональный блок заблокирован до повторной инициализации входом RESET |

Для расчёта записываются четыре последовательных значения, чтобы итоговая производная была максимально точной.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>integral_inst<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>INTEGRAL<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>rInput<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>        <?Pub _font
FontColor="#E7B639"?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"?>1.0<?Pub /_font
?><?Pub _font FontColor="white"?>;<?Pub /_font?>   <?Pub _font
FontColor="#5DA35B"?>// входное значение (например, постоянный сигнал)<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>dwTime<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>        <?Pub _font
FontColor="#E7B639"?>DWORD<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"?>100<?Pub /_font
?><?Pub _font FontColor="white"?>;<?Pub /_font?>  <?Pub _font
FontColor="#5DA35B"?>// время между вызовами, мс (пример: 100 мс)<?Pub /_font
?>
    <?Pub _font FontColor="#7B8DF7"?>xReset<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>        <?Pub _font
FontColor="#E7B639"?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="white"?>FALSE<?Pub /_font
?><?Pub _font FontColor="white"?>;<?Pub /_font?> <?Pub _font
FontColor="#5DA35B"?>// сброс интегратора<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>rOut<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>          <?Pub _font
FontColor="#E7B639"?>REAL<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>          <?Pub _font FontColor="#5DA35B"?>// значение интеграла<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>xOverflow<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>          <?Pub _font FontColor="#5DA35B"?>// признак переполнения<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>integral_inst<?Pub /_font?><?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>rInput<?Pub /_font
?><?Pub _font FontColor="white"?>, TM<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>dwTime<?Pub /_font?><?Pub _font FontColor="white"?>, RESET<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>xReset<?Pub /_font?><?Pub _font FontColor="white"
?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>rOut<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>integral_inst<?Pub /_font?><?Pub _font FontColor="white"?>.OUT;<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>xOverflow<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>integral_inst<?Pub /_font?><?Pub _font FontColor="white"?>.OVERFLOW;<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-120410"></a>

#### LIN_TRAFO

**Функциональный блок LIN_TRAFO** — выполняет линейное преобразование.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | REAL | Входное значение |
| IN_MIN | REAL | Минимальное входное значение |
| IN_MAX | REAL | Максимальное входное значение |
| OUT_MIN | REAL | Соответствующее минимальное выходное значение |
| OUT_MAX | REAL | Соответствующее максимальное выходное значение |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | REAL | Выходное значение |
| ERROR | BOOL | TRUE: IN_MIN = IN_MAX или IN вне диапазона входных значений |

Преобразование выполняется с использованием минимального и максимального значений входа для линейной аппроксимации выходного значения.

Пример применения: Датчик температуры выдаёт значения напряжения унифицированного сигнала 0...10 В (вход IN). Эти значения необходимо преобразовать в температуру в градусах Цельсия (выход OUT). Диапазон входных значений (В) задаётся пределами IN_MIN = 0 и IN_MAX = 10. Диапазон выходных значений (°C) задаётся пределами OUT_MIN = -20 и OUT_MAX = 40. Таким образом, при входном значении 5 В на выходе получится температура 10 °C.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbLinTrafo<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>LIN_TRAFO<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>rVolt<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font
FontColor="#E7B639"?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"?>5.0<?Pub /_font
?><?Pub _font FontColor="white"?>;<?Pub /_font?>     <?Pub _font
FontColor="#5DA35B"?>// Напряжение с датчика (В)<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>rTemp<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font
FontColor="#E7B639"?>REAL<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>            <?Pub _font FontColor="#5DA35B"?>// Температура (°C)<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>xError<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>            <?Pub _font FontColor="#5DA35B"?>// признак ошибки<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbLinTrafo<?Pub /_font?><?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>rVolt<?Pub /_font
?><?Pub _font FontColor="white"?>, IN_MIN<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>0.0<?Pub /_font?><?Pub _font FontColor="white"?>, IN_MAX<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#FF99CC"?>10.0<?Pub /_font?><?Pub _font FontColor="white"
?>, OUT_MIN<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:= -<?Pub /_font
?><?Pub _font FontColor="#FF99CC"?>20.0<?Pub /_font?><?Pub _font
FontColor="white"?>,
OUT_MAX<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>40.0<?Pub /_font?><?Pub _font
FontColor="white"?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>rTemp<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbLinTrafo<?Pub /_font?><?Pub _font FontColor="white"?>.OUT;<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>xError<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbLinTrafo<?Pub /_font?><?Pub _font FontColor="white"?>.ERROR;<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120411"></a>

#### STATISTICS_INT

**Функциональный блок STATISTICS_INT** — вычисляет минимальное, максимальное и среднее значение входного сигнала типа данных INT.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | INT | Входное значение |
| RESET | BOOL | TRUE: AVG устанавливается в 0, MN и MX - в минимально и максимально возможные значения типа INT |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| MN | INT | Минимальное значение |
| MX | INT | Максимальное значение |
| AVG | INT | Среднее значение |

Расчёт выполняется во времени и может быть сброшен, чтобы начать новое вычисление/статистику.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbStat<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>STATISTICS_INT<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>iValue<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>0<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>        <?Pub _font
FontColor="#5DA35B"?>// входное значение<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>xReset<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>FALSE;<?Pub /_font?>   <?Pub _font
FontColor="#5DA35B"?>// сброс статистики<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>iMin<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>             <?Pub _font FontColor="#5DA35B"?>// минимум<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>iMax<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>             <?Pub _font FontColor="#5DA35B"?>// максимум<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>iAvg<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>             <?Pub _font FontColor="#5DA35B"?>// среднее<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbStat<?Pub /_font?><?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>iValue<?Pub /_font
?><?Pub _font FontColor="white"?>, RESET<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>xReset<?Pub /_font?><?Pub _font FontColor="white"?>);<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>iMin<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbStat<?Pub /_font?><?Pub _font FontColor="white"?>.MN<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>iMax<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbStat<?Pub /_font?><?Pub _font FontColor="white"?>.MX<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>iAvg<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbStat<?Pub /_font?><?Pub _font FontColor="white"?>.AVG<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120412"></a>

#### STATISTICS_REAL

**Функциональный блок STATISTICS_REAL** — вычисляет минимальное, максимальное и среднее значение входного сигнала типа данных REAL.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | REAL | Входное значение |
| RESET | BOOL | TRUE: AVG устанавливается в 0, MN и MX - в минимально и максимально возможные значения типа REAL |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| MN | REAL | Минимальное значение |
| MX | REAL | Максимальное значение |
| AVG | REAL | Среднее значение |

Расчёт выполняется во времени и может быть сброшен, чтобы начать новое вычисление/статистику.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbStat<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>STATISTICS_REAL<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>iValue<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>0<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>        <?Pub _font
FontColor="#5DA35B"?>// входное значение<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>xReset<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>FALSE;<?Pub /_font?>    <?Pub _font
FontColor="#5DA35B"?>// сброс статистики<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>iMin<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>             <?Pub _font FontColor="#5DA35B"?>// минимум<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>iMax<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>             <?Pub _font FontColor="#5DA35B"?>// максимум<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>iAvg<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>             <?Pub _font FontColor="#5DA35B"?>// среднее<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbStat<?Pub /_font?><?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>iValue<?Pub /_font
?><?Pub _font FontColor="white"?>, RESET<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>xReset<?Pub /_font?><?Pub _font FontColor="white"?>);<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>iMin<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbStat<?Pub /_font?><?Pub _font FontColor="white"?>.MN<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>iMax<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbStat<?Pub /_font?><?Pub _font FontColor="white"?>.MX<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>iAvg<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbStat<?Pub /_font?><?Pub _font FontColor="white"?>.AVG<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120413"></a>

#### VARIANCE

**Функциональный блок VARIANCE** — вычисляет математическую дисперсию переменной во времени.\*

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | REAL | Входное значение |
| RESET | BOOL | Сброс |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | REAL | Дисперсия |

\*Под «во времени» здесь понимается, что при каждом вызове функционального блока значение дисперсии дополняется (накапливается) до тех пор, пока не будет выполнен сброс.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbVariance<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>VARIANCE<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>rValue<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>10.0<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>      <?Pub _font FontColor="#5DA35B"
?>// входное значение<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>xReset<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>FALSE;<?Pub /_font?>     <?Pub _font
FontColor="#5DA35B"?>// сброс расчета<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>rVar<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>       <?Pub _font
FontColor="#E7B639"?>REAL<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>              <?Pub _font FontColor="#5DA35B"?>// дисперсия<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbVariance<?Pub /_font?><?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>rValue<?Pub /_font
?><?Pub _font FontColor="white"?>, RESET<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>xReset<?Pub /_font?><?Pub _font FontColor="white"?>);<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>rVar<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbVariance<?Pub /_font?><?Pub _font FontColor="white"?>.OUT;<?Pub /_font
?>
</code></td></tr></tbody></table></div></div>

<a id="topic-120414"></a>

### Сигналы

<a id="topic-120415"></a>

#### BLINK

**Функциональный блок BLINK** — генерирует "мигающий" сигнал (включение и выключение с заданной длительностью).

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| ENABLE | BOOL | TRUE: начать мигание<br>FALSE: остановить мигание, при этом OUT сохраняет своё значение |
| TIMELOW | TIME | Время, в течение которого OUT = FALSE |
| TIMEHIGH | TIME | Время, в течение которого OUT = TRUE |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | BOOL | Выходной сигнал, начинается с FALSE и переключается между TRUE и FALSE с заданной периодичностью. |

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbBlink<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>BLINK<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>xEnable<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>TRUE;<?Pub /_font?>       <?Pub _font
FontColor="#5DA35B"?>// разрешить переключение<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>tLow<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font FontColor="#E7B639"
?>TIME<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#99FF99"?>T#500ms<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>    <?Pub _font FontColor="#5DA35B"
?>// время OUT = FALSE<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>tHigh<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>TIME<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#99FF99"?>T#500ms<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>    <?Pub _font FontColor="#5DA35B"
?>// время OUT = TRUE<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>xOut<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>               <?Pub _font FontColor="#5DA35B"?>// входной сигнал<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbBlink<?Pub /_font?><?Pub _font
FontColor="white"?>(ENABLE<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>xEnable<?Pub /_font
?><?Pub _font FontColor="white"?>, TIMELOW<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>tLow<?Pub /_font?><?Pub _font FontColor="white"?>, TIMEHIGH<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>tHigh<?Pub /_font?><?Pub _font FontColor="white"
?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>xOut<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbBlink<?Pub /_font?><?Pub _font FontColor="white"?>.OUT;<?Pub /_font
?>
</code></td></tr></tbody></table></div></div>

<a id="topic-120416"></a>

#### FREQ_MEASURE

**Функциональный блок FREQ_MEASURE** — измерение частоты сигнала.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | BOOL | Входной сигнал |
| PERIODS | INT<br>(1..10) | Период - это время между двумя нарастающими фронтами входного сигнала. OUT равен средней частоте за заданное число периодов PERIODS (количество периодов: минимум 1, максимум 10).<br>Функциональный блок работает только если значение находится в диапазоне 1..10 |
| RESET | BOOL | Сброс измерения |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | REAL | Частота \[Гц\] |
| VALID | BOOL | FALSE: пока не завершено первое измерение;<br>или если временной интервал между двумя фронтами > 3 \* OUT (указывает на некорректный входной сигнал) |

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbFreq<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>FREQ_MEASURE<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>xDI<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font
FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// дискретный вход (например, датчик импульсов)<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>iPeriods<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="#FF99CC"?>5<?Pub /_font?><?Pub _font
FontColor="white"?>;<?Pub /_font?>       <?Pub _font FontColor="#5DA35B"
?>// усреднение по 5 периодам (1..10)<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>xReset<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font FontColor="white"?>FALSE;<?Pub /_font?>  <?Pub _font
FontColor="#5DA35B"?>// сброс измерения<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>rFreqHz<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font FontColor="#E7B639"
?>REAL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// измеренная частота, Гц<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>xValid<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font FontColor="#E7B639"
?>BOOL<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>           <?Pub _font FontColor="#5DA35B"?>// признак валидности измерения<?Pub /_font
?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>fbFreq<?Pub /_font?><?Pub _font
FontColor="white"?>(IN<?Pub /_font?> <?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"?>xDI<?Pub /_font
?><?Pub _font FontColor="white"?>, PERIODS<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>iPeriods<?Pub /_font?><?Pub _font FontColor="white"?>, RESET<?Pub /_font
?> <?Pub _font FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
FontColor="#7B8DF7"?>xReset<?Pub /_font?><?Pub _font FontColor="white"
?>);<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>rFreqHz<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbFreq<?Pub /_font?><?Pub _font FontColor="white"?>.OUT;<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>xValid<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>fbFreq<?Pub /_font?><?Pub _font FontColor="white"?>.VALID;<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-120417"></a>

#### GEN

**Функциональный блок GEN** — генерирует периодические функции заданных типов.

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| MODE | GEN_MODE | Доступные типы:<br>• TRIANGLE: треугольный сигнал от -AMPLITUDE до +AMPLITUDE;<br>• TRIANGLE_POS: треугольный сигнал от 0 до +AMPLITUDE;<br>• SAWTOOTH_RISE: пилообразный сигнал, возрастающий от -AMPLITUDE до +AMPLITUDE;<br>• SAWTOOTH_FALL: пилообразный сигнал, убывающий от +AMPLITUDE до -AMPLITUDE;<br>• RECTANGLE: прямоугольный сигнал, переключающийся от -AMPLITUDE до +AMPLITUDE;<br>• SINE: синус;<br>• COSINE: косинус |
| BASE | BOOL | FALSE: период задаётся по количеству вызовов (CYCLES);<br>TRUE: период задаётся по времени (PERIOD) |
| PERIOD | TIME | Время периода; используется только при BASE = TRUE |
| CYCLES | INT | Количество вызовов на период; используется только при BASE = TRUE |
| AMPLITUDE | INT | Амплитуда генерируемой функции |
| RESET | BOOL | TRUE: устанавливает OUT в 0 |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| OUT | INT | Сгенерированное значение функции |

Генерация может выполняться относительно заданной временной базы или относительно количества вызовов (BASE). Пример доступных типов периодических функций приведён на изображении.

![Generator](https://docs.owen.ru/book_img/2352/157604.png)

Пример:

Генерация прямоугольного сигнала заданной частоты и амплитуды

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>fbgen<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font FontColor="#E7B639"
?>util<?Pub /_font?><?Pub _font FontColor="white"?>.<?Pub /_font?><?Pub _font
FontColor="#E7B639"?>GEN<?Pub /_font?><?Pub _font FontColor="white"
?>;<?Pub /_font?>   <?Pub _font FontColor="#5DA35B"?>(* экземпляр ФБ *)<?Pub /_font?>
    <?Pub _font FontColor="#7B8DF7"?>signal<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>INT<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>        <?Pub _font FontColor="#5DA35B"?>(* выходной сигнал *)<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#5DA35B"?>(* Генерация треугольника от -AMPLITUDE до +AMPLITUDE.
Период задан по количеству вызовов: BASE = FALSE, CYCLES = 100 *)<?Pub /_font
?>
<?Pub _font FontColor="#7B8DF7"?>fbgen<?Pub /_font?><?Pub _font
FontColor="white"?>(<?Pub /_font?>
    <?Pub _font FontColor="white"?>MODE<?Pub /_font?>      <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="#FFFFCC"?>.TRIANGLE<?Pub /_font
?><?Pub _font FontColor="white"?>,<?Pub /_font?>
    <?Pub _font FontColor="white"?>BASE<?Pub /_font?>      <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="white"
?>FALSE,<?Pub /_font?>
    <?Pub _font FontColor="white"?>CYCLES<?Pub /_font?>    <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>100<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
    <?Pub _font FontColor="white"?>AMPLITUDE<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#FF99CC"
?>1000<?Pub /_font?><?Pub _font FontColor="white"?>,<?Pub /_font?>
    <?Pub _font FontColor="white"?>RESET<?Pub /_font?>     <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="white"
?>FALSE,<?Pub /_font?>
    <?Pub _font FontColor="white"?>OUT<?Pub /_font?>       <?Pub _font
FontColor="#EF7244"?>=&gt;<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>signal<?Pub /_font?>
<?Pub _font FontColor="white"?>);<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-120418"></a>

### Версия библиотеки Util

<a id="topic-120419"></a>

#### Version_Util

**Функция Version_Util** позволяет в программе просмотреть версию библиотеки Util.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
   <?Pub _font FontColor="#7B8DF7"?>wVersion<?Pub /_font?><?Pub _font
FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font FontColor="#E7B639"
?>WORD<?Pub /_font?><?Pub _font FontColor="white"?>;<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#7B8DF7"?>wVersion<?Pub /_font?> <?Pub _font
FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font FontColor="#7B8DF7"
?>util<?Pub /_font?><?Pub _font FontColor="teal"?><?Pub /_font?><?Pub _font
FontColor="white"?>.Version_Util(b<?Pub _font FontColor="#EF7244"
?>:=<?Pub /_font?>True);<?Pub /_font?>
</code></td></tr></tbody></table></div></div>
