PDA

Просмотр полной версии : Modbus TCP (write multiple registers)



cer_cer
05.06.2014, 18:02
Здравствуйте. Прошу помочь разобраться в следующей проблеме:

Хочу протестировать скорость и стабильность передачи данных по LAN между ПЛК 100 и S7-1200 по протоколу Modbus TCP .
ПЛК 100 мастер (клиент) S7-1200 слейв (сервер) ПЛК100 нужно записать командой write multiple registers (0х10) 32 регистра (word)

Читаю документацию (plc_configuration)
===Параметры каналов ввода/вывода модуля Modbus (Master): «Номер команды протокола» (Command) – значения выбираются из
списка возможных вариантов, значение по умолчанию – «preset single register (0x06)» для выходной строковой переменной («write multiple
registers (0x10)» для 2-байтной переменной и др.) (см. п. 3.2.2.1).===
Вообще ничего непонятно. Что такое в вашем понимании строковая переменная? А ===2-байтная переменная и др.=== мне вообще ни о чём неговорит к применению 0Х10 команды?

===3.2.2.1. Параметр «Номер команды протокола» (Command)
В параметре «Номер команды протокола» (Command) задают номер команды (номер функции) протокола, по которой будет производиться обмен,
т.к. некоторые устройства поддерживают не все команды (функции) протокола ModBus.===

Так вот выставил я в конфигураторе в Register output module 0х10 команду но больше 1го канала типа word не могу добавить!?
Есть ли где-нибудь пример конфигурации Register output module на 0х10 команду?

capzap
05.06.2014, 18:41
если Вы знаете протокол modbusTCP, то можете не читать такую документацию, Вам главное понять, что указав какие переменные Вы будете передавать в слейв, задав им 16 функцию и жжелательно не накладывать адресацию друг на друга, то конфигуратор запишет в слейв групповой запрос

cer_cer
05.06.2014, 18:59
если Вы знаете протокол modbusTCP, то можете не читать такую документацию, Вам главное понять, что указав какие переменные Вы будете передавать в слейв, задав им 16 функцию и жжелательно не накладывать адресацию друг на друга, то конфигуратор запишет в слейв групповой запрос

АГА... Т.е. надо в Universal modbus device сконфигурировать к примеру 32 register output module c 16 функцией и адресами строго попорядку (к примеру 0...32) и эти регистры запишутся в слейв (сервер) в одной транзакции (запросе) я правильно вас понял?

capzap
05.06.2014, 19:54
ну какими пачками будет записывать конфигуратор я не знаю, скорее всего полностью

cer_cer
05.06.2014, 22:51
ну какими пачками будет записывать конфигуратор я не знаю, скорее всего полностью

Мне нужно знать точно. 16 функция предусматривает передачу данных (32 регистра в моём случае) в ОДНОМ пакете Это очень важно. Т.к. в разы отличается скорость передачи и нагрузка на сеть. Буду ждать ответа техподдержки.

cer_cer
15.06.2014, 22:32
Уважаемая техподдержка, ответьте пожалуйста хоть что-нибудь. Например так =Ответа на этот вопрос небудет (ненадейтесь)=

Если кому интересно протестировал обмен по 6 команде с соединением через роутер.
При минимальном Polling time (10ms) передаётся 35-38 пакетов в секунду.

Валенок
16.06.2014, 12:04
Штатный мастер у овена не особо заточен под группы. Некоторое решение - string output/input с 16й функцией. Размер строки в пределах 80 байт - настраивается. Поинтеры помогут с переносами.

Трофимов Артем
16.06.2014, 12:07
в ПЛК не реализован групповой запрос более чем двух регистров. потому, если Вы добавляете несколько 32 register output module , то у вас будет соответсвующее количество запросов, сколько переменных добавлено.

Валенок
16.06.2014, 12:20
Т.к. Артем - от авторов, то как работает string output/input ?

Трофимов Артем
16.06.2014, 13:45
в string элементах указывается количество передаваемых байт ( количество символов строки), что фиксированно будут передаваться. единственный элемент, который можно назвать "псевдо-групповым" запросом. т.к. по сути это передача одной строки, как и передача отдельного DWORD'а. Соглашусь, тут меняя количество байт мы можем получить передачу бОльших данных в одном запросе , нежели другими средствами , заложенными в конфигурацию ПЛК. но тут нужно упаковать все Ваши данные побайтово в ASCII символы. да и не забыть , что за чем лежит.

Валенок
16.06.2014, 13:59
А зачем в ASCii - структура/фб через указатель. Ведь передается не LEN а SIZEOF, да ?
Ведь в модбас нет строк, и если передача за раз, то единственный вариант тут не псевдо, а действительно групповой. И строка здесь просто буфер.

Единственная проблема - проверить адрес этой строки на кратность 4м если есть обращения к полям этой структуры через указатель

Трофимов Артем
16.06.2014, 15:25
А зачем в ASCii - структура/фб через указатель. Ведь передается не LEN а SIZEOF, да ?
Ведь в модбас нет строк, и если передача за раз, то единственный вариант тут не псевдо, а действительно групповой. И строка здесь просто буфер.

Единственная проблема - проверить адрес этой строки на кратность 4м если есть обращения к полям этой структуры через указатель

по поводу ASCII предполагал разбить нашу переменную через указатели на байты. и конвертировать их в строку. хотя в итоге получаем те же байты в посылке. просто при составлении строки можно CONCATами добавить какие либо идентификаторы/разделители. ну и тут же возникает указанная Вами проблема с кратностями.

Валенок
16.06.2014, 15:51
Если переносить структуру в коробку от этой строки побайтно или sysmemсpy, то добавлять CONCATA'ми какие-либо идентификаторы к получившемуся не гут, так как отдельные элементы внутри структуры могут содержать нулевые байты и результат почикается. К тому же в бинарном виде составные байты числа могут содержать любое значение - чем тогда будет разделитель ?
С кратностью же бороцца просто - перенос (см. выше) в нормальное место и после этого использование.