Нет, по протоколу ОВЕН. Параметр 'p.min' в принципе не доступен по Modbus.
Не могу прокомментировать, и у меня в данный момент нет цели тестировать этот функционал.
Вы можете задать этот вопрос в разделе ТРМ или написать запрос на support@owen.ru
Для параметров P.min, P.max, P.nom, i.upr, i.min чтение можно осуществлять через формат с фиксированной точкой REAL_FRM.FIX_BIN, а вот запись необходимо осуществлять используя формат для целых чисел INT_FRM.UINT_FRM.
Структура формата REAL_FRM.FIX_BIN 16 битная:
0-11 - значение без точки.
12-14 бит - десятичный сдвиг точки
15 бит - знак, если 0 - то плюс, 1 - значит минуc
Примеры:
3.1=2#0001_0000_0001_1111
-3.1=2#1001_0000_0001_1111
0,300=2#0011_0001_0010_1100
Проблема крылась в том, что при записи целых положительных чисел биты 12-14 равны 0, тогда в битах 0-11 храниться целое значение. Но алгоритм работает с ошибкой, а при записи с десятичной точкой в битах 12-14 есть значения, т.е. все свелось к принудительной установке хотя бы одной точки после запятой.
Соответственно, для параметров P.min, P.max, P.nom, i.upr, i.min достаточно одной цифры после запятой, и необходимо знать знак числа.
Всем успехов :cool:
Код проверен на ТРМ251 v1.10.
Мой пример реализации ниже.
Код:GetReal:OWEN_GET_REAL;
SetDint:OWEN_SET_DINT;
i_min: // Огр. мин. интеграла
IF pribor^[prib_name].oper.StateTask[state].isRead THEN
GetReal(
Enable:= com_active,
Addr:= com_prib.addr[prib_name],
AddrLen:=com_prib.addrlen,
Name:='i.min' ,
Index:= 16#FFFF,
RealType:= REAL_FRM.FIX_BIN,
ComHandle:= hComTrm,
TimeOut:=com_prib.TimeOut*T#1MS ,
Complete=>,
Value=> ,
wTime=> ,
Error=> );
IF GetReal.Complete OR GetReal.Error<>0 THEN
pribor^[prib_name].oper.StateTask[state].error:=SetReal.Error;
CASE GetReal.Error OF
NoError:
pribor^[prib_name].pid.i_min:=GetReal.Value;
pribor^[prib_name].oper.StateTask[state].ValReal:=GetReal.Value;
state:=StateNoError(state:=state,StateTaskPt:=ADR(pribor^[prib_name].oper.StateTask));
NACK:
state:=end_pooling;
ELSE
state:=StateNoError(state:=state,StateTaskPt:=ADR(pribor^[prib_name].oper.StateTask));
END_CASE
GetReal(Enable:=FALSE);
END_IF
ELSE
IF pribor^[prib_name].pid.i_min >-0.001 THEN
SetDint.Value:=2#0001_0000_0000_0000; // Положительное число, одна цифра после запятой
ELSE
SetDint.Value:=2#1001_0000_0000_0000; // Отрицательное число, одна цифра после запятой
END_IF
SetDint(
Enable:= com_active,
Addr:= com_prib.addr[prib_name],
AddrLen:= com_prib.addrlen,
Name:= 'i.min',
Index:= 16#FFFF,
IntType:=INT_FRM.UINT_FRM,
Value:=REAL_TO_DINT(ABS(pribor^[prib_name].pid.i_min*10)) + SetDint.Value, // Сдвиг запятой на 1 знак в право.
ComHandle:= hComTrm,
TimeOut:= com_prib.TimeOut*T#1MS,
Complete=> ,
Error=> );
IF SetDint.Complete OR SetDint.Error<>0 THEN
pribor^[prib_name].oper.StateTask[state].error:=GetDint.Error;
CASE SetReal.Error OF
NoError:
state:=StateNoError(state:=state,StateTaskPt:=ADR(pribor^[prib_name].oper.StateTask));
NACK:
state:=end_pooling;
ELSE
state:=StateNoError(state:=state,StateTaskPt:=ADR(pribor^[prib_name].oper.StateTask));
END_CASE
SetDint(Enable:=FALSE);
END_IF
END_IF
Большое спасибо вам за пример.
Здравствуйте, коллеги, подскажите, пожалуйста, у меня СПК107, CS3.5.14, модули подхватились отлично по шаблонам, а кастомное модбас ТСР устройство, которое я добавил, валится в ошибку постоянно (восклицательный знак мигает), вроде всё настроил нормально, но открывается соединение, тут же ошибка сокета и дисконект, судя по логам. Есть предположение, что это из-за несоответствия версий устройств кодсиса таргету ПЛК. Где скачать и как правильно установить устройства модбас тср мастер, слэйв и т.д соответствующих версий?соответствующих версий?
Добрый день. Столкнулся со следующей проблемой: Для обмена по ModBus использую библиотеку OwenCommunication, при перезагрузке ПЛК функциональный блок MB_SerialRequest завершается с ошибкой 12 (WRONG_PARAMETER). Однако, если не перезагружать ПЛК, а только перезалить софт и запустить программу, то все работает корректно, никаких ошибок не возникает. Куда можно копать, чтобы понять в чем проблема?
https://disk.yandex.ru/d/Lh3KhEVIeO9ASg - ссылка на проект.
Описание:
Записываем проект на ПЛК. Создаем загрузочное приложение. После чего перезагружаем ПЛК путем сброса питания. После загрузки общение по ModBus не происходит. Подключаемся к ПЛК из Кодесис, смотрим имя ошибки.
Далее, перезаписываем прошивку. Запускаем программу. ModBus работает корректно, никаких ошибок нет.
Здравствуйте! Устанавливаю Функциональный блок actual_data для опроса ВКТ-7.
В нем используется входной параметр handle - SYSCOM.RTS_IEC_HANDLE (Дескриптор последовательного порта)
Не подскажете, где найти этот параметр или его описание?
Это помогло. Спасибо! А в чем причина? Можно предположить, допустим, что значение дескриптора порта остается старым, так как переменная хранится в независимой памяти, но при инициализации она должна перезаписаться, так как инициализация ModBus производится каждый раз при запуске.
Здравствуйте. Есть вопрос по библиотеке MQTT (Stefan Robmann).
Нужна подписка на топик.
ПЛК 200.
Брокер поднят на Raspberry (Mosquitto).
К брокеру претензий нет, работает уже месяца три, все публикуется, подписывается (на стороннем софте).
Установил последнюю версию библиотеки(3.5.0.0). Вроде все понятно, заработало с первого раза, но:
1. При компиляции выдает 22 предупреждения:
[WARNING] mqtt client library, 3.5.0.0 (stefan roßmann engineering solutions): FB_MQTTClient(Строка 100, Столбец 1 (Реализ.)): C0195: Неявная конверсия типа со знаком 'INT' в тип без знака 'UINT': возможно изменение знака
Понятно, что не смертельно, но странно как-то... может я чего-то не установил ? (на библиотеки не ругается, загружается, работает).
2. Несколько раз вылетело исключение в библиотеке (с остановкой ПЛК). Вылетает не предсказуемо, может раз в пару суток.
3. При перезагрузке брокера обмен "замерзает" и самостоятельно не поднимается. Флаг ошибки и код статуса не меняются. Но если попереключать флаг подписки - обмен поднимется (костыль в виде периодического передергивания флага приладил, но это как-то... костыль короче).
4. При введении второй копии функционального блока (подписка на второй топик), через некоторое время начинает путать топики (связать с каким-либо событием не могу, наверное просто время).
Другие библиотеки пока не пробовал, особо времени нет, если это не лечится - то придется.
Допиливать эту библиотеку самостоятельно - это не по мне :).
Собственно вопрос: это только у меня такие косяки?
Может что подскажите, очень мало информации.
А код - по имеющемуся в доке примеру (IP брокера и имя топика инициализированы в описании переменных, подписка на один топик):
MQTT_POOLlevel(i_xEnable:=TRUE,i_sBrokerAddress:=M QTTBrokerAddress,i_xSubscribe:=xSubscribe_PL,i_sTo picSubscribe:=sTopicSubscribe_PL);
xError_PL := MQTT_POOLlevel.q_xError;
udiState_PL := MQTT_POOLlevel.q_udiState;
sLastReceivedMessage_PL:=MQTT_POOLlevel.q_sLastRec eivedMessage;
HCSR04data := STRING_TO_WORD (sLastReceivedMessage_PL);
Спасибо.
Коллеги добрый день...Прошу помощи с функциями и адресами регистров модбаса (OwenCommunication) Вложение 54972 какие коды функций ( я так понимаю READ_HOLDING_REGISTERS и WRITE_SINGLE_REGISTER) и какие адреса ставить на пример для регистра 38?
Вы понимаете правильно (для записи может потребоваться WRITE_MULTIPLE_REGISTER).Цитата:
какие коды функций ( я так понимаю READ_HOLDING_REGISTERS и WRITE_SINGLE_REGISTER)
Так и ставить - 38.Цитата:
и какие адреса ставить на пример для регистра 38?
я просто тогда не понимаю смысл вот это : The Modbus Communication Module supports zero-based addressing. For example, Holding Register 40002 is addressed as 0001
in a Modbus message.
The Holding Registers shown in Table 4 - Table 8 assume 4xxxx addressing. For example, Holding Register 40001 is shown as 1.
Через переводчик воообще мура какая то...
Например, регистр 40002 хранения адресуется как 0001
в сообщении Modbus.
Регистры хранения, показанные в таблице 4 - Таблица 8, предполагают адресацию 4xxxx. Например, регистр хранения 40001 отображается как 1.
чет бред какой то..
Можете здесь почитать по этому поводу:
https://oscat.ru/?p=369
п. 1.1
Я таки дико извиняюсь :), но вопросы по MQTT не исчезли (ну, почти).
Неужто никто не занимался подпиской?
Не, примеры в ютубе я видел... так и у меня работает...
Но вот как глубже копнешь - какая-то ерунда выходит.
С вопросом 4 вроде разобрался: этому FB похоже вообще параллельно на имя топика подписки.
Пока не ввел проверку на совпадение имени последнего принятого топика с подписываемым (????? казалось бы, какого...), приходили данные из нескольких топиков (с этого-же устройства-публикатора), какой топик раньше обновился - тот и на выходе FB.
Причем, в коде FB (банальным поиском), кроме как в описании переменных, обращения к переменной с названием топика подписки я НЕ НАШЕЛ. Может там есть косвенные обращения через указатели... хотя ко многим другим входным переменным обращения идут непосредственно по именам.
И такое ощущение, что в части подписки данная библиотека дико сырая.
Как хочется верить, что я ошибаюсь (а еще и понять бы - в чем конкретно). Если в том, что пытаюсь использовать бесплатную библиотеку, а не за 50 ойро - так и текущая задача этих денег не стоит по большому счету. Это скорее демонстрационный проект.
Больше вопросов к перспективе использования технологии в дальнейшем.
Параллельно ребята кодят MQTT под NBIoT, там тоже не всё гладко (но там и платформа другая, и средства разработки).
1. У меня не воспроизводится - предупреждений нет.
Вложение 55006
2. Причины могут быть разными. Можете почитать в этой теме:
https://owen.ru/forum/showthread.php...l=1#post355252 (c этого поста и далее)
3. Я не тестировал со своим брокером, который можно перезагрузить, так что не могу дать комментариев.
Если заглянуть в исходники - думаю, не сложно будет добавить в ФБ вход типа xReset.
4. У меня не воспроизводится.
Но я использую один инстанс для подписки на множество топиков, и не понимаю, зачем поступать иначе.
https://owen.ru/forum/showthread.php...l=1#post355434
Эта фраза звучит странно, так как без факта подписки брокер вообще не должен пересылать клиенту сообщения по данным топикам.Цитата:
С вопросом 4 вроде разобрался: этому FB похоже вообще параллельно на имя топика подписки.
Евгений, спасибо!
Есть, с чем поразбираться. Как минимум у других работает :).
Здравствуйте! Можно ли как-то настроить на СПК1хх и ПЛК2хх клиент OpenVPN? Чтобы при наличии интернета он мог соединяться с сервером.
Если нет, может кто посоветовать не сильно дорогое решение с функцией OpenVPN клиента, через которое можно подключить СПК к удаленному серверу для диспетчеризации по ethernet? По 2/3/4G?
Роутер с OpenVPN.
В последней прошивке для СПК OpenVPN доступен:
https://owen.ru/forum/showthread.php...l=1#post351532
Для ПЛК2хх прошивка с OpenVPN в настоящий момент на этапе доработки и тестирования.
Приветствую, форумчане!
Столкнулся с банальной проблемой - Как организовать реализацию Modbus TCP Master в среде CodeSys 3.5?
Много где есть упоминание, но я не нашёл ни одной инструкции по реализации данного протокола.
Если есть у кого инструкции или пример реализации прошу поделиться опытом =)
Доброго дня Коллеги! разбираюсь с ФБ MB_TcpRequest... с чтением вопросов нет,все хорошо...При записи fbWriteRequest "виснет" и перестает реагировать на внешние раздражители...При этом запись происходит( смотрю через веб интерфейс железки), fbWriteRequest.xError сразу устанавливается в TRUE, попробовал выставить tTimeout :=T#1000MS,usiRetry :=10 ,результат тотже...При записи в тот же регистр допустим программой TIK Modscan не каких проблем нет...Прошу помощи...
fbWriteRequest.eError возвращает код 52 ( ILLEGAL_DATA_VALUE Некорректное значение в поле данных) чтобы это могло значить?
Добрый день.
Что вы называете "fbWriteRequest"?
Как мне воспроизвести вашу проблему на своем оборудовании?
Это значит, что в ответ на запрос slave-устройство вернуло ответ с кодом ошибки 03.Цитата:
fbWriteRequest.eError возвращает код 52 ( ILLEGAL_DATA_VALUE Некорректное значение в поле данных) чтобы это могло значить?
В спецификации Modbus описано, в каких случаях он должен возвращаться (например, если вы пытаетесь считать со слэйва 0 или >125 регистров)
В некоторых случаях slave-устройства возвращают этот код в неописанных спецификацией случаях - например, когда записываемое значение выходит за допустимый диапазон параметра.
Что вы называете "fbWriteRequest"? ФБ из OwenCommunication
Как мне воспроизвести вашу проблему на своем оборудовании? наверное только через удаленный доступ ...ШЛЮЗ ПРОТОКОЛА MODBUS MD-CCM18A/N думаю оч редкая железка
Это значит, что в ответ на запрос slave-устройство вернуло ответ с кодом ошибки 03.
В спецификации Modbus описано, в каких случаях он должен возвращаться (например, если вы пытаетесь считать со слэйва 0 или >125 регистров) естественно более 125 ...( 64фанкрйла Х 32 регистра= 2048 как минимум...)
В некоторых случаях slave-устройства возвращают этот код в неописанных спецификацией случаях - например, когда записываемое значение выходит за допустимый диапазон параметра. Нет не выходит...