Школа для Электрика. Все Секреты Мастерства. Образовательный сайт по электротехнике  
ElectricalSchool.info - большой образовательный проект на тему электричества и его использования. С помощью нашего сайта вы не только поймете, но и полюбите электротехнику, электронику и автоматику!
Электрические и магнитные явления в природе, науке и технике. Современная электроэнергетика, устройство электрических приборов, аппаратов и установок, промышленное электрооборудование и системы электроснабжения, электрический привод, альтернативные источники энергии и многое другое.
 
Школа для электрика | Правила электробезопасности | Электротехника | Электроника | Провода и кабели | Электрические схемы
Автоматизация | Тренды, актуальные вопросы | Обучение электриков | Вебинары и курсы | Калькулятор по электротехнике | Контакты



 

База знаний | Избранные статьи | Эксплуатация электрооборудования | Электроснабжение
Электрические аппараты | Электрические машины | Электропривод | Электрическое освещение

 Школа для электрика / Автоматизация производственных процессов / Типы данных Structured Text в промышленной автоматике: понимание основ программирования ПЛК


 Школа для электрика в Telegram

Типы данных Structured Text в промышленной автоматике: понимание основ программирования ПЛК



На первый взгляд может показаться, что типы данных в языке Structured Text (ST) для программирования ПЛК — это просто скучный справочный материал, который нужно выучить для галочки. Однако это далеко не так. Правильное понимание типов данных — это фундамент, на котором строится эффективное и надежное программное обеспечение для промышленных контроллеров.

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

Типы данных Structured Text в промышленной автоматике

Что такое типы данных и для чего они нужны

В сущности, тип данных — это определение границ и правил для хранения информации в памяти контроллера. Каждый тип данных определяет не только объем памяти, который будет выделен для переменной, но и диапазон значений, которые эта переменная может принимать, а также какие операции с ней допустимы. Это как правила дорожного движения: они не ограничивают вашу свободу, а наоборот, позволяют всем участникам безопасно и предсказуемо взаимодействовать на дороге.

Согласно стандарту IEC 61131-3, который определяет единый подход к программированию промышленных контроллеров во всем мире, существует несколько категорий типов данных. Каждая категория предназначена для решения определенного класса задач, и правильный выбор типа данных — это залог эффективного использования памяти контроллера и точности выполнения расчетов.

Элементарные типы данных

Начнем с самого простого и фундаментального типа — BOOL, булевского типа данных. BOOL занимает в памяти всего один бит и может принимать два значения: TRUE (истина) или FALSE (ложь).

На первый взгляд, такая ограниченность кажется излишней, но в промышленной автоматике булевы переменные встречаются повсеместно. Они используются для представления состояния датчиков, сигналов управления, флагов ошибок и логических условий. Например, датчик, установленный на входе ПЛК, может быть либо активирован, либо нет, и никаких промежуточных состояний не существует.

Числовые типы данных

Следующая категория типов данных — целые числа со знаком: INT, DINT, SINT. Давайте разберемся в различиях между ними с точки зрения физического представления в памяти контроллера.

INT — это 16-битное целое число со знаком, способное хранить значения от -32768 до 32767. Это своего рода стандартный выбор для большинства счетчиков, индексов массивов и управляющих параметров. Почему 16 бит? Потому что это исторически сложившийся баланс между диапазоном значений и размером занимаемой памяти. На заре развития промышленной электроники 16 бит считались оптимальным компромиссом.

DINT — это 32-битное целое число, способное охватить диапазон от -2 147 483 648 до 2 147 483 647. Когда возникает необходимость работать с большими числами, например при подсчете общего количества произведенных единиц продукции за длительный период, INT просто недостаточен. Вот тогда на помощь приходит DINT.

SINT — 8-битное целое число со знаком, способное хранить значения от -128 до 127. Хотя SINT редко используется в современной практике (так как логичнее сразу использовать INT или DINT), все же существуют сценарии, когда экономия памяти критична, например в встроенных системах с очень ограниченным ресурсом.

Существуют также беззнаковые целые числа: UINT (16-битное, 0...65535) и UDINT (32-битное, 0...4294967295). Эти типы используются, когда по смыслу задачи число не может быть отрицательным. Например, при подсчете количества импульсов от счетчика событий используют UINT или UDINT.

Вещественные числа: kontinuum значений

Когда речь идет о датчиках температуры, давления, влажности или при необходимости выполнить вычисления с дробными результатами, на сцену выходят вещественные числа — REAL и LREAL.

REAL — это 32-битное вещественное число, соответствующее стандарту IEEE 754. Оно способно представить значения в диапазоне примерно от ±1.4х10-45 до ±3.4х1038. Важно понимать, что вещественные числа в компьютере хранятся не точно, а с определенной точностью. REAL обеспечивает точность примерно до 6-7 значащих цифр, что вполне достаточно для большинства промышленных приложений.

LREAL — это 64-битное вещественное число, обеспечивающее точность до 15-16 значащих цифр. Используется в сложных инженерных вычислениях, когда требуется высокая точность или работа с очень большими или очень малыми числами.

Физически, вещественное число в памяти представляется в виде: знак (1 бит) + порядок (несколько битов) + мантисса (остаток битов). Этот формат позволяет представить широкий диапазон значений, но за счет некоторой потери точности при округлении.

Строковые типы данных

STRING — это тип данных для хранения текстовых строк переменной длины, до 255 символов. В памяти контроллера строка хранится как последовательность ASCII-кодов символов, плюс некоторая служебная информация для отслеживания длины строки.

Строки широко используются для хранения сообщений об ошибках, логирования событий, отправки информации на дисплеи операторских панелей. Например, когда возникает сбой в работе оборудования, ПЛК может сформировать и отправить оператору строку вида: "Error: Temperature sensor malfunction at 14:32:45".

Временные типы данных

Одной из ключевых функций ПЛК является управление временными параметрами процессов. Для этого служат типы данных TIME, DATE, TIME_OF_DAY и DATE_AND_TIME.

TIME хранит интервал времени или длительность (не привязанную к конкретной дате). Значение может быть задано в виде T#5s (5 секунд), T#100ms (100 миллисекунд), T#2h30m (2 часа 30 минут) и т.д. Физически TIME — это 32-битное целое число, хранящее количество миллисекунд.

DATE хранит календарную дату в формате год-месяц-день (например, D#2026-01-07) и используется при необходимости запомнить или проверить дату какого-либо события.

DATE_AND_TIME объединяет оба этих типа, сохраняя полную информацию о дате и времени, что необходимо для точного временного штампа событий, критичных для последующего анализа производственного процесса.

TIME_OF_DAY хранит время суток без привязки к дате в формате часы:минуты:секунды (например, TOD#14:30:25). Этот 32-битный тип данных ограничен диапазоном от TOD#00:00:00 до TOD#23:59:59,999 и используется для планирования событий по времени — включение освещения в 6:00, остановка оборудования в 18:00 или смена смен в 8:00.

Производные типы данных

По мере усложнения управляемых процессов становится очевидно, что простых типов данных недостаточно. Нам требуется способ организовать несколько связанных переменных в единую логическую сущность. Для этого служат производные типы данных.

ARRAY — это упорядоченная коллекция элементов одного типа. Например, чтобы хранить значения температуры с 10 датчиков, мы можем определить: temperatures: ARRAY[0..9] OF REAL. Каждый элемент массива можно обращать по индексу: temperatures, temperatures и так далее.

STRUCT (структура) — это составной тип данных, позволяющий объединить несколько полей разных типов в единую сущность. Например, для управления насосом можно определить структуру:

TYPE TPump STRUCT
speed: INT; (* скорость вращения *)
pressure: REAL; (* давление нагнетания *)
enabled: BOOL; (* статус включения *)
errorMessage: STRING; (* текст ошибки *)
END_STRUCT

Такой подход существенно упрощает программный код, делает его более организованным и понятным. Вместо того чтобы иметь разрозненные переменные pump_speed, pump_pressure, pump_enabled, мы имеем единый объект myPump, к полям которого обращаемся как myPump.speed, myPump.pressure и т.д.

ENUM (перечисление) позволяет создать набор именованных констант для представления состояний. Вместо того чтобы кодировать состояния цифрами (0, 1, 2...), мы определяем:

TYPE TMotorState ENUM
STOPPED := 0,
ACCELERATING := 1,
RUNNING := 2,
DECELERATING := 3
END_ENUM

Это делает код значительно более читаемым и менее подверженным ошибкам. Когда вы видите в коде condition = TMotorState#RUNNING, вам сразу ясна цель проверки, в отличие от condition = 2.

UNION — это специальный тип данных, в котором несколько полей разных типов совместно используют одну и ту же область памяти. Когда вам нужно интерпретировать одни и те же байты данных по-разному в разных ситуациях (например, в низкоуровневых операциях с аппаратным обеспечением), UNION может оказаться полезным. Однако это редкий случай в высокоуровневой автоматизации.

Типы данных в ST.jpg

Сводная таблица основных типов данных ST

Тип данных Размер Диапазон значений Применение Пример
BOOL 1 бит FALSE / TRUE Сигналы включения/выключения, флаги состояния, логические условия enabled: BOOL := TRUE;
INT 16 бит -32768...32767 Счётчики, индексы массивов, управляющие параметры counter: INT := 100;
DINT 32 бита -2.1х109...2.1х109  Большие счётчики, таймеры, длительные процессы totalCount: DINT := 1000000;
SINT 8 бит -128...127 Экономия памяти в ограниченных системах, малые диапазоны offset: SINT := -50;
UINT 16 бит 0...65535 Беззнаковые счётчики, события, положительные величины eventCount: UINT := 500;
UDINT 32 бита 0...4.3х109 Большие беззнаковые счётчики, импульсы totalEvents: UDINT := 50000;
REAL 32 бита ±3.4х1038 (6-7 знач. цифр) Датчики температуры, давления, вычисления temp: REAL := 25.5;
LREAL 64 бита ±1.7х10308 (15-16 знач. цифр) Высокоточные расчёты, научные вычисления precision: LREAL := 3.141592653589793;
STRING до 255 байт ASCII символы Сообщения об ошибках, логирование, текстовые данные error: STRING := 'Error: Temp overflow';
TIME 32 бита T#0s...T#24d Задержки, интервалы времени, таймеры delay: TIME := T#5s500ms;
DATE 32 бита 1970-2106 Хранение календарных дат, логирование событий eventDate: DATE := D#2026-01-07;
DATE_AND_TIME 64 бита Дата + время Полные временные метки, аудит и трассировка timestamp: DATE_AND_TIME := DT#2026-01-07-20:30:00;
ARRAY Переменный До 65536 элементов Списки данных, таблицы поиска, буферы temps: ARRAY[0..9] OF REAL;
STRUCT Переменный Несколько полей Объединение разнородных данных, объектная организация myPump: TPump;

Эта таблица служит быстрым справочником для инженера, позволяя за несколько секунд найти подходящий тип данных для конкретной задачи. Обратите внимание на взаимосвязь между размером типа данных и его диапазоном: каждый дополнительный бит памяти позволяет представить в два раза больше различных значений. Это один из фундаментальных принципов информатики, и понимание его критично для профессиональной работы с программированием контроллеров.

Преобразование типов данных

Одна из сложных и требующих внимания тем — это преобразование (конвертация) между разными типами данных. Например, результат деления двух целых чисел может быть вещественным числом. Или нам может потребоваться преобразовать строку в целое число, прочитанную с операторской панели.

Преобразования могут быть неявными (автоматическими) и явными (требующими явного указания функции). Так, преобразование INT в DINT — это всегда безопасное преобразование (неявное), так как меньшее число всегда может быть представлено в большем диапазоне. А преобразование REAL в INT требует явного указания функции (например, TRUNC или ROUND), так как оно связано с потерей дробной части и может привести к ошибкам.

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

Представим себе простую задачу управления производственной линией. На входе ПЛК — датчики (BOOL для сигналов наличия/отсутствия, REAL для температур и давлений). Нам нужно считать, сколько единиц продукции произведено (INT или UDINT), контролировать временные интервалы между операциями (TIME), сохранять логи ошибок (STRING), и управлять состояниями оборудования (ENUM).

Правильная организация этих данных с использованием STRUCT позволяет нам написать чистый, хорошо структурированный код, который легко понимается другими инженерами, проще отлаживается, и менее подвержен ошибкам. Это не просто удобство программиста — это инвестиция в надежность и долгосрочную поддерживаемость программного обеспечения.

Практическая реализация

Если вы хотите не просто прочитать об этом, но и интерактивно изучить все типы данных Structured Text, поэкспериментировать с примерами кода и проверить свои знания через квиз, то вам понравится интерактивное веб-приложение "Типы данных ST для ПЛК", доступное по адресу https://electricalschool.info/st-with-telegram.html

Это приложение предоставляет полное справочное руководство по всем типам данных согласно стандарту IEC 61131-3, снабженное примерами кода на Structured Text, встроенным генератором кода для структур данных, интерактивным квизом для проверки знаний и таблицами преобразования типов. Интерфейс приложения интуитивно понятен, данные организованы логически, что позволяет быстро найти нужную информацию или углубить понимание необходимого типа данных.

Путь к мастерству: как глубже изучить ST

Structured Text легко осваивается, но мастерство требует практики. Эта статья дала базу для простых программ, но для сложных техник нужна практика.

Подпишитесь на канал «ПЛК и автоматизация» в Telegram — https://t.me/plcmasters:

  • Детальные туториалы по ST и IEC 61131-3;
  • Практические примеры из производства;
  • Советы по оптимизации и лучшие практики.

Сообщество профессионалов поможет развить навыки. Присоединяйтесь и управляйте сложными процессами!

Телеграмм каналы для тех, кто каждый день хочет узнавать новое и интересное:

Упростите расчеты электрических цепей с помощью удобного приложения:
Онлайн-калькулятор по электротехнике

Интерактивное веб-приложение: Обучение теоретическим основам электротехники (ТОЭ)

Онлайн-калькулятор освещения: Калькулятор освещения LED-светильниками

Интерактивный инструмент для изучения возобновляемой энергетики: Симулятор микросетей

Для повышения вашей продуктивности: Таймер по методу Pomodoro

Развивайте свои профессиональные навыки:
Каталог обучающих вебинаров и курсов для технических специалистов

Выбирайте удобный формат и темы!