PDA

Просмотр полной версии : Проблема связи ПЛК110-60(Master) с ПЛК110-60(Slave) по ModBus ASCII RS485



jon
19.03.2015, 11:50
В обоих ModBus slave и Master создано по 4 переменные byte.
В Master тип переменных out. подэлемента Universal ModBus device.

Проблема в том что меняются значения только первого
байта В ModBus slave.


17234

17235


Что я делаю не так?

Николаев Андрей
19.03.2015, 11:54
Почитайте в руководстве пользователя про адресацию и про выравнивание адресов ModBus

petera
19.03.2015, 12:44
В обоих ModBus slave и Master создано по 4 переменные byte.
В Master тип переменных out. подэлемента Universal ModBus device.

Проблема в том что меняются значения только первого
байта В ModBus slave.


17234

17235


Что я делаю не так?
Сделайте в мастере так
17237
И все получится

jon
19.03.2015, 14:13
Все работает.
Спасибо за помощь!

Maxlan
13.10.2016, 15:06
Поднимаю тему, как наиболее близкую к моему вопросу.
Имею опыт программирования на МЭК, но ОВЕН попал в руки впервые.
Пытаюсь разобраться с выравниванием переменных в буфере обмена контроллеров по 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?

petera
13.10.2016, 15:16
Поднимаю тему, как наиболее близкую к моему вопросу.
Имею опыт программирования на МЭК, но ОВЕН попал в руки впервые.
Пытаюсь разобраться с выравниванием переменных в буфере обмена контроллеров по 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?

О каких потерях в моем посте Вы говорите?
Просто у вопрошающего команды в мастере были Write bytes, вместо нужных Force multiply coils.
И причем здесь выравнивание?

Maxlan
13.10.2016, 15:25
Судя по рисунку первый байт буфера пишется в регистр 0, второй в регистр 8, третий читается из регистра 16, четвертый опять пишется в регистр 24
Куда делись регистры 1-7,9-15, 17-24?

petera
13.10.2016, 15:30
Про выравнивание
http://www.owen.ru/forum/attachment.php?attachmentid=12345&d=1395648726
Левая колонка - память слейва в контроллере нумеруется в БАЙТАХ.
Регистры в слейве (третья колонка) нумеруются в регистрах, в каждом два байта.
Суть выравнивания:
компилятор автоматически выравнивает адрес регистра WORD до четного байта, а для DWORD или REAL до байта кратного ЧЕТЫРЕМ или регистра кратного ДВУМ.
Из-за чего могут возникать области незанятого пространства но только не 64 бита!
В худшем случае Вы потеряете два байта или 16 бит.

petera
13.10.2016, 15:38
Судя по рисунку первый байт буфера пишется в регистр 0, второй в регистр 8, третий читается из регистра 16, четвертый опять пишется в регистр 24
Куда делись регистры 1-7,9-15, 17-24?
Самое главное в том, что выравнивание относится к слейву, а не к мастеру.
А Вы ссылаетесь на картинку конфигурации мастера.
Первый 8bits пишет один байт в область 0х(1х) второго контроллера с любого БИТА хоть с 1, хоть 10, хоть с 2345.
Второй и последующие могут писать один байт в область 0х(1х) второго контроллера тоже с любого БИТА.
Старшинства здесь нет.
При чем здесь регистры?
А если эти биты и попадают в регистры слейва, то могут попасть с любого разряда, совсем дажке не с нулевого или восьмого, а хоть с 13, следующие биты окажутся уже в разрябах другого регистра.
А в слейве, для байтовых модулей 8bits никакого выравнивания нет и не может быть

ЗЫ.
Первый 8bits пишет один байт в область 0х(1х) второго контроллера с номера 2345
27019
А второй 8bits пишет один байт в область 0х(1х) второго контроллера с номера 23
27020

Maxlan
13.10.2016, 16:01
Путем логических рассуждений и экспериментов я пришел именно к такому методу выравнивания.
По дискретным переменным никаких проблем. Засаду с плавающей точкой пока понять не могу.
Похоже что при считывании мастером переменной с плавающей точкой пропал знак.
Как сделать чтобы в master значение переменной выглядело так-же как и в slave?

petera
13.10.2016, 16:03
Если я указал в элементе Modbus(slave) Переменную типа Float, то я обязан ее читать элементом Modbus(master) из регистра 4?
А первые 64 бита буфера обмена куда девать? Наплевать и забыть?
Я готов смириться с потерей байта при передаче 8 бит через регистр.
Но терять 32 бит при передаче слова и 64 бита при передаче дабла, это маразм.
Совет petera меня вообще озадачил, это 7,5 регистров буфера в потерях.

Может я чего не понял в объяснениях автора руководства по программированию?

Может так станет понятнее?
27023
Адрес регистра DWORD или REAL кратен 2.
А цифра 4 это если рассматривать не в регистрах, а в байтах.

Левая колонка - память слейва в контроллере нумеруется в БАЙТАХ.
Регистры в слейве (третья колонка) нумеруются в регистрах, в каждом два байта.

petera
13.10.2016, 16:08
UPS
http://www.owen.ru/forum/attachment.php?attachmentid=11954&d=1392750964
Я был невнимательным.

Maxlan
13.10.2016, 16:12
К чему относится эта фраза?

− Register Address (Адрес регистра Slave-устройства) – устанавливают адрес
регистра опрашиваемого устройства. Адрес определяется Slave-
устройством, и описан в документации на него. При конфигурировании
ПЛК указывается этот адрес.

Ткните носом, какие адреса мне указать в моем мастере чтобы правильно читать/писать мой слэйв?

petera
13.10.2016, 16:16
К чему относится эта фраза?

− Register Address (Адрес регистра Slave-устройства) – устанавливают адрес
регистра опрашиваемого устройства. Адрес определяется Slave-
устройством, и описан в документации на него. При конфигурировании
ПЛК указывается этот адрес.

Ткните носом, какие адреса мне указать в моем мастере чтобы правильно читать мой слэйв?

В предыдущем посте я погорячился, не увидел сразу вторую картинку со слейвом.
Адреса у Вас в мастере верные!

petera
13.10.2016, 16:20
А что у Вас здесь стоит?
27024

ЗЫ.
Верните как было.
Дело в том, что для REAL передаются два регистра, в каком порядке не стандартизовано для модбаса
По этому
0х4000C51C = 2.01203060150146484375
http://www.binaryconvert.com/result_float.html?hexadecimal=4000C51C
а
0xC51C4000 = -2500.
http://www.binaryconvert.com/result_float.html?hexadecimal=C51C4000

Maxlan
13.10.2016, 16:27
Может так станет понятнее?
27023
Адрес регистра DWORD или REAL кратен 2.
А цифра 4 это если рассматривать не в регистрах, а в байтах.

Таки я так и сделал.
ОК так вот где последовательность байт переключается! Я ее давно ищу!
Первая мысль самая верная! Спасибо за помощь, переключил в нэйтив, всё получилось!
Недокурил мануал...:)