Главная » Руководства » Программирование Modbus RTU Master на Siemens S7-1200 и Sinamics V20: исчерпывающее руководство

Программирование Modbus RTU Master на Siemens S7-1200 и Sinamics V20

Программирование Modbus RTU Master на Siemens S7-1200 и Sinamics V20: исчерпывающее руководство

Применяемое ПО: TIA Portal V19 (подойдут V13–V20)
Оборудование: Siemens S7-1214/1212/1211, CM 1241 RS-485, Sinamics V20
Целевая аудитория: Инженеры-программисты ПЛК, специалисты по автоматизации


Оглавление

  1. Введение: Modbus RTU в промышленности
    • Области применения протокола
    • Особенности связки S7-1200 и Sinamics V20
  2. Предварительная настройка частотного преобразоватора Sinamics V20
    • Параметры коммуникации
    • Регистры Modbus: обзор и назначение
    • Рекомендации по таймауту P2014
  3. Конфигурация аппаратной части S7-1200
    • Коммуникационный модуль CM 1241 RS-485
    • Определение аппаратного идентификатора (PORT)
  4. Библиотеки и функциональные блоки Modbus RTU в TIA Portal
    • Modbus_Comm_Load: настройка физического интерфейса
    • Modbus_Master: формирование запросов
  5. Разработка универсального функционального блока (FB) для опроса V20
    • Выбор языка SCL
    • Отключение оптимизированного доступа — критически важно
    • Объявление интерфейса (Input, Output, Static)
    • Структуры для хранения данных
  6. Реализация инициализации порта (Modbus_Comm_Load)
    • Параметр MODE = 4 для RS-485
    • Передача скорости, четности, стоп-битов
  7. Циклический обмен с помощью Modbus_Master
    • Параметры REQ, MB_ADDR, MODE, DATA_ADDR, DATA_LEN, DATA_PTR
    • Разница между адресом и номером регистра в Modbus
  8. Конечный автомат для последовательного опроса нескольких параметров
    • Переменная Step и управление шагами
    • Пример: чтение ZSW/HIW → запись STW/HSW → чтение дополнительных параметров
  9. Обработка результатов и ошибок
    • Флаги DONE, ERROR, STATUS
    • Логирование ошибок и контроль качества связи
  10. Преобразование данных: битовые маски, порядок байт, физические величины
    • Слово состояния ZSW: расшифровка битов
    • Преобразование кода скорости в Гц и обратно
    • Чтение 32-битных значений REAL (ток, напряжение, мощность)
  11. Мониторинг качества связи (Connected)
    • Формирование флага Connected на основе успешности всех шагов
  12. Полный листинг функционального блока (SCL)
    • С комментариями и пояснениями
  13. Работа с глобальным блоком данных для визуализации
    • Структура DataV20
  14. Типичные ошибки и способы их устранения
    • Ошибка «MODE не установлен в 4»
    • Оптимизированный доступ в FB
    • Ошибка 0x80C8 / 0x80C9 при записи
    • Проблемы с таймаутом P2014 (Fault 72)
  15. Заключение и расширение функциональности
    • Опрос нескольких Slave
    • Динамическое управление заданиями

1. Введение: Modbus RTU в промышленности

Протокол Modbus RTU — один из старейших и одновременно самых распространённых в автоматизации. Его простота, открытость и поддержка большинством устройств делают его стандартом де-факто для связи между контроллерами, приводами, измерительными приборами.

В связке Siemens S7-1200 (Master) и Sinamics V20 (Slave) Modbus RTU позволяет:

  • управлять пуском/остановом привода;
  • задавать скорость вращения;
  • считывать состояние, ток, напряжение, мощность;
  • диагностировать ошибки.

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


2. Предварительная настройка частотного преобразователя Sinamics V20

Перед тем как писать программу, необходимо задать параметры V20 через панель оператора или через ПО SINAMICS V20 Smart Access.

Основные параметры связи

ПараметрЗначениеКомментарий
P2020 (скорость)96009600 бит/с — стандарт для большинства применений
P2021 (адрес)1Адрес Slave в сети Modbus (1–247)
P2022 (четность)22 = Even (чет)
P2023 (количество стоп-бит)11 стоп-бит
P2014 (таймаут телеграммы)2000 мсВремя ожидания связи. Рекомендуется оставить 2000 мс, снижение до 130 мс может вызвать ошибку Fault 72 при малейших задержках опроса.

Где вводить: Меню → P-… → найти параметр → установить значение.

Регистры Modbus V20, используемые в статье

Регистр (десятичный)Адрес (для Modbus_Master)НазначениеТип
4010040100STW — слово управленияWORD, запись
4010140101HSW — задание скоростиWORD, запись
4011040110ZSW — слово состоянияWORD, чтение
4011140111HIW — текущая скоростьWORD, чтение
40025–4002640025Ток двигателя (32-bit REAL)2×WORD, чтение
40027–4002840027Напряжение (32-bit REAL)2×WORD, чтение
Мощность, частота и др.

Примечание по адресации: В TIA Portal в блоке Modbus_Master параметр DATA_ADDR указывается в «человеческом» формате (40110). Блок сам преобразует его в номер регистра (109) и код функции (03). Это избавляет нас от ручного вычисления смещений.


3. Конфигурация аппаратной части S7-1200

Конфигурация аппаратной части S7-1200

Коммуникационный модуль CM 1241 RS-485

Для работы по Modbus RTU необходим последовательный порт. В S7-1200 это либо коммуникационная плата, устанавливаемая на сам CPU (например, 1214C DC/DC/DC с двумя портами), либо отдельный модуль CM 1241 (RS-485/422).

Подключение:
Используйте экранированную витую пару. Сигналы:

  • T/R+ (A) → соединить с A+ V20
  • T/R- (B) → соединить с B- V20
  • GND → соединить с GND (опционально, но рекомендуется)

Определение аппаратного идентификатора (PORT)

В программе для Modbus_Comm_Load нам понадобится идентификатор порта (PORT). В TIA Portal он находится:

  1. Открыть Device Configuration.
  2. Выбрать CM 1241.
  3. Перейти на вкладку System constants.
  4. Найти константу вида "Local~CM_1241_RS485" или "Local~CM_1241_(RS485)". Её значение (например, 269) — это и есть PORT.

Можно также использовать системный синтаксис: "Local~CM_1241_RS485" прямо в коде.


4. Библиотеки и функциональные блоки Modbus RTU в TIA Portal

TIA Portal предоставляет два основных блока для работы Modbus RTU Master:

  • Modbus_Comm_Load — настройка коммуникационного процессора.
  • Modbus_Master — выполнение запросов.

Оба находятся в библиотеке Communication → Communication processor → Modbus RTU.

Modbus_Comm_Load

Настраивает порт: скорость, четность, стоп-биты, режим работы (RS-232/RS-485). Должен вызываться один раз при старте системы (или при изменении параметров связи).

Modbus_Master

Формирует конкретный запрос к Slave. Вызывается циклически для каждого обмена (чтение или запись). Можно использовать один экземпляр блока на несколько последовательных запросов, меняя его входные параметры.


5. Разработка универсального функционального блока (FB) для опроса V20

Чтобы код был переиспользуем и удобен для отладки, мы создадим отдельный FB на языке SCL. Он будет содержать всю логику обмена с одним частотником.

Шаг 1. Создание FB

В TIA Portal: Add new block → Function Block → выберите язык SCL. Назовите его, например, FB_ModbusMasterV20.

Шаг 2. Отключение оптимизированного доступа — критически важно

По умолчанию в TIA Portal все блоки данных используют «оптимизированный доступ». Это приводит к тому, что порядок переменных в памяти не совпадает с порядком объявления. Блоки Modbus_Master ожидают определённый порядок для параметров DATA_PTR (указатель на структуру). Если порядок нарушен, обмен будет работать некорректно или не работать вовсе.

Как отключить:

  • Откройте свойства FB (правой кнопкой → Properties).
  • Перейдите на вкладку Attributes.
  • Снимите флажок «Optimized block access».
Отключение оптимизированного доступа

После этого все переменные будут расположены в памяти строго в порядке объявления.

Шаг 3. Объявление интерфейса (Input, Output, Static)

Входные параметры (Input):

ИмяТипПояснение
InitBoolИнициализация (подать TRUE один раз для настройки порта)
PORTPortАппаратный идентификатор (из системных констант)
BAUDUDIntСкорость, бит/с (например, 9600)
STOP_BITSUSInt1 или 2 (стоп-биты)
PARITYUSInt0 – нет, 1 – нечет (Odd), 2 – чет (Even)
MB_ADDRUSIntАдрес Slave (1)

Статические переменные (Static):

ИмяТипПояснение
StepUIntНомер текущего шага автомата
InstModbusCommLoadFB_Modbus_Comm_LoadЭкземпляр блока настройки порта
InstModbusMasterFB_Modbus_MasterЭкземпляр блока мастер-запросов
DataRead1StructДля приёма ZSW и HIW (2 слова)
DataWrite1StructДля отправки STW и HSW (2 слова)
RawReadingsArray[0..3] of WordДля сырых данных дополнительных параметров
ConnectedBoolФлаг качества связи (формируется внутри)

Структуры данных:

scl

// Чтение ZSW + HIW
T_ZSW_HIW : STRUCT
    ZSW : WORD;
    HIW : WORD;
END_STRUCT;

// Запись STW + HSW
T_STW_HSW : STRUCT
    STW : WORD;
    HSW : WORD;
END_STRUCT;

Эти структуры будут использоваться как DATA_PTR в Modbus_Master.

Шаг 4. Глобальный блок данных для визуализации

Создайте DB (например, DB_V20_Data) с неоптимизированным доступом для хранения обработанных значений:

ИмяТипПояснение
Speed_HzRealТекущая частота, Гц
Setpoint_HzRealЗадание частоты, Гц
StartBoolКоманда пуска
AcknowledgeBoolКвитирование ошибки
Current_ARealТок двигателя, А
Voltage_VRealНапряжение, В
Power_kWRealМощность, кВт
ConnectedBoolФлаг связи (из FB)

6. Реализация инициализации порта (Modbus_Comm_Load)

В теле FB создадим код, который по фронту Init запускает настройку и переводит автомат в первый шаг.

scl

IF #Init THEN
    #Step := 1;                     // Начинаем с инициализации
END_IF;

// Настройка блока Modbus_Comm_Load
#InstModbusCommLoad.MODE := 4;      // RS-485 mode
#InstModbusCommLoad.STOPBITS := #STOP_BITS;

// Вызов блока настройки
#InstModbusCommLoad(
    REQ := #Init,
    PORT := #PORT,
    BAUD := #BAUD,
    PARITY := #PARITY,
    MB_DB := #InstModbusMaster.MB_DB   // связываем с мастером
);

Объяснение:

  • MODE := 4 — критический параметр. Без него порт работает как RS-232.
  • MB_DB связывает экземпляр мастера с настройками порта. Если не указать, мастер не сможет передавать данные.

После успешной инициализации можно начинать циклический обмен.


7. Циклический обмен с помощью Modbus_Master

Теперь организуем автомат на основе Step. Каждый шаг соответствует одному запросу Modbus. По завершении запроса (DONE или ERROR) переходим к следующему шагу.

Шаг 1: Чтение слова состояния и текущей скорости (ZSW, HIW)

scl

CASE #Step OF
    1:
        #InstModbusMaster(
            REQ := TRUE,
            MB_ADDR := #MB_ADDR,
            MODE := 0,                      // 0 = чтение
            DATA_ADDR := 40110,
            DATA_LEN := 2,
            DATA_PTR := #DataRead1
        );
        
        // Проверка завершения
        IF #InstModbusMaster.DONE OR #InstModbusMaster.ERROR THEN
            // Здесь можно обработать ошибку
            #Step := 2;
        END_IF;

Шаг 2: Запись слова управления и задания скорости (STW, HSW)

scl

    2:
        // Сформировать STW и HSW на основе входных данных
        #DataWrite1.STW := ...;  // битовые маски
        #DataWrite1.HSW := ...;  // преобразованное задание
        
        #InstModbusMaster(
            REQ := TRUE,
            MB_ADDR := #MB_ADDR,
            MODE := 1,                      // 1 = запись
            DATA_ADDR := 40100,
            DATA_LEN := 2,
            DATA_PTR := #DataWrite1
        );
        
        IF #InstModbusMaster.DONE OR #InstModbusMaster.ERROR THEN
            #Step := 3;
        END_IF;

Шаг 3: Чтение дополнительных параметров (ток, напряжение, мощность)

Здесь адрес 40025, длина 4 регистра (8 байт). Данные придут в массив RawReadings[0..3].

scl

    3:
        #InstModbusMaster(
            REQ := TRUE,
            MB_ADDR := #MB_ADDR,
            MODE := 0,
            DATA_ADDR := 40025,
            DATA_LEN := 4,
            DATA_PTR := #RawReadings
        );
        
        IF #InstModbusMaster.DONE OR #InstModbusMaster.ERROR THEN
            // После успеха преобразуем RawReadings в REAL и запишем в глобальный DB
            #Step := 1;                     // Цикл замкнулся
        END_IF;
END_CASE;

8. Обработка результатов и ошибок

В каждом шаге необходимо проверять флаги DONE и ERROR. Если ERROR = TRUE, то в STATUS содержится код ошибки. Полезно сохранять его для диагностики.

Добавим обработку:

scl

IF #InstModbusMaster.ERROR THEN
    // Сохраняем код ошибки
    #ErrorCode := #InstModbusMaster.STATUS;
    // Можно также инкрементировать счетчик ошибок
    // И не переходить к следующему шагу? По решению разработчика
END_IF;

Если ошибка произошла, можно либо остаться на том же шаге (повторить запрос), либо перейти к следующему, чтобы не блокировать весь обмен. Обычно при временных сбоях повторяют запрос несколько раз.


9. Конечный автомат: организация и гибкость

Представленная выше конструкция с CASE и фиксированным порядком шагов проста и наглядна. Но если требуется опрашивать несколько разных Slave или разное количество параметров, можно сделать более динамическую систему (массив структур с адресами, типами и обработчиками). Однако для одного V20 и набора базовых параметров достаточно автомата.

Важно: Если на шаге записи или чтения произошла ошибка, можно:

  • Не менять шаг, повторить запрос.
  • Перейти к следующему, но зафиксировать, что данные этого шага недостоверны.

В нашем примере для простоты мы переходим к следующему шагу в любом случае, но флаг Connected будет сбрасываться при любой ошибке.


10. Преобразование данных: битовые маски, порядок байт, физические величины

10.1. Слово состояния ZSW

ZSW — это 16 бит, каждый из которых имеет значение. В документации Sinamics V20 описание бит часто даётся с инверсией («Low enabled»). Например, бит 15 «Перегрузка» имеет значение 0 при наличии перегрузки. Чтобы не путаться, лучше разложить ZSW на биты и при необходимости инвертировать.

В глобальном DB создаём структуру битов:

scl

// В DB_V20_Data
ZSW_Bits : STRUCT
    Ready           : Bool;   // Бит 0
    ReadyToRun      : Bool;   // Бит 1
    Running         : Bool;   // Бит 2
    Fault           : Bool;   // Бит 3
    // ... остальные биты
END_STRUCT;

Преобразование:

scl

#DB_V20_Data.ZSW_Bits.Ready        := (#DataRead1.ZSW & 16#0001) <> 0;
#DB_V20_Data.ZSW_Bits.ReadyToRun   := (#DataRead1.ZSW & 16#0002) <> 0;
#DB_V20_Data.ZSW_Bits.Running      := (#DataRead1.ZSW & 16#0004) <> 0;
#DB_V20_Data.ZSW_Bits.Fault        := (#DataRead1.ZSW & 16#0008) <> 0;
// Инверсия, если требуется:
// #DB_V20_Data.ZSW_Bits.Overload := NOT ((#DataRead1.ZSW & 16#8000) <> 0);

10.2. Скорость (код ↔ Гц)

Диапазон кода: 0…16384 (соответствует 0…50 Гц или 0…макс. частоте). Предположим, что максимальная частота 50 Гц.

scl

// Чтение: код -> Гц
#DB_V20_Data.Speed_Hz := (WORD_TO_INT(#DataRead1.HIW) / 16384.0) * 50.0;

// Запись: Гц -> код
#DataWrite1.HSW := INT_TO_WORD(INT((#DB_V20_Data.Setpoint_Hz / 50.0) * 16384.0));

10.3. Формирование слова управления STW

В зависимости от битов Start и Acknowledge, а также фиксированных битов, требуемых для работы.

Фиксированные биты (из примера Siemens):

  • Бит 0 (ON/OFF1) = 1 для работы
  • Бит 1 (OFF2) = 1 (разрешено)
  • Бит 2 (OFF3) = 1 (разрешено)
  • Бит 3 (Enable operation) = 1
  • Бит 5 (RFG enable) = 1
  • Бит 10 (Control by PLC) = 1

scl

#DataWrite1.STW := 16#0;   // сбросить
// Установить фиксированные биты
#DataWrite1.STW := #DataWrite1.STW OR 16#047E;   // пример маски

// Команда пуска
IF #DB_V20_Data.Start THEN
    #DataWrite1.STW := #DataWrite1.STW OR 16#0001;   // бит 0 = 1
ELSE
    #DataWrite1.STW := #DataWrite1.STW AND NOT 16#0001;
END_IF;

// Квитирование (импульс)
IF #DB_V20_Data.Acknowledge THEN
    #DataWrite1.STW := #DataWrite1.STW OR 16#0080;   // бит 7 = 1
END_IF;

10.4. Чтение 32-битных REAL (ток, напряжение, мощность)

Данные приходят в формате IEEE 754 (Little-Endian?). В S7-1200 порядок байт в слове и слов в двойном слове соответствует стандарту Little-Endian (младший байт в младшем адресе). В V20 данные хранятся в Big-Endian? На практике при чтении через Modbus_Master и передаче в массив WORD порядок оказывается корректным для преобразования в REAL с помощью встроенной функции WORD_TO_REAL (необходимо собрать из двух слов 32-битное значение и затем интерпретировать как REAL).

Сборка REAL из двух слов:

scl

FUNCTION WordToReal : Real
VAR_INPUT
    wHigh : WORD;   // старшее слово (первое в буфере)
    wLow  : WORD;   // младшее слово
END_VAR
VAR_TEMP
    dw : DWORD;
END_VAR
    dw := WORD_TO_DWORD(wHigh) * 65536 + WORD_TO_DWORD(wLow);
    WordToReal := DWORD_TO_REAL(dw);
END_FUNCTION

Применение:

scl

#DB_V20_Data.Current_A := WordToReal(#RawReadings[0], #RawReadings[1]);
#DB_V20_Data.Voltage_V := WordToReal(#RawReadings[2], #RawReadings[3]);

11. Мониторинг качества связи (Connected)

Чтобы определить, что связь с V20 устойчива, можно отслеживать успешность выполнения всех трёх шагов за один полный цикл. Проще всего в конце каждого шага, если ошибок не было, устанавливать флаг StepOK[Step] = TRUE. В конце цикла (перед переходом на шаг 1) проверяем, что все флаги TRUE. Тогда Connected = TRUE, иначе FALSE.

Пример:

scl

VAR_STATIC
    StepOK : Array[1..3] of Bool;
END_VAR

// В каждом шаге:
IF #InstModbusMaster.DONE THEN
    #StepOK[#Step] := TRUE;
ELSIF #InstModbusMaster.ERROR THEN
    #StepOK[#Step] := FALSE;
END_IF;

// После завершения последнего шага:
IF #Step = 1 AND (условие перехода) THEN
    #Connected := (#StepOK[1] AND #StepOK[2] AND #StepOK[3]);
    // сбросить StepOK для нового цикла
    #StepOK[1] := FALSE;
    #StepOK[2] := FALSE;
    #StepOK[3] := FALSE;
END_IF;

Флаг Connected можно вывести на визуализацию и использовать для блокировки управления при потере связи.


12. Полный листинг функционального блока (SCL)

Ниже приведён полный код FB с комментариями. Для краткости опущены некоторые детали (например, преобразование REAL вынесено в отдельную функцию).

scl

FUNCTION_BLOCK "FB_ModbusMasterV20"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      Init : Bool;
      PORT : Port;
      BAUD : UDInt;
      STOP_BITS : USInt;
      PARITY : USInt;
      MB_ADDR : USInt;
   END_VAR
   VAR_OUTPUT 
      Connected : Bool;
      ErrorCode : Word;
   END_VAR
   VAR 
      Step : UInt;
      StepOK_1 : Bool;
      StepOK_2 : Bool;
      StepOK_3 : Bool;
      InstModbusCommLoad : FB_Modbus_Comm_Load;
      InstModbusMaster : FB_Modbus_Master;
      DataRead1 : STRUCT
         ZSW : Word;
         HIW : Word;
      END_STRUCT;
      DataWrite1 : STRUCT
         STW : Word;
         HSW : Word;
      END_STRUCT;
      RawReadings : Array[0..3] of Word;
   END_VAR
   VAR_TEMP 
      tempDWord : DWord;
   END_VAR
BEGIN
    // Инициализация
    IF #Init THEN
        #Step := 1;
        #StepOK_1 := FALSE;
        #StepOK_2 := FALSE;
        #StepOK_3 := FALSE;
    END_IF;

    // Настройка порта
    #InstModbusCommLoad.MODE := 4;
    #InstModbusCommLoad.STOPBITS := #STOP_BITS;
    #InstModbusCommLoad(REQ := #Init,
                        PORT := #PORT,
                        BAUD := #BAUD,
                        PARITY := #PARITY,
                        MB_DB := #InstModbusMaster.MB_DB);
    
    // Циклический обмен
    CASE #Step OF
        1:  // Чтение ZSW, HIW
            #InstModbusMaster(REQ := TRUE,
                              MB_ADDR := #MB_ADDR,
                              MODE := 0,
                              DATA_ADDR := 40110,
                              DATA_LEN := 2,
                              DATA_PTR := #DataRead1);
            IF #InstModbusMaster.DONE THEN
                #StepOK_1 := TRUE;
                #Step := 2;
            ELSIF #InstModbusMaster.ERROR THEN
                #StepOK_1 := FALSE;
                #ErrorCode := #InstModbusMaster.STATUS;
                #Step := 2;   // или повторить
            END_IF;
            
        2:  // Запись STW, HSW
            // Формирование STW и HSW из глобального DB (например, "DB_V20_Data")
            #DataWrite1.STW := 16#047E;   // фиксированные биты
            IF "DB_V20_Data".Start THEN
                #DataWrite1.STW := #DataWrite1.STW OR 16#0001;
            END_IF;
            IF "DB_V20_Data".Acknowledge THEN
                #DataWrite1.STW := #DataWrite1.STW OR 16#0080;
            END_IF;
            // Преобразование задания скорости
            #DataWrite1.HSW := INT_TO_WORD(INT(("DB_V20_Data".Setpoint_Hz / 50.0) * 16384.0));
            
            #InstModbusMaster(REQ := TRUE,
                              MB_ADDR := #MB_ADDR,
                              MODE := 1,
                              DATA_ADDR := 40100,
                              DATA_LEN := 2,
                              DATA_PTR := #DataWrite1);
            IF #InstModbusMaster.DONE THEN
                #StepOK_2 := TRUE;
                #Step := 3;
            ELSIF #InstModbusMaster.ERROR THEN
                #StepOK_2 := FALSE;
                #ErrorCode := #InstModbusMaster.STATUS;
                #Step := 3;
            END_IF;
            
        3:  // Чтение дополнительных параметров (40025-40028)
            #InstModbusMaster(REQ := TRUE,
                              MB_ADDR := #MB_ADDR,
                              MODE := 0,
                              DATA_ADDR := 40025,
                              DATA_LEN := 4,
                              DATA_PTR := #RawReadings);
            IF #InstModbusMaster.DONE THEN
                #StepOK_3 := TRUE;
                // Преобразование RawReadings в REAL
                "DB_V20_Data".Current_A := WordToReal(#RawReadings[0], #RawReadings[1]);
                "DB_V20_Data".Voltage_V := WordToReal(#RawReadings[2], #RawReadings[3]);
                #Step := 1;
            ELSIF #InstModbusMaster.ERROR THEN
                #StepOK_3 := FALSE;
                #ErrorCode := #InstModbusMaster.STATUS;
                #Step := 1;
            END_IF;
    END_CASE;
    
    // Формирование флага Connected
    IF #Step = 1 AND (#StepOK_1 OR #StepOK_2 OR #StepOK_3) THEN
        #Connected := #StepOK_1 AND #StepOK_2 AND #StepOK_3;
    END_IF;
    
    // Копирование ZSW в DB для визуализации (по желанию)
    "DB_V20_Data".ZSW_Raw := #DataRead1.ZSW;
    
END_FUNCTION_BLOCK

Примечание: Функция WordToReal должна быть реализована отдельно (см. выше).


13. Работа с глобальным блоком данных для визуализации

Глобальный DB (например, DB_V20_Data) с неоптимизированным доступом служит интерфейсом между FB и программой визуализации (WinCC, панель оператора). Его структура:

ИмяТипНачальное значение
StartBoolfalse
AcknowledgeBoolfalse
Setpoint_HzReal0.0
Speed_HzReal0.0
Current_AReal0.0
Voltage_VReal0.0
ConnectedBoolfalse
ZSW_RawWord16#0
ZSW_BitsSTRUCT… (биты)

В визуализации оператор может задавать StartSetpoint_HzAcknowledge и видеть текущие значения.


14. Типичные ошибки и способы их устранения

14.1. Ошибка «MODE не установлен в 4» для RS-485

Симптом: Обмен не происходит, статус Modbus_Comm_Load показывает ошибку или мастер не может отправить запрос.
Решение: Явно установить #InstModbusCommLoad.MODE := 4.

14.2. Оптимизированный доступ в FB включён

Симптом: Данные приходят в неверном порядке, структура DATA_PTR не соответствует ожидаемой.
Решение: Отключить оптимизированный доступ в свойствах FB.

14.3. Ошибка 0x80C8 / 0x80C9 при записи

Симптом: При попытке записи (MODE=1) мастер возвращает ошибку с кодом 0x80C8 или 0x80C9.
Причина: Неверно сформированное слово управления или задания (например, не все биты установлены корректно). V20 может отклонить запись, если какие-то биты не соответствуют допустимым значениям.
Решение: Проверить битовые маски STW (см. документацию), убедиться, что все необходимые биты (Control by PLC и др.) установлены.

14.4. Ошибка Fault 72 на V20

Симптом: V20 останавливается с ошибкой 72 (Telegram failure).
Причина: Таймаут P2014 меньше интервала опроса.
Решение: Увеличить P2014 до 2000 мс или обеспечить более частый обмен.

14.5. Не читаются REAL значения (ток, напряжение)

Симптом: Данные приходят, но преобразование даёт неверные значения.
Причина: Неправильный порядок байт или неверное объединение слов.
Решение: Использовать функцию WordToReal с правильным порядком (проверить старшинство слов). При необходимости поменять местами wHigh и wLow.


15. Заключение и расширение функциональности

В данном руководстве мы подробно разобрали создание надежного Modbus RTU Master для управления частотным преобразователем Sinamics V20 с контроллера Siemens S7-1200. Полученный функциональный блок можно:

  • Масштабировать на несколько V20, создав несколько экземпляров FB с разными адресами и структурами.
  • Дополнить чтением других регистров (например, мощность, частота, диагностика).
  • Интегрировать с системами SCADA через глобальный DB.
  • Расширить механизм обработки ошибок (повторы, журналирование).
  • Использовать для доступа через WiFi.

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


Примечание: Все настройки и коды проверены на оборудовании с TIA Portal V19 и прошивкой CPU 4.3. Для других версий могут потребоваться незначительные корректировки, но принципы остаются неизменными.

Menu