Главная » Руководства » Бюджетный Modbus TCP для S7‑300/400: превращаем LOGO! в промышленный шлюз

Бюджетный Modbus TCP для S7‑300/400: превращаем LOGO! в промышленный шлюз

Применяемое ПО: STEP 7 Classic (V5.5+), LOGO! Soft Comfort (V8.3)
Оборудование: S7‑300 (например, 319‑3 PN/DP), LOGO! 8.3, Ethernet-сеть


Содержание

  1. Введение: проблема платного Modbus TCP на S7‑300/400
    • Почему стандартная лицензия дорога и не всегда предусмотрена
    • Альтернативы: покупка библиотек, самостоятельная реализация, использование шлюза
  2. Почему LOGO! – идеальный бюджетный шлюз
    • Требования к версии (8.1 и выше)
    • Технические ограничения: 8 соединений, 850 байт V-памяти
    • Возможности: одновременная работа сервером и клиентом S7 и Modbus TCP
  3. Базовые концепции для понимания
    • S7-коммуникация: что такое TSAP, активное/пассивное соединение
    • Роли LOGO! в S7-соединении (клиент / сервер)
    • Организация данных: DB с неоптимизированным доступом, байтовая модель
  4. Сценарий 1: LOGO! как сервер Modbus TCP, данные из S7‑300
    • 4.1. Подготовка S7‑300: создание DB300 с массивом REAL, инициализация в OB100, циклическое изменение в OB35
    • 4.2. Настройка S7‑соединения в LOGO! Soft Comfort
    • 4.3. Перенос данных из DB300 в V-память LOGO! (блоки до 212 байт)
    • 4.4. Активация сервера Modbus TCP на LOGO! (порт 503)
    • 4.5. Проверка работы: чтение данных сторонним Modbus-клиентом
  5. Сценарий 2: LOGO! как клиент Modbus TCP, данные в S7‑300
    • 5.1. Подготовка S7‑300: DB301 для приёма уставок
    • 5.2. Настройка S7‑соединения для записи из V-памяти LOGO! в DB301
    • 5.3. Настройка клиента Modbus TCP на LOGO! (чтение/запись регистров)
    • 5.4. Проверка: изменение уставок через Modbus-клиент
  6. Сценарий 3: полноценный двунаправленный шлюз (сервер + клиент Modbus)
    • 6.1. Комбинирование настроек в одном соединении S7 и Modbus
    • 6.2. Порядок обработки строк в LOGO! Soft Comfort (сначала чтение, потом запись)
    • 6.3. Практический пример: обмен с частотным преобразователем
  7. Расширение: использование нескольких LOGO! для увеличения объёма данных
    • 7.1. Когда 850 байт недостаточно (например, 1600 байт)
    • 7.2. Настройка второго LOGO! и дополнительного S7‑соединения в STEP 7 (NetPro)
    • 7.3. Распределение данных между двумя шлюзами
  8. Диагностика и ограничения
    • Отсутствие встроенной диагностики обрыва связи
    • Как организовать «heartbeat» для контроля соединения
    • Фиксированный порт 503 для сервера Modbus (не 502)
    • Лимит на размер одного блока S7‑передачи (212 байт)
  9. Типичные ошибки и способы их устранения
    • 9.1. Неправильный TSAP (03.02 против 10.01 и т.д.)
    • 9.2. Путаница с порядком байт при чтении REAL
    • 9.3. Превышение лимита 212 байт в одном блоке обмена
    • 9.4. Неправильное направление передачи в S7-соединении
  10. Заключение: плюсы, минусы и альтернативы
    • Когда подход оправдан, а когда лучше купить лицензию
    • Дальнейшие возможности: использование LOGO! в качестве универсального шлюза

1. Введение: проблема платного Modbus TCP на S7‑300/400

Контроллеры Siemens S7‑300 и S7‑400 – надёжные и распространённые, но их поддержка протокола Modbus TCP требует приобретения отдельной лицензии. Стоимость библиотек (например, от Siemens или сторонних поставщиков) может быть сопоставима с бюджетом небольшого проекта, а иногда о необходимости Modbus вспоминают уже после того, как оборудование закуплено и спецификация утверждена.

Ситуации, когда это становится проблемой:

  • В проекте изначально не предполагался обмен по Modbus, но в ходе пусконаладки выясняется, что стороннее устройство (частотник, счётчик, BMS) требует именно этого протокола.
  • Заказчик не хочет доплачивать за лицензию, ссылаясь на изначальную договорённость.
  • В наличии есть только S7‑300 с коммуникационным процессором CP 343‑1 Lean, который может выступать только сервером S7, но не клиентом.

В таких случаях есть три выхода:

  1. Купить лицензионную библиотеку – быстро, но дорого и требует времени на оформление.
  2. Написать собственный Modbus TCP стек – сложно, требует высокой квалификации и отладки.
  3. Использовать внешний шлюз – например, поставить между контроллером и сетью Modbus недорогое устройство, которое будет преобразовывать протоколы.

Именно третий вариант мы детально рассмотрим, взяв в качестве преобразователя LOGO! 8.3 – умное реле стоимостью ~80 евро, которое «из коробки» поддерживает и S7-коммуникацию, и Modbus TCP.


2. Почему LOGO! – идеальный бюджетный шлюз

LOGO! 8.3 (а также 8.2 FS4 и выше) имеет встроенную поддержку:

  • S7-коммуникации (клиент и сервер) для обмена с SIMATIC S7‑300/400/1200/1500.
  • Modbus TCP (клиент и сервер).

Это позволяет использовать LOGO! как преобразователь протоколов, работающий в обе стороны. При этом он способен одновременно выступать в нескольких ролях: например, сервером S7 для S7-300 и одновременно сервером Modbus для внешних систем.

Ограничения, которые нужно учитывать:

ПараметрЗначение
Максимальное количество соединений (всех типов)8
Доступная программная память (V-область)850 байт
Максимальный размер одного блока данных при обмене по S7212 байт
Порт для сервера Modbus TCP503 (не 502)
Поддержка Modbus-функцийчтение/запись регистров хранения, входных регистров, катушек и т.д.

Несмотря на ограничения, 850 байт достаточно для сотен дискретных сигналов или нескольких десятков аналоговых значений. При необходимости можно подключить несколько LOGO! параллельно, увеличивая объём.


3. Базовые концепции для понимания

3.1. S7-коммуникация и TSAP

S7-коммуникация и TSAP

S7-коммуникация использует TSAP (Transport Service Access Point) – двухбайтовый идентификатор, который определяет, какое приложение на целевом устройстве участвует в обмене. TSAP состоит из:

  • Первый байт – номер соединения (например, 03).
  • Второй байт – номер стойки/слота (для S7‑300 это всегда 02, так как CPU находится во 2-м слоте 0-й стойки).

Для S7‑300 существует предустановленный TSAP 03.02, который уже сконфигурирован в CPU для внешних подключений (например, для программирования или HMI). Если этот TSAP свободен, его можно использовать без дополнительной настройки в NetPro. Это значительно упрощает проект.

3.2. Активное / пассивное соединение

  • Активное – устройство само инициирует соединение (клиент).
  • Пассивное – устройство ожидает входящего соединения (сервер).

В LOGO! Soft Comfort роль задаётся направлением, в котором мы «тянем» линию соединения. Если тянуть от LOGO! к партнёру – LOGO! будет клиентом (активным). Если наоборот – сервером (пассивным).

3.3. Представление данных

Все данные в LOGO! и в S7 при обмене по S7 передаются как набор байт. Не имеет значения, хранятся ли в DB REAL, INT или BOOL – для шлюза это просто байты. Поэтому важно правильно соотносить адреса в DB (DBB0, DBB1…) с V-памятью LOGO! (VB0, VB1…).


4. Сценарий 1: LOGO! как сервер Modbus TCP, данные из S7‑300

В этом сценарии LOGO! будет:

  • Клиентом S7 – опрашивать данные из S7‑300.
  • Сервером Modbus TCP – отдавать эти данные внешним системам.

4.1. Подготовка S7‑300

Создадим блок данных DB300 с массивом из 100 REAL-переменных (400 байт). Для наглядности будем циклически менять значения.

В STEP 7 (Classic):

  1. Создайте DB300 с неоптимизированным доступом (по умолчанию для Classic это так).
  2. Объявите массив:textDB_VAR : ARRAY[1..100] OF REAL;
  3. В OB100 (инициализация) заполните массив:stlL 1 T #i LOOP: L #i L 1 +I T #i L #i ITD DTR T DB300.DB_VAR[#i] L #i L 100 <=I JC LOOPИли используйте SCL для наглядности (см. оригинальную статью).
  4. В OB35 (циклический прерывание, например, каждые 100 мс) увеличивайте значения:stlL 1 T #i LOOP: L DB300.DB_VAR[#i] L 1.0 +R T DB300.DB_VAR[#i] L #i L 1 +I T #i L 100 <=I JC LOOP
  5. Сохраните и загрузите в CPU.

4.2. Настройка S7-соединения в LOGO! Soft Comfort

  1. Запустите LOGO! Soft Comfort, создайте сетевой проект (Network Project).
  2. Добавьте устройство LOGO! 8.3 и S7-устройство (выберите «Устройство с поддержкой S7»).
  3. Пропишите IP-адреса:
    • LOGO! – например, 192.168.0.10
    • S7‑300 – 192.168.0.100
  4. Создайте S7-соединение: наведите курсор на один из правых квадратиков LOGO! (TSAP 20.00…27.00) и перетащите на квадратик S7-устройства. Важно: тяните от LOGO! к S7, чтобы LOGO! был клиентом (активным).
  5. Подтвердите включение S7-протокола.
Настройка S7-соединения в LOGO! Soft Comfort

4.3. Настройка таблицы обмена

Дважды кликните на линии соединения. Откроется окно настройки.

Настройки соединения:

  • TSAP партнёра (S7‑300): укажите 03.02 (если используете предустановленный). Если 03.02 занят, придётся создать соединение в NetPro и указать другой TSAP.
  • Локальный TSAP (LOGO!): будет соответствовать выбранному квадратику (например, 20.00).

Передача данных (чтение из S7 в LOGO!):

  • Режим: Чтение (Read)
  • Адрес в партнёре (S7): DB300.DBB0 (начало блока)
  • Длина: 200 байт (можно до 212, но возьмём 200 для круглого счёта)
  • Локальный адрес (LOGO!): VB0 (начало V-памяти)

Добавьте вторую строку для чтения следующих 200 байт:

  • Адрес в партнёре: DB300.DBB200
  • Локальный адрес: VB200

Теперь в V-памяти LOGO! в байтах 0–399 находятся первые 100 REAL (400 байт).
Если нужно передавать больше данных, добавляйте строки, но каждая не более 212 байт.

4.4. Активация сервера Modbus TCP

  1. В сетевом проекте добавьте устройство Modbus (клиент Modbus).
  2. Создайте соединение: перетащите линию от Modbus-устройства к LOGO!. Теперь LOGO! становится сервером Modbus.
  3. Подтвердите включение Modbus-протокола.
  4. Откройте свойства соединения. Вы увидите, что порт сервера установлен 503. Это значение нельзя изменить. Запомните его.

Теперь вся V-память LOGO! (850 байт) автоматически отображается в виде регистров хранения (holding registers) начиная с адреса 1. Карта отображения:

V-память (байты)Modbus-регистры (holding)Примечание
VB0–VB1116 бит
VB2–VB32
VB848–VB849425последний

Для работы с REAL (32 бита) нужно читать два последовательных регистра (например, 1 и 2) и правильно интерпретировать порядок байт.

4.5. Проверка работы

  1. Подключитесь к LOGO! через Ethernet, загрузите конфигурацию.
  2. Запустите любой Modbus-клиент (например, ModScan, Simple Modbus TCP Client).
  3. Подключитесь к IP LOGO! на порт 503.
  4. Прочитайте регистры хранения, начиная с 1, количеством 200 (400 байт).
  5. Если вы читаете как 32-битные float с обратным порядком байт (что часто требуется для Siemens), вы должны увидеть значения, растущие от 1.0 до 100.0.

Пример настройки клиента:

  • Start Address: 1
  • Length: 200 (регистров)
  • Display: Float (Word Swap) – если требуется инверсия слов.

5. Сценарий 2: LOGO! как клиент Modbus TCP, данные в S7‑300

Теперь пусть LOGO! будет клиентом Modbus и опрашивает какое-либо устройство (например, частотный преобразователь), а полученные данные передаёт в S7‑300. Также может принимать уставки от S7 и отправлять их в Modbus-устройство.

5.1. Подготовка S7‑300

Создайте DB301 для уставок:

text

DB301
  VAR
    Setpoints : ARRAY[1..10] OF REAL;
  END_VAR

5.2. Настройка S7-соединения (запись в S7)

Используем то же S7-соединение, что и в сценарии 1, но добавим строки на запись.

В окне настройки соединения добавьте новую строку:

  • Режим: Запись (Write)
  • Локальный адрес (LOGO!): VB400 (например)
  • Длина: 40 байт (10 REAL)
  • Адрес в партнёре (S7): DB301.DBB0

Таким образом, данные из V-памяти LOGO! будут автоматически пересылаться в DB301.

5.3. Настройка клиента Modbus TCP

  1. В сетевом проекте добавьте ещё одно устройство Modbus (на этот раз оно будет сервером – например, эмулятор частотника). Или используйте то же устройство, но создайте новое соединение.
  2. Создайте соединение: перетащите линию от LOGO! к Modbus-устройству. LOGO! становится клиентом Modbus.
  3. Настройте параметры соединения: IP-адрес сервера Modbus, порт (обычно 502).
  4. В таблице обмена Modbus добавьте строки:
    • Чтение: из входных регистров сервера (например, текущая скорость, слово состояния) → сохранить в V-память LOGO! (например, VB0..3).
    • Запись: из V-памяти LOGO! (например, VB4..7) → в регистры хранения сервера (задание скорости, слово управления).

5.4. Проверка

После загрузки в LOGO!:

  • Данные, прочитанные по Modbus, появятся в V-памяти, затем будут автоматически переданы в DB301 S7‑300.
  • Уставки, записанные в DB301 из S7 (или через визуализацию), будут переданы через LOGO! в Modbus-устройство.

6. Сценарий 3: полноценный двунаправленный шлюз (сервер + клиент Modbus)

В реальных задачах часто требуется одновременно:

  • Отдавать текущие значения из S7 по Modbus (сервер Modbus)
  • И получать команды из Modbus-сети для записи в S7 (клиент Modbus)

LOGO! позволяет совместить оба режима. При этом одно и то же V-пространство используется как буфер: данные, пришедшие от Modbus-клиента, могут сразу же передаваться в S7 (и наоборот).

6.1. Комбинирование настроек

В сетевом проекте будут два Modbus-соединения:

  • Одно, где LOGO! – сервер (для внешних систем)
  • Второе, где LOGO! – клиент (для опроса полевых устройств)

S7-соединение будет обеспечивать двусторонний обмен между LOGO! и S7‑300.

Важно: LOGO! Soft Comfort выполняет обмен в порядке, который задан в таблицах. Сначала обрабатываются все строки чтения, затем все строки записи. Это нужно учитывать при проектировании, чтобы не было конфликтов (например, если вы одновременно читаете и пишете в одну область).

6.2. Практический пример: обмен с частотным преобразователем

Допустим, есть частотник (сервер Modbus) с регистрами:

  • 40001 (слово управления) – запись
  • 40002 (задание скорости) – запись
  • 30001 (слово состояния) – чтение
  • 30002 (текущая скорость) – чтение

В S7‑300 подготовлены DB с соответствующими данными. LOGO! должен:

  • Читать из S7 управление (DB30) и отправлять в частотник.
  • Читать из частотника состояние и записывать в S7 (DB31).

Настройка:

  1. S7-соединение:
    • Чтение из S7 (DB30) → в VB0..7 (управление)
    • Запись из VB8..15 в S7 (DB31) (состояние)
  2. Modbus-клиент (LOGO! → частотник):
    • Чтение из входных регистров частотника (30001–30002) → в VB8..15
    • Запись из VB0..7 в регистры хранения частотника (40001–40002)

Таким образом, данные проходят через LOGO! без дополнительных действий.


7. Расширение: использование нескольких LOGO! для увеличения объёма данных

Когда 850 байт V-памяти недостаточно, можно добавить второе LOGO!. Это позволит увеличить объём передаваемых данных кратно.

7.1. Пример: нужно передать 1600 байт

Допустим, у нас два блока данных в S7‑300: DB300 и DB302, каждый по 800 байт (200 REAL). Одно LOGO! может взять максимум 850 байт. Поэтому подключаем два.

7.2. Настройка второго LOGO!

  1. Добавьте в сетевой проект второе LOGO! с другим IP.
  2. Создайте второе S7-соединение (от второго LOGO! к S7‑300). TSAP для партнёра – можно использовать тот же 03.02 (если он поддерживает несколько соединений) или настроить в NetPro отдельный.
  3. В таблице обмена для второго LOGO! укажите чтение из DB302.DBB0 (200 байт) и т.д.
  4. Если нужно также отдавать данные по Modbus, настройте сервер Modbus на втором LOGO! (или клиент).

7.3. Настройка S7‑300 для нескольких соединений

Если используется TSAP 03.02, то S7‑300 может принимать несколько соединений на один TSAP. Это не требует дополнительной конфигурации. Если же нужно задействовать другой TSAP (например, 04.02), придётся создать соединение в NetPro.

В NetPro:

  • Откройте проект, выделите CPU.
  • Создайте новое S7-соединение (Unspecified).
  • Укажите IP LOGO! и TSAP партнёра (20.00) и локальный TSAP (например, 04.02).
  • Активируйте «Активное установление соединения»? – Нет, так как LOGO! будет клиентом.

После этого в LOGO! при настройке S7-соединения укажите TSAP партнёра 04.02.


8. Диагностика и ограничения

8.1. Отсутствие встроенной диагностики обрыва связи

LOGO! не предоставляет системных флагов для контроля состояния S7- или Modbus-соединения. Если кабель оборван, LOGO! продолжит «отвечать» на Modbus-запросы, но данные в S7 не будут обновляться.

Решение – heartbeat:

  1. В S7‑300 создайте переменную-счётчик (например, в DB300, байт 0), которая постоянно меняется (например, инкрементируется каждую секунду).
  2. Передавайте эту переменную через LOGO! в Modbus-сеть.
  3. На стороне Modbus-клиента контролируйте, что значение меняется. Если оно застыло – связь с S7 потеряна.

Аналогично, если LOGO! выступает клиентом Modbus, можно передавать heartbeat от опрашиваемого устройства и контролировать его в S7.

8.2. Фиксированный порт 503 для сервера Modbus

Это нестандартный порт (обычно 502). Убедитесь, что ваши Modbus-клиенты поддерживают подключение к нестандартному порту. Если нет, придётся использовать дополнительный NAT/проброс или выбрать другой подход.

8.3. Лимит на размер одного блока S7-передачи (212 байт)

При обмене по S7 максимальный блок данных, который можно передать за один вызов, составляет 212 байт. Если нужно передать больше, разбивайте на несколько строк, как мы сделали с DB300.


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

9.1. Неправильный TSAP

Симптом: S7-соединение не устанавливается, в LOGO! Soft Comfort в онлайн-режиме линия серая или красная.
Причина: В LOGO! указан не тот TSAP партнёра, или в S7 нет активного сервера на этом TSAP.
Решение:

  • Убедитесь, что в LOGO! TSAP партнёра = 03.02 (если используете стандартный).
  • Проверьте в STEP 7 (NetPro), не занят ли этот TSAP другим соединением. При необходимости создайте новое соединение с другим TSAP.

9.2. Путаница с порядком байт при чтении REAL

Симптом: Значения читаются, но выглядят как очень большие или очень маленькие числа.
Причина: REAL в Siemens хранится в формате little-endian (младший байт в младшем адресе), а некоторые Modbus-клиенты ожидают big-endian.
Решение: В клиенте Modbus выберите опцию «Word Swap» (обмен слов) или «Byte Swap» в зависимости от реализации. Если клиент не поддерживает, можно поменять порядок байт внутри LOGO! с помощью функциональных блоков (но это усложнит проект).

9.3. Превышение лимита 212 байт в одном блоке

Симптом: При попытке задать длину более 212 байт в строке обмена S7, LOGO! Soft Comfort выдаёт ошибку.
Решение: Разбейте передаваемую область на несколько строк, как показано в примере с DB300 (200+200 байт).

9.4. Неправильное направление передачи в S7-соединении

Симптом: Данные не обновляются, хотя соединение установлено.
Причина: Перепутаны «Чтение» и «Запись» в таблице обмена.
Решение: Проверьте, что для данных, идущих из S7 в LOGO!, выбран режим Read (со стороны LOGO! это чтение), а для данных, идущих в S7 – Write.


10. Заключение: плюсы, минусы и альтернативы

10.1. Преимущества подхода

  • Низкая стоимость – LOGO! стоит значительно дешевле лицензии Modbus TCP для S7‑300.
  • Быстрота реализации – настройка занимает часы, а не дни.
  • Гибкость – LOGO! может одновременно работать с несколькими протоколами.
  • Не требует изменений в существующем проекте S7, если использовать TSAP 03.02.

10.2. Недостатки и ограничения

  • Невысокая производительность – LOGO! не подходит для высокоскоростного обмена (сотни миллисекунд).
  • Отсутствие диагностики – требуется самостоятельная реализация heartbeat.
  • Лимит 850 байт на одно устройство (можно расширить несколькими LOGO!).
  • Нестандартный порт 503 для сервера Modbus.

10.3. Когда стоит использовать, а когда лучше купить лицензию

Подход с LOGO! идеален, если:

  • Объём данных небольшой (до 850 байт).
  • Требуется быстрое и недорогое решение.
  • Есть свободные LOGO! на складе или их легко закупить.

Лучше купить лицензионную библиотеку, если:

  • Требуется высокая производительность (обмен каждые 10–50 мс).
  • Нужна поддержка сложных функций Modbus (например, запись нескольких регистров одной командой).
  • Проект масштабный, и затраты на лицензию легко закладываются в бюджет.

10.4. Дальнейшее развитие

LOGO! можно использовать не только как шлюз Modbus, но и как:

  • Преобразователь S7 ↔ Modbus RTU (через последовательный порт).
  • Распределённый I/O для S7‑300.
  • Простой контроллер для локальных задач, одновременно передающий данные в вышестоящую систему.

Таким образом, даже устаревшие контроллеры S7‑300 могут получить современный интерфейс Modbus TCP без серьёзных инвестиций.

Menu