PDA

Просмотр полной версии : Openhab-Телемеханника-Modbus



John888
29.11.2019, 14:50
Имею следущую проблему. ПЛК110-30ТЛ через Modbus передаю переменную температуры в Openhab, по дороге теряется "," и вместо 77,34градуса 45862 получаю 773445861. Считываю другим софтом например ModbusPoll проблема аналогичная 45863 Подскажите куда копать?

melky
29.11.2019, 15:31
а что вас удивляет ? переменная в одном регистре, значит не float, нужно самостоятельно множитель применять в системе

John888
29.11.2019, 15:36
в телемеханнике? как это сделать? Вроде написано Float

melky
29.11.2019, 15:39
float для переменной внутри, а что в сеть ? может там отдельная настройка. Не пользую просто ТЛ но по окну ModbusPool видно что это не float

John888
29.11.2019, 16:01
float для переменной внутри, а что в сеть ? может там отдельная настройка. Не пользую просто ТЛ но по окну ModbusPool видно что это не float

Вот о том и речь что телемеханника пишет что это float вещественная переменная, а передает ее похоже как целочисленную45865 Вот и думаю как быть... Опять же не понятно как привязать сейчас ко входу переменную float чтобы попробовать передать конкретно ее.

melky
29.11.2019, 16:08
обманщики :)

John888
29.11.2019, 19:19
https://owen.ru/forum/showthread.php?t=27069&page=3 тут нашел вот такое сообщение 45873 действительно так??? С ПЛК с индексом ТЛ т.е. под телемеханнику НЕВОЗМОЖНО КОРРЕКТНО ПЕРЕДАТЬ FLOAT ЧЕРЕЗ MODBUS????? Печаль :(((

melky
29.11.2019, 21:42
Кстати поиском поищите, или дождитесь авторитетных товарищей. Ну не может быть, что про float забыли в сети. Иначе какой-то бред получается, ведь он другие устройства может опрашивать, а там может быть и float

John888
30.11.2019, 06:24
Кстати поиском поищите, или дождитесь авторитетных товарищей. Ну не может быть, что про float забыли в сети. Иначе какой-то бред получается, ведь он другие устройства может опрашивать, а там может быть и float

Уже, жду не дождусь:) Опрашивает без проблем. в моем случае Openhab мастер, а ПЛК slave

Сергей Сисейкин
03.12.2019, 11:42
Уже, жду не дождусь:) Опрашивает без проблем. в моем случае Openhab мастер, а ПЛК slave

Провел эксперимент, назначил для ПЛК-110.ТЛ две переменные, вещественные. при чтении, чтобы ПЛК корректно прочитал выставил коэффициент 0.01, а при записи - 100. Отработало как надо, попробуйте ввести коэффициенты. (в качестве мастера был другой ПЛК - виртуальный, для физического ПЛК с двумя переменными я задал адреса для переменных 2 и 4. читал 3 функцией, записывал 6.

melky
03.12.2019, 14:24
Сергей Сисейкин прикольно, вопрос о множителях уже поднимался, но почему у вас внутри программы float а в сети int так и не ответили :)

Сергей Сисейкин
03.12.2019, 14:27
Сергей Сисейкин прикольно, вопрос о множителях уже поднимался, но почему у вас внутри программы float а в сети int так и не ответили :)

в конфигурации для "отдачи" карту редактируем, - для интов по порядку, для флоатов через один, начиная с четного.

John888
03.12.2019, 14:42
Провел эксперимент, назначил для ПЛК-110.ТЛ две переменные, вещественные. при чтении, чтобы ПЛК корректно прочитал выставил коэффициент 0.01, а при записи - 100. Отработало как надо, попробуйте ввести коэффициенты. (в качестве мастера был другой ПЛК - виртуальный, для физического ПЛК с двумя переменными я задал адреса для переменных 2 и 4. читал 3 функцией, записывал 6.

Коэффициент масштабирования?

John888
03.12.2019, 14:42
в конфигурации для "отдачи" карту редактируем, - для интов по порядку, для флоатов через один, начиная с четного.

тут не понял, можно подробнее?

melky
03.12.2019, 14:48
Вот и мне не понятно. При чем тут мастшабирование при чтении и записи если речь изначально шла о float ? то бишь IEEE 754 имеется ввиду, если я правильно понимаю.

Сергей Сисейкин
03.12.2019, 15:02
Вот и мне не понятно. При чем тут мастшабирование при чтении и записи если речь изначально шла о float ? то бишь IEEE 754 имеется ввиду, если я правильно понимаю.

карта адресов ПЛК в модуле "Контроллеры" - F8. Float- 2 регистра. Располагаем переменные через один регистр 45939

предположу:
откройте карту адресов прибора в разделе modbus там указывается адрес переменной, тип данных, функция чтения/записи, иногда коэффициент. Так и с ПЛК, возможно заданы какие то, дополнительные коэффициенты для передачи float, и исполнительная среда может отдавать в нужном формате, но только с коэффициентом. Уточню у разработчиков.

melky
03.12.2019, 15:04
объясните на кой ляд float-у множитель ? тогда я возможно пойму идею :)

John888
03.12.2019, 15:32
карта адресов ПЛК в модуле "Контроллеры" - F8. Float- 2 регистра. Располагаем переменные через один регистр 45939

предположу:
откройте карту адресов прибора в разделе modbus там указывается адрес переменной, тип данных, функция чтения/записи, иногда коэффициент. Так и с ПЛК, возможно заданы какие то, дополнительные коэффициенты для передачи float, и исполнительная среда может отдавать в нужном формате, но только с коэффициентом. Уточню у разработчиков.

У меня телемеханника не оставляет пустых адресов45940 ну и попробовал менять коэффициенты ничего не дало :(((

melky
03.12.2019, 15:38
John888 вам надо в OpenHub читать и писать как сказал Сергей с множителями.

capzap так речь о том, чтобы у автора OpenHub прочитал и показал именно float. А то вдруг он множителями там оперировать не может при записи например.

Речь об этом с самого начала, почему в программе float а в регистрах нет...

melky
03.12.2019, 15:47
блин, с множителями понятно, я о другом говорю, почему нельзя настроить вывод именно во float чтобы не терялась запятая у автора ?

Не пользовался OpenHub, но вот представьте что ваше ПО или какая-то железка банально не умеет делить и умножать ?
Вот либо автор не знает как делить и умножать в OpenHub либо он этого не умеет а оперирует постоянными величинами - int, float, double и так далее.

Хочешь с ПЛК считать float а не тут то было, там блин int.

Так яснее объяснил ?
а так то в ПЛК разное бывает, вон в Allen Bradley тоже, если программист не использовал float переменные штатные, может запихнуть все в штатные int16, а там, что он туда запихнет его право, ибо свободно программируемое устройство, а потом тому, кто в Scada это заводит сиди и догадывайся что это, int16, float или вообще DWORD с битовой маской настроек....

Вот и тут примерно из той же оперы...

John888
03.12.2019, 16:00
Именно о том и речь. Хочется чтобы ПЛК выдавал изначально правильные значения, а не дорисовывать их руками в Openhabe, у меня переменных вагон и маленькая тележка и у каждой свой адрес и не попорядку, каждую делить гемора дофига

melky
03.12.2019, 16:02
во-во, дорисуйте запятую просто, ну как картинку :)

capzap
03.12.2019, 16:16
в документации

John888
03.12.2019, 17:02
в документации

45950
не получается:(( даже когда ставишь коэффициент 0,01 и пытаешься записать в контроллер, говорит что конфигурация не содержит изменений

melky
03.12.2019, 17:24
Загляните в указанный файл, там что ?

Запустил ТЛ, понял что без ПЛК и бутылки(ок) пива не разобрать, закрыл :)

melky
03.12.2019, 17:48
в этом самом BIN\IO ....
Типы регистров:
и один из них #define RT_FLOAT32 23 правда без коментариев

John888
03.12.2019, 17:58
Загляните в указанный файл, там что ?

Запустил ТЛ, понял что без ПЛК и бутылки(ок) пива не разобрать, закрыл :)

ничего нового, все написано ровно так как запостил capzap боюсь что мой вопрос это не решает :(

John888
03.12.2019, 18:03
45951 Вот что нашел в системе помощи энлоджика, но опять же не понятно пытаюсь считать через Read input register не считывает вообще ничего...ноли

John888
03.12.2019, 18:07
я торопился, скрин относится к мастеру, слейв видимо несколько иное, надо искать что написано в документации по работе в качестве сервера. Насколько помню там где то выделено что все аналоговые сигналы 4-х байтные, независимо вещественные или целочисленные, в Вашем случае вообще все наоборот, все ужато в слова. Тут надо не обрезанные Ваши скрины смотреть а проект в целом. Как обычно, чтоб не обидеть Вашу интелектуальную собственность, создайте пустой проект с нуля и воспроизведите проблему только с одной переменной, если проявится выкладывайте

тут дело не в моем проекте, просто попробуйте создать вещественную переменную с дробным значением а потом передайте ее например в модбас-пул или опенхаб у Вас тоже ничего не получится. А проект ончиста для меня сделан да и выложить я его не стесняюсь:)) может более опытные коллеги подскажут чего:)))) Куда выкладывать?

John888
03.12.2019, 18:14
https://yadi.sk/d/QJINMsbdnKcWaw
сюда залил
Но ведь мой ПЛК одновременно является Мастером для Модулей ввода например и счетчиков и Слейвом для Openhab

John888
03.12.2019, 18:23
Загляните в указанный файл, там что ?

Запустил ТЛ, понял что без ПЛК и бутылки(ок) пива не разобрать, закрыл :)

там есть виртуальный ПЛК можно на нем поэкспериментировать:))

Сергей Сисейкин
04.12.2019, 09:25
https://yadi.sk/d/QJINMsbdnKcWaw
сюда залил
Но ведь мой ПЛК одновременно является Мастером для Модулей ввода например и счетчиков и Слейвом для Openhab

поэтому я и сделал следующий IO файл для физического ПЛК с двумя переменными и для Телемеханики его сделал slave:
<?xml version="1.0" encoding="windows-1251"?>

<KLogicModules>

<Module Id="14235"> Comment="ок">
<Name>Test</Name>
<sModGroupName>TEST</sModGroupName>
<CfgName>тест</CfgName>
<Descr>тест</Descr>
<Protocol>Modbus</Protocol>
<Properties>
<Prop Id="1" Name="Адрес модуля" Type="BYTE" Init="1"/>
<Prop Id="2" Name="Режим" Descr="Режим передачи 0-RTU, 1-ASCII (не реализован)" Type="BYTE" Init="0" Access="H"/>
<Prop Id="3" Name="Карта" Descr="Адресация карты с 1" Type="BYTE" Init="0" Access="H"/>
<Prop Id="4" Name="Доп.свойства" Type="BYTE" Init="1" Descr="Дополнительны свойства (биты): 1-Endian, 2-АдресТегаТУ" Access="H"/>
</Properties>
<TagProperties>
<Prop IdStr="Adr" Name="Адрес модбас" Type="WORD" Access="RW"/>
<Prop IdStr="Func" Name="Код функции" Type="BYTE" Access="RW" Init="3"/>
<Prop IdStr="DataType" Name="Тип данных" Type="BYTE" Access="RW" Init="23"/>
<Prop IdStr="K" Name="Коэффициент" Type="FLOAT" Access="RW" Init="1"/>
<Prop IdStr="msk" Name="Маска" Type="WORD" Access="R" Init="0xFFFF"/>
<Prop IdStr="endian" Name="Порядок следования (0-как есть, 1-обратный п.байт, 2-обрат.п.слов, 3-обрат.п.байт,слов" Type="BYTE" Access="R" Init="0"/>
</TagProperties>
<TagTree>
<Group Name="Служебные">
<Tag Name="Связь" Type="DI" Adr="0x0001" Func="0" Descr="Наличие связи с устройством"/>
<Tag Name="Время" Type="DTI" Adr="0x0002" Func="0" Descr="Время опроса устройства"/>
<Tag Name="Приостанов" Type="DO" Adr="0x0003" Func="0" Descr="Приостанов опроса устройства (True - не опрашивать)"/>
</Group>
<Group Name="Сетевые настройки reed">
<Tag Name="1ya" Type="AIF" Adr="2" Func="3" K="0,01" DataType="11" Descr="переменная 1 чтение"/>
<Tag Name="2ya" Type="AIF" Adr="4" Func="3" K="0,01" DataType="11" Descr="переменная 2 чтение"/>
<Tag Name="1yaz" Type="AOF" Adr="2" Func="6" K="100" DataType="11" Descr="переменная 1 запись"/>
<Tag Name="2yaz" Type="AOF" Adr="4" Func="6" K="100" DataType="11" Descr="переменная 2 запись"/>
</Group>

</TagTree>
</Module>

</KLogicModules>


а виртуальным контроллером его и опрашивал.
у каждого ПО свой способ добавления slave устройства, у нас можно вводить коэффициенты.

John888
15.12.2019, 14:50
и все таки возможно ли обойтись без коэффициентов? ну или где то в файле настроек прописать их для того чтобы наружу модбасс передавался корректно? Вопрос прям очень принципиальный!!! и принимался тоже. Эта проблема вроде только на ПЛК с индексом ТЛ только присутствует на остальных вроде все корректно

Сергей Сисейкин
16.12.2019, 09:58
и все таки возможно ли обойтись без коэффициентов? ну или где то в файле настроек прописать их для того чтобы наружу модбасс передавался корректно? Вопрос прям очень принципиальный!!! и принимался тоже. Эта проблема вроде только на ПЛК с индексом ТЛ только присутствует на остальных вроде все корректно

Без коэффициентов не обойтись, они должны выставляться на ПО, которое является мастером для ПЛК. Это не проблема, это особенность, внутри своей среды (контроллеры "ТЛ" и SCADA Телемеханика лайт) проблем нет, для передачи в другую среду есть особенности, в данном случае коэффициенты.

John888
16.12.2019, 11:37
Без коэффициентов не обойтись, они должны выставляться на ПО, которое является мастером для ПЛК. Это не проблема, это особенность, внутри своей среды (контроллеры "ТЛ" и SCADA Телемеханика лайт) проблем нет, для передачи в другую среду есть особенности, в данном случае коэффициенты.

Хорошо, тогда поясните пожалуйста подробнее где эти коэффициенты выставлять?

Сергей Сисейкин
16.12.2019, 12:33
В каждом программном обеспечении есть свой формат карты адресов опрашиваемых устройств, обратитесь в техническую поддержку openhab.
я приводил выше пример, где данная настройка задается в Телемеханике, должно быть что то похожее и вашем ПО.

melky
16.12.2019, 17:30
Сергей Сисейкин это какой-то треш, ну уже признали бы, что формат IEEE754 в сети вы не поддерживаете в ТЛ. А то выглядит все вышесказанное как отмазка.

Сергей Сисейкин
17.12.2019, 11:34
Сергей Сисейкин это какой-то треш, ну уже признали бы, что формат IEEE754 в сети вы не поддерживаете в ТЛ. А то выглядит все вышесказанное как отмазка.

Карта адресов в ПЛК:
46221
адреса переменных 2, 4 и 6. Будем в них записывать значения и читать.
в opc сервере Owen добавляем 6 тэгов, три для чтения, три для записи.

Начну с записи Float:
46222
использовать нужно настройки как на скриншоте.

для чтения Float нужно умножать адрес переменной на "2". (отрыл старую доку, в конце приложу описание)
46223

запись и чтение Float работает
46224

Modbus TCP slave в исполнительной системе EnLogic.

Протокол MODBUS TCP обеспечивает обмен между устройствами в сети Ethernet, используя модель клиент-сервер (master-slave) со стеком протоколов TCP/IP, где ИС EnLogic выступает в роли сервера (EnLogic также может быть и клиентом, но этот вопрос не рассматривается в данном документе).

В ИС EnLogic поддержаны три функции Modbus TCP slave:
0x03 - Read Holding Registers
Внутри ИС каждый параметр EnLogic имеет размер 4 байта (2 регистра Modbus). При подготовке ответа на запрос мастера значение параметра "ужимается" до одного регистра (2 байта), т.е. вполне может произойти переполнение. В этом случае вместо значения передаётся 0xFFFF. Полноразмерное значение параметра можно получить, используя функцию 0x04.
Все значения в ответе передаются как short int (от -32767 до 32767), параметры типа Integer передаются без изменений, параметры типа Float умножаются на заданный множитель и обрезаются до целого числа, параметры типа Boolean передаются как 1 (true) или 0 (false). В регистрах, соответствующих несуществующим в конфигурации контроллера параметрам (а также параметрам вне разрешённого диапазона) и в регистрах, соответствующих недостоверным параметрам (с плохим качеством), передаются 0xFFFF.
В данном запросе адреса Modbus соответствуют МЭК-адресам параметров в конфигурации ИС EnLogic.
Если адреса запрошенных параметров не попадают в допустимый диапазон, то возвращается исключение Modbus с кодом 2.
0x04 - Read Input Registers
В ответ на этот запрос отправляются значения параметров «как есть», без дополнительной обработки, при этом каждый параметр передаётся в двух регистрах Modbus. Адреса Modbus в данном запросе должны представлять собой МЭК-адреса параметров в конфигурации EnLogic, умноженные на 2. Например, для запроса трёх параметров, начиная с МЭК-адреса 21, запрос должен быть на шесть регистров, начиная с адреса 42.
В ответ в регистрах, соответствующих несуществующим в конфигурации контроллера параметрам (а также параметрам вне разрешённого диапазона) и в регистрах, соответствующих недостоверным параметрам (с плохим качеством), передаются 0xFFFFFFFF. Целочисленные параметры передаются как INT32, параметры с плавающей запятой – как FLOAT32, дискретные значения передаются следующим образом: TRUE - как 0x00000001, FALSE – как 0x00000000.
Если адреса запрошенных параметров не попадают в допустимый диапазон, то возвращается исключение Modbus с кодом 2.
0x06 - Write Single Register
В данном запросе адрес Modbus должен соответствовать МЭК-адресу параметра в конфигурации ИС EnLogic, а само значение параметра должно быть передано в формате short int (от -32767 до 32767), при этом для записи параметров типа Float его значение должно быть умножено на заданный множитель и обрезано до целого числа.
Если адрес выходит за пределы разрешённого диапазона или отсутствует в конфигурации EnLogic, то возвращается исключение Modbus с кодом 2.

Настройки задачи Modbus TCP slave
Настройки задачи Modbus TCP slave и её текущее состояние отображаются в ФБ ModbusTcpSlave:
46225
Настройки по-умолчанию следующие: Порт = 502, Максимум соединений = 5, Начальный адрес = 1, Конечный адрес = 32767, Множитель = 100.

melky
17.12.2019, 14:34
Вот именно это у вас человек и просил с самого начала...

Сергей Сисейкин
17.12.2019, 16:07
Вот именно это у вас человек и просил с самого начала...

да, понятно, немного не в то русло попали сначала..