Просмотр полной версии : Адресация переменных по Modbus
Сильно не ругаемся. Если тема где то уже раскрыта то прошу добавить в манула для новичков
СПАСИБО!!! ПОМОГЛО! С адресацией ппц. пока разобрался.... с этой программой проще.
Павел Б.
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 "Адрес регистра" .... неужели он ?
Регистр = 16 бит
8+8+8+8 = 32 это 2 регистра.
адресация начинается с 0.
float = 2 регистрам, он занимает 32 бита, тоесть 2й и 3й регистр у вас. Читать 2й.
Добавляя в мастер вы говорите откуда читать, а сколько и как вам представить эти данные вы говорите словом Float.
Всегда откуда и сколько.
Павел, вы путаете биты и регистры. Один регистр — 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 видел ?
Вот примеры
Master -а 22060
и
Slave 22061
Подскажите как настроить то Мастера что бы Флоат с Slave видел ?Уже все разжевали, подробно!
Все равно в Мастере
у регистра с Float адрес 32 вместо 2. Вы читать других умеете?
Нет? Тогда смотрите картинку
http://www.owen.ru/forum/attachment.php?attachmentid=12345&d=1395648726
Вроде понял но не понял. =)
вот собрал я 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
Ну-ка обкатаем мою новую программу* (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). Если Вы используете функцию чтения/записи битов/койлов, то указываете адрес бита/койла, если используете функцию чтения/записи регистра, то указываете адрес регистра.
Ув. Петра, хм.... меня тоже несколько раздражает тот факт что я туплю извиняюсь что и вас это коснулось.
Я так понимаю что если я использую 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 спасибо что подсказали.
Всем спасибо за помощь.
День добрый, уже всю голову сломал, есть два плк 110-60 соединенные по rs-485 загвоздка как у автора темы, один плк - мастер, второй - слейв, вообщем с мастера в слейв данные пишутся, но мастером со слейва не читаются, никак, даже если на слейве делаю всего 1 переменную float в мастере делаю real input, читаю мастером по адресу регистра 0 и ничего не приходит. На слейве изменяю значения на мастере изменения не отображаются. В чем может быть причина.
Вообщем так: поставил вместо 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? или ссылку где можно почитать. не как не разберусь как объявить переменную что бы передать ее на Орс сервер
Добрый день, подскажите, почему переменным не присваивается значение TRUE?
Зинько Владислав
15.05.2018, 16:47
Добрый день, подскажите, почему переменным не присваивается значение TRUE?
Добрый день!
У Вас запущен опрос?
Похоже, что мастер перезатирает те значения, которым Вы пытаетесь присвоить TRUE.
кста, тоже интересн
Спамер? Что собираетесь рекламировать?
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot