PDA

Просмотр полной версии : Помогите новичку



кибернетик
01.04.2016, 15:30
Привет, форумчане.
Изучаю программирование PLC. По Modbus получаю данные(HEX) в PLC из ОВЕН МВ110-224 в виде массива Word, выглядит примерно так: 16#4401(0), 16#42E0(1). Вопрос, как вынуть из массива данные и перевести их в десятичное число с плавающей запятой? Должно получиться примерно так: 517,045 (по крайней мере так пишет конфигуратор). С массивами раньше не сталкивался, поэтому голову себе уже почти сломал... Всем ответившим большое человеческое спасибо!!!

petera
01.04.2016, 16:15
По Modbus получаю данные(HEX) в PLC из ОВЕН МВ110-224 в виде массива Word, выглядит примерно так: 16#4401(0), 16#42E0(1)
Это мазохизм какой-то.
Никаких массивов. Вместо двух Register input module используйте один Real input module и сразу получите из МВ110 число с плавающей точкой.
А чтобы не выглядело так "16#4401(0)" в онлайн просмотре переключите отображение переменных в десятичном виде.

кибернетик
01.04.2016, 19:03
Контроллер GLOFA, не ОВЕН, в том то и дело, в GMWIN единственный доступный модуль для чтения Modbus - MOD0304, а он выставляет данные массивом ARY_WORD и другие типы данных не поддерживает... отсюда и мазохизм.

melky
01.04.2016, 19:28
Тогда склеить два полученных ворда в дворд и преобразовать во флоат.

кибернетик
01.04.2016, 19:28
Извиняюсь, обманул, есть еще MOD0102, но он на выходе делает битовый массив ARY_BOOL, но это по-моему еще мазохистее...

кибернетик
01.04.2016, 19:40
Спасибо, попробую. Хотя до сих пор "выдрать" WORD из ARY_WORD у меня не получалось... Получалось ARY_WORD преобразовать в STRING, но это хрень полная...

cer_cer
01.04.2016, 20:11
Привет, форумчане.
Изучаю программирование PLC. По Modbus получаю данные(HEX) в PLC из ОВЕН МВ110-224 в виде массива Word, выглядит примерно так: 16#4401(0), 16#42E0(1). Вопрос, как вынуть из массива данные и перевести их в десятичное число с плавающей запятой? Должно получиться примерно так: 517,045 (по крайней мере так пишет конфигуратор). С массивами раньше не сталкивался, поэтому голову себе уже почти сломал... Всем ответившим большое человеческое спасибо!!!
Вы неможете из ОВЕН МВ110-224 получить массив Word - ов. Ну конечно если очень захотеть... Или вы каким-то боком всю принятую модбасову телеграму целиком в массив суёте?
вы вообще приколист.... а что будет если вы получите не данные(HEX), а данные (BIN) ?

кибернетик
01.04.2016, 20:38
К сожалению не получилось

кибернетик
01.04.2016, 20:57
cer_cer, вы бы лучше посоветовали что-нибудь дельное, а ёрничать мы все умеем... Массив в PLC приходит, и приходит в том виде, как положено двумя Word-ами, как Вы выразились, точно так-же, как я вижу в конфигураторе к ОВЕНу, ничего лишнего. А в том, что в ПО к GLOFA G7 нет нормальных способов удобно преобразовать данные из массива в число - не моя же вина, правда? Был бы контроллер ОВЕН-ом, вопросов бы не было, в CoDeSys-е все просто и удобно, а Вы опробуйте в GMWIN...

Scream
01.04.2016, 21:33
Спасибо, попробую. Хотя до сих пор "выдрать" WORD из ARY_WORD у меня не получалось... Получалось ARY_WORD преобразовать в STRING, но это хрень полная...

Тут может и решение.
Расскажите что из себя представляет этот ARY_WORD и как получалось в String преобразовать.

cer_cer
02.04.2016, 07:47
cer_cer, вы бы лучше посоветовали что-нибудь дельное, а ёрничать мы все умеем... Массив в PLC приходит, и приходит в том виде, как положено двумя Word-ами, как Вы выразились, точно так-же, как я вижу в конфигураторе к ОВЕНу, ничего лишнего. А в том, что в ПО к GLOFA G7 нет нормальных способов удобно преобразовать данные из массива в число - не моя же вина, правда? Был бы контроллер ОВЕН-ом, вопросов бы не было, в CoDeSys-е все просто и удобно, а Вы опробуйте в GMWIN...

Кибернетик, я думал речь идёт о кодесис, с ПО к GLOFA G7 я совсем незнаком. Неужели там нет конвертера? какие языки программирования там поддерживаются?

melky
02.04.2016, 09:14
Вообще странно что принимается массив Word а не byte например.

интересно, а 32-х битные операции вообще вашим контроллером поддерживаются ?, если нет, то вы как ни пляшите, многого от него не получите.
з.ы. вряд ли тут кто-то начнет изучать ваш контроллер, чтобы обяснить возможно то что вы хотите или нет и если возможно то как это сделать. Ищите профильный форум по своему контроллеру или обращайтесь в тех поддержку производителя контроллера

Язык программирования поддерживает мировые стандарты (EC61131-3): IL, ID, SFC - думаю, что надо копать в сторону SFC и тут может помогу с кодом, так как в CDS такой язык присутствует.
IL в CDS нет, тут больше смогут помочь кто для Сименса пишет, хотя именно спеца по IL найти думаю будет сложновато., ID вообще первый раз слышу, что это

кибернетик
02.04.2016, 11:35
cer_cer, вы бы лучше посоветовали что-нибудь дельное, а ёрничать мы все умеем... Массив в PLC приходит, и приходит в том виде, как положено двумя Word-ами, как Вы выразились, точно так-же, как я вижу в конфигураторе к ОВЕНу, ничего лишнего. А в том, что в ПО к GLOFA G7 нет нормальных способов удобно преобразовать данные из массива в число - не моя же вина, правда? Был бы контроллер ОВЕН-ом, вопросов бы не было, в CoDeSys-е все просто и удобно, а Вы опробуйте в GMWIN...

кибернетик
02.04.2016, 11:39
поддерживаются IL, LD, FB

кибернетик
02.04.2016, 11:40
я пишу в LD

кибернетик
02.04.2016, 11:47
32-х битные операции поддерживаются. А контроллер изучать и не надо, я просил подсказать метод...
В ПО к контроллеру реализовано несколько функций для работы с modbus, две из них для чтения, одна выдает массив bool, вторая word. Ковертеры массивов есть, но они все конвертируют в массив, кроме одного, который конвертирует в строку

кибернетик
02.04.2016, 11:51
в GMWIN есть стандартная функция ARY_WORD_TO_STRING, но на выходе охинея, которая ни во что не конвертируется...

кибернетик
02.04.2016, 12:28
в массиве ARY_WORD 2 слова по 2 байта, данные в Hex, если я после ARY_WORD_TO_STRING делаю STRING_TO_WORD, на выходе 0, ошибку не выдает.

кибернетик
02.04.2016, 12:30
то же самое, с STRING_TO_BYTE

кибернетик
02.04.2016, 12:48
после ARY_WORD_TO_STRING делаю STRING_TO_ARY, на выходе массив байтовый ARY_BYTE, проверил по-байтно данные совпадают, значит в STRING не охинея, как то можно оттуда данные достать....

petera
02.04.2016, 19:42
в массиве ARY_WORD 2 слова по 2 байта, данные в Hex, если я после ARY_WORD_TO_STRING делаю STRING_TO_WORD, на выходе 0, ошибку не выдает.
Что Вы ерундой занимаетесь, какие ARY_WORD_TO_STRING?
У вас из МВ110 приходит число с плавающей точкой - Float по стандарту IEEE_754.
Оно действительно занимает 32 бита или два WORD или Ваш массив из двух WORD.
Прежде чем преобразовывать этот массив во всякую ерунду посмотрели бы в начале, а что находится в этих WORD
https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BE%D0%B4%D0%B8% D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D 1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8
23572
Отсюда видно, что ничего общего со String получить нельзя, как нельзя склеить два полученных ворда в дворд и преобразовать во флоат. Чего склеивать? Он уже и так Float
В одном Worde часть мантиссы, а во втором оставшаяся часть мантиссы, порядок и знак.
Воспользуйтесь калькулятором http://www.binaryconvert.com/result_float.html?hexadecimal=440142E0 и убедитесь, что из 16#4401(0), 16#42E0(1) получиться примерно так: 517,045 (по крайней мере так пишет конфигуратор)
23573
Так, что никакой склейки, только вычисления Вас спасут.

petera
02.04.2016, 21:09
Не знаю как там в GMWIN.
В Кодесис без использования указателей вычисление в соответствии с этим описанием
23576

PROGRAM PLC_PRG
VAR
ARY_WORD: ARRAY [0..1] OF WORD:=16#4401,16#42E0; (*Данные в виде массива*)
epo: INT; (*Порядок*)
mant: DINT; (*Мантисса*)
factor: REAL; (*Знак*)
ARY_WORD_TO_FLOAT: REAL; (*Результат*)
END_VAR

IF ARY_WORD[0]>32768 THEN
factor:=factor:=-1.0;
ELSE
factor:=factor:=1.0;
END_IF
epo:=SHR((16#7F80 AND ARY_WORD[0]),7) - 127; (*Для вычисления показателя степени из восьмиразрядного поля порядка вычитается смещение порядка равное 127*)

mant:=WORD_TO_DINT(16#7F AND ARY_WORD[0])*65536 + WORD_TO_DINT(ARY_WORD[1]); (*Собираем мантиссу из частей*)
mant:=mant+16#800000; (*Для вычисления мантиссы к единице добавляется дробная часть мантиссы из 23-х разрядного поля дробной части мантиссы*)

ARY_WORD_TO_FLOAT:=factor*DINT_TO_REAL(mant)/EXPT(2,23-epo); (*Число равно произведению мантиссы со знаком на двойку в степени порядка*)
Можно оформить в виде функции.
Пример с Вашими данными
23579