Просмотр полной версии : Получение значений float32
Доброго времени суток.
Нет ли для 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 реализован в виде тригера при добавлении канала. Если выбран тригерный способ, то в окне где происходит привязка переменных появится еще одна переменная, по срабатыванию которой будет писаться канал.
Александр. Большое спасибо. Инструкция нормальная, понятная.
Скажите принцип работы триггера Rising Edge такой же как BYTE у STATE? Мне надо по переднему фронту устанавливать в TRUE бит триггера и записывать значение, а после записи сбрасывать бит в FALSE?
Я читал все рассуждения по поводу получения 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), но и это зачем делать?
почему надо менять байты местами, потому что существует четыре комбинации
Александр Приходько
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 разных алгоритма сбора/разбора.
Извините Александр.
Вы бы не могли, если Вас это не затруднит описать как собирать во флоат словами, как у Вас построен алгоритм разбора флоат для передачи по Модбас. Понятно что 4 алгоритма разборки, какой применяете ВЫ.
http://www.owen.ru/forum/showthread.php?t=13584&p=93612&viewfull=1#post93612
Здесь не пробовали посмотреть?
http://www.owen.ru/forum/showthread.php?t=13584&p=93612&viewfull=1#post93612
Здесь не пробовали посмотреть?
Сейчас попробую
Вы меня постоянно уводите на CDS2.3 в нем у меня вообщем проблем не было. Там в конфигурировании были модули REAL input, output и я отсылал и принимал REAL когда угодно и куда угодно. В CDS3 разработчики не сделали таких модулей а отдали это на откуп пользователей. Даже в видео там просто выбирается алгоритм сбора в зависимости от алгоритма разбора.
А я устал уже повторять что модбас это стандартный протокол, он собирается и разбирается по одним и тем же законам, что во второй что в третьец версии
Александр Приходько
10.09.2013, 13:56
Извините Александр.
Вы бы не могли, если Вас это не затруднит описать как собирать во флоат словами, как у Вас построен алгоритм разбора флоат для передачи по Модбас. Понятно что 4 алгоритма разборки, какой применяете ВЫ.
Именно так, как в примере описано.
Хорошо. Если Вы так упрямо стоите на своем, то объясните почему в CDS2.3 я этого не делал.
Может быть у Вас это коммерческая тайна? Почему если в данной версии нет того же функционала, какой был в предыдущей Вы не напишите пользователям внятной инструкции. Вы поймите мы работу делаем и занимаемся разработками малую часть своей деятельности. У меня нет времени долго и нудно сидеть и разбираться в этом вопросе. За то время которое я убиваю не понятно на что, я бы уже написал программу по обработке флоатовского значения, а я тупо не могу нормально получить значения веса, который выдает Ваш же прибор, а не прибор стороннего производителя. Подумайте над моими словами, мы в конце концов Ваши партнеры.
Я Ваш пример в проект встроил, но значения REAL отличаются от значений которые у меня выдает прибор в программе на CDS2.3. Там у меня выдает -9.8....... а здесь.... высылаю скриншот.
А код без онлайн можно увидеть, а то как то не вяжеться мысль что Вы тосуете байты местами, если одни и теже значения три раза повторяются и указатель из указателя это вообще круто, в каком примере это описано?
Этот пример программы мне прислал СуперМодератор в первом ответе можете оригинал посмотреть.
Я не супер программист, но я тоже немного засомневался и попросил словами объяснить, может у меня лучше бы получилось. Просто нужно понять, что нужно сделать. Я из этого текста кода просто даже понять не могу ни чего и тем более внятно объяснить.
Александр Приходько
11.09.2013, 05:48
Я Ваш пример в проект встроил, но значения REAL отличаются от значений которые у меня выдает прибор в программе на CDS2.3. Там у меня выдает -9.8....... а здесь.... высылаю скриншот.
А байты сами пробовали перетосовать?
Этот код я использовал при опросе значений с МВ110-8А.
Если получится, попробую сегодня проверить на 4ТД.
я тоже немного засомневался и попросил словами объяснить
Ссылка на ссылку это как бы нормальное дело, но в плк это делать лучше имея большой опыт, меня удивило что так предлагают в примерах для новичков, считаю что надо показывать каждый шаг в таких делах, вот этоо реал, вот это указатель на реал, вот это массив из четырех байт, вот указатель ложим в ячейку массива, вот дедаем смещегие указателя, снова ложим и т.д.
Тогда новичку было бы ронятно
Извините Александр.
Вы бы не могли, если Вас это не затруднит описать как собирать во флоат словами, как у Вас построен алгоритм разбора флоат для передачи по Модбас. Понятно что 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, может будет понятно в каком порядке нужно будет переставлять байты (какой из четырех алгоритмов использовать)
Вот за это огромное спасибо. Я долго просил разработчиков такую информацию.
Вот за это огромное спасибо. Я долго просил разработчиков такую информацию.
вот тут я вообще недоумеваю, а на видео у меня тогда что? Из выпадающего списка выбирал очередность байт, показывал как они расположены в двойном слове, как меняется сам Реал (флоат)
:) луч ненависти в сторону petera, за то что встрял, я уже виртуалку с КДС3 открыл хотел проект для примера создать, а тут уже все вдруг стало понятно :)
У меня "терпелка" кончилась, глядя как человек мучается из-за непонимания формата Float
Канал3 считывает в два регистра переменную float32, уже получены значения каждого из 2 регистров теперь я должен соотнести 2 переменные типа WORD к какими либо двумя вордовскими переменными и в конечном итоге получить переменную типа Итого:REAL=WordToReal(Канал3.1:WORD)*WordToReal(Ка нал3.2:WORD) или я чего-то не понимаю.
добавляю видео и проект, раз уж проговорился что решил помочь :)
ЫЗ Забыл добавить, в проекте есть функция перевертывания байт в ворде и вместо записей вроде ptWord^ :=arr[iter]; нужно писать ptWord^ :=SWAPB(arr[iter]); , ну и оставишиеся две комбинации тоже самое только дабавлять элементы массива сперва четные потом нечетные
ЗЫ в догонку еще видео
добавляю видео и проект, раз уж проговорился что решил помочь :)
ЫЗ Забыл добавить, в проекте есть функция перевертывания байт в ворде и вместо записей вроде ptWord^ :=arr[iter]; нужно писать ptWord^ :=SWAPB(arr[iter]); , ну и оставишиеся две комбинации тоже самое только дабавлять элементы массива сперва четные потом нечетные
ЗЫ в догонку еще видео
Скажите а где тексты кода которые на видео
один в проекте, а второй нажмите паузу второго видео и скопируйте, там четыре строчки повторяются четыре раза с разными вариациями.
ЗЫ за основу второго видео взят первый проект. из PLC_PRG удален старый код и вставлено то что на видео, остальное в проекте без изменений
один в проекте, а второй нажмите паузу второго видео и скопируйте, там четыре строчки повторяются четыре раза с разными вариациями.
ЗЫ за основу второго видео взят первый проект. из PLC_PRG удален старый код и вставлено то что на видео, остальное в проекте без изменений
Просто я когда открыл проект там были только GVL и девайсы а с моего проигрывателя я не могу скопировать. Еще откуда у Вас берется DataMonitor где вы ловко выбираете последовательности и у меня когда я соотношу переменные тип у меня не меняется на массив, а так и остается WORD
Просто я когда открыл проект там были только GVL и девайсы а с моего проигрывателя я не могу скопировать. Еще откуда у Вас берется DataMonitor где вы ловко выбираете последовательности и у меня когда я соотношу переменные тип у меня не меняется на массив, а так и остается WORD
это не я такой ловкий, а прога которая делает скан экрана увеличивает скорость, под копированием я имел ввиду ручками набрать текст который виден на видео, GVL и девайсы действительно расположены на вкладке устройства, а ПОУ я стараюсь создавать на вкладке ПОУ, DataMonitor это окно программы эмулятора слейва http://www.hmisys.com/downloads/PeakHMISlaveSimulatorInstall.exe, по поводу соотношения, массив из ПОУ надо соотносить с массивом конфигурации слейва, в нем смотрите колонку тип
Извините capzap у меня не соотносятся регистры к массивам правильно посмотрите скришот
10075
один в проекте, а второй нажмите паузу второго видео и скопируйте, там четыре строчки повторяются четыре раза с разными вариациями.
ЗЫ за основу второго видео взят первый проект. из PLC_PRG удален старый код и вставлено то что на видео, остальное в проекте без изменений
Соврал, изменения все же были, я в канале менял с 3-ей функции на 16-ую
Извините capzap у меня не соотносятся регистры к массивам правильно посмотрите скришот
не помойму, что не соотноситься, вроде всё верно получается, конкретнее в чем проблема?
Соврал, изменения все же были, я в канале менял с 3-ей функции на 16-ую
не помойму, что не соотноситься, вроде всё верно получается, конкретнее в чем проблема?
Я создаю в канале массив пока не соотношу с массивом переменных у меня в в разных словах разные цифры, как только соотношу с массивом переменных каждое слово в свой итый номер, то начинает отоброжатся значение первого из 2 регистров в обоих номерах массива это видно на скриншоте
Я создаю в канале массив пока не соотношу с массивом переменных у меня в в разных словах разные цифры, как только соотношу с массивом переменных каждое слово в свой итый номер, то начинает отоброжатся значение первого из 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, 14:30
Александр. Огромное спасибо за столь исчерпывающую информацию, я испытаю и отпишусь. Скажите как вы пишите много строк одновременно, вы показывали мне, я просто забыл.
Очень просто. Ставите курсор в нужную позицию. Нажимаете кнопку ALT , нажимаете ПКМ(правая кнопка мыши) и не отпуская ее выделяете редактируюмую область. После выделения области отпускаете мышь и вводите текст.
Очень просто. Ставите курсор в нужную позицию. Нажимаете кнопку ALT , нажимаете ПКМ(правая кнопка мыши) и не отпуская ее выделяете редактируюмую область. После выделения области отпускаете мышь и вводите текст.
Большое спасибо
Александр. Все получилось. Наверное есть смысл поместить этот приложение в примеры программ и полезностей.
Александр Приходько
16.09.2013, 15: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
Готовые примеры выложил тут:
http://www.owen.ru/forum/showthread.php?t=15530&p=115706&viewfull=1#post115706
Большое спасибо
Александр Приходько
19.09.2013, 22:22
Большое спасибо
Пример понятен? Разобрались?
Пример понятен? Разобрались?
Александр. Программу переделал на СПК вроде все работает, осталось только время добавить, мне его не обязательно вводить с экрана. Дело в том, что по определенному числу устройство на котором работает моя программа перестает работать, и без введения определенного не известного пользователю устройство не начинает работать. В КДС2.3 я вводил время и дату через PLC браузер, на панели время просто выводилось.
Я попробовал ту программу ссылку на которую Вы дали, что-то не получается и не понятно ни чего.
Александр Приходько
30.09.2013, 14:09
Александр. Программу переделал на СПК вроде все работает, осталось только время добавить, мне его не обязательно вводить с экрана. Дело в том, что по определенному числу устройство на котором работает моя программа перестает работать, и без введения определенного не известного пользователю устройство не начинает работать. В КДС2.3 я вводил время и дату через PLC браузер, на панели время просто выводилось.
Я попробовал ту программу ссылку на которую Вы дали, что-то не получается и не понятно ни чего.
А что собственно не понятно?
Если Вам не надо вводить время, не вводите его, просто не используйте лишние поля.
Там есть выходы, где дата и время просто выводятся, их и используйте.
подскажите а как порядок байт типа real поменять в версии CoDeSys 2.3?
Пробовали в проекте создать переменные с четырьмя возможными комбинациями последовательности байт и выяснить какая пправильная?
Пробовали в проекте создать переменные с четырьмя возможными комбинациями последовательности байт и выяснить какая пправильная?
11034
вот что я получаю опрашивая терминал. подскажите как это можно перевести в байты , после чего эти байты собрать в другом порядке в real... буду очень благодарен за помощь :)
Указатель на реал даст первый байт, указатель плюс один даст второй и т.д.
Создайте массив из четырех байт, заполните его через вышеописаные указатели и играйтесь комбинациями
В примерах на диске это должно быть показано
Второй вариант, должны понять что в этом плане вторая и третья версия ни чем не отличаются, в конфигурации держите не реал а два ворда вместо него, а дальше как здесь показано, если без ооп
а как получить из массива байт собрать real?
Так же через указатель на реал
может есть у кого нибудь пример на CDS2.3 в котором полученное число типа real переделываетсья в другое число типа real с другим порядком байт?
скажите хотябы как обратиться указателем pt:POINTER TO BYTE; ко второму байту переменной?
Александр Приходько
21.12.2013, 00:30
Я был в гостях у компании 3S в германии. Рассказал им, что многие наши пользователи имеют проблемы со сбором переменных Real из пары переменных Word.
Даже рассказал, что они имеют несколько разновидностей передачи и т.п.
В общем компания 3S сейчас думает как лучше реализовать карту Modbus в нужные типы данных.
Как только появятся данные я обязательно сообщу в данной ветке. И сообщу в какой версии CODESYS появится данная реализация.
Здравствуйте. Столкнулся с той же проблемой конвертации 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
Искал решение для 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
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot