PDA

Просмотр полной версии : СПК110 Modbus TCP обмен с модулями ввода/вывода



Unreality
03.12.2024, 07:15
Добрый день,
Описание проблемы:

Контроллер СПК110
SMC EX600
И модули ввода/вывода МВ210


Все они соединены между собой по Modbus TCP
Внутри CODESYS все настроено, проверено с помощью руководств и FAQов, но есть нюанс...
Обмен который происходит по Modbus TCP выполняется медленно на практике, и запуске ПЛК всегда есть ошибки на модуле SMC EX600 (ошибки появляются не сразу)
Сам обмен настроен так:
У ПЛК цикл выполнения задач = 25мс
у ОВЕН модулей МВ210 - дискретные = 25мс, у аналогового 400мс
у EX600 тоже обмен стоит по 25мс
Итого на практике получается следующее:
При включении выхода на МВ210 или на EX600, с панели через кнопку - задержка по сути только визуальная, которая складывается из времени цикла визуализации и реакции системы.
Иными словами если я включу один выход на МВ210 или на EX600, руками с панели - проблем особо нет.
Однако в рамках технологии мне нужно на EX600, одновременно включить 4ре выхода на разных адресах в модуле. И тут начинается проблема - это по сути невозможно сделать.
Как проверялось - я сделал цикл 100мс/500мс/1000мс (как это сделано написано в отдельной ветке форума, потому что и там тоже не гладко)
***
Сразу оговорка по Фрейду - мои действия в настройке программы могут быть ошибочны или не правильными, поэтому я пытаюсь понять, что не так в моих действиях или что не так в настройках ПО
***
Собственно поставил 4 бита разных адресов, включаться каждую секунду - результат включение рандомно, то 1 выход, то 2 выхода, то 1 и 3й выход включаться - одновременно их включить не получается
Попробовал уменьшить время до 500мс - тоже самое
Пробовал на МВ210-403 - тоже самое
Вспомнил то как когда то вручную писал обмен на Segnetics, для Modbus RTU, там нужно было прям прописать байтами запрос и получив байтовый ответ, разобрать его.
Тут ситуация иная - в самом CODESYS есть возможность привязки переменных, что я и сделал.
Привязал битовые данные к выходам (ниже будет вырезка из EX600)
Пробовал использовать запись по коду 05 или 15 - разницы нет, результат один и тот же.

Единственное, что не пробовал - так это, привязывать цикл шины к задаче, но об этом ниже - вопросы.

Картинки того как настроено все - ниже
80517
80518

Вопросы:
1. Допускается ли использование битовых переменных при обмене по Modbus TCP именно в CODESYS?
2. Есть ли разница при записи через код 5 или код 15 при использовании битовых переменных?
Тут вопрос, про код 15 больше, так как я изменяю 1 бит в low byte, остальные не трогаю - по сути изменения записываются сами средствами ПЛК - или это не так?
3. нужно ли привязать цикл шины к циклу ПЛК, например к main_prg?
4. Более "абстрактный" вопрос - в чем может быть причина асинхронной работы модулей вывода?
Вопрос касается поведения описанного выше. Я беру 4 бита из адресного пространства 0х0000 / 0х0010 / 0х0020 - и получаю глюки, вместо одновременного включения.

Евгений Кислов
03.12.2024, 07:43
Добрый день.

1. Да.
2. С точки зрения ПЛК - никакой принципиальной разницы нет.
Функция 15 позволяет записать несколько бит одним запросом, функция 05 записывает каждый бит отдельным запросом.
Основной вопрос к SMC EX600 - позволяет ли он записать все 4 нужных вам бита одним запросом.
3. https://ftp.owen.ru/CoDeSys3/98_Books/CodesysTaskManagment.pdf (п. 4, п. 8)

Напишите мне в телеграм (см. в подписи) или на support@owen.ru - разберемся, что происходит в вашей конкретной ситуации.

Unreality
03.12.2024, 08:00
Добрый день.

1. Да.
2. С точки зрения ПЛК - никакой принципиальной разницы нет.
Функция 15 позволяет записать несколько бит одним запросом, функция 05 записывает каждый бит отдельным запросом.
Основной вопрос к SMC EX600 - позволяет ли он записать все 4 нужных вам бита одним запросом.
3. https://ftp.owen.ru/CoDeSys3/98_Books/CodesysTaskManagment.pdf (п. 4, п. 8)

Напишите мне в телеграм (см. в подписи) или на support@owen.ru - разберемся, что происходит в вашей конкретной ситуации.

Напишу
Руководство по циклам - это первое, что я прочитал)
EX600 по идее позволяет. По крайней мере ограничений внутри руководства я не нашел.
да и логика работы их модуля одинакова на всех протоколах (PROFIBUS/PROFINET/CAN и т.д.)

Unreality
18.12.2024, 22:49
Напишу
Руководство по циклам - это первое, что я прочитал)
EX600 по идее позволяет. По крайней мере ограничений внутри руководства я не нашел.
да и логика работы их модуля одинакова на всех протоколах (PROFIBUS/PROFINET/CAN и т.д.)

***
Итого получилось сделать так
Чтение и запись сделал 2мя командами соответственно
На чтение идет 4 байта
На запись (код 15) идет 4 байта

Время опроса для всех модулей установил равным 250 мс
У аналогового модуля - 600мс (чтобы стабилизировать сигнал по инструкции)
В итоге получился разбег от 250 мс до 600 мс время опроса для 4х модулей ввода вывода

Отрабатывает отлично
пропусков в командах нет.

***
Однако появился нюанс с точки зрения ошибок по соединению - модуль EX600 начал в произвольный момент времени отваливаться. То есть СПК110 сообщает что ошибка SLAVE. Её сбрасываешь и все едет дальше.
В поддержку написал, жду ответа. Думаю это обсуждать в этой теме не стоит.