Pull to refresh

Бюджетная реализация Modbus TCP в серии Simatic S7-300/400 при помощи Logo

Reading time10 min
Views7.6K

Классические линейки контроллеров Siemens, а именно — Simatic S7-300 и Simatic S7-400, поддерживают протокол Modbus TCP как в качестве клиента, так и в качестве сервера. Эта поддержка не лишена одного существенного недостатки, она платная, и стоимость лицензии весьма высока.

Если заказчик — «богатый», а интегратор — «умный» (опытный), то факт платности лицензии и ее стоимость не приводит к неприятностям, все известно заранее, на этапе составления спецификации, бюджет согласован заранее. Если применяется серия S7-1200 / 1500, то вопрос даже не поднимается, эти PLC поддерживают Modbus RTU и TCP без дополнительного лицензирования.

На практике встречаются случаи, когда ничто не «предвещало беды», но модбас на «трехсотнике» неожиданно становится нужен (никогда такого не было, и вот опять!). Не учли что-нибудь, форс-мажор или просто разгильдяйство. Какие в этом случае пути решения? Первый — купить лицензионные библиотеки. Хороший вариант, только затратный, да и подождать придется. Второй — реализовать Modbus TCP силами программиста. Тоже хороший вариант, но требует какую-никакую квалификацию и какое-никакое время. Я уверен, что у серьезных интеграторов все эти библиотеки давно разработаны, для них это не проблема. Для мелких интеграторов — уже проблема, даже сервер Modbus TCP реализовать атруднительно, а клиент — тем более.

Первый вариант — затратный, второй — условно-бесплатный. Целью данной заметки является краткое описание третьего варианта, а именно — применение реле Logo! в качестве преобразователя протокола S7 в Modbus TCP. Протокол S7 поддерживается PLC моделей 300, 400, 1200, 1500. Протокол Modbus будем рассматривать и как клиент, и как сервер. Реле Logo, в свою очередь, «понимает» и S7, и Modbus, а так же умеет выступать и в роли сервера, и в роли клиента этих протоколов. В том числе — во всех 4 ролях одновременно, сервер и клиент S7, а так же сервер и клиент Modbus TCP (зачем нужно такое безумие я не знаю, но на практике проверил — работает).

Итак, сооружаем из релюшки ценой ~80 евро преобразователь протоколов. Любая версия не подойдет, необходима версия от 8.1 и выше. Различия в настройке между 8.1&8.2 (FS4) и 8.3 минимальные, поэтому я буду работать на примере актуальной модели — 8.3. Для начала обращаю внимание на возможности, предоставляемые Logo! Ограничения у нас, все же, есть, и они достаточно суровые, но и тут при желании можно выкрутиться. Общее количество соединений, которые можно сконфигурировать на смарт-реле — 8. Размер программной памяти (область V) Logo версии 8.3 составляет 850 байт. Именно столько информации мы сможем отдать стороннему клиенту Modbus TCP или забрать с одного или нескольких серверов Modbus.

Рассматриваем первый вариант, мы отдаем информацию с ПЛК по протоколу Modbus TCP, т.е. организуем сервер. В качестве контроллера 300ой серии выступает S7 319-3 PN/DP со встроенным в CPU интерфейсом промышленного Ethernet. Блок данных DB300 хранит информацию для стороннего клиента, это массив вещественных величин с индексами от 1 до 100.

При запуске контроллера эти значения инициализируются (OB100) и меняются каждые 100 мс (OB35)

ORGANIZATION_BLOCK OB100

VAR_TEMP
    // Reserved
    info : ARRAY[0..19] OF BYTE;
    // Temporary Variables
    i : INT;
END_VAR

    FOR i := 1 TO 100 BY 1 DO
        DB300.DB_VAR[i] := i;
        //DB302.DB_VAR[i] := (-1) * i;
    END_FOR;
    
END_ORGANIZATION_BLOCK


ORGANIZATION_BLOCK OB35

VAR_TEMP
    // Reserved
    info : ARRAY[0..19] OF BYTE;
    // Temporary Variables
    i : INT;
END_VAR

    FOR i := 1 TO 100 BY 1 DO
        DB300.DB_VAR[i] := DB300.DB_VAR[i] + 1;
        //DB302.DB_VAR[i] := DB302.DB_VAR[i] - 1;        
    END_FOR;

END_ORGANIZATION_BLOCK

Блок данных DB301 содержит 10 вещественных уставок, получаемых с клиента Modbus

Немного теории «на пальцах». Протокол S7 работает как по сетям промышленного Ethernet, так и по сетям Profibus и MPI. В подавляющем количестве случаев необходимо сконфигурировать соединение на обоих узлах информационного обмена. В Step 7 это делается в Netpro, в LogoSoft Comfort немного иначе. Мы работаем по Ethernet через TCP/IP, поэтому используем ip-адрес. Кроме ip-адреса необходимо еще знать т.н. TSAP (Transport Service Access Point или же точка доступа транспортного уровня). TSAP состоит из двух байт. Первый байт — это номер сконфигурированного соединения. Второй байт состоит из номера стойки и номера слота, в котором находится CPU. Для S7-300 это всегда 0/2, нулевой рэк, второй слот. Для Logo! второй байт будет равен 0. Кроме того, при конфигурировании соединения в Step 7 мы должны указать, является ли «наш» узел соединения активным или нет.

Что значит «установить активное соединение»? Это означет, что данный узел будет инициатором связи. Т.е. он будет выступать клиентом. Клиент — галочка устанавливается, сервер — галочки нет. В LogoSoft Comfort этой галочки просто нет, там используется терминология «клиент» и «сервер».

В настоящем примере я стремлюсь минимизировать программирование и конфугурирование. И в связи с этим напоминаю про другую свою заметку: Односторонние S7-коммуникации. Как организовать обмен ПЛК-ПЛК, программируя и загружая только один ПЛК?

Главный вывод этой заметки — к трехсотнику можно подключиться, используя TSAP 03.02, он уже сконфигурирован для внешнего подключения. Пропадает необходимость дополнительной настройки PLC и прогрузки изменений. Если же этот TSAP уже используется, то тут выхода нет — открываем NetPro и настраиваем все с нуля.

В NetPro щелкаем правой кнопкой мыши на CPU, выбираем из менюшки Insert New Connection
В NetPro щелкаем правой кнопкой мыши на CPU, выбираем из менюшки Insert New Connection
Выбираем Unspecified, тип S7 Connection
Выбираем Unspecified, тип S7 Connection
Снимаем галочку Active Connection, задает ip-адрес удаленной станции, жмем Address Details
Снимаем галочку Active Connection, задает ip-адрес удаленной станции, жмем Address Details
Смотрим и задаем TSAP
Смотрим и задаем TSAP

На последнем скриншоте важно задать и запомнить TSAP локального ПЛК (S7-300) и удаленного коммуникационного партнера (Logo!). Локальный Rack/Slot задан правильно и не меняется (это же S7-300), коммуникационный ресурс можно оставить, Rack/Slot партнера в нашем случае задан по умолчанию правильно, а вот коммуникационный ресурс надо будет подглядеть уже в LogoSoft Comfort, куда так же при задании коннекшена не забыть правильно внести TSAP «трехсотника».

Но для упрощения жизни мы будет подключаться без дополнительной настройки S7-300, как к серверу, по TSAP 03.02. Кроме того, я предлагаю применять S7-300 именно как сервер S7-соединения. Это позволит, во-первых, упростить обмен между PLC и Logo!, просто прописав необходимые адреса в настройках соединения реле. Во-вторых, не все коммуникационные процессоры S7-300 поддерживают функционал клиента S7. В частности, очень распространенный CP 343-1 Lean может выступать только в качестве сервера, т.е. принимать соединения, а не инициировать их.

Перейдем, наконец, к настройке Logo! Работать будем в рамках сетевого проекта Logo!Soft Comfort. Даже у такой несложной задачи есть несколько вариантов реализации и их комбинации, перечислять все нет смысла. Как сказано выше, действуем по принципу «чем проще, тем лучше». Для начала я рекомендую ознакомиться для общего развития еще с двумя заметками по коммуникациям в Logo:

Siemens Logo! и Modbus TCP в сетевом проекте

Siemens Logo! и Modbus TCP

Создаем сетевой проект и добавляем в него устройство S7 и Logo! версии 8.3, прописываем адреса.

Далее конфигурируем соединение по S7 между Logo и PLC, для этого тянем мышью линию от любого из 8 правых квадратов реле на квадрат устройства S7. Именно от Logo к ПЛК, смарт-реле становится клиентом, а ПЛК сервером. Если тянуть наоборот, то роли в обмене данных меняются. В процессе среда разработки (для версии реле 8.3) выдаст предупреждение, что данное действие включает протокол S7, соглашаемся.

Дабл-клик мышью по линии соединения между S7 и Logo! выдаем нам окошно настройки и список информации для обмена. Настраиваем следующим образом:

Указываем TSAP нашего трехсотника, как я уже говорил выше, ставим доступный по умолчанию 03.02. Далее прописываем объем информации, который мы забираем. У нас в блоке данных DB300 есть массив из 100 REAL'ов, и это 400 байт. Мы можем забирать или отправлять информацию блоками, максимальный размер каждого блока составляет 212 байт (очевидно, что это ограничения в рамках механизма соединения S7). Для удобства я буду работать с объемом, кратным 200 байт. Мы считываем информацию в программную память Logo, это область V объемом 850 байт. Источник данных удаленного партнера — это блок данных DB300. Итого, вначале из блока данных DB300 мы берем 200 байт с нулевым смещением (DBB0) и размещаем их локально в байты 0..199 (VB0…VB199) пограммной памяти. Потом берем еще 200 байт из блока со смещением 200 и записываем их в локальные байты VB200…VB399. Причем, что у нас вообще хранится в исходном блоке данных, будь то булевые значения, целочисленные величины, слова данных, вещественные параметры — это все неважно, т.к. с точки зрения вычислительной машины это всего лишь набор байт. А мы сейчас тем и занимаемся, что перекладываем набор байт, доступный по одному протоколы в доступный по другому протоколу. Поэтому в моем упрощенном примере у меня массив данных. На практике будет, разумеется, осмысленный набор, но забирать мы его будем так же. Именно поэтому, исключительно для облегчения жизни, целесообразно все данные, отдаваемые по модбасу, подготовить на ПЛК заранее и держать их в одном блоке данных. Ибо набор строк по каждой переменной, сконфигурированный в Logo!Soft Comfort, вполне допустим, но при таком подходе существенно возрастает вероятность ошибки при составлении этой таблицы.

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

Конечно, я не стал забивать в таблицу данных все 100 переменных, а ограничился лишь первой и последней из каждого читаемого набора данных в 200 байт. Тут VD0 соответствует DB300.DB_VAR[1], а VD396 сооветствует DB300.DB_VAR[100]. Наблюдаем осмысленные данные, значит, ошибки нет.

В блоке данных DB301 S7-300 содежится массив из 10 переменных, которые должны записываться сторонним клиентом. Давайте добавим и эту информацию в список обмена. Снова открываем свойства коннекшена S7.

Итого, 40 байт (10 вещественных) программной памяти V, начиная с 400ого байта, записываются в блок данных DB301 в нулевое смещение. Загружаем и проверяем в таблице данных.

Записываем новое значение в переменную VD400
Записываем новое значение в переменную VD400

Смотрим блок данных DB301 контроллера S7-300

Информация записалась. Теперь необходимо сконфигурировать на смарт-реле сервер Modbus TCP. Для этого добавим в проект устройство Modbus и создадим соединение между ним и Logo! Устройство Modbus в нашем случае — это клиент, а Logo — сервер этого протокола. Линию тянем мышью от клиента к серверу. В процессе получим предупреждение об открытии доступа по протоколу Modbus.

Теперь посмотрим на свойства соединения Modbus TCP

Настраивать тут ничего не надо. Мы уже активировали сервер Modbus. Единственное, на что хочется обратить внимание. Порт для входящих соединений — 503. Не 502, который является портом по умолчанию, а 503. Изменить его нельзя. Неудобно и нелогично. Мне это не нравится. В рамках этого сетевого проекта я не нашел способ создать соединение с явно заданным «своим» портом. Редактировать список доступных по протоколу modbus переменных нет смысла, Logo! выполняет ролько «перекладывателя» данных, поэтому пусть доступными будут все данные. Карта регистров доступна в свойствах нашего реле.

Карта регистров сервера Modbus
Карта регистров сервера Modbus

В соответствии с этой картой, нам нужны регистры хранения с 1 по 425, это программная память V. Запускаем клиент Modbus на ПК, подключаемся к реле по его ip-адресу и указываем порт 503. Тут главное не запутаться в байтах, регистрах и двойных словах. Вот, к примеру, чтение регистров хранения, начиная со 101 (база отсчета 1) в количестве 10 штук, трактуемая, как вещественное с обратным порядком байт.

Как видно, информация читается. Данные вменяемые, трактуются корректно, меняют свои значения.

Теперь давайте прочитаем и попробуем изменить информацию с блока данных 301, это уставки. Первая уставка — это регистры 201 и 202 (за базу принята единица). Настраиваем клиент и записываем в эти регистры вещественное число 777.0

Смотрим это значение в блоке данных 301

Таким образом, мы оперативно достигли двухстороннего информационного обмена между сторонним клиентом протокола Modbus TCP и ПЛК Simatic S7-300, имея на руках лишь реле Logo.

Прошу обратить внимание на пару нюансов. Если связь между Logo! и S7-300 будет нарушена, то клиент Modbus, все равно, будет уверен, что связь присутсвует. Ведь сервер модбас отвечает. Тут целесообразно завести на трехсотом вспомогательную переменную, которая будет всегда менять свое состояние и анализировать эту переменную на стороне клиента. К примеру, если бит перестал меняться с 0 на 1 (или int перестал менять значение), то это указывает на отсутствие связи.

Второй нюанс. Как я говорил выше, у нас для обмена предусмотрено всего 850 байт, 450 регистров. Что делать, если этих 850 байт не хватает? Как вариант, задействовать второе реле лого. Вообще, их можно подключить в количестве, которое соответствует числу свободных коммуникационных ресурсом трехсотого ПЛК. Разумеется, исходя при соображений здравого смысла. Есть ли смысл подключать, например, 8 релюшек только для одного Modbus? Тут уже имеет смысл либо писать свою реализацию, либо покупать готовую.

Проведем эксперимент. Теперь в ПЛК у нас 2 блока данных с массивами по 200 вещественных (2 потому что так удобнее выполнять демонстрационный проект). Итого надо забрать с ПЛК 1600 байт. На это уже одного реле не хватит.

Меняем конфигурацию существующего реле. Теперь свойства соединения с S7-300 выглядят следующим образом.

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

Добавляем в проект еще одно реле, версии FS4. Добавляем необходимые соединения для «нового» Logo

Прописываем в S7-300 соединение. Вот так оно выглядит в Step 7

А вот новое соединение с ПЛК в Logo!Soft Comfort. Обратите внимение, что и коммуникационный ресурс, и rack/slot у меня совпадают в Step 7 и Logo!Soft.

Подключаемся к новому реле, смотрим переменные.

Все верно, так как программа ПЛК данные для «второго реле» загоняет в минуса для наглядности. Теперь смотрим клиент протокола Modbus.

Первые пять переменных из блока DB300
Первые пять переменных из блока DB300
Первые пять переменных из блока DB302
Первые пять переменных из блока DB302

Как видно, обойти ограничение железа в 850 байт — не проблема, если под рукой есть еще железо. На этом заканчиваем реализацию серверной части и переходим к клиентской.

Новая вводная. Где-то «в поле» у нас затесался преобразователь частоты, с которым можно общаться только по протоколу Modbus TCP. Т.е. частотник является сервером Modbus (буду его симулировать на ПК). С частотника надо забирать слово состояния, текущую скорость, слать ему слово управления и задание скорости. Управляющий контроллер у нас- все тот же S7-300. Лицензию никто не купил. Программировать никто не умеет. В ПЛК уже подготовлен блок данных для частотника.

Для удобства группируем состояние и управление
Для удобства группируем состояние и управление

Упростим себе жизнь и представим, что карта регистров Modbus состоит из :

— входных регистров 0 (текущая скорость) и 1 (слово состояния);

— регистров хранения 0 (задание скорости) и 1 (слово управления).

В том же порядке, что и блок данных (это для удобства) заполняем таблицу обмена в рамках S7-соединения. Само соединение остается, как и в первом примере. Реле является клиентом и подключается к S7-300 по TSAP 03.02. Разумеется, тут надо правильно задать направление передачи данных. Состояния мы читаем «с поля» по модбас и пишем в ПЛК по S7, управление — читаем с ПЛК по S7 и пишем «в поле» по Modbus. После составления таблицы обмена и ее повторного открытия, Logo!Soft Comfort делает перестановки. Вид таблицы меняется, а точнее - меняется порядок строк обмена. Вначале идут строки чтения, потом строки записи. Мы читаем с ПЛК уставку и задание, и пишем текущую скорость и слово состояния.

Загружаем изменения и проверяем обмен Logo — S7.

На стороне ПЛК удобнее использовать таблицу переменных
На стороне ПЛК удобнее использовать таблицу переменных

Обмен по S7 работает.

Теперь необходимо прописать на смарт-реле функционал клиента Modbus и забрать информацию с «частотника». Теперь необходимо «тянеть» коннекшен от реле до устройства Modbus. Вот что в итоге получается.

Выполняем дабл-клик на соединении Modbus и заполняем таблицу следующим образом

Итого, с 0ого по 3ий байты области V — это два входных регистра (их читаем), а запись регистров хранения 1 и 2 (база 1) осуществляем из области памяти VB4..7. Получается, что мы читаем 2 входных регистра устройства модбас, помещаем прочитанное значение в программную память реле и тут же автоматически записываем эти значения в ячейки блока данных контроллера S7-300. С уставками все ровно наоборот, с ПЛК читаем, в «частотник» пишем. При этом используются одни и те же переменные программной памяти.

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

Всего смарт-реле держит 8 соединений. Из них одно занято для связи с ПЛК, остается 7 свободных. 850 байт программной памяти в большинстве случаев хватит за глаза. А если устройств «в поле» больше, то ничто не мешает подключить еще одно лого.

Больным местом остается диагностика соединения по Modbus TCP. В Logo! его просто нет. Остается надеяться лишь на то, что в оконечном устройстве присутсвует какая-нибудь переменная, постоянно меняющая свое значение, с помощью которой получится отследить состояние коннекта на стороне ПЛК.

Tags:
Hubs:
Total votes 6: ↑6 and ↓0+6
Comments0

Articles