PDA

Просмотр полной версии : Как форматировать все переменные для передачи по ModbusRTU Slave



phenomit
21.11.2019, 11:10
Доброго дня. Такая проблема, Есть готовый и уже работающий проект приточки/вытяжки, с которого, понадобилось по ModBusRTU брать все значения аналоговых входов и выходов Mx210/

Все переменные описаны как:
xAI_T_return_water,
xAI_T_direct_water,
xAI_P_water: ANALOG_SENSOR_VALUE;

Значение аналог.входов можно получить через .rValue
xAI_T_return_water.r.Value

- это будет REAL, а значит просто вписывать их в регистры в Modbus_serial_device нельзя (или нет?).
Делить на 2 word НЕ нужно, да и глобально мне не понятно, как это сделать через UNIT т.к. тип переменных уже "ANALOG_SENSOR_VALUE"

В идеале нужно преобразовать все значения переменных WORD взяв 2 знака перед запятой и 1 после. Как это можно сделать глобально? Или придётся добавлять дополнительные переменные и приравнивать их к имеющимся с упрощением?

melky
21.11.2019, 11:30
Modbus умеет работать с float (real), в чем проблема то ? СПК тоже должна уметь

Евгений Кислов
21.11.2019, 11:43
Добрый день.
В любом случае потребуется выполнить преобразование к WORD.
Например, так:


придётся добавлять дополнительные переменные и приравнивать их к имеющимся с упрощением?

Или, например, можно воспользоваться ФБ REAL_TO_WORD2 из библиотеки OwenCommunication - тогда можно разбить REAL на два регистра, и мастер сможет получить исходное (а не округленное) значение.

phenomit
21.11.2019, 21:20
Попытался через UINT, показалось самым простым вариантом, но выдает ошибку "C032: невозможно конвертирование..."
Например
Есть переменная

xAI_P_water :ANALOG_SENSOR_VALUE;

Добавил переменную

mAI_P_water :Real_word;

приравнял,
mAI_P_water:=xAI_P_water.rValue;

при перекомпиляции выдает ошибку. Может я что-то не правильно понял

UPD:
Вроде понял почему не работало, вроде как надо было приравнивать не к переменной "имя" а к "имя".rRealValue

mAI_P_water.rRealValue:=xAI_P_water.rValue;

Но проверить не успел т.к. добавил POU CFC (PRG), в нём пока без ошибок соотносится всё. Вот только не знаю будет ли работать так? Дополнительный POU (PRG) нужно добавлять в MainTask? или будет работать по вызову по ModBus?

phenomit
22.11.2019, 01:53
Теперь столкнулся с другой проблемой, не получается привязать Вход уставку регулятора к Holding регистру

в основной программе переменная real

после инициализации уставка приравнивается к 23 градусам

PValve:=23

И далее участвует в расчетах пид регулятора. Менять уставку можно в визуализации с простой привязкой элемента к переменной "PLC_PRG.PValve"

Но при привязки входной переменной для ModBus (CFC)

MBPValve: Real_Word;

[MBPValve.rRealValue]-----------[PValve]

Не компилируется т.к. CDS ругается на то, что "PValve" не является входной переменной, но как так, если ее можно менять из визуализации

Евгений Кислов
22.11.2019, 07:15
Вы хотите уставку изменять и из визуализации, и по Modbus?

phenomit
22.11.2019, 08:02
Да. Или так просто не получится?

Евгений Кислов
22.11.2019, 08:14
Да. Или так просто не получится?

Со стандартным Modbus Slave, добавляемым через дерево проекта - нет.
Используйте библиотеку OwenCommunication.
См. здесь п. 5.9.2:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.0.pdf

phenomit
22.11.2019, 14:14
Спасибо

У меня сейчас основная программа на ST, я добавил pou PRG на CFC с своими переменными и конвертациями из переменных из plc_prg для modbus.
2 PRG на разных языках работать будет? и нужно-ли эту вспомогательную pou добавлять в main_task?

Евгений Кислов
22.11.2019, 14:17
Оба варианта (вызов одной из программы из другой или привязка программ к одной или разным задачам) являются легитимными - но для каждой программы в проекте должен использовать только один из них (не оба сразу).

phenomit
23.11.2019, 01:58
Со стандартным Modbus Slave, добавляемым через дерево проекта - нет.
Используйте библиотеку OwenCommunication.
См. здесь п. 5.9.2:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v2.0.pdf

Я так понял ModBus Slave OwenCommunication позволяет только прописывать вручную всю работу modbus и адресами регистров? Таблицы адресов как от 3s нет?

Неужели нельзя стандартными средствами реализовать изменение переменной из двух разных мест?

Ну например присвоить элемент визуализации и Вход Регистра к разным переменным и установить зависимость между ними?

Евгений Кислов
23.11.2019, 09:38
При работе с библиотекой вы таблицу адресов формируете самостоятельно.


Ну например присвоить элемент визуализации и Вход Регистра к разным переменным и установить зависимость между ними?

Да, можно сделать и так. Не уверен, что это будет проще, чем использование библиотечного слэйва (где все сводится к вызову двух ФБ) - но, разумеется, такой вариант тоже возможен.