PDA

Просмотр полной версии : Получение значений float32



инок
08.09.2013, 00:54
Доброго времени суток.
Нет ли для CDS3 какого-либо руководства по конфигурированию устройств по протоколу Modbus. МВ110-4ТД выдает значения веса в формате float32, обычные WORD BYTE считываю нормально, а при добавлении канала с длинной 2 регистра в соотнесении входов появляются два регистра из которых я могу считать два WORDa в две переменные, а как потом собрать их обратно в float32.
Еще вопрос. В CDS2.3 в модулях Modbus master были выходы STATE (с разрешением по 255), как организовать запись значений в регистры слайв устройств в CDS3 по разрешению. И какой сом-порт указывать при опросе по ТСР/IP

Александр Приходько
08.09.2013, 01:23
инок (http://www.owen.ru/forum/member.php?u=17821) , в 3 соседних ветках все эти вопросы уже решались.
1) Чтобы из 2-х вордов собрать 1 Real надо немного поиграть с перестановкой регистров. Методов и способов много. Я использую такой:


Объявляем переменные:



p1: POINTER TO BYTE;
p2: POINTER TO BYTE;
IN_Data: POINTER TO ARRAY[0..1] OF WORD; (*Указатель на массив регистров для Float*)
Out_data: Real;


Код программы:


(*Регистры с типом данных Word необходимо пересобрать в обратной последовательности для получения Float*)
p1:=ADR(Out_data);
p2:=ADR(IN_Data^[1]);

p1^:=p2^;
p1:=p1+1;
p2:=p2+1;
p1^:=p2^;
p1:=p1+1;
p2:=ADR(IN_Data^[0]);
p1^:=p2^;
p1:=p1+1;
p2:=p2+1;
p1^:=p2^;




2)Руководство по конфигурированию Modbus тоже есть. Версия не совсем финальная, но рабочая:
http://www.owen.ru/forum/showthread.php?t=15674&p=117771&viewfull=1#post117771
3) State реализован в виде тригера при добавлении канала. Если выбран тригерный способ, то в окне где происходит привязка переменных появится еще одна переменная, по срабатыванию которой будет писаться канал.

инок
08.09.2013, 14:22
Александр. Большое спасибо. Инструкция нормальная, понятная.
Скажите принцип работы триггера Rising Edge такой же как BYTE у STATE? Мне надо по переднему фронту устанавливать в TRUE бит триггера и записывать значение, а после записи сбрасывать бит в FALSE?

инок
08.09.2013, 15:44
Я читал все рассуждения по поводу получения float32. Извините какая-то лабуда.
На скриншоте Канал1 считывает переменную в 16 бит т.е. WORD, он правильно считывает нет необходимости менять последовательность следования байтов как в описанном Вами примере и других подобных примеров много и по-проще.
Канал3 считывает в два регистра переменную float32, уже получены значения каждого из 2 регистров теперь я должен соотнести 2 переменные типа WORD к какими либо двумя вордовскими переменными и в конечном итоге получить переменную типа Итого:REAL=WordToReal(Канал3.1:WORD)*WordToReal(Ка нал3.2:WORD) или я чего-то не понимаю.
Зачем мне переставлять 8 бит(POINTER TO BYTE) в 16 битной переменной типа WORD см. Канал1, я бы еще понял если бы Вы начали с POINTER TO WORD; и как бы меняли следование регистров (ведь регистр Modbus 16 бит т.е. WORD, а не BYTE), но и это зачем делать?

capzap
08.09.2013, 17:35
почему надо менять байты местами, потому что существует четыре комбинации

Александр Приходько
08.09.2013, 20:09
Александр. Большое спасибо. Инструкция нормальная, понятная.
Скажите принцип работы триггера Rising Edge такой же как BYTE у STATE? Мне надо по переднему фронту устанавливать в TRUE бит триггера и записывать значение, а после записи сбрасывать бит в FALSE?

Добавляете логическую переменную. В момент ее включения (по переднему фронту) произойдет однократная запись переменной.
Откройте справку CODESYS там все расписано.


Я читал все рассуждения по поводу получения float32. Извините какая-то лабуда.
На скриншоте Канал1 считывает переменную в 16 бит т.е. WORD, он правильно считывает нет необходимости менять последовательность следования байтов как в описанном Вами примере и других подобных примеров много и по-проще.
Канал3 считывает в два регистра переменную float32, уже получены значения каждого из 2 регистров теперь я должен соотнести 2 переменные типа WORD к какими либо двумя вордовскими переменными и в конечном итоге получить переменную типа Итого:REAL=WordToReal(Канал3.1:WORD)*WordToReal(Ка нал3.2:WORD) или я чего-то не понимаю.
Зачем мне переставлять 8 бит(POINTER TO BYTE) в 16 битной переменной типа WORD см. Канал1, я бы еще понял если бы Вы начали с POINTER TO WORD; и как бы меняли следование регистров (ведь регистр Modbus 16 бит т.е. WORD, а не BYTE), но и это зачем делать?

Лабуда не лабуда, дело в том, что формат REAL не описан в протоколе Modbus. Данный протокол не коим образом не описывает формат передачи данных Real/Float. Поэтому каждый производитель софта/оборудования последовательность сбора/разбора real делает по своему.
То, что вы видите данные, которые нормально приходят в WORD не говорит о том, что эти данные должны быть в такой же последовательности в REAL.
Попробуйте возьмите два указателя на word и соберите Real, после этого задавайте вопросы.


почему надо менять байты местами, потому что существует четыре комбинации
Собственно в этом видео все видно. 4 разных последовательности - 4 разных алгоритма сбора/разбора.

инок
10.09.2013, 10:20
Извините Александр.
Вы бы не могли, если Вас это не затруднит описать как собирать во флоат словами, как у Вас построен алгоритм разбора флоат для передачи по Модбас. Понятно что 4 алгоритма разборки, какой применяете ВЫ.

capzap
10.09.2013, 10:44
http://www.owen.ru/forum/showthread.php?t=13584&p=93612&viewfull=1#post93612
Здесь не пробовали посмотреть?

инок
10.09.2013, 11:03
http://www.owen.ru/forum/showthread.php?t=13584&p=93612&viewfull=1#post93612
Здесь не пробовали посмотреть?

Сейчас попробую

инок
10.09.2013, 11:29
Вы меня постоянно уводите на CDS2.3 в нем у меня вообщем проблем не было. Там в конфигурировании были модули REAL input, output и я отсылал и принимал REAL когда угодно и куда угодно. В CDS3 разработчики не сделали таких модулей а отдали это на откуп пользователей. Даже в видео там просто выбирается алгоритм сбора в зависимости от алгоритма разбора.

capzap
10.09.2013, 13:54
А я устал уже повторять что модбас это стандартный протокол, он собирается и разбирается по одним и тем же законам, что во второй что в третьец версии

Александр Приходько
10.09.2013, 13:56
Извините Александр.
Вы бы не могли, если Вас это не затруднит описать как собирать во флоат словами, как у Вас построен алгоритм разбора флоат для передачи по Модбас. Понятно что 4 алгоритма разборки, какой применяете ВЫ.

Именно так, как в примере описано.

инок
10.09.2013, 20:18
Хорошо. Если Вы так упрямо стоите на своем, то объясните почему в CDS2.3 я этого не делал.

инок
10.09.2013, 20:30
Может быть у Вас это коммерческая тайна? Почему если в данной версии нет того же функционала, какой был в предыдущей Вы не напишите пользователям внятной инструкции. Вы поймите мы работу делаем и занимаемся разработками малую часть своей деятельности. У меня нет времени долго и нудно сидеть и разбираться в этом вопросе. За то время которое я убиваю не понятно на что, я бы уже написал программу по обработке флоатовского значения, а я тупо не могу нормально получить значения веса, который выдает Ваш же прибор, а не прибор стороннего производителя. Подумайте над моими словами, мы в конце концов Ваши партнеры.

инок
10.09.2013, 23:27
Я Ваш пример в проект встроил, но значения REAL отличаются от значений которые у меня выдает прибор в программе на CDS2.3. Там у меня выдает -9.8....... а здесь.... высылаю скриншот.

capzap
11.09.2013, 00:00
А код без онлайн можно увидеть, а то как то не вяжеться мысль что Вы тосуете байты местами, если одни и теже значения три раза повторяются и указатель из указателя это вообще круто, в каком примере это описано?

инок
11.09.2013, 00:22
Этот пример программы мне прислал СуперМодератор в первом ответе можете оригинал посмотреть.
Я не супер программист, но я тоже немного засомневался и попросил словами объяснить, может у меня лучше бы получилось. Просто нужно понять, что нужно сделать. Я из этого текста кода просто даже понять не могу ни чего и тем более внятно объяснить.

Александр Приходько
11.09.2013, 05:48
Я Ваш пример в проект встроил, но значения REAL отличаются от значений которые у меня выдает прибор в программе на CDS2.3. Там у меня выдает -9.8....... а здесь.... высылаю скриншот.
А байты сами пробовали перетосовать?
Этот код я использовал при опросе значений с МВ110-8А.
Если получится, попробую сегодня проверить на 4ТД.

capzap
11.09.2013, 07:12
я тоже немного засомневался и попросил словами объяснить

Ссылка на ссылку это как бы нормальное дело, но в плк это делать лучше имея большой опыт, меня удивило что так предлагают в примерах для новичков, считаю что надо показывать каждый шаг в таких делах, вот этоо реал, вот это указатель на реал, вот это массив из четырех байт, вот указатель ложим в ячейку массива, вот дедаем смещегие указателя, снова ложим и т.д.
Тогда новичку было бы ронятно

petera
11.09.2013, 07:54
Извините Александр.
Вы бы не могли, если Вас это не затруднит описать как собирать во флоат словами, как у Вас построен алгоритм разбора флоат для передачи по Модбас. Понятно что 4 алгоритма разборки, какой применяете ВЫ.
Для начала о формате Float. Число в этом формате представлено в виде мантиссы и экспоненты+знак числа. Для представления такого числа используются 32 бита=4байта=2WORD.
Есть такой онлайн ресурс http://www.binaryconvert.com/convert_float.html, где можно проводить преобразование чисел из одного формата в другой.
Так вот, попробую с его помощью объяснить почему возможны 4 варианта
Вот так выглядит представление числа Float
10051
Хорошо видно где находятся знак, мантисса и экспонента.
В ПЛК число "1" должно быть представлено так
10052
Как уже было сказано, в стандарте на протокол ModBus не описано как должны передаваться 32-битные числа в формате Float. Просто для предачи 32 бит используют передачу двух 16-битных регистров WORD. Назавем их WORD_0 и WORD_1
В каком порядке будет передавать эти WORD в Ваш ПЛК подключенное к нему Slave устройство выбрал изготовитель Slave устройства, так как ему понравиться. Ведь стандарта нет.
Мало того, что порядок передачи регистров может быть WORD_0,WORD_1 или WORD_1,WORD_0.
Так еще есть два вариант упаковки байт исходного числа в WORD.
Вот и получаются еще три варианта в дополнение к выше приведенному.
10053
10054
10055
Можете попробовать вставить сюда 2 WORD, которые Вы прочитали из Slave, может будет понятно в каком порядке нужно будет переставлять байты (какой из четырех алгоритмов использовать)

инок
11.09.2013, 12:00
Вот за это огромное спасибо. Я долго просил разработчиков такую информацию.

capzap
11.09.2013, 12:08
Вот за это огромное спасибо. Я долго просил разработчиков такую информацию.

вот тут я вообще недоумеваю, а на видео у меня тогда что? Из выпадающего списка выбирал очередность байт, показывал как они расположены в двойном слове, как меняется сам Реал (флоат)
:) луч ненависти в сторону petera, за то что встрял, я уже виртуалку с КДС3 открыл хотел проект для примера создать, а тут уже все вдруг стало понятно :)

petera
11.09.2013, 12:25
У меня "терпелка" кончилась, глядя как человек мучается из-за непонимания формата Float

Канал3 считывает в два регистра переменную float32, уже получены значения каждого из 2 регистров теперь я должен соотнести 2 переменные типа WORD к какими либо двумя вордовскими переменными и в конечном итоге получить переменную типа Итого:REAL=WordToReal(Канал3.1:WORD)*WordToReal(Ка нал3.2:WORD) или я чего-то не понимаю.

capzap
11.09.2013, 13:12
добавляю видео и проект, раз уж проговорился что решил помочь :)

ЫЗ Забыл добавить, в проекте есть функция перевертывания байт в ворде и вместо записей вроде ptWord^ :=arr[iter]; нужно писать ptWord^ :=SWAPB(arr[iter]); , ну и оставишиеся две комбинации тоже самое только дабавлять элементы массива сперва четные потом нечетные

ЗЫ в догонку еще видео

инок
11.09.2013, 18:42
добавляю видео и проект, раз уж проговорился что решил помочь :)

ЫЗ Забыл добавить, в проекте есть функция перевертывания байт в ворде и вместо записей вроде ptWord^ :=arr[iter]; нужно писать ptWord^ :=SWAPB(arr[iter]); , ну и оставишиеся две комбинации тоже самое только дабавлять элементы массива сперва четные потом нечетные

ЗЫ в догонку еще видео

Скажите а где тексты кода которые на видео

capzap
11.09.2013, 18:45
один в проекте, а второй нажмите паузу второго видео и скопируйте, там четыре строчки повторяются четыре раза с разными вариациями.
ЗЫ за основу второго видео взят первый проект. из PLC_PRG удален старый код и вставлено то что на видео, остальное в проекте без изменений

инок
11.09.2013, 19:13
один в проекте, а второй нажмите паузу второго видео и скопируйте, там четыре строчки повторяются четыре раза с разными вариациями.
ЗЫ за основу второго видео взят первый проект. из PLC_PRG удален старый код и вставлено то что на видео, остальное в проекте без изменений

Просто я когда открыл проект там были только GVL и девайсы а с моего проигрывателя я не могу скопировать. Еще откуда у Вас берется DataMonitor где вы ловко выбираете последовательности и у меня когда я соотношу переменные тип у меня не меняется на массив, а так и остается WORD

capzap
11.09.2013, 19:37
Просто я когда открыл проект там были только GVL и девайсы а с моего проигрывателя я не могу скопировать. Еще откуда у Вас берется DataMonitor где вы ловко выбираете последовательности и у меня когда я соотношу переменные тип у меня не меняется на массив, а так и остается WORD

это не я такой ловкий, а прога которая делает скан экрана увеличивает скорость, под копированием я имел ввиду ручками набрать текст который виден на видео, GVL и девайсы действительно расположены на вкладке устройства, а ПОУ я стараюсь создавать на вкладке ПОУ, DataMonitor это окно программы эмулятора слейва http://www.hmisys.com/downloads/PeakHMISlaveSimulatorInstall.exe, по поводу соотношения, массив из ПОУ надо соотносить с массивом конфигурации слейва, в нем смотрите колонку тип

инок
11.09.2013, 21:21
Извините capzap у меня не соотносятся регистры к массивам правильно посмотрите скришот
10075

capzap
11.09.2013, 21:36
один в проекте, а второй нажмите паузу второго видео и скопируйте, там четыре строчки повторяются четыре раза с разными вариациями.
ЗЫ за основу второго видео взят первый проект. из PLC_PRG удален старый код и вставлено то что на видео, остальное в проекте без изменений

Соврал, изменения все же были, я в канале менял с 3-ей функции на 16-ую

Извините capzap у меня не соотносятся регистры к массивам правильно посмотрите скришот
не помойму, что не соотноситься, вроде всё верно получается, конкретнее в чем проблема?

инок
12.09.2013, 13:11
Соврал, изменения все же были, я в канале менял с 3-ей функции на 16-ую

не помойму, что не соотноситься, вроде всё верно получается, конкретнее в чем проблема?

Я создаю в канале массив пока не соотношу с массивом переменных у меня в в разных словах разные цифры, как только соотношу с массивом переменных каждое слово в свой итый номер, то начинает отоброжатся значение первого из 2 регистров в обоих номерах массива это видно на скриншоте

capzap
12.09.2013, 13:14
Я создаю в канале массив пока не соотношу с массивом переменных у меня в в разных словах разные цифры, как только соотношу с массивом переменных каждое слово в свой итый номер, то начинает отоброжатся значение первого из 2 регистров в обоих номерах массива
судя по скрину, Вы пытаетесь каждый флоат получить отдельно, хотя регистры следуют друг за другом, у меня же один канал читает сразу 8 регистров и получает из них 4 реала, может в этом разница

Александр Приходько
12.09.2013, 13:38
Всех приветствую.
Наконец добрался до 4ТД.

1. Модуль 4ТД не поддерживает групповой опрос (к сожалению). Максимальное кол-во регистров которое можно считать -2 и это только для параметров типа Float.
2. Я подготовил видео пример и пример в CODESYS по опросу модуля 4ТД, надеюсь больше вопросов не будет.

http://youtu.be/GHUrbkP-gU4
10082

инок
13.09.2013, 11:53
Александр. Огромное спасибо за столь исчерпывающую информацию, я испытаю и отпишусь. Скажите как вы пишите много строк одновременно, вы показывали мне, я просто забыл.

Александр Приходько
13.09.2013, 14:30
Александр. Огромное спасибо за столь исчерпывающую информацию, я испытаю и отпишусь. Скажите как вы пишите много строк одновременно, вы показывали мне, я просто забыл.

Очень просто. Ставите курсор в нужную позицию. Нажимаете кнопку ALT , нажимаете ПКМ(правая кнопка мыши) и не отпуская ее выделяете редактируюмую область. После выделения области отпускаете мышь и вводите текст.

инок
13.09.2013, 23:24
Очень просто. Ставите курсор в нужную позицию. Нажимаете кнопку ALT , нажимаете ПКМ(правая кнопка мыши) и не отпуская ее выделяете редактируюмую область. После выделения области отпускаете мышь и вводите текст.

Большое спасибо

инок
15.09.2013, 14:45
Александр. Все получилось. Наверное есть смысл поместить этот приложение в примеры программ и полезностей.

Александр Приходько
16.09.2013, 15:17
Александр. Все получилось. Наверное есть смысл поместить этот приложение в примеры программ и полезностей.

Ура! )
Инок, если не секрет, так в чем же была загвоздка? Если есть, проблема, которую я не отразил в своем руководстве, давайте ее туда внесем?

инок
17.09.2013, 21:17
Ура! )
Инок, если не секрет, так в чем же была загвоздка? Если есть, проблема, которую я не отразил в своем руководстве, давайте ее туда внесем?


Загвоздка по моему в версиях МодбасСлейва в примере который прислали Вы 3.4.0.0 и там тип регистрам канала присваивается тип WORD, я до инструкции я делал в версии 3.5.2.0 там тип регистрам канала когда длина больше 1 (2 и более регистра), то автоматически присваивается тип массива. И пока я не соотношу с переменными массива выдают значения правильно, а как соотнесу то в обоих переменных появляется значение первого регистра. Я не знаю почему, это у вас надо спросить. Это видно на скринах которые я capsarу отсылал.
Скажите пожалуйста как в СПК пользоваться часами реального времени, могу ли я взять из КДС2.3 пример работы со временем? Что изменилось в библиотеке SysLibTime и если не изменилось какую версию использовать?

Александр Приходько
18.09.2013, 15:13
Загвоздка по моему в версиях МодбасСлейва в примере который прислали Вы 3.4.0.0 и там тип регистрам канала присваивается тип WORD, я до инструкции я делал в версии 3.5.2.0 там тип регистрам канала когда длина больше 1 (2 и более регистра), то автоматически присваивается тип массива. И пока я не соотношу с переменными массива выдают значения правильно, а как соотнесу то в обоих переменных появляется значение первого регистра. Я не знаю почему, это у вас надо спросить. Это видно на скринах которые я capsarу отсылал.
Скажите пожалуйста как в СПК пользоваться часами реального времени, могу ли я взять из КДС2.3 пример работы со временем? Что изменилось в библиотеке SysLibTime и если не изменилось какую версию использовать?

Готовые примеры выложил тут:
http://www.owen.ru/forum/showthread.php?t=15530&p=115706&viewfull=1#post115706

инок
18.09.2013, 18:16
Готовые примеры выложил тут:
http://www.owen.ru/forum/showthread.php?t=15530&p=115706&viewfull=1#post115706

Большое спасибо

Александр Приходько
19.09.2013, 22:22
Большое спасибо
Пример понятен? Разобрались?

инок
27.09.2013, 21:24
Пример понятен? Разобрались?
Александр. Программу переделал на СПК вроде все работает, осталось только время добавить, мне его не обязательно вводить с экрана. Дело в том, что по определенному числу устройство на котором работает моя программа перестает работать, и без введения определенного не известного пользователю устройство не начинает работать. В КДС2.3 я вводил время и дату через PLC браузер, на панели время просто выводилось.
Я попробовал ту программу ссылку на которую Вы дали, что-то не получается и не понятно ни чего.

Александр Приходько
30.09.2013, 14:09
Александр. Программу переделал на СПК вроде все работает, осталось только время добавить, мне его не обязательно вводить с экрана. Дело в том, что по определенному числу устройство на котором работает моя программа перестает работать, и без введения определенного не известного пользователю устройство не начинает работать. В КДС2.3 я вводил время и дату через PLC браузер, на панели время просто выводилось.
Я попробовал ту программу ссылку на которую Вы дали, что-то не получается и не понятно ни чего.

А что собственно не понятно?

Если Вам не надо вводить время, не вводите его, просто не используйте лишние поля.
Там есть выходы, где дата и время просто выводятся, их и используйте.

Makc
12.12.2013, 12:40
подскажите а как порядок байт типа real поменять в версии CoDeSys 2.3?

Makc
13.12.2013, 04:20
HELP!!! :)

capzap
13.12.2013, 06:58
Пробовали в проекте создать переменные с четырьмя возможными комбинациями последовательности байт и выяснить какая пправильная?

Makc
13.12.2013, 07:37
Пробовали в проекте создать переменные с четырьмя возможными комбинациями последовательности байт и выяснить какая пправильная?

11034
вот что я получаю опрашивая терминал. подскажите как это можно перевести в байты , после чего эти байты собрать в другом порядке в real... буду очень благодарен за помощь :)

capzap
13.12.2013, 07:41
Указатель на реал даст первый байт, указатель плюс один даст второй и т.д.
Создайте массив из четырех байт, заполните его через вышеописаные указатели и играйтесь комбинациями
В примерах на диске это должно быть показано

capzap
13.12.2013, 07:44
Второй вариант, должны понять что в этом плане вторая и третья версия ни чем не отличаются, в конфигурации держите не реал а два ворда вместо него, а дальше как здесь показано, если без ооп

Makc
13.12.2013, 07:44
а как получить из массива байт собрать real?

capzap
13.12.2013, 08:06
Так же через указатель на реал

Makc
13.12.2013, 09:48
может есть у кого нибудь пример на CDS2.3 в котором полученное число типа real переделываетсья в другое число типа real с другим порядком байт?

Makc
13.12.2013, 11:48
скажите хотябы как обратиться указателем pt:POINTER TO BYTE; ко второму байту переменной?

capzap
13.12.2013, 12:04
Pt:=pt+1 я же написал

Александр Приходько
21.12.2013, 00:30
Я был в гостях у компании 3S в германии. Рассказал им, что многие наши пользователи имеют проблемы со сбором переменных Real из пары переменных Word.
Даже рассказал, что они имеют несколько разновидностей передачи и т.п.

В общем компания 3S сейчас думает как лучше реализовать карту Modbus в нужные типы данных.
Как только появятся данные я обязательно сообщу в данной ветке. И сообщу в какой версии CODESYS появится данная реализация.

Medyv
23.02.2014, 11:12
Здравствуйте. Столкнулся с той же проблемой конвертации 2-х WORD в REAL при работе с МВ110-2А в CodeSys 3.5. Нашел простенькое решение: В адресах регистров МВ110-2А есть отдельно адрес регистра целой части (мантиссы) и регистра положения десятичной точки. Организовал вывод температуры так:

temp1:=WORD_TO_REAL(Mant1)/EXPT(10,WORD_TO_REAL(DP1));
temp2:=WORD_TO_REAL(Mant2)/EXPT(10,WORD_TO_REAL(DP2));

12050
12051

maix
29.11.2015, 14:34
Искал решение для DELPHI, в интернете особо не нашел, но помогли примеры выше,оказалось все просто. Возможно кому нибудь поможет:


var
a,b:Word; //Исходные данные, 2 ячейки по 2 байта
c:Single; //Результирующая ячейка, действительное число 4 байта
d:^Cardinal; //Указатель на целочисленную 4х байтовую переменную
begin
a:=64; //Для примера
b:=16440;

d:=@c; // Присваиваем целочисленной 4х байтовой переменной тот же адрес что и действительной

d^:=MakeLong(a,b); // Объединяем 2 слова в одно 4х байтовое

Caption:=FloatToStr(c); // Получаем результат 2.875015259
end