PDA

Просмотр полной версии : Неправильно отображаются значения переменных (ПЛК-154 slave, СП270-Т master)



TAASoft
20.05.2011, 19:45
Доброго времени суток!

Помогите, пожалуйста, разобраться где у меня ошибка.
Есть 4 переменные типа DWORD, 2 из них отображаются
правильно, а 2 другие полная лажа.
Скорее всего что-то из-за неправильного понимания мной
выравнивания переменных в памяти.

Более подробно во вложении.

Заранее спасибо!

Николаев Андрей
20.05.2011, 20:01
Все дело в выравнивании. Смотрим документацию - 4-х байтные начинаются с четного адреса. В Вашем случае с 8.

TAASoft
20.05.2011, 20:08
Андрей, если я Вас правильно понял, то значит будут 8, 10, 12, 14?
А как же сейчас правильно работают переменные с адресами 9 и 13?
Или они прихватывают смежные байты?

capzap
20.05.2011, 21:01
4-х байтные переменные размещаются по адресам кратным четырем, т.е. 0,4,8,12 и т.д.. Регистры всегда кратны двум - 0,2,4,6 и т.д.

TAASoft
21.05.2011, 00:11
Спасибо! Т.е., если я правильно понял, то в СП2701-Т для этих 4-х байтных переменных
будут след. адреса (в моем случае): 8, 12, 16, 20 и тип данных DWord? Или я опять туплю?

ward
21.05.2011, 16:23
чувак, это овен, тут нет логики. У меня такая же ситуация, тоже думал что и 4х байтовые переменные по документации на 4,8, 12, 16 и т.д. А нифига подобного, у меня и с нуля отображалось и с 9го, методом тыка надо делать. Это не единственная лажа у овенов), у тебя все впереди :)

Николаев Андрей
21.05.2011, 16:42
Спасибо! Т.е., если я правильно понял, то в СП2701-Т для этих 4-х байтных переменных
будут след. адреса (в моем случае): 8, 12, 16, 20 и тип данных DWord? Или я опять туплю?


чувак, это овен, тут нет логики. У меня такая же ситуация, тоже думал что и 4х байтовые переменные по документации на 4,8, 12, 16 и т.д. А нифига подобного, у меня и с нуля отображалось и с 9го, методом тыка надо делать. Это не единственная лажа у овенов), у тебя все впереди :)

Лажа обычно в головах и в нежелании читать документацию.
Такие же странности при обмене по ModBus Вы встретите и в других контроллерах под CoDeSys. Понимаю, что все мы крутые эксперты, а CoDeSys "писали какие то лабухи"... однако документация - полезная вешчь.
0 адрес, как это не странно тоже четный.
И с 9 можно считывать, и с 10, и с 11.
Но чтобы получать ликвидные данные, а не часть от одного параметра, а часть от другого стоит следовать документации.
Четко прописано:
Память одна, что для битовых переменных, что для 2-х байтных, что для 4-х байтных. Адреса идут последовательно.
2 байта занимают один регистр и адресуются 0,1,2,3,4,5,6...
4 байта занимают 2 регистра и адресуются 0,2,4,6,8. Выравнивание и сделано как раз для умельцев, которые добавляют в разнобой 2 и 4 байта, и потом не знают что откуда брать... И это механизм CoDeSys...

ward
21.05.2011, 16:54
4 байта занимают 2 регистра и адресуются 0,2,4,6,8. Выравнивание и сделано как раз для умельцев, которые добавляют в разнобой 2 и 4 байта, и потом не знают что откуда брать... И это механизм CoDeSys...

у меня кроме 2 байтов было и 8 бит, с 9го адреса считывал отчетливо 4х байтовую..., а если после этих 4х байт сунуть еще четыре байта, то их надо будет не с 11го(!!!!) считывать, а с 12го, и где логика, сэр?
девятка явно не входит в перечисление 0,2,4,6...., собственно как и 11, зато 12 да

Николаев Андрей
21.05.2011, 17:02
Логика то как раз в том, чтобы не проводить эксперименты над собой,и не тратить свое время на изыскания, не сбивать с толку других специалистов...
Если Вы добавите регистр (адрес 0) а потом 2 4-х байтных переменных, то по адресу 1 Вы получите часть данных из одной переменной, часть из дугой. НАВЕРНОЕ при условии, что второе 4-х байтное не пренимает значение, которое выходит за младшие 2 байта, Вы получите ликвидные данные, а если выходит - врядли.
Но в общем то мне заниматься этими изысканиями и не интересно и времени нет. По тому что принцип описанный в документации на 100% работает - проверено уже не в одном проекте (лично мною). Да и форум показывает что все работает корректно (вопросов очень мало по выравниванию). а если и возникают - заканчиваются просто. Переставил - работает - спасибо.

ward
21.05.2011, 17:10
Логика то как раз в том, чтобы не проводить эксперименты над собой,и не тратить свое время на изыскания, не сбивать с толку других специалистов...
Если Вы добавите регистр (адрес 0) а потом 2 4-х байтных переменных, то по адресу 1 Вы получите часть данных из одной переменной, часть из дугой. НАВЕРНОЕ при условии, что второе 4-х байтное не пренимает значение, которое выходит за младшие 2 байта, Вы получите ликвидные данные, а если выходит - врядли.
Но в общем то мне заниматься этими изысканиями и не интересно и времени нет. По тому что принцип описанный в документации на 100% работает - проверено уже не в одном проекте (лично мною). Да и форум показывает что все работает корректно (вопросов очень мало по выравниванию). а если и возникают - заканчиваются просто. Переставил - работает - спасибо.
спасибо за внимание

capzap
21.05.2011, 23:11
у меня кроме 2 байтов было и 8 бит, с 9го адреса считывал отчетливо 4х байтовую

Но чтобы получать ликвидные данные, а не часть от одного параметра, а часть от другого стоит следовать документации.
Что бы сильно не портить настроение на оставшийся выходной на этой неделе, поверте что все в этой истории посвоему правы. Если задать в конфигураторе разнообразные по количеству байт переменные и требуется в них что то записать от внешнего мастера, то следует помнить о выравнивании, о том что перед 4-х байтовой переменной может образоваться "пустота". Это как в рассказе Задорнова про девятый вагон: "Девятый вагон это тот который после восьмого, а не перед 10", может возникнуть путаница на какой адрес записывать 4-е байта
Но, если писать организацию обмена с помощью библиотек модбаса, то становиться уже не важно как устроена адресация в КДС, внешним мастером записываете с 9 регистра 4-байта, то и в ПЛК считываете 4 байта начиная с 9 регистра

Николаев Андрей
22.05.2011, 00:08
Полностью сгласен. И мы стараемся дать клиенту выбор. По этому и SysLibCom поддержана, и библиотеку ModBus делаем...

TAASoft
22.05.2011, 00:37
Ребята, давайте жить дружно! Спасибо всем. Но я окончательно запутался в многообразии ответов.
Я перепробовал кучу вариантов 8, 10, 12, 14 (как советовал Андрей), 8, 12, 16, 20 (как советовал capzap) и др. варианты, но правильно отображаются только 9 и 13 при раскладе (7, 9, 11, 13). Я понимаю, что это не правильно, но это так.
Где я туплю???
Андрей, я всегда стараюсь читать документацию. Использовал даже картинку "Сквозная адресация параметров (ПЛК-SLAVE)", которую нашел где-то на форуме... И, в результате был вынужден обратиться на форум за помощью. М.б Вы дадите ссылку на документ, где поподробнее описана данная тема?
Спасибо.

Николаев Андрей
22.05.2011, 02:23
Да мы и не ругаемся - общение с грамотными специалистами заставляет не расслабляться и двигаться вперед.
Вот, к примеру, в документацию заглянул, и увидел, что там опечатка... Исправим.
Резюмирую:
0. Есть область памяти в контроллере. Есть карта ModBus адресов. О ней я ниже и буду говорить.
1. Область памяти одна. Что для битов, что для регистров.
2. Рекомендую (из опыта)начинать добавлять переменные с наименьших (то есть с битовых переменных).
Две 8-ми битные переменные занимают два байта - регистр.
2-х байтные переменные - регистр.
4-х байтные - 2 регистра.
3. Адресация регистров начинается с нулевого.
4. Адресация 2-х байтных переменных идет кратной 1.
5. Адресация 4-х байтных перменных - двум. То есть 0,2,4,6 и т.д. (как раз тут в документации ошибка). То есть если у Вас добавлено двухбайтное число, и оно попало в регистр с адресом 2, а за ним идет 4-х байтное - адрес у 4-х байтного будет 4 а не 3. Один регистр останется пустым, в жертву выравнивания.
Подробно это описано в руководстве по программированию или РП - раздел ModBus Slave (шестидесятые и 90-е страницы соответсвенно) - очень понятная таблица выравнивания.

capzap
22.05.2011, 09:55
4. Адресация 2-х байтных переменных идет кратной 1.
5. Адресация 4-х байтных перменных - двум.
Снова вмешаюсь, эти пункты относительно адресов регистров, мой коммент относительно кратности двум и четырем относился к байтам