Вход

Просмотр полной версии : Чтение нескольких регистров DWORD из ПЛК, выравнивание адресов.



ZPavel
27.10.2014, 15:21
Про выравнивание многократно говорили, но про несколько регистров DWORD я не нашел. Решил спросить , правильно ли я понимаю. Хочу панелью опросить три регистра DWORD. По документации прочитал, что адреса будут кратны 4.
1 регистр 0х00
2 регистр 0х04
3 регистр 0х08.
Но ведь получаются дырки, незанятые в адресном пространстве с адресами 0х02, 0х03, 0х06, 0х07. Правильно ли я понимаю?

lara197a
27.10.2014, 15:24
нет
DWORD занимает 2 регистра а не 4.
1 регистр -2 байта(word)

ZPavel
27.10.2014, 15:46
Я знаю , что два, я же упомянул про дырки. Вы не внимательно прочитали мой пост.

petera
27.10.2014, 15:50
Про выравнивание многократно говорили, но про несколько регистров DWORD я не нашел. Решил спросить , правильно ли я понимаю. Хочу панелью опросить три регистра DWORD. По документации прочитал, что адреса будут кратны 4.
1 регистр 0х00
2 регистр 0х04
3 регистр 0х08.
Но ведь получаются дырки, незанятые в адресном пространстве с адресами 0х02, 0х03, 0х06, 0х07. Правильно ли я понимаю?
Если регистры в конфигураторе расположены друг за другом, то их адреса будут
1 регистр 0х00
2 регистр 0х02
3 регистр 0х04.

ZPavel
27.10.2014, 16:02
DWORD- четырехбайтная переменная.
четырёхбайтным переменным присваиваются адреса, кратные 4; двухбайтным – кратные 2; - это так сказано в инструкции, получается инструкция лжёт?

lara197a
27.10.2014, 16:11
По твоей логике 0х00- адрес кратный 4-м?
Включай мозг...

amn
27.10.2014, 16:18
Чтобы было понятнее представьте себе, что адресное пространство состоит из ячеек размером по 4 байта. В одну ячейку можно положить 2 регистра или одну 4-х байтную переменную. Таким образом адрес ячейки для 4-х байтной переменной должен быть кратен 4 байтам. Иначе она будет размещена в двух разных ячейках.

Надо просто следить за адресацией так, чтобы нужная нам переменная целиком помещалась в одну ячейку.

ZPavel
27.10.2014, 16:23
Хорошо, если придираться к инструкции так как предлагает lara197a, тогда получаем адреса 0х04, 0х08, 0х0с, будь неладен тот, кто ее писал. Хотя, мы все понимаем, что они начинаются с 0х00. Но тогда почему тот человек написал кратным 4. Или он подразумевал адреса байтов. Там указываются адреса, адреса чего, мол догадывайтесь сами. В табличке 7.3 есть адреса битов, байтом, регистров, а в тексте, встречается несколько раз слово адрес, а вот адрес чего , не понятно.

lara197a
27.10.2014, 16:30
Еще раз:
1 регистр -2 байта
2 регистра -4байта
Адрес должен быть для 4-х байтной переменной кратен 4-м(байтам)
Что не правильно написано?
Где сказано, что номер адреса кратный 4-м?

lara197a
27.10.2014, 16:36
причем тут с нуля?
Если к примеру переменная 1=2 байтам,
а 2 и 3 4-м байтам,
то адреса будут
0х00
0х01
0х03
И это будет правильно, не смотря на то, что ни1 ни 3 на 4 не делятся!!:confused:
Это просто кошмар..

ZPavel
27.10.2014, 16:37
Но если в модуле используются переменные разных типов (например, одно-временно восьмибитный, двухбайтный и четырёхбайтный), то при распределении адресов ПО CoDeSys производит «выравнивание» адресов переменных – упорядо-чение адресов переменных в памяти модуля. Такое упорядочение заключается в ор-ганизации памяти таким образом, что переменные размером 8 бит, 2 байта и 4 байта располагаются только по определенным адресам: четырёхбайтным переменным присваиваются адреса, кратные 4; двухбайтным – кратные 2; однобайтным (или восьмибитным) –кратные 1. То есть, независимо от порядка задания переменных, выравнивание назначает переменным адреса, кратные их длине.

ZPavel
27.10.2014, 16:38
Все мы с Вами все хорошо, понимаем, просто немого криво составлена инструкция. Поэтому так часто и всплывает эта тема.

lara197a
27.10.2014, 16:40
Но если в модуле используются переменные разных типов (например, одно-временно восьмибитный, двухбайтный и четырёхбайтный), то при распределении адресов ПО CoDeSys производит «выравнивание» ....
Это кто такое сказал?
Драйвер распределяет переменные внутри и как он это делает- его личное дело.
"Снаружи"-ручками, с выравниванием.

lara197a
27.10.2014, 16:41
А инструкция написана правильно.

ZPavel
27.10.2014, 16:42
не понял, ка это "Снаружи"-ручками, с выравниванием.

приборист
27.10.2014, 17:24
Есть великолепная картинка, если по ней не ясно, то "медицина тут бессильна".
14955

ZPavel
27.10.2014, 17:57
по картинке следует то что под словом адрес в руководстве на контроллер, нужно понимать адрес байта, что ж, хорошо, спасибо.