PDA

Просмотр полной версии : Modbus TCP Slave



ivydy
19.11.2021, 13:31
Здравствуйте. Имею Owen ПЛК160[M02] и панель Weintek MT8050iE.
Соединил их по протоколу Modbus TCP. Плк-slave, панель - master. Получилось настроить связь и передать некоторые данные посредством параметрирования пункта "Конфигурация ПЛК" в Codesys v2.3. Но проблема в том, что нужно передавать очень большие объемы данных (несколько десятков массивов по 50...200 значений). Вручную вбивать каждую переменную массива очень трудозатратно. Каким образом можно это осуществить? Иными словами, как можно передать весь массив целиком? Спасибо

In_Da_Cher_A
19.11.2021, 14:13
несколько десятков массивов по 50...200 значенийрецепты? грубо 2000-5000 и т.д. переменных? а что им делать всем там делать?
мне кажется вы переоцениваете возможности плк

ivydy
19.11.2021, 14:17
рецепты? 2000 переменных? а что им делать всем там делать?
мне кажется вы переоцениваете возможности плк

разве это много? У меня были проекты, где количество передаваемых переменных превышало 8000.
Суть не в этом. Даже если нужно передать всего лишь два массива по 100 переменных. Как это сделать наиболее быстро? Без прописывания каждого канала по отдельности. В Codesys v3.5 такое возможно. Есть ли в Codesys v2.3 что-либо подобное?

melky
19.11.2021, 14:29
библиотеки использовать а не конфигурацию, а конфигурацию надо будет отключить.

ivydy
19.11.2021, 14:32
библиотеки использовать а не конфигурацию, а конфигурацию надо будет отключить.

Не могли бы вы сказать название библиотек или дать ссылку на обучающее видео? На ютуб-канале Owen при первом беглом просмотре я что-то не нашел ничего по этой теме

melky
19.11.2021, 15:20
Modbus Slave очевидно. ссылок на обучающее не дам, так как не знаю. Работа с Modbus возможна двумя способами, через Конфигуратор, что вам лень, хотя как Slave ПЛК читается групповыми запросами. Или через библиотеки, без добавления данных в Конфигуратор (хотя если ПЛК не мастер должно быть фиолетово, есть там что-то или нет, порт только может мешать будет)

з.ы. до библиотек сам еще не добрался...

ivydy
19.11.2021, 15:28
Modbus Slave очевидно. ссылок на обучающее не дам, так как не знаю. Работа с Modbus возможна двумя способами, через Конфигуратор, что вам лень, хотя как Slave ПЛК читается групповыми запросами. Или через библиотеки, без добавления данных в Конфигуратор (хотя если ПЛК не мастер должно быть фиолетово, есть там что-то или нет, порт только может мешать будет)

з.ы. до библиотек сам еще не добрался...

что за Modbus Slave? Я нашел только библиотеку OwenModbusSlave, но она работает только для Modbus RTU, то есть в моем случае не подходит.

kondor3000
19.11.2021, 15:35
разве это много? У меня были проекты, где количество передаваемых переменных превышало 8000.
Суть не в этом. Даже если нужно передать всего лишь два массива по 100 переменных. Как это сделать наиболее быстро? Без прописывания каждого канала по отдельности. В Codesys v3.5 такое возможно. Есть ли в Codesys v2.3 что-либо подобное?

Если бы был ПЛК мастер, то пятью String можно передать 200 переменных, упакованных в 5 массивов по 40 целочисленных ( или 20 REAL). Писанины меньше.
Тоже можно сделать и в слейве, только добавлять придётся 200 шт. по 2 BYTE. Это всё через конфигурацию.

melky
19.11.2021, 15:57
ivydy oscat networks или base не смотрели? где-то из них есть Modbus TCP

Логвиненко Андрей
19.11.2021, 16:00
Через конфигуратор всё делается достаточно просто.
Максимальный размер слейва 999 переменных, если они будут DWORD, то можно зарезервировать область памяти до 3996 байт.
Делается это копипастом достаточно быстро.
Далее нужно создать структуру, которая содержит нужные типы данных, например:
TYPE Motor :
STRUCT
uiState: UINT;
uiPrt: UINT;
xMan,
xManStart,
xSwitch ,
xReady,
xRun,
xAuto,
xDrvFault,
xInhibition,
xStartFault,
xAlert,
xReset: BOOL;

END_STRUCT
END_TYPE

в глобальных переменных объявляем переменные требуемого типа:
VAR_GLOBAL

Pump1 AT %QD7.1.0:Motor;

Pump2 AT %QD7.5.0:Motor;

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

ivydy
19.11.2021, 16:56
Через конфигуратор всё делается достаточно просто.
Максимальный размер слейва 999 переменных, если они будут DWORD, то можно зарезервировать область памяти до 3996 байт.
Делается это копипастом достаточно быстро.
Далее нужно создать структуру, которая содержит нужные типы данных, например:
TYPE Motor :
STRUCT
uiState: UINT;
uiPrt: UINT;
xMan,
xManStart,
xSwitch ,
xReady,
xRun,
xAuto,
xDrvFault,
xInhibition,
xStartFault,
xAlert,
xReset: BOOL;

END_STRUCT
END_TYPE

в глобальных переменных объявляем переменные требуемого типа:
VAR_GLOBAL

Pump1 AT %QD7.1.0:Motor;

Pump2 AT %QD7.5.0:Motor;

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

Спасибо за ответ. А в самой Конфигурации ПЛК что в вашем случае требуется сделать? Ничего? Ограничиться только вызовом подэлемента TCP[VAR] и все?

Логвиненко Андрей
19.11.2021, 17:31
В конфигурации выбираются требуемые интерфейсы (TCP, RS-xxx), их может быть несколько, и резервируется необходимый размер памяти.

ivydy
19.11.2021, 17:34
В конфигурации выбираются требуемые интерфейсы (TCP, RS-xxx), их может быть несколько, и резервируется необходимый размер памяти.

А резервируется каким образом? Что сделать то нужно для этого?

57979

Логвиненко Андрей
19.11.2021, 17:52
Надо добавить нужное количество пустых подэлементов , лучше всего 4 byte.

keysansa
19.11.2021, 19:11
Если бы был ПЛК мастер, то пятью String можно передать 200 переменных, упакованных в 5 массивов по 40 целочисленных ( или 20 REAL). Писанины меньше.
Тоже можно сделать и в слейве, только добавлять придётся 200 шт. по 2 BYTE. Это всё через конфигурацию.

По времени - дешевле массив подряд по RTU передавать. чем строку.