PDA

Просмотр полной версии : Не правильные значения переменных при передачи по протоколу Modbus (ПЛК210 - ПК)



Xasya
29.07.2023, 16:20
Здравствуйте.
Пишу обмен ПЛК 210 с программой на ПК по протоколу Modbus TCP. ПЛК выступает в роли slave. Столкнулся с такой проблемой, что при обмене значения переменных имеют не верное значения.
В Codesys есть переменная типа REAL, с помощью функции REAL_TO_WORD2 конвертирую в два значения WORD и передаю по modbus на ПК. С пк считываю значение как float и оно имеет не верное значение. Например передаю с плк 12 а приходит 2,3....
Пробовал передавать значение типа int, но все равно происходит расхождение значений.

Помогите пожалуйста настроить обмен.

kondor3000
29.07.2023, 16:39
Здравствуйте.
Пишу обмен ПЛК 210 с программой на ПК по протоколу Modbus TCP. ПЛК выступает в роли slave. Столкнулся с такой проблемой, что при обмене значения переменных имеют не верное значения.
В Codesys есть переменная типа REAL, с помощью функции REAL_TO_WORD2 конвертирую в два значения WORD и передаю по modbus на ПК. С пк считываю значение как float и оно имеет не верное значение. Например передаю с плк 12 а приходит 2,3....
Пробовал передавать значение типа int, но все равно происходит расхождение значений.

Помогите пожалуйста настроить обмен.

Float это 32 битная переменная ( 2 регистра WORD или 4 байта), при не правильном отображении надо поменять местами регистры ( байты)
Для начала поменяйте местами WORD-ы.
У меня из числа 12.0 при перестановке регистров получилось 2.340729e-041

Xasya
29.07.2023, 17:41
Поменял местами WORD, теперь значение на ПК стало 3,015625, но не 12 Во вложении скриншот регистров во время отладки

Xasya
29.07.2023, 17:48
Так же я пробовал с типом INT используя один регистр WORD. Все равно не правильно значение передается. Может у вас есть рабочий пример, буду очень благодарен?

kondor3000
29.07.2023, 18:59
Так же я пробовал с типом INT используя один регистр WORD. Все равно не правильно значение передается. Может у вас есть рабочий пример, буду очень благодарен?

У вас нормальный пример и проблема в перестановке регистров и байт, (при условии, что адрес регистров правильный) надо найти правильную комбинацию их всего 4. Вот скрин с вариантами 69283
Правильное число получено при перестановке регистров 123.4568
Скачайте Овен ОРС сервер, дело 2 минут, добавьте свой флоат, там есть переставить регистры и переставить байты и проверьте https://owen.ru/product/new_opc_server

Если у вас и целочисленное INT не правильно отображается, то ещё и байты надо переставить.
В вашей программе тоже должна быть перестановка.
Вот скрин с вашим числом 12, всё как у вас 69288
Кстати байты можно переставить и у вас в программе, вместо FALSE поставить TRUE на входе блока 69289

Xasya
29.07.2023, 22:58
У вас нормальный пример и проблема в перестановке регистров и байт, (при условии, что адрес регистров правильный) надо найти правильную комбинацию их всего 4. Вот скрин с вариантами 69283
Правильное число получено при перестановке регистров 123.4568
Скачайте Овен ОРС сервер, дело 2 минут, добавьте свой флоат, там есть переставить регистры и переставить байты и проверьте https://owen.ru/product/new_opc_server

Если у вас и целочисленное INT не правильно отображается, то ещё и байты надо переставить.
В вашей программе тоже должна быть перестановка.
Вот скрин с вашим числом 12, всё как у вас 69288
Кстати байты можно переставить и у вас в программе, вместо FALSE поставить TRUE на входе блока 69289

Спасибо большое. Помогло.