Просмотр полной версии : Modbus Slave STRING
Добрый день.
Так понял возможность читать 16 функцией если ПЛК мастер есть, но отдавать сразу несколько регистров он не умеет (FLOAT не в счет)?
Я хотел опрашивать ПЛК сразу кучу регистров в несколько десятков, но String для modbus slave нет.
Может кто что подскажет, какие способы еще есть?
в чем подвох, слейв в плк отдает 3 функцией сколько затребовано регистров, и флоаты как частный случай подтверждение тому
Гарчев Евгений
03.02.2016, 13:33
Здравствуйте!
Как бы ... 16-функция - это функция записи ...
А для слейва можно читать/писать одной посылкой все подряд, хоть кучу 8bit-элементов, хоть все вперемешку - float, 2byte, 4byte ,8bit ...
в чем подвох, слейв в плк отдает 3 функцией сколько затребовано регистров, и флоаты как частный случай подтверждение тому
скомпоновать мне как 300 регистров? клацать мышкой 150 раз?
Здравствуйте!
Как бы ... 16-функция - это функция записи ...
А для слейва можно читать/писать одной посылкой все подряд, хоть кучу 8bit-элементов, хоть все вперемешку - float, 2byte, 4byte ,8bit ...
да, функцию перепутал, не важно.
хочу разместить массив, например как String в modbus master.
скомпоновать мне как 300 регистров? клацать мышкой 150 раз?
а, дело не в запросе а в создании слейва в конфигураторе, тогда поищите поиском, выкладывалось решение импорт/експорт, а в текстовом редакторе копипастинг, причем не важно слова или двойные будут, главное что б по размеру совпадало, а из проги указателем присваивать массив
а, дело не в запросе а в создании слейва в конфигураторе, тогда поищите поиском, выкладывалось решение импорт/експорт, а в текстовом редакторе копипастинг
да, верно.
Думал об этом, но блин, 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-ТД.
На счет ПЛК все верно, но вот флоат или дворд не всегда подтверждают возможность опроса групповыми посылками. Бывает, что на 2-ух регистрах как раз и заканчивается возможность группового опроса, например, как в модулях Мх110-ТД.
а какой предел этой возможности? сколько регистров плк может отдать?
а какой предел этой возможности? сколько регистров плк может отдать?
а это в протоколе нужно смотреть, по полю количество отдаваемых данных в байтах? размер этого поля тоже байт, так что можно отправить не больше 127 слов, мне так кажется
Гарчев Евгений
03.02.2016, 14:11
предел - максимальная длина посылки протокола ModBus (125 или 126 регистров).
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) регистров.
А, ну да. Он приходил с вопросом как прочитать 140, после чего я предложил ему делать по 70. Так что максимум где-то между этими числами.
spectrum48k
03.02.2016, 19:26
Как всегда у ОВНа , самописная библиотека -- Ваше Всё
Читаем хотя бы wiki про модбас (250read/246write)
ПЛК как штатный слейв замечательный и полноразмерный. 125 рег (ф3,4) и/или 123рег (ф16) без всяких биб-к позволяет легко читать и писать.
ПЛК как штатный мастер не очень удобен, на данный момент ограничен 40 рег (через строку). Но через биб-ки снимаются ессно все ограничения.
скомпоновать мне как 300 регистров? клацать мышкой 150 раз?
В принципе уже сказали, но отмечу, что зажав одной рукой ctrl-v, а другой размешивая кофе где-то через 5 (пять) сек получаете слейв в 200..300 регистров.
значит самый большой тип который можно использовать чтобы набить регистры - float = 4 байта
нигде там подправить нельзя чтобы был свой тип на 20\40\80 байт?
spectrum48k
04.02.2016, 14:10
Читаем хотя бы wiki про модбас (250read/246write)
ПЛК как штатный слейв замечательный и полноразмерный. 125 рег (ф3,4) и/или 123рег (ф16) без всяких биб-к позволяет легко читать и писать.
ПЛК как штатный мастер не очень удобен, на данный момент ограничен 40 рег (через строку). Но через биб-ки снимаются ессно все ограничения.
и тогда это будет называться, если я не путаю, JBus
А на кой ?
допустим я хочу String передать в панель (панель Master, запросит), извращаться с регситрами не хочу, просто хочу объявить фиксированное кол-во байт и отдать это кол-во одним запросом, это ведь так просто... но Овен так не думает.
Филоненко Владислав
05.02.2016, 11:59
скомпоновать мне как 300 регистров? клацать мышкой 150 раз?
300 регистров вообще невозможно передать по протоколу ModBus. до 120 штук.
300 регистров вообще невозможно передать по протоколу ModBus. до 120 штук.
пусть за 3 запроса, не в этом суть.
допустим я хочу String передать в панель (панель Master, запросит), извращаться с регситрами не хочу, просто хочу объявить фиксированное кол-во байт и отдать это кол-во одним запросом..
Регистры ? А что это ? ))
FB и STRUCT - свободно объявляемые пользователем типы любого размера с любым уровнем вложенности
Slave - идеально работающий по модбас просто кусок памяти со свободно изменяемым размером
Взгляд на этот кусок памяти через трафарет указателя to FB/STRUCT решает проблему + куча бонусов
Для мастеров которым нужны именно адреса - несложно найти их временной отладочной функцией
Если и мастер - плк, о регистрах вообще забываем
Регистры ? А что это ? ))
FB и STRUCT - свободно объявляемые пользователем типы любого размера с любым уровнем вложенности
Slave - идеально работающий по модбас просто кусок памяти со свободно изменяемым размером
Взгляд на этот кусок памяти через трафарет указателя to FB/STRUCT решает проблему + куча бонусов
Для мастеров которым нужны именно адреса - несложно найти их временной отладочной функцией
Если и мастер - плк, о регистрах вообще забываем
https://ru.wikipedia.org/wiki/Modbus (https://ru.wikipedia.org/wiki/Modbus)тут около 30 раз упоминается слово "регистр"
мысль вашу не до конца понял, если можно, чуть подробнее.
с указателями я думал, но ничего не придумал толкового пока, конфигуратор дает гулять только в четкой границе описанных регистров в нем.
Вам предлагается тупо набить необходимый объём слейва в конфигурации и обращаться к этому участку памяти из программы как к структуре или как к любому другому типу. Например, если через слейв вы хотите проталкивать 80-байтную строку и при этом в программе ПЛК работать с ней именно как со строкой, то добавляете 20 безымянных (кроме первого) 4 byte в слейв, в программе ПЛК объявляете указатель POINTER TO STRING(80), ставите этот указатель на адрес первого 4 byte, и — вуаля! — у вас слейв со строкой. Но таки да, вам пришлось добавить 20 4-байтовых элементов (впрочем, именовать их не потребовалось).
конфигуратор дает гулять только в четкой границе описанных регистров в нем.
откажитесь от него, если на ПК прога это не какой то законченный продукт, а собственный примите бинарные данные через сокет, разбор на конкретные переменные в проге будет намного быстрее чем три раза выполнять запрос на чтение по модбас
откажитесь от него, если на ПК прога это не какой то законченный продукт, а собственный примите бинарные данные через сокет, разбор на конкретные переменные в проге будет намного быстрее чем три раза выполнять запрос на чтение по модбас
Да, больше склоняюсь к этому варианту. Полный контроль над происходящим.
Вам предлагается тупо набить необходимый объём слейва в конфигурации и обращаться к этому участку памяти из программы как к структуре или как к любому другому типу. Например, если через слейв вы хотите проталкивать 80-байтную строку и при этом в программе ПЛК работать с ней именно как со строкой, то добавляете 20 безымянных (кроме первого) 4 byte в слейв, в программе ПЛК объявляете указатель POINTER TO STRING(80), ставите этот указатель на адрес первого 4 byte, и — вуаля! — у вас слейв со строкой. Но таки да, вам пришлось добавить 20 4-байтовых элементов (впрочем, именовать их не потребовалось).
Да, спасибо, это я уже понял, что без клацанья никак.
У меня нужные мне данные склеиваются в пакеты по 10 байт, обновляются раз в 3 сек, с помощью string, хотел сделать массив по принципу первый вошёл последним вышел, тоесть маленький архив, к которому можно в любой момент обратиться. Данные должны попасть все в любом случае, коммерческий учёт. Сохранение в файлы на плк не представляется возможным, все глючит.
Поэтому хотел несколько таких массивов рахместить в slave, ,проблема в том что регистры вставляются в середину со смещением, я просто запутаюсь, сейчас пока проектирования у меня 10 байт, завтра 12 и всё адреса поплывут.
проблема в том что регистры вставляются в середину со смещением, я просто запутаюсь, сейчас пока проектирования у меня 10 байт, завтра 12 и всё адреса поплывутНу а для кого ж я стараюсь-то? http://www.owen.ru/forum/showthread.php?t=23196
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot