В обоих ModBus slave и Master создано по 4 переменные byte.
В Master тип переменных out. подэлемента Universal ModBus device.
Проблема в том что меняются значения только первого
байта В ModBus slave.
Вложение 17234
Вложение 17235
Что я делаю не так?
В обоих ModBus slave и Master создано по 4 переменные byte.
В Master тип переменных out. подэлемента Universal ModBus device.
Проблема в том что меняются значения только первого
байта В ModBus slave.
Вложение 17234
Вложение 17235
Что я делаю не так?
Почитайте в руководстве пользователя про адресацию и про выравнивание адресов ModBus
Сделайте в мастере так
Вложение 17237
И все получится
Все работает.
Спасибо за помощь!
Поднимаю тему, как наиболее близкую к моему вопросу.
Имею опыт программирования на МЭК, но ОВЕН попал в руки впервые.
Пытаюсь разобраться с выравниванием переменных в буфере обмена контроллеров по Modbus.
Прочитал "7.4.2.2.1 Выравнивание адресации" из файла rp_plk110.160.pdf, нахожусь в ступоре.
Если я указал в элементе Modbus(slave) Переменную типа Float, то я обязан ее читать элементом Modbus(master) из регистра 4?
А первые 64 бита буфера обмена куда девать? Наплевать и забыть?
Я готов смириться с потерей байта при передаче 8 бит через регистр.
Но терять 32 бит при передаче слова и 64 бита при передаче дабла, это маразм.
Совет petera меня вообще озадачил, это 7,5 регистров буфера в потерях.
Может я чего не понял в объяснениях автора руководства по программированию?
PS Немного оффтоп, но чтобы не распыляться спрашиваю здесь.
Зачем на входах с 16 битными АЦП и выходах с совсем-уж 10 битными ЦАП забиты переменные формата REAL?
Судя по рисунку первый байт буфера пишется в регистр 0, второй в регистр 8, третий читается из регистра 16, четвертый опять пишется в регистр 24
Куда делись регистры 1-7,9-15, 17-24?
Про выравнивание
http://www.owen.ru/forum/attachment....5&d=1395648726
Левая колонка - память слейва в контроллере нумеруется в БАЙТАХ.
Регистры в слейве (третья колонка) нумеруются в регистрах, в каждом два байта.
Суть выравнивания:
компилятор автоматически выравнивает адрес регистра WORD до четного байта, а для DWORD или REAL до байта кратного ЧЕТЫРЕМ или регистра кратного ДВУМ.
Из-за чего могут возникать области незанятого пространства но только не 64 бита!
В худшем случае Вы потеряете два байта или 16 бит.
Самое главное в том, что выравнивание относится к слейву, а не к мастеру.
А Вы ссылаетесь на картинку конфигурации мастера.
Первый 8bits пишет один байт в область 0х(1х) второго контроллера с любого БИТА хоть с 1, хоть 10, хоть с 2345.
Второй и последующие могут писать один байт в область 0х(1х) второго контроллера тоже с любого БИТА.
Старшинства здесь нет.
При чем здесь регистры?
А если эти биты и попадают в регистры слейва, то могут попасть с любого разряда, совсем дажке не с нулевого или восьмого, а хоть с 13, следующие биты окажутся уже в разрябах другого регистра.
А в слейве, для байтовых модулей 8bits никакого выравнивания нет и не может быть
ЗЫ.
Первый 8bits пишет один байт в область 0х(1х) второго контроллера с номера 2345
Вложение 27019
А второй 8bits пишет один байт в область 0х(1х) второго контроллера с номера 23
Вложение 27020
Путем логических рассуждений и экспериментов я пришел именно к такому методу выравнивания.
По дискретным переменным никаких проблем. Засаду с плавающей точкой пока понять не могу.
Похоже что при считывании мастером переменной с плавающей точкой пропал знак.
Как сделать чтобы в master значение переменной выглядело так-же как и в slave?