Pull to refresh

Comments 42

Спасибо что поделились. Существует ли к этим контроллерам какая-либо бесплатная среда для их программирования? Валяется один такой без дела, 21-дневный триал давно кончился, платная версия стоит судя по всему недешево.
Версия Step 7 Basic для программирования контроллеров серии S7-1200 распространяется в РФ безвозмездно, т.е. даром. Свяжитесь с представительством компании Сименс в Вашем регионе.
От представителя физ.лицо не получит должного ответа.
Все, кто работает с Siemens, прекрасно знают о существовании ключей для разработчиков. Они не ограничивают функционал и без ограничения по времени, единственное — их нельзя оставить заказчику. А для личного использования самое то.
P.S. Sim_EKB_Install_2018_11_14

На самом деле достаточно счёта на покупку ПЛК, по нему лицензию высылают.

О, если не секрет? От какой компании получали ключ? Миг, форум, симекс, ЭТМ?

Каталог указывает на цену в 336 евро
STEP 7 Basic V16 6ES7 822-0AA06-0YA5

Если мне вопрос, то ключ я прошу в самом Сименс, раньше у них Разгоева этим занималась, теперь вроде кто-то другой.


Недавно с итальянцами проект запускали, так они спокойно ekb ставят.

Нет ничего криминального в ekb.
Сам Сименс ставит их на ПК заказчику, а по окончанию ПНР передают запечатанную коробку с ключом.
Все понимают что заказчик лицензию оплатил, и не обязательно использовать на АРМ именно купленный ключ. И автоматически уходят проблемы с восстановлением лицензии при выходе из строя АРМ.
Анна Разгоева теперь стала Анной Чистяковой, а в целом ситуация не изменилась )
Пишите/звоните в ближайшее местном бюро Сименс

Из моего опыта отслеживать Done и Error недостаточно, они могут и не появиться. Использую ещё таймер по таймауту.

Кажется, в документации что-то было про то, что по таймауту error взводится или я путаю?
Не всегда…
Самое надежное анализировать количество принятых байт или анализ «Живого слова». Например секунд системного времени устройства.
Я, конечно, извиняюсь, но программирование микроконтроллеров и программирование ПЛК — это немного разные вещи.
Прошу простить, исправлюсь.
Просто и Вы поймите — я слежу за хабом «Программирование микроконтроллеров» потому что мне интересны именно микроконтроллеры, а не ПЛК :)
Я прекрасно понял Ваше недоумение и осознаю свою ошибку.
Никаких обид не испытываю, Ваше замечание более чем справедливое )
Спасибо, интересно читать ваши статьи, понятно, доходчиво и развернёто.
Я в своё время делал этот обмен на LAD, было больновато)) У вас конечно, на SCL поизящней будет.

Как я вижу — у вас идёт циклическое чтение\запись независимо от условий.
И я вроде, тоже так делал. Однако, в случае, если выходами слейвов может управлять кто-то ещё (например, модуль реле у WirenBoard может переключать выходы от своих входов, а может «рулиться» по модбас — задача управления светом).
Соответственно, нужно делать некий кроссчек на проверку, была ли переменная изменена, чтобы не было такого, что слейв пишет на выход «0», а мы туда статически пишем «1». В ПЧ и т.д. обычно используют режим local\remote либо как здесь некий ControlFromPLC бит, как подтверждение «легитимности» записи.
В-общем, за счёт того, что Modbus в Siemens прописывается «руками» о циклической записи нужно помнить, я так понимю.
Или в дебрях руководства к драйверу что-нибудь написано про то, что если с последней записи данных значения не изменились то в интерфейс новые значения подаваться не будут? В любом случае, это не отменяет необходимость чтения выходов слейва и только потом записи (если пришел реквест на запись).

Пока оставляем прием данных без обработки, компилируем и грузим программу, смотрим на результат. Кстати, обращаю еще внимание на один факт. Поскольку мы работаем, завернув системные вызовы в свой функциональный блок, то любое изменение «своего» ФБ с последующей загрузкой ПЛК, будет нарушать обмен в связи с переинициализацией экземпляра нашего ФБ. Например, будет уходить в ноль значение «шага обмена». Да и внутренние статические переменные коммуникационных вызовов тоже пострадают. Самый простой способ — стоп и старт контроллера. В боевом проекте это опасно, поэтому там на вход Init я бы подал еще одну переменную и поднимал ее самостоятельно после изменений в коммуникациях. Пока же боремся с остановом обмена простым стоп-стартом ПЛК.


Можно ещё раз другими словами?.. Я немного не понял… ПЛК грузится в RUN «онлайн» без стопа? соответственно, модбас драйвер уже инициализирован и новые значения при их прогрузке не подхватывает, так? Напомните, S7-1200 может грузиться онлайн или через стоп?
А блок инициализации можно вызывать принудительно? Не хотелось бы, условно говоря останавливать процесс ради переинициализации обмена данными.

ЗЫ. Планирую поставить какой-нибудь 1200й в качестве главного ПЛК для умного дома.
Соответственно, нужно делать некий кроссчек на проверку, была ли переменная изменена, чтобы не было такого, что слейв пишет на выход «0», а мы туда статически пишем «1». В ПЧ и т.д. обычно используют режим local\remote либо как здесь некий ControlFromPLC бит, как подтверждение «легитимности» записи.
В-общем, за счёт того, что Modbus в Siemens прописывается «руками» о циклической записи нужно помнить, я так понимю.


Речь не о Модбас в Сименс, речь про Модбас вообще. И даже не только про Модбас. Любое устройство, если оно спроектировано с умом, будет выбирать источник получения команд, «место управления». В случае частотно-регулируемых приводов, как правило, это реализуется выбором управления с локальной панели, с дискретных/аналоговых входов или по интерфейсу, неважно какому. Опять же, как правило, если ПЧ управляется от ПЛК по интерфейсу, то это его штатный режим работы, выбрано место управления, выставлены соответствующие разрешения.

Можно ещё раз другими словами?.. Я немного не понял… ПЛК грузится в RUN «онлайн» без стопа? соответственно, модбас драйвер уже инициализирован и новые значения при их прогрузке не подхватывает, так? Напомните, S7-1200 может грузиться онлайн или через стоп?


ПО ПЛК серии Simatic возможно загружать без останова CPU, это его нормальная работа.
Речь в данном случае идет про то, что в моем примере применяется т.н. мультиэкземпляр функционального блока, где внутри одного ФБ завернуты другие экземпляры ФБ, в частости — отвечающие за коммуникацию. Если на лету изменить интерфейс «внешнего» ФБ, то загрузка по умолчанию будет выполнена с переинициализацией всех его переменных, включая коммуникационные ФБ. Если в это время идет обмен, то такое финт является грубым вмешательством в коммуникации, и обмен попросту останавливается от такого пинка. Это неправильно.

Рестарт контроллера — это самый простой, но самый тупой способ устранить последствия такого наглого вмешательства.

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

Приведенный мной пример не является боевым проектом, но может послужить базой для его разработки.
Если на лету изменить интерфейс «внешнего» ФБ,

Что значит «интерфейс» внешнего ФБ?.. Изменение его структуры, добавление новых данных и т.д.?
Можно ли как-то автоматически отслеживать, что произошла загрузка\изменение ФБ и запуск инициализации коммуникации «с начала»?.. Либо даже не с начала а с последнего шага…
Может ли в таком случае быть потерян какой-то управляющий сигнал на запись?.. (если мы использовали что-то в стиле one shot в шаге 3, а пере-инициализация началась на шаге 1 и мы «потеряли» команду управления?) В-общем, похоже нужно быть внимательным… Может быть, можно и автоматически останавливать коммуникацию?..
Что значит «интерфейс» внешнего ФБ?.. Изменение его структуры, добавление новых данных и т.д.?


Интерфейс функционального блока — это его входные, выходные и статические переменные, то есть, то, что является частью экземпляра ФБ.

Можно ли как-то автоматически отслеживать, что произошла загрузка\изменение ФБ и запуск инициализации коммуникации «с начала»?.. Либо даже не с начала а с последнего шага…


Возможно. Тут можно завести отдельную статическую переменную, вроде аналога «FirstScan», которая при инициализации будет держать значение «истина». Внутри блока при поднятии этой переменной надо будет проводить инит. Тут надо вдумчвиво смотреть и пробовать, описанное выше является предположением.

Может ли в таком случае быть потерян какой-то управляющий сигнал на запись?.. (если мы использовали что-то в стиле one shot в шаге 3, а пере-инициализация началась на шаге 1 и мы «потеряли» команду управления?) В-общем, похоже нужно быть внимательным… Может быть, можно и автоматически останавливать коммуникацию?..


Если связь останавливается, то разумеется у нас рвутся коммуникации. На секунду, а то и больше, к примеру. При этом ряд оборудования держит специальный watchdog, и если от мастера длительное время не прилетает уставка, это считается неисправностью, и ПЧ может остановиться.

В общем, как я уже сказал, это не боевой проект.
Самое простое, что тут можно сделать — это не заворачивать коммуникационные ФБ модбаса в мультиэкземпляр, а объявить их в виде глобальных экземплярных блоков данных. Тогда ситуация на площадке сильно упростится.
Хотелось бы понять а зачем… «заворачивать» ФБ модбаса в мультиэкземпляр как таковой… Это хорошая практика? В примерах Сименс похожий подход?.. Не должна как по мне, падать программа при изменении формата хранения данных…
Там скорее всего… я не знаю как сказать — драйвер модбаса обращается к «жестко» прописанным адресам в ДБ, и если ДБ «сместить» (добавить новую переменную выше по течению) драйвер модбаса наверное, «сходит с ума»?.. хотелось бы поподробнее понять механизм, что там происходит и почему… По всей видимости, нужен какой-то online memory rebuild или типа того, чтобы после изменения олнайн программа продолжала «жить»…
Возможно, в справке по online change про это что-нибудь рассказано, но я с сименсом давно уже не работал…
«— Они тоже из тиа программируются? — Нет, ещё из степа».
Непривычно видеть название STEP7 для среды программирования S7-1200/1500. Обычно её называют TIA Portal, а STEP7 остаётся для старого доброго SIMATIC Manager S7-300/400.
Надо бросать что-то писать с планшета, буквы мелкие, я вначале по ним не попадаю, а потому не вижу кучу опечатак… (

Вот что должно было быть написано:
А сам продукт так и называется — Step 7.
Уточняется либо номером версии (v16, например) или примечанием, что он портальный: Step 7 (TIA Portal).
Например:
mall.industry.siemens.com/mall/en/ru/Catalog/Products/10317037?tree=CatalogTree
1. Также хотелось бы понять механизм появления данных, считанных по Модбас — в какой момент и как они появляются?.. Скажем, классический сценарий работы ЦПУ — считываем входы, делаем программу — записываем выходы.
Где в этом цикле будет находиться перемещине данных из буфера коммуникационного модуля в область ДБ?.. Нужно ли это учитывать при написании программы? Могут ли данные появиться в середине цикла программы и может ли это повлиять на работоспособность?
Насколько я могу судить, считываемые данные могут появиться в любой момент времени (мы не знаем, через сколько ответит слейв или если есть на линии отваленные устройства то к циклу опроса добавится задержка). Не знаю, важно ли это или нет.

2. Я всё со своей записью в регистры «по изменению» в релеынй модуль WirenBoard.
Как писал выше — кейс: управлять лампочками через релейный модуль «в параллель» с входными сигналами. Релейный модуль меняет состояние выходных каналов по фронту входных сигналов, а также может менять состояние (R/W) выходных каналов через modbus.

Остаётся продумать механизм записи. Похоже, он просто выглядит из, как минимум, 2х циклов: чтение выходов (скажем, слово из 8 бит, по биту на выход), проверки слова на запись, если слово на запись != считанному слову -> посылка слова на запись, непосредственно запись в слейв.

Также для повышения быстродействия, по всей видимости (если опрашиваем ХХ устройств) на отклик — можно предусмотреть «прерывания» — если слова на запись != считанным словам, то изменить шаг с условного 1(считывание первого устройства) на 10 — (запись в 1 устройство).
Но опять же, придётся учитывать, что остальная запись пройдет скорее всего, «в холостую», т… е в остальные слейвы будут записаны те же данные, что там и были(для простоты программы).

3. Эмулятор под S7-1200/1500 позволит протестировать Modbus TCP?.. Лет 9 назад вроде не умел, согласно документации…

4.0 Если использовать Modbus TCP, сколько коннектов можно поднять на S7-1200?.. У него вроде было до 8 коннектов, вот я не знаю — туда входят коннекты Модбаса? Вопрос в том ключе, что как работает драйвер ModbusTСP с несколькими слейвами — если делать опрос «по шагам» — то понятно, что как «поллинг».
А что если использовать несколько экземпляров ModbusTСP драйвера, каждый со своим коннекшеном, могу ли я тем самым повысить быстродействие?
4.1 Такой финт ушами для MB_MASTER (несколько экземпляров) в режиме ModbusRTU Over TCP всё равно не пройдет, ведь я понимаю, один экземлпяр на один коммуникационный модуль?
4.2 Что если я поставлю на каждый конвертер TCP-RTU и буду поднимать отдельный MB_MASTER RTU over TCP на каждый конвертер — в теории это же должно повысить быстродействие (см 4.0)?.. Мало того, можно использовать топологию «звезда».
Скажем, в условиях домашнего применения можно было бы HVAC повесить на один шлейф, а управление светом — на другой и вместо RS485 модуля купить 2 преобразователя TCP-RTU.
Вопрос целесообразности пока не сильно затрагиваю, хотелось бы понять больше принцип работы.
Коллега, у Вас очень много вопросов на общие темы.
Так я все пальцы сотру )
Напишите мне в приват, я могу позвонить Вам и дать ответы в общем.

Эм... Выходит, если Modbus TCP использует OUC, то доступно только 8 "слейвов" Modbus TCP? (т.е. каждый слейв со своим IP будет занимать одно соединение)?...(

Все верно, коннекшены расходуются, и их в 1200ом - немного.

Далее я попытался разложить слово состояния в биты состояния, заменив WORD на структуру из бит, но что-то явно пошло не так.

В PLC Siemens для типов больших одного байта используется формат big-endian(от старшего к младшему, см. Endianness).
Поэтому и "перепутались" байты.

Каждый раз, видя статьи на Хабре о том, как следовать F1 в TIA Portal меня сжигает испанский стыд… От комментариев и вовсе опускаются руки… Может тоже свои дрова как статьи выложить? Хотя бы за рамки хелпа выберусь… И самое грустное — такие статьи не спасут от имён блоков/переменных на русском языке в пять-семь слов или любителей весь код впихнуть в OB1…
Коллега, Вы не поверите, но
1. Являясь технической поддержкой Сименс на Урале, я постоянно сталкиваюсь с вопросами про модбас и s7-связь. Несмотря на то, что мануала вполне достаточно. Все мои публикации написаны, в том числе, с корыстной целью упростить себе жизнь.
2. Выкладывайте, конечно. Будет полезно и познавательно, особенно новичкам, которые вряд ли даже понимают, что значит «количество байт далее» в пакете modbus tcp
Конечно, выкладывайте, интересно ж!
Скажу честно, заглянул найти для себя что-то интересное. С siemens не работаю.
Из прочитанного сделал следующий вывод — реализовать даже кастомного (есть встроенный) мастера на ПЛК Овен (среда Codesys 2.3) значительно проще. Про ПЛК фирмы Koyo вообще и говорить нечего.

Зачем они так усложняют? Я не говорю, что это сложно. Но требует явно больше времени на реализацию.
Коллега, я не стремлюсь вдаваться в дискуссию и поэтому позволю себе только один вопрос.
Реализовать на овене проще или привычнее? Это разные вещи.
И в Овне и в Koyo есть конструктор — просто и быстро можно подключить кучу девайсов, проставить признаки обновления (по времени, по изменению тд).
Если же стандартный конструктор не устраивает, на помощь приходит Modbus_lib. Здесь уже реализация напоминает ваш случай. Просто в реализации на Codesys на мой взгляд библиотека очевиднее. Открыть порт все так же. Вот последующие запросы немного иначе. Вы используете DATA_ADDR с указанием области. В моем же случае у меня полный набор ФБ в виде read_holding, write_coil, write_multiple и так далее. Понятно, что можно таковые создать и у вас в проекте.
Лично я ждал от топ ПЛК какого-то богатого набора инструментов из коробки. Изумившись отсутствием и был написан первый коммент.

А в заключение, оговорюсь по поводу проще — кому-то и на жигулях с механикой «проще», чем на автомате мерса. Это вкусовщина. Я не совсем корректно выразил мысль в первом сообщении.

И еще одна ремарка, я не люблю Овен. Я просто вынужден с ним работать.
Я вспомнил, о чем Вы говорили, коллега

Справедливости ради замечу, что безусловное удобство работы с модбасом является заслугой компании 3S software, являющейся автором среды codesys третьей версии, где и программируется ряд ПЛК фирмы Овен. Некоторые же модели ПЛК, например, плк63 и плк73 программируются в кодесис версии 2, и опрос по модбас превращается в тьму и ужас )

Но в третьей версии — красота.

Вынужден вас поправить. Третью версию codesys поддерживает 1 или 2 ПЛК овен узкой специализации ( совершенно не подходят для стандартных проектов). Вся основная линейка (включая новый 110м2 на котором мы сидим ) дружит только с версией 2.3. Удивительно, ПЛК новый, а среда старая. Имея опыт знакомства с TIA 15 версии, скажу так — codesys 2.3 это как Delphi 6 версии. При этом имеется удобнейший конструктор для modbus. Хотя, не глядя на modbus, я всегда завидовал тем кто работает на TIA. Довелось поработать неделю в свежей версии. Это как иномарка после Жигулей.

Странно, очень странно.

Поработав как-то с ПЛК110 (вроде бы) в кодесис 3, был абсолютно уверен, что таргеты под новые ПЛК будут исключительно для 3ей версии.

За исключением мутности с версией таргета и версией библиотек, и с учетом стоимости, решение, в принципе, удовлетворительное. Не знаю, правда, то ли эта тенденция у них, то ли мне так «везло», но цепи в 24 Вольта у них дохнут, как мухи в полдень.
Хочется проконсультироваться) Автору спасибо, ибо появилось хоть общее представление как работать с модбасом в сименсе. Сейчас ситуация такова: плк S7-1200 (6ES7215-1HG40-0XB0), панель TP700 (6AV2124-0GC01-0AX0) и 4 тензомодуля (7MH4960-2AA01). Предполагалось подключить все модули к контроллеру на шину, но в итоге узнаю что модули должны быть установлены удаленно от контроллера ближе к датчикам тензометрии (метров 30). Знаю что можно панель непосредственно подключить через Модбас (у моей Profinet (( ). Теперь задумка поставить на контроллер модуль RS-485 (6ES7 241-1CH32-0XB0) и организовать чтение/запись в тензомодули. Я понимаю что это получится много запросов, плюс как то необходимо калибровать сами модули с панели ( вообщем жопа(( ). Посоветуйте как проще выбраться из этой ситуации и вообще получится сделать так, как я хочу?
Only those users with full accounts are able to leave comments. Log in, please.