Операции перемещения
Передача и управление данными
Передача данных — это кровеносная система вашей программы ПЛК. Эффективно управляйте копированием переменных, сериализацией структур и манипуляциями с блоками памяти.
Что такое операции перемещения в TIA Portal?
Операции перемещения позволяют копировать данные из одного места памяти в другое. Они варьируются от простого копирования переменной (MOVE) до сложной манипуляции целыми структурами для связи (Serialize/Deserialize) или управления непрерывными областями данных (MOVE_BLK).
TIA Portal предлагает современные инструкции для символьного доступа, динамического управления через типы Variant и оптимизированные функции для Array DB, сохраняя при этом инструкции Legacy для совместимости со старыми системами S7-300.
Базовая передача
Фундаментальные инструкции копирования и форматирования
MOVE — Копировать значение
MOVEЧто она делает
Копирует содержимое входа IN на выход OUT. Если типы данных различаются, может произойти неявное преобразование, если оно безопасно.
Когда использовать
Инициализация переменных, копирование уставок HMI или передача результатов расчетов.
Советы профи
Вы можете добавить несколько выходов (OUT1, OUT2...), чтобы скопировать значение в несколько мест одновременно.
В SCL просто используйте присваивание: destination := source;
Работает почти со всеми типами данных (Bool, Int, Real, Struct, String).
Serialize / Deserialize
SERЧто они делают
Serialize преобразует сложную структуру в последовательный поток байтов (Array of Byte). Deserialize делает обратное.
Когда использовать
Подготовка данных для отправки по протоколам связи (TCP/IP, UDP) или компактного хранения.
Советы профи
Используйте параметр POS для отслеживания индекса заполнения в целевом буфере.
Необходимо для обмена с системами сторонних производителей, которые не понимают UDT Siemens.
Убедитесь, что размер буфера достаточен во избежание ошибок во время выполнения.
SWAP — Переставить байты
SWAPЧто она делает
Меняет порядок байтов (Endianness) в операнде IN.
Когда использовать
Связь с устройствами, использующими формат 'Little-Endian', когда ПЛК использует 'Big-Endian'.
Советы профи
Обычно используется для типов Word или DWord.
Полезно для обработки данных от определенных датчиков Modbus.
Можно использовать для переупорядочивания ASCII-кодов, полученных в обратном порядке.
Перемещение блоков
Манипуляция массивными и непрерывными областями памяти
MOVE_BLK / UMOVE_BLK
MOVE_BLKЧто она делает
Копирует определенное количество элементов из исходного массива в целевой. UMOVE_BLK — это непрерываемая (атомарная) версия.
Когда использовать
Управление буферами, архивирование исторических данных или дублирование рецептов изготовления.
Советы профи
Начальный индекс (COUNT) определяет количество копируемых элементов.
UMOVE_BLK гарантирует, что данные не будут изменены прерыванием (OB) во время копирования.
Типы данных источника и назначения должны быть идентичными.
MOVE_BLK_VARIANT
Что она делает
Расширенная версия MOVE_BLK, поддерживающая типы данных Variant для гибкой адресации.
Когда использовать
Разработка переиспользуемых библиотечных блоков, работающих с массивами разных размеров или типов.
Советы профи
Позволяет копировать между массивами, типы которых определяются во время выполнения.
Используйте CountOfElements для автоматизации параметра COUNT.
Очень мощный инструмент в S7-1500 для общего программирования.
Заполнение области
Быстрая инициализация диапазонов памяти
FILL_BLK / UFILL_BLK
FILLЧто она делает
Заполняет область памяти (массив) одним значением, указанным на входе IN.
Когда использовать
Сброс массива измерений в ноль или инициализация буфера значением по умолчанию.
Советы профи
UFILL_BLK предпочтительнее для критических областей, разделяемых с прерываниями.
Намного эффективнее, чем цикл FOR для инициализации большого массива.
COUNT указывает количество элементов для заполнения, начиная с указанного указателя.
Scatter / Gather
Разложение и композиция битов
SCATTER / GATHER
Что они делают
SCATTER раскладывает слово (Word, DWord...) на отдельные биты в структуру или массив. GATHER делает обратное.
Когда использовать
Извлечение битов состояния из слова диагностики или формирование командного слова из контрольных битов.
Советы профи
Выгодно заменяет множество доступов к битам (например, %X0).
Доступно на S7-1200 и S7-1500.
Обеспечивает более чистый и простой в обслуживании код.
Доступ к Array DB
Чтение и запись в блоках данных типа массив
ReadFromArrayDB / WriteToArrayDB
Что они делают
Позволяют читать или записывать определенный элемент в блоке данных, настроенном как 'Array DB'.
Когда использовать
Управление большими списками данных, где индексация должна быть динамической и быстрой.
Советы профи
Версии 'L' (например, ReadFromArrayDBL) обращаются к загрузочной памяти (Load Memory) для редко используемых данных.
Использование Array DB часто эффективнее, чем классический индексный доступ.
Убедитесь, что индекс находится в допустимых пределах во избежание ошибки доступа.
Манипуляция Variant
Инструменты для динамического программирования
VariantGet / VariantPut
Что они делают
VariantGet извлекает значение переменной Variant в типизированную переменную. VariantPut записывает типизированное значение в переменную Variant.
Когда использовать
Обработка данных, точный тип которых известен только в момент вызова блока.
Советы профи
Используйте EQ_Type для проверки типа перед извлечением значения.
Фундаментально для создания общих функций связи.
CountOfElements возвращает количество элементов, если Variant указывает на массив.
Границы массива
Динамическое определение пределов
LOWER_BOUND / UPPER_BOUND
Что она делает
Возвращает нижнюю (LOWER) или верхнюю (UPPER) границу массива, переданного как параметр Variant.
Когда использовать
Цикл по массиву неизвестного размера (например, Array[*] of MyUDT).
Советы профи
Необходимо для написания надежных циклов FOR: FOR i := LOWER_BOUND(...) TO UPPER_BOUND(...) DO
Работает как с одномерными, так и с многомерными массивами.
Параметр DIM указывает желаемую размерность (по умолчанию 1).
Инструкции Legacy
Совместимость со старыми системами S7-300/400
Инструкции, такие как BLKMOV, FILL и FieldRead/FieldWrite, сохранены для совместимости. Для новых проектов S7-1200/1500 предпочтительнее MOVE_BLK, FILL_BLK и прямой символьный доступ.
Сравнение методов копирования
Выбор правильной инструкции передачи
| Вам нужно... | Рекомендуемая инструкция | Пример |
|---|---|---|
| Копировать простую переменную | MOVE | Уставка -> Текущее |
| Копировать область памяти | MOVE_BLK | Буфер FIFO |
| Инициализировать массив | FILL_BLK | Сброс ошибок |
| Подготовить сообщение TCP | Serialize | Структура -> Поток байтов |
| Разбить слово на биты | SCATTER | Диагностика слова -> структура |
| Динамический доступ | VARIANT | Универсальный библиотечный блок |
Часто задаваемые вопросы
В чем разница между MOVE и MOVE_BLK?
MOVE предназначен для копирования одного значения или целой структуры за раз. MOVE_BLK оптимизирован для копирования части массива (определенного количества последовательных элементов).
Зачем использовать UMOVE_BLK вместо MOVE_BLK?
Буква 'U' означает Uninterruptible (непрерываемый). Эта инструкция гарантирует, что операция копирования не будет прервана циклом прерывания (приоритетными OB), обеспечивая полную согласованность скопированных данных.
Когда использовать Serialize и Deserialize?
Эти инструкции жизненно важны, когда вам нужно отправить структурированные данные через 'сырые' протоколы, такие как TSEND/TRCV, или на оборудование сторонних производителей. Они управляют выравниванием байтов стандартным образом.
Работает ли MOVE_BLK с абсолютными адресами (P#DB1.DBX0.0...)?
Да, но TIA Portal поощряет использование символьного доступа. Для сложной абсолютной адресации все еще используется BLKMOV (Legacy), хотя MOVE_BLK_VARIANT является рекомендуемым современным решением.