Вход

Просмотр полной версии : Адрес переменной modbus slave



sekerin
07.05.2025, 18:39
83675

добрый день
подскажите не могу сообразить и понять в инструкции как это работает
создал в плк110[m02] модбас slave
переменные чтобы из другого устройства к ним обращаться
не могу понять какие у них адреса?

%QW6.5.0 это адрес? как его понять какой регистр?

FPavel
07.05.2025, 18:53
От 0 по порядку. Один адрес - 2 байта.
Иногда (для REAL) срабатывает выравнивание на чётные адреса.
Об этом есть в одном из документов на страничке прибора и загрузки CoDeSys.

sekerin
07.05.2025, 19:02
От 0 по порядку. Один адрес - 2 байта.
Иногда (для REAL) срабатывает выравнивание на чётные адреса.
Об этом есть в одном из документов на страничке прибора и загрузки CoDeSys.

можете объяснить я не могу понять. то есть первая переменная 0, вторая плюс два байта? а это значение что означает - QW6.5.0, если в ней тип word то это два байта, 5 регистр получается если по порядку ?

FPavel
07.05.2025, 19:10
r_temp1 - адрес 0
r_temp2 - адрес 1
r_temp3 - адрес 2
и т.д.

QW6.5.0 - ещё один способ адресации из программы к этой области памяти.

Не стесняйтесь - читайте документацию к CoDeSys.

sekerin
07.05.2025, 19:13
r_temp1 - адрес 0
r_temp2 - адрес 1
r_temp3 - адрес 2
и т.д.

QW6.5.0 - ещё один способ адресации из программы к этой области памяти.

Не стесняйтесь - читайте документацию к CoDeSys.

да я не стесняюсь, но или переработал или недоучился, читаю и понять не могу, спасибо за помощь, сейчас проверю

YuriBel
07.05.2025, 19:13
В ПЛК 110 адресуются либо регистры, либо биты. При этом адресные пространства накладываются друг на друга. В вашем случае все двухбайтовые переменные будут адресоваться как регистры, соответственно, 0,1,2,3,4

FPavel
07.05.2025, 19:32
Найдите
Конфигурирование области ввода/вывода ПЛК Руководство пользователя

Там глава "Модуль Modbus (Slave)" - в ней и об адресации и о выравнивании.

Практическое применение адресов QW6.5.0 - для ускорения чтения из модуля - не по одному регистру, а сразу группу регистров.

Sulfur
08.05.2025, 17:15
sekerin
Мастер модбаса будет читать\писать регистры по порядковому номеру.
То есть, например мастер запрашивает регистр №0 устройства <ваш слейв>, в вашем примере это переменная r_temp1,
регистр №1 - r_temp2, и т. д.

sekerin
30.07.2025, 09:31
Добрый день, подскажите у меня есть переменные word это один регистр, если добавляю float это два регистра. но в конфигурации плк в модбас slave, нумерация идет все равно 1,2,3,4,5 и тд у меня там около 40 сейчас переменных и пришлось адрес в ручную попробовал по регистрам посчитать, 85068
тут получается адрес 74
но я вручную посчитал что с учетом REAL выше еще значение адрес 79 и ссылаясь на него значение записывается.
но так в ручную считать неудобно и долго. или я не правильно смотрю адреса?

In_Da_Cher_A
30.07.2025, 09:34
про выранивание адресов в памяти читали?

Валенок
30.07.2025, 09:37
..
в ручную? лови для самопроверок
еёный_num_reg := (adr(еёный) - adr(самая_первая_переменная_в_слейве)) / 2;

sekerin
30.07.2025, 09:49
про выранивание адресов в памяти читали?

Конфигурирование области ввода/вывода ПЛК Руководство пользователя

Cs-Cs
30.07.2025, 09:54
Если уж тут программы народ начал писать, то ВОТ
85069 85070 85071 85072

sekerin
30.07.2025, 09:56
в ручную? лови для самопроверок
еёный_num_reg := (adr(еёный) - adr(самая_первая_переменная_в_слейве)) / 2;

то есть нужно чтобы real адрес был кратный 4?

Если представить область памяти с возрастающими адресами (от 0 до
какого-либо числа) и расположить переменные, то, если идет первая
переменная типа «байт», то она будет расположена по адресу 0х00,
следующая – 0х01 и т.д. Если дальше идет 4-байтная переменная, она должна
располагаться по адресу 0х04, т.е., кратному 4

Очередность переменных нужно правильно выстраивать я правильно понял?

sekerin
30.07.2025, 09:57
Если уж тут программы народ начал писать, то ВОТ
85069 85070 85071 85072

спасибо сейчас изучу

In_Da_Cher_A
30.07.2025, 10:02
Конфигурирование области ввода/вывода ПЛК Руководство пользователяда
и что там написано?


Автоматическая адресация переменных производится последовательно, начиная с нулевого адреса (как для битовых переменных, так и для переменных, передаваемых регистрами).
Таким образом, если в модуле используются переменные одного типа, то при запросе устройством – Мастером регистра с адресом «0», модуль считывает первые два байта, для регистра с адресом «1» – вторые два байта и так далее.
Если переменные имеют длину более двух байт, то при запросе регистра с адресом «0», модуль считывает первые два байта первой переменной, для регистра с адресом «1» – вторые два байта первой переменной и так далее.
Но если в модуле используются переменные разных типов (например, одновременно восьмибитный, двухбайтный и четырёхбайтный), то при распределении адресов ПО CoDeSys производит «выравнивание» адресов переменных – упорядо
чение адресов переменных в памяти модуля. Такое упорядочение заключается в организации памяти таким образом, что переменные размером 8 бит, 2 байта и 4 байта располагаются только по определенным адресам: четырёхбайтным переменным
присваиваются адреса, кратные 4; двухбайтным – кратные 2; однобайтным (или восьмибитным) –кратные 1. То есть, независимо от порядка задания переменных, выравнивание назначает переменным адреса, кратные их длине.
Таким образом, первая восьмибитная переменная будет расположена в 0… 7 битах памяти модуля, вторая – в 8… 15 и т.д. Если же вторая переменная двухбайтная, она будет располагаться в 16… 31 битах, т.е., по адресу, кратному 2, и т.д. Четырехбайтная переменная займет следующее свободное место, кратное 4.
Такой порядок размещения переменных в памяти модуля может образовать адресные пространства, не занятые переменными. Эти пространства не отображаются в области ввода/вывода, но они обязательно должны учитываться при организации опроса переменных; учитывать эту особенность следует еще на стадии задания переменных. переводя на русский - флоат всегда должен начинаться с чётного номера регистра (понятно?),
\ при этом занимает два номера (понятно?)
при этом - следим за руками - нечётный регистр флоата в адресном пространстве не отображается
понятно?85074

Валенок
30.07.2025, 10:04
то есть нужно чтобы real адрес был кратный 4?
не "нужно", а будет автоматически в слейве КДС. С автовставляемыми неявными полями если нужно.

sekerin
30.07.2025, 10:08
да
и что там написано?

переводя на русский - флоат всегда должен начинаться с чётного номера регистра (понятно?),
\ при этом занимает два номера (понятно?)
при этом - следим за руками - нечётный регистр флоата в адресном пространстве не отображается
понятно?85074

ну плюс минус да, сейчас по тыкаю руками чтобы понятнее стало

Cs-Cs
30.07.2025, 10:11
Вот ещё можно не переставлять всё в конфигурации, а сделать Slave через структуру: https://cs-cs.net/codesys-modbus-karta-registrov-struktury
Но выравнивание и там надо соблюдать

sekerin
30.07.2025, 10:21
Вот ещё можно не переставлять всё в конфигурации, а сделать Slave через структуру: https://cs-cs.net/codesys-modbus-karta-registrov-struktury
Но выравнивание и там надо соблюдать

да спасибо сейчас читаю, надо разобраться с этим)

In_Da_Cher_A
30.07.2025, 10:41
ну плюс минус да, сейчас по тыкаю руками чтобы понятнее сталочего там тыкать, две страницы мусолим азбуку, что написано в руководстве

sekerin
30.07.2025, 11:16
Вот ещё можно не переставлять всё в конфигурации, а сделать Slave через структуру: https://cs-cs.net/codesys-modbus-karta-registrov-struktury
Но выравнивание и там надо соблюдать

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

sekerin
30.07.2025, 11:18
чего там тыкать, две страницы мусолим азбуку, что написано в руководстве

для я понял что там написано, просто в 3.5 кодесис если правильно помню не было такой задачи, вот и не сразу сообразил

Cs-Cs
30.07.2025, 12:11
Правильно понял вы чтобы этим вычислением не заниматься в своем приложении реестр заводите переменных , и с него уже порядок переменных вводите в codesys ? пока в экселе думаю сделаю , потому что переменных в slave планируется много.
АГА! Я решил, что сначала лучше отдельно рассчитать, а потом набивать рассчитанное.