PDA

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



Scream
03.02.2016, 13:11
Добрый день.
Так понял возможность читать 16 функцией если ПЛК мастер есть, но отдавать сразу несколько регистров он не умеет (FLOAT не в счет)?
Я хотел опрашивать ПЛК сразу кучу регистров в несколько десятков, но String для modbus slave нет.
Может кто что подскажет, какие способы еще есть?

capzap
03.02.2016, 13:19
в чем подвох, слейв в плк отдает 3 функцией сколько затребовано регистров, и флоаты как частный случай подтверждение тому

Гарчев Евгений
03.02.2016, 13:33
Здравствуйте!
Как бы ... 16-функция - это функция записи ...
А для слейва можно читать/писать одной посылкой все подряд, хоть кучу 8bit-элементов, хоть все вперемешку - float, 2byte, 4byte ,8bit ...

Scream
03.02.2016, 13:33
в чем подвох, слейв в плк отдает 3 функцией сколько затребовано регистров, и флоаты как частный случай подтверждение тому

скомпоновать мне как 300 регистров? клацать мышкой 150 раз?

Scream
03.02.2016, 13:36
Здравствуйте!
Как бы ... 16-функция - это функция записи ...
А для слейва можно читать/писать одной посылкой все подряд, хоть кучу 8bit-элементов, хоть все вперемешку - float, 2byte, 4byte ,8bit ...

да, функцию перепутал, не важно.
хочу разместить массив, например как String в modbus master.

capzap
03.02.2016, 13:36
скомпоновать мне как 300 регистров? клацать мышкой 150 раз?

а, дело не в запросе а в создании слейва в конфигураторе, тогда поищите поиском, выкладывалось решение импорт/експорт, а в текстовом редакторе копипастинг, причем не важно слова или двойные будут, главное что б по размеру совпадало, а из проги указателем присваивать массив

Scream
03.02.2016, 13:37
а, дело не в запросе а в создании слейва в конфигураторе, тогда поищите поиском, выкладывалось решение импорт/експорт, а в текстовом редакторе копипастинг

да, верно.
Думал об этом, но блин, 100500 строк в конфигураторе, костыль.

Гарчев Евгений
03.02.2016, 13:50
да, функцию перепутал, не важно.
хочу разместить массив, например как String в modbus master.
В программе объявите переменную стринг нужной длины, указав ей АТ-адрес первого элемента (например, 2 byte) из ModBus Slave. Но при этом придется создать необходимое кол-во элементов 2byte в области ModBus Slave.

Можно объявить и непосредственно массив из необходимого кол-ва элементов, указав АТ-адрес первого элемента в слейве.

Гарчев Евгений
03.02.2016, 13:52
да, верно.
Думал об этом, но блин, 100500 строк в конфигураторе, костыль.

Придется, по другому никак (Ctrl+C, Ctrl+V первого элемента).
Точнее: по другому - написать свой слейв через библиотеки.

Гарчев Евгений
03.02.2016, 13:56
в чем подвох, слейв в плк отдает 3 функцией сколько затребовано регистров, и флоаты как частный случай подтверждение тому

На счет ПЛК все верно, но вот флоат или дворд не всегда подтверждают возможность опроса групповыми посылками. Бывает, что на 2-ух регистрах как раз и заканчивается возможность группового опроса, например, как в модулях Мх110-ТД.

Scream
03.02.2016, 13:59
На счет ПЛК все верно, но вот флоат или дворд не всегда подтверждают возможность опроса групповыми посылками. Бывает, что на 2-ух регистрах как раз и заканчивается возможность группового опроса, например, как в модулях Мх110-ТД.

а какой предел этой возможности? сколько регистров плк может отдать?

capzap
03.02.2016, 14:10
а какой предел этой возможности? сколько регистров плк может отдать?

а это в протоколе нужно смотреть, по полю количество отдаваемых данных в байтах? размер этого поля тоже байт, так что можно отправить не больше 127 слов, мне так кажется

Гарчев Евгений
03.02.2016, 14:11
предел - максимальная длина посылки протокола ModBus (125 или 126 регистров).

Yegor
03.02.2016, 14:17
125 уже не получится. Коллега спотыкался на чём-то около 70. Может быть даже 64 — как раз круглое число. Решение — читать мастером поочерёдно (с 0 по 63, с 64 по 127, со 128...).

Гарчев Евгений
03.02.2016, 14:24
125 уже не получится. Коллега спотыкался на чём-то около 70. Может быть даже 64 — как раз круглое число. Решение — читать мастером поочерёдно (с 0 по 63, с 64 по 127, со 128...).

Странно, 70 регистров - это всего где-то половина от максимальной длины посылки. Думаю, можно все-таки попробовать прочитать и 125 регистров, а уж если не получится, тогда и разбивать запросы по 70 (или по 64) регистров.

Yegor
03.02.2016, 19:01
А, ну да. Он приходил с вопросом как прочитать 140, после чего я предложил ему делать по 70. Так что максимум где-то между этими числами.

spectrum48k
03.02.2016, 19:26
Как всегда у ОВНа , самописная библиотека -- Ваше Всё

Валенок
03.02.2016, 20:46
Читаем хотя бы wiki про модбас (250read/246write)
ПЛК как штатный слейв замечательный и полноразмерный. 125 рег (ф3,4) и/или 123рег (ф16) без всяких биб-к позволяет легко читать и писать.
ПЛК как штатный мастер не очень удобен, на данный момент ограничен 40 рег (через строку). Но через биб-ки снимаются ессно все ограничения.

Валенок
03.02.2016, 20:57
скомпоновать мне как 300 регистров? клацать мышкой 150 раз?
В принципе уже сказали, но отмечу, что зажав одной рукой ctrl-v, а другой размешивая кофе где-то через 5 (пять) сек получаете слейв в 200..300 регистров.

Scream
03.02.2016, 21:00
значит самый большой тип который можно использовать чтобы набить регистры - float = 4 байта
нигде там подправить нельзя чтобы был свой тип на 20\40\80 байт?

Валенок
03.02.2016, 21:03
А на кой ?

spectrum48k
04.02.2016, 14:10
Читаем хотя бы wiki про модбас (250read/246write)
ПЛК как штатный слейв замечательный и полноразмерный. 125 рег (ф3,4) и/или 123рег (ф16) без всяких биб-к позволяет легко читать и писать.
ПЛК как штатный мастер не очень удобен, на данный момент ограничен 40 рег (через строку). Но через биб-ки снимаются ессно все ограничения.


и тогда это будет называться, если я не путаю, JBus

Валенок
04.02.2016, 18:04
Тогда это когда ? ))

Scream
05.02.2016, 11:42
А на кой ?

допустим я хочу String передать в панель (панель Master, запросит), извращаться с регситрами не хочу, просто хочу объявить фиксированное кол-во байт и отдать это кол-во одним запросом, это ведь так просто... но Овен так не думает.

Филоненко Владислав
05.02.2016, 11:59
скомпоновать мне как 300 регистров? клацать мышкой 150 раз?
300 регистров вообще невозможно передать по протоколу ModBus. до 120 штук.

Scream
05.02.2016, 12:37
300 регистров вообще невозможно передать по протоколу ModBus. до 120 штук.

пусть за 3 запроса, не в этом суть.

Валенок
05.02.2016, 22:18
допустим я хочу String передать в панель (панель Master, запросит), извращаться с регситрами не хочу, просто хочу объявить фиксированное кол-во байт и отдать это кол-во одним запросом..
Регистры ? А что это ? ))
FB и STRUCT - свободно объявляемые пользователем типы любого размера с любым уровнем вложенности
Slave - идеально работающий по модбас просто кусок памяти со свободно изменяемым размером
Взгляд на этот кусок памяти через трафарет указателя to FB/STRUCT решает проблему + куча бонусов
Для мастеров которым нужны именно адреса - несложно найти их временной отладочной функцией
Если и мастер - плк, о регистрах вообще забываем

Scream
06.02.2016, 00:03
Регистры ? А что это ? ))
FB и STRUCT - свободно объявляемые пользователем типы любого размера с любым уровнем вложенности
Slave - идеально работающий по модбас просто кусок памяти со свободно изменяемым размером
Взгляд на этот кусок памяти через трафарет указателя to FB/STRUCT решает проблему + куча бонусов
Для мастеров которым нужны именно адреса - несложно найти их временной отладочной функцией
Если и мастер - плк, о регистрах вообще забываем

https://ru.wikipedia.org/wiki/Modbus (https://ru.wikipedia.org/wiki/Modbus)тут около 30 раз упоминается слово "регистр"
мысль вашу не до конца понял, если можно, чуть подробнее.
с указателями я думал, но ничего не придумал толкового пока, конфигуратор дает гулять только в четкой границе описанных регистров в нем.

Yegor
06.02.2016, 06:57
Вам предлагается тупо набить необходимый объём слейва в конфигурации и обращаться к этому участку памяти из программы как к структуре или как к любому другому типу. Например, если через слейв вы хотите проталкивать 80-байтную строку и при этом в программе ПЛК работать с ней именно как со строкой, то добавляете 20 безымянных (кроме первого) 4 byte в слейв, в программе ПЛК объявляете указатель POINTER TO STRING(80), ставите этот указатель на адрес первого 4 byte, и — вуаля! — у вас слейв со строкой. Но таки да, вам пришлось добавить 20 4-байтовых элементов (впрочем, именовать их не потребовалось).

capzap
06.02.2016, 07:54
конфигуратор дает гулять только в четкой границе описанных регистров в нем.
откажитесь от него, если на ПК прога это не какой то законченный продукт, а собственный примите бинарные данные через сокет, разбор на конкретные переменные в проге будет намного быстрее чем три раза выполнять запрос на чтение по модбас

Scream
06.02.2016, 11:03
откажитесь от него, если на ПК прога это не какой то законченный продукт, а собственный примите бинарные данные через сокет, разбор на конкретные переменные в проге будет намного быстрее чем три раза выполнять запрос на чтение по модбас

Да, больше склоняюсь к этому варианту. Полный контроль над происходящим.

Scream
06.02.2016, 11:14
Вам предлагается тупо набить необходимый объём слейва в конфигурации и обращаться к этому участку памяти из программы как к структуре или как к любому другому типу. Например, если через слейв вы хотите проталкивать 80-байтную строку и при этом в программе ПЛК работать с ней именно как со строкой, то добавляете 20 безымянных (кроме первого) 4 byte в слейв, в программе ПЛК объявляете указатель POINTER TO STRING(80), ставите этот указатель на адрес первого 4 byte, и — вуаля! — у вас слейв со строкой. Но таки да, вам пришлось добавить 20 4-байтовых элементов (впрочем, именовать их не потребовалось).

Да, спасибо, это я уже понял, что без клацанья никак.
У меня нужные мне данные склеиваются в пакеты по 10 байт, обновляются раз в 3 сек, с помощью string, хотел сделать массив по принципу первый вошёл последним вышел, тоесть маленький архив, к которому можно в любой момент обратиться. Данные должны попасть все в любом случае, коммерческий учёт. Сохранение в файлы на плк не представляется возможным, все глючит.
Поэтому хотел несколько таких массивов рахместить в slave, ,проблема в том что регистры вставляются в середину со смещением, я просто запутаюсь, сейчас пока проектирования у меня 10 байт, завтра 12 и всё адреса поплывут.

Yegor
06.02.2016, 11:59
проблема в том что регистры вставляются в середину со смещением, я просто запутаюсь, сейчас пока проектирования у меня 10 байт, завтра 12 и всё адреса поплывутНу а для кого ж я стараюсь-то? http://www.owen.ru/forum/showthread.php?t=23196