PDA

Просмотр полной версии : Адресация переменных по Modbus



Uniqum
25.06.2015, 09:57
Сильно не ругаемся. Если тема где то уже раскрыта то прошу добавить в манула для новичков

Вольд
25.06.2015, 10:44
Нормально. Молодец.

NIKO007
23.11.2015, 00:19
СПАСИБО!!! ПОМОГЛО! С адресацией ппц. пока разобрался.... с этой программой проще.

Павел Б.
26.01.2016, 08:58
Вроде понял но не понял. =) И вообщем спасибо стало понятно почему у меня Float не хочет идти, адрес где то на 4000 будет ?!?!?!


Как вообще высчитывать адрес (регистр) ???

Опишу свою проблему

вот собрал я 2 ПЛК160 RS-485-1 по А и B соединил проводами.

Slave
8 бит
8 бит
8 бит
8 бит
Float

Maste
8 бит чтение (регистр 0 *)
8 бит чтение (регистр 8 *)
8 бит запись (регистр 16 *)
8 бит запись (регистр 24 *)
Float чтение (регистр ?? )


*здесь под регистром я понимаю уставку в CodeSys 2.3 "Register Adress" соответствующего модуля (каждого из 8 бит и Float ?)

для 8 битовых значений "Разобрался" в том смысле что работает и на чтение и на запись а вот для других значений(типов переменных) что то не понятно как считать.

Float 32 битное значения или Адрес 32 , или адрес 5 (ведь это РЕГИСТР 5 по "учебнику" ) или я что то в основах не понимаю или это 2 ...

Вообщем не с одним из параметров ( 32, 5, 2) не работает.

Тут такой вопрос хорошо если подскажете, а какой же "Адрес регистра " а ещё лучше КАК считать. потому что читая мукулатуру не смог разобраться.


Понятно что тут как то замешано "выравнивания" адресации но мне не понятен сам принцип расчёта... зачем тогда в таблице (в прикреплённом файле) Адресс регистра 1, 2, 3 ,4 а у меня в ПЛК160 получает 0 , 8, 16, 24 хотя по идее должны идти 1, 2 итд ? или я чёто туплю по жоскому ?? а то у меня в CodeSys получает не адрес регистра а адрес бита для этого поля а как его расчитывать ?
22024

Вообщем не понятно .... может быть кто ссылкой поделится на документы разьесняющий или на тему на форуме ? (уже гууглил не нашёл не чего)


ПС: для примера ещё скрин настроек ПЛК мастера (в слейве как я понимаю не чего настраивать не нужно в том смысле что 8 битные значения передаются и "адреса регистров" раздаются автоматический, а не выбираются)
22026

ППС: ещё не пробывал 28 "Адрес регистра" .... неужели он ?

Scream
26.01.2016, 09:13
Регистр = 16 бит
8+8+8+8 = 32 это 2 регистра.
адресация начинается с 0.
float = 2 регистрам, он занимает 32 бита, тоесть 2й и 3й регистр у вас. Читать 2й.
Добавляя в мастер вы говорите откуда читать, а сколько и как вам представить эти данные вы говорите словом Float.
Всегда откуда и сколько.

Yegor
26.01.2016, 11:21
Павел, вы путаете биты и регистры. Один регистр — 16 бит. Правильно будет так:

8 бит чтение (регистр 0, биты 0-7 *)
8 бит чтение (регистр 0, биты 8-15 *)
8 бит запись (регистр 1, биты 0-7 *)
8 бит запись (регистр 1, биты 8-15 *)
Float чтение (регистры 2-3 )

Выравнивание в этом случае себя не проявляет. Чтобы проявило, можно удалить "8 бит":

8 бит чтение (регистр 0, биты 0-7 *)
8 бит чтение (регистр 0, биты 8-15 *)
8 бит запись (регистр 1, биты 0-7 *)
Float чтение (регистры 2-3 )

Или даже два раза по "8 бит":

8 бит чтение (регистр 0, биты 0-7 *)
8 бит чтение (регистр 0, биты 8-15 *)
Float чтение (регистры 2-3 )

И даже единственные 8 бит будут выталкивать Float на регистр 2:

8 бит чтение (регистр 0, биты 0-7 *)
Float чтение (регистры 2-3 )

В этих случаях перед регистром 2 просто образуется дыра.

Узлы выравниваются до кратных своему размеру адресов. Float занимает два регистра, и поэтому может располагаться только по адресам 0, 2, 4, 6, 8 и т.д. То же самое с 32-битными целыми (тоже по два регистра). Регистры укладываются в единицы — следовательно, идут по адресам 0, 1, 2, 3, 4... А 8-битные узлы занимают пол-регистра, и потому могут укладываться по два в один регистр: 0, 0.5 (биты 8-15), 1, 1.5 (биты 8-15) и т.д.

Павел Б.
27.01.2016, 01:31
Регистр = 16 бит
8+8+8+8 = 32 это 2 регистра.
адресация начинается с 0.
float = 2 регистрам, он занимает 32 бита, тоесть 2й и 3й регистр у вас. Читать 2й.
Добавляя в мастер вы говорите откуда читать, а сколько и как вам представить эти данные вы говорите словом Float.
Всегда откуда и сколько.

Я приблизительно так и понял когда читал документацию ...


у меня и путаница в голове происходит потому что я в поле Register Adress ввожу "Адрес регистра" не работает, а ввожу "адрес бита" РАБОТАЕТ ....

Если сегодня не получиться разобраться постараюсь принести на общий суд "проэкты" Slave и Master-а


ПС: мб тут у slave стоит протокол "ОВЕН" .... пойду посмотрю правда "стенд" на заводе, завод "секретный" и без интернетов и телефонов и в 30 минутах езды от офиса на служебной машине которая не всегда доступна. =)))))) вообщем рабочая ситуация.



ППС: в этой же сети RS-485-1 находится прибор СМИ2 (такой маленький экранчик на четыре символа) у него по документации на 26 регистре выводится тип данных WORD и указав адрес регистра 26, я получил то что хотел. То есть для СМИ2 работает именно "адрес регистра", а для ПЛК 160 Slave почему то работает "адрес бита" или чего я вообще не понимаю.



Павел, вы путаете биты и регистры. Один регистр — 16 бит.
Я не то что бы их путаю, я просто пытаюсь сделать что бы работало и почему-то ПЛК160 хочет "слушать" не "адреса регистров", а "адреса битов"

У меня с такими "адресами регистров"(которые по сути являются "адресами битов") работает! вот в чём весь вопрос только работают 8битовые, а на флоат уже получается не работает, удивительно если неправельно почему работает, а если правельно то какой должен быть адрес у Float .

Юрий, спасибо за информацию, гораздо понятнее чем в "учебнике" .



Вообщем спасибо за объяснения, прочитал, сделал вывод что всё я почти правильно понимал с адресами регистров (после ваших объяснений стал чуть получше понимать) , а это значит что где то не так что то настроил с Mu-bus буду разбираться.

Если что получится отпишусь , не получится принесу проекты =)

Павел Б.
27.01.2016, 09:32
Вот примеры
Master -а 22060
и
Slave 22061

Подскажите как настроить то Мастера что бы Флоат с Slave видел ?

petera
27.01.2016, 16:39
Вот примеры
Master -а 22060
и
Slave 22061

Подскажите как настроить то Мастера что бы Флоат с Slave видел ?Уже все разжевали, подробно!
Все равно в Мастере
у регистра с Float адрес 32 вместо 2. Вы читать других умеете?
Нет? Тогда смотрите картинку
http://www.owen.ru/forum/attachment.php?attachmentid=12345&d=1395648726

petera
27.01.2016, 17:01
Вроде понял но не понял. =)

вот собрал я 2 ПЛК160 RS-485-1 по А и B соединил проводами.

Slave
8 бит
8 бит
8 бит
8 бит
Float

Maste
8 бит чтение (регистр 0 *)
8 бит чтение (регистр 8 *)
8 бит запись (регистр 16 *)
8 бит запись (регистр 24 *)
Float чтение (регистр ?? )

У ПЛК ОВЕН и биты и регистры находятся в одной и той же физической памяти
Поэтому (См. каринку выше)

Slave
8 бит \

находятся в регистре "0" первые 8 в разрядах 7..0 вторые 8 в разрядах 15..8 регистра "0"
8 бит /
8 бит \

находятся в регистре "1" первые 8 в разрядах 7..0 вторые 8 в разрядах 15..8 регистра "1"
8 бит/
Float будет иметь адрес регистра "2", т.к. 0 и 1 уже заняты четырьмя 8-битными модулями

Maste
8 бит чтение (регистр 0 *) правильно не регистр а бит 0\

.эти биты фактически в регистре "0"
8 бит чтение (регистр 8 *) правильно не регистр а бит 8/
8 бит запись (регистр 16 *) правильно не регистр а бит 16\

.эти биты фактически в регистре "1"
8 бит запись (регистр 24 *) правильно не регистр а бит 24/
Float чтение (регистр ?? ) правильно 2, а не 32 и не 26

Yegor
27.01.2016, 19:07
Ну-ка обкатаем мою новую программу* (http://owen.ru/forum/showthread.php?t=23196), подсунем ей ваш slave.pro:

22085

Первая цифра это номер регистра, если что. В мастере придётся делать не 4×8 bit, а 2×16 bit (то есть 2×'2 byte', оно же register input module), чтобы всё получилось прочитать. И будет примерно так:

Register input module (register address 0)
Register input module (register address 1)
Real input module (register address 2)

К сожалению, двухбайтовые узлы не отображаются в конфигурации поразрядно (petera знает, как это обойти, но я умоляю его не показывать в этой теме), поэтому обращаться к отдельным битам этих register input module придётся из POU.

Павел Б.
28.01.2016, 01:22
Ув. Петра, хм.... меня тоже несколько раздражает тот факт что я туплю извиняюсь что и вас это коснулось.


Я так понимаю что если я использую 8 битовые значения я должен писать в поле Register Adress "адрес бита", а если использую 2 и 1 байтовые значения "адрес регистра" ?

И если следующее модуль будет Float у него будет в поле Register Adress значение 4 ?

а если за ним будет ещё и 8 битный у него будет в поле Register Adress значение 96 ?

22094

Гарчев Евгений
28.01.2016, 20:05
Я так понимаю что если я использую 8 битовые значения я должен писать в поле Register Adress "адрес бита", а если использую 2 и 1 байтовые значения "адрес регистра" ?

Зависит от того, какую функцию Вы используете (поле command). Если Вы используете функцию чтения/записи битов/койлов, то указываете адрес бита/койла, если используете функцию чтения/записи регистра, то указываете адрес регистра.

petera
29.01.2016, 16:14
Ув. Петра, хм.... меня тоже несколько раздражает тот факт что я туплю извиняюсь что и вас это коснулось.


Я так понимаю что если я использую 8 битовые значения я должен писать в поле Register Adress "адрес бита", а если использую 2 и 1 байтовые значения "адрес регистра" ?

И если следующее модуль будет Float у него будет в поле Register Adress значение 4 ?

а если за ним будет ещё и 8 битный у него будет в поле Register Adress значение 96 ?

22094
для вашей картинке -да у последнего 8 битного будет в поле Register Adress значение 96.
Причем в этом поле "96" относится именно к первому биту модуля, у последнего (восьмого)107.
Т.е. для 8-битных модулей Вы указываете адрес(номер) первого бита в группе из восьми.
Самое интересное, что для этой 8-битной группы можно указать адрес бита с любого числа, не обязательно кратного 8, например 9 или 11 и любого другого. Естественно, что адреса последующих в группе бит будут иметь (10,11,12,13,14,15,16) или (12,13,14,15,16,17,18). Конечно первая последовательность частично попадет в 1 регистр Word, а именно 16 бит будет эквивалентен нулевому разряду 1 регистра Word.

Павел Б.
02.02.2016, 01:15
Получилось, для этого выбрал в параметреComand значение Read coils status (0x01)
а в параметр Register Adress поставил значение 32.


Попытки занести в параметреComand значение Read input Registr (0x04), а в параметр Register Adress значения 2 , 4, 5 , 6 не приносили результата.... (((

С вашей помощью задача — решена значения переданы. Помимо общей своей тупизны тупил тем что не "игрался" с параметром Comand спасибо что подсказали.


Всем спасибо за помощь.

Parovoz
23.07.2016, 08:29
День добрый, уже всю голову сломал, есть два плк 110-60 соединенные по rs-485 загвоздка как у автора темы, один плк - мастер, второй - слейв, вообщем с мастера в слейв данные пишутся, но мастером со слейва не читаются, никак, даже если на слейве делаю всего 1 переменную float в мастере делаю real input, читаю мастером по адресу регистра 0 и ничего не приходит. На слейве изменяю значения на мастере изменения не отображаются. В чем может быть причина.

Parovoz
23.07.2016, 18:16
Вообщем так: поставил вместо ASCII RTU удалось получить переменную WORD, однако real упорно не считывался, плюс ко всему начал жестко тупить обмен данных по rs485 на том слоте у меня еще висел четырехканальный модуль ввода тензодатчиков, в итоге законнектил оба контроллера по rs232, а все остальное оборудование оставил на rs485, но real так прочитать и не смог пришлось преобразовывать в int затем в word после чего передавать как два байта, а получать как input register. Для меня это было не критично меня целые числа устраивали. С адресацией творилась какая-то ерунда у меня были в слейве у меня были два ворда которые я писал мастером по адресам 0 и 1 соответственно, далее у меня был float который я хотел прочитать по адресу 2 модулем real input, однако у меня ничего так и не вышло, далее в слейве у меня был float который я успешно писал из мастера модулем real output по адресу 5!!! как так хз, однако оно работает и успешно пишет и дробные отрицательные числа в 5 адрес хотя по идее должно писаться по четвертому адресу, т.к. 0 регистр - word, 1 - word, 2-3 - float который я так и не считал, 4-5 должен быть float, однако он писался по адресу 5, а по 6 адресу я успешно считывал то число которое я хотел считывать из 2 регистра в формате real, но после преобразований считал как целочисленное в формате word, пробовал вывести переменную float в конце но получал неправильный вид. Вот как-то так, долго разговаривал с техподдержкой пришли к выводу что глюк с адресацией памяти надо менять прошивку контроллера у меня была 2.14.0, а последняя 2.15.9. Так что иммейте ввиду, я оставил все как есть по принципу работает стабильно да и ладно.

Владимир1967
06.06.2017, 23:41
А можно такой же пример для GKR63? или ссылку где можно почитать. не как не разберусь как объявить переменную что бы передать ее на Орс сервер

xrus
15.05.2018, 16:40
Добрый день, подскажите, почему переменным не присваивается значение TRUE?

Зинько Владислав
15.05.2018, 16:47
Добрый день, подскажите, почему переменным не присваивается значение TRUE?

Добрый день!

У Вас запущен опрос?
Похоже, что мастер перезатирает те значения, которым Вы пытаетесь присвоить TRUE.

xrus
15.05.2018, 17:01
Спасибо, помогло!

Doffy
16.09.2022, 14:12
кста, тоже интересн

capzap
16.09.2022, 14:16
кста, тоже интересн

Спамер? Что собираетесь рекламировать?