Codesys преобразовать word в real

  1. Обязательно представиться на русском языке кириллицей (заполнить поле «Имя»).
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему — вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома — бан без предупреждения.
  5. Рекламу и частные объявления «куплю/продам/есть халтура» мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать — читать здесь и здесь.

RoninX

здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 08 авг 2018, 21:27
Имя: Павел
Страна: Россия
город/регион: Москва
Благодарил (а): 3 раза

Склеить два Word и получить Real

Сообщение

RoninX » 08 авг 2018, 21:46

Здравствуйте!

Измеритель выдает значение влажности в формате Real IEEE754 двумя Word. Связь с измерителем по интерфейсу RS485 Modbus RTU. Контроллер S7-1200. Как в TIA portal преобразовать эти два регистра WORD в REAL? (CD AB). На контроллерах Овен задача решается путем создания типа FLoat в списке регистров Модбас и контроллер сам преобразовывает два регистра в Реал. Как данная задача решается в tia portal v4.2?

pkl58

не первый раз у нас
не первый раз у нас
Сообщения: 347
Зарегистрирован: 19 мар 2012, 20:04
Имя: Павел
Страна: Россия
Благодарил (а): 5 раз
Поблагодарили: 43 раза

Склеить два Word и получить Real

Сообщение

pkl58 » 09 авг 2018, 12:41

Как у Сименса не знаю. Но в общем случае есть команды преобразования целых чисел в вещественные. Возможно потребуется поменять местами исходные WORD.

NewOrdered

осмотрелся
осмотрелся
Сообщения: 153
Зарегистрирован: 24 янв 2018, 11:18
Имя: Антон
Страна: Россия
город/регион: Калининград
Благодарил (а): 25 раз
Поблагодарили: 25 раз

Склеить два Word и получить Real

Сообщение

NewOrdered » 09 авг 2018, 13:49

RoninX писал(а): ↑08 авг 2018, 21:46
Здравствуйте!

Измеритель выдает значение влажности в формате Real IEEE754 двумя Word. Связь с измерителем по интерфейсу RS485 Modbus RTU. Контроллер S7-1200. Как в TIA portal преобразовать эти два регистра WORD в REAL? (CD AB). На контроллерах Овен задача решается путем создания типа FLoat в списке регистров Модбас и контроллер сам преобразовывает два регистра в Реал. Как данная задача решается в tia portal v4.2?

Определите область памяти длиной 4 байта как REAL. В первые два байта загрузите 1 слово, во вторые — второе слово. Далее работайте с вашим значением в формате REAL.

RoninX

здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 08 авг 2018, 21:27
Имя: Павел
Страна: Россия
город/регион: Москва
Благодарил (а): 3 раза

Склеить два Word и получить Real

Сообщение

RoninX » 14 авг 2018, 10:30

NewOrdered писал(а): ↑09 авг 2018, 13:49
Определите область памяти длиной 4 байта как REAL. В первые два байта загрузите 1 слово, во вторые — второе слово. Далее работайте с вашим значением в формате REAL.

Добрый день! Получилось, спасибо!

djonm

новенький
новенький
Сообщения: 1
Зарегистрирован: 07 фев 2018, 15:04
Имя: Евгений
город/регион: Ростов

Склеить два Word и получить Real

Сообщение

djonm » 22 авг 2018, 13:53

RoninX писал(а): ↑14 авг 2018, 10:30
Добрый день! Получилось, спасибо!

У меня похожая задача и что то не фига не получается. По modbus читаю значение измеренного напряжения float32 (real). MB_Master читает в переменную REAL, но значение получаются совсем левые. Может надо читать Word- дами а потом переставлять биты и конвертировать в REAL?

Аватара пользователя

petr2off

эксперт
эксперт
Сообщения: 1355
Зарегистрирован: 06 янв 2016, 19:45
Имя: Петров В.Л.
Страна: Россия
город/регион: Красноярск
Благодарил (а): 56 раз
Поблагодарили: 138 раз

Склеить два Word и получить Real

Сообщение

petr2off » 22 авг 2018, 16:33

Какая разница как читать, Вы уже считали 4 байта. К этой области памяти можно обратится как 4-х байтовому полю, как к 2 16-ти битовым словам и как к 4 байтовым адресам. А еще добавляя точку можно и к битам обратится. Как вариант поменяйте слова местами. Очень часто при чтении Modbas 16 разрядные слова не в том порядке принимаются.

RoninX

здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 08 авг 2018, 21:27
Имя: Павел
Страна: Россия
город/регион: Москва
Благодарил (а): 3 раза

Склеить два Word и получить Real

Сообщение

RoninX » 24 дек 2018, 14:44

[/quote] У меня похожая задача и что то не фига не получается. По modbus читаю значение измеренного напряжения float32 (real). MB_Master читает в переменную REAL, но значение получаются совсем левые. Может надо читать Word- дами а потом переставлять биты и конвертировать в REAL?
[/quote]

Попробуйте применить функцию SWAP

Serg_G

здесь недавно
здесь недавно
Сообщения: 59
Зарегистрирован: 04 авг 2018, 07:02
Имя: Сергей
Благодарил (а): 8 раз
Поблагодарили: 2 раза

Склеить два Word и получить Real

Сообщение

Serg_G » 21 янв 2019, 18:45

Попробуйте так. В классике это работало. Только надо правильно выбрать байты из слова.

У вас нет необходимых прав для просмотра вложений в этом сообщении.

Вернуться в «Simatic TIA Portal»


Перейти

  • Работа форума
  • База знаний (Knowledge Exchange)
  • ↳   Eplan Electric P8
  • ↳   Общий F.A.Q.
  • ↳   Общие вопросы
  • ↳   Новости
  • ↳   Ошибки
  • ↳   Проект
  • ↳   Изделия
  • ↳   Устройства
  • ↳   Соединения
  • ↳   Кабели
  • ↳   Клеммы
  • ↳   ПЛК
  • ↳   Компоновка 2D
  • ↳   Макросы
  • ↳   Eplan API
  • ↳   Сценарии (Только готовые решения)
  • ↳   Внешняя обработка
  • ↳   ProPanel
  • ↳   Инструкции ProPanel (Только готовые решения)
  • ↳   Прочие направления Eplan
  • ↳   FieldSys (Топология)
  • ↳   Preplanning
  • ↳   Harness proD
  • ↳   EEC One
  • ↳   Advantech
  • ↳   F.A.Q., Инструкции
  • ↳   Allen Bradley
  • ↳   Общие вопросы
  • ↳   ПЛК
  • ↳   Операторские панели
  • ↳   B&R Automation
  • ↳   F.A.Q.
  • ↳   Danfoss
  • ↳   DEIF A/S
  • ↳   Общие вопросы
  • ↳   UNI-LINE
  • ↳   MULTI-LINE
  • ↳   MULTI-LINE 300
  • ↳   Emerson
  • ↳   Общие вопросы
  • ↳   КИП и регуляторы
  • ↳   DeltaV
  • ↳   ОВЕН
  • ↳   Прософт-Системы
  • ↳   Общие вопросы
  • ↳   ПЛК REGUL
  • ↳   Schneider Electric
  • ↳   Общие вопросы
  • ↳   ПЛК
  • ↳   Панели оператора
  • ↳   SCADA
  • ↳   Электротехника
  • ↳   Приводная техника
  • ↳   SIEMENS
  • ↳   Общие вопросы
  • ↳   LOGO!
  • ↳   ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
  • ↳   Simatic Step7
  • ↳   Simatic TIA Portal
  • ↳   Simatic PCS 7
  • ↳   Операторские панели
  • ↳   WinCC
  • ↳   Приводная техника (Sinamics, Micromaster, Masterdrive, Simoreg, Simotics)
  • ↳   SmartGen
  • ↳   Общие вопросы
  • ↳   Промышленные (береговые) контроллеры
  • ↳   Морские контроллеры и устройства
  • ↳   WEINTEK (операторские панели)
  • ↳   F.A.Q., Инструкции
  • ↳   Архив
  • ↳   Микроконтроллеры и электроника
  • ↳   Arduino
  • ↳   Raspberry
  • ↳   Другие микроконтроллеры
  • ↳   Электроника
  • Общие вопросы АСУТП
  • ↳   Общие вопросы
  • ↳   Вопросы от студентов
  • ↳   Литература
  • ↳   Новости и отчётность
  • ↳   Нормативы, ГОСТы, стандарты
  • ↳   Информационная безопасность
  • ↳   Проектирование и САПР
  • ↳   Системная интеграция
  • ↳   Разбор полетов
  • ↳   Работа
  • ↳   Заготовки для базы знаний
  • ↳   Производство и технология
  • ↳   MES — Системы автоматизации управления производством
  • ↳   Метрология, КИП и датчики
  • ↳   Исполнительные устройства, регуляторы
  • ↳   Средний уровень автоматизации (управляющий)
  • ↳   Алгоритмы
  • ↳   Операторские панели
  • ↳   Верхний уровень автоматизации (отображение)
  • ↳   GE iFix
  • ↳   Wonderware Intouch
  • ↳   MasterScada
  • ↳   SCADA+
  • ↳   Альфа платформа
  • ↳   Интерфейсы, протоколы, связь
  • ↳   Радиосвязь
  • ↳   Полезное ПО
  • ↳   Электротехника, энергетика и электропривод
  • ↳   Генераторы, электростанции и силовые агрегаты
  • ↳   Теплотехника
  • ↳   Подбор аналогов
  • F.A.Q. (краткая выжимка из некоторых сообщений форума)
  • ↳   Документация (вариант 1)
  • ↳   Документация (вариант 2)
  • ↳   Электротехника и электроэнергетика
  • ↳   F.A.Q. по программируемым логическим контроллерам (PLC)
  • ↳   Обсуждение F.A.Q. по PLC
  • ↳   F.A.Q. по выбору PLC
  • ↳   F.A.Q. по аппаратной части PLC
  • ↳   F.A.Q. по языкам программирования
  • ↳   F.A.Q. по структуре программ
  • ↳   F.A.Q. по взаимодействию PLC с HMI
  • О жизни
  • ↳   Для дома, для семьи
  • ↳   Комната смеха
  • ↳   Электродвижение

  • В этой теме 8 ответа, 3 участника, последнее обновление 1 год, 4 месяцев назад da Серхио Бертана.

Просмотр 9 сообщений — с 1 по 9 (из 9 всего)

  • автор

    После

  • Октябрь 9, 2020 в 2: 29 вечера
    #57875

    Мне нужно преобразовать DWORD в REAL. При использовании функции TO_REAL получается неправильное число. Вместо этого я получаю правильное значение с помощью конвертера, который можно найти по следующей ссылке https://www.h-schmidt.net/FloatConverter/IEEE754.html.

    Как я могу решить проблему?
    Есть ли функциональный блок, который выполняет тот же тип преобразования, что и упомянутый выше преобразователь?

    Октябрь 9, 2020 в 2: 30 вечера
    #57878

    Оператор TO_REAL правильный, вы, вероятно, ошибаетесь в том, что видите, вот оно Скриншот пример конвертации.

    Как видите, я загрузил значение 12345678 в DWORD и определил то же значение в поле Вы вошли веб-утилиты. В результате преобразования у меня будет переменная REAL RVAR имеет значение 12345678.0, но если я использую указатель типа DWORD, я показываю шестнадцатеричное значение, я получаю 16 # 4B3C614E, которое является тем же значением, которое отображается в поле Шестнадцатеричное представление.

    Я использовал указатель только для того, чтобы одновременно видеть как РЕАЛЬНОЕ, так и его шестнадцатеричное значение, но вы также можете перейти в окно просмотра и выбрать переменную и щелкнуть правой кнопкой мыши на Формат и формат Шестнадцатеричный, чтобы увидеть то же самое.

    Добавлю, что если нужно больше разрешения из версии XЕдиный Из систем мы ввели как целые, так и плавающие 64-битные числа.

    Октябрь 16, 2020 в 8: 07 утра
    #57939

    Я объясню проблему лучше: у меня есть датчик расхода Hart, который передает значение сумматора на ведущее устройство Hart — преобразователь ведомого устройства Modbus, который, в свою очередь, передает данные в ПЛК через RS485. Elsist. Как видно изкартина «variable_1» типа DWORD передается мне преобразователем Hart master-Modbus slave и исходит от расходомера.

    На дисплее счетчика отображается значение 121240.5546, соответствующее шестнадцатеричному значению 16 # 47ECCC47, полученному с помощью упомянутого преобразователя. Как мне получить РЕАЛЬНОЕ значение на ПЛК?

    Если я использую функцию Block TO_REAL для преобразования DW, я получаю РЕАЛЬНОЕ число, которое не является правильным.

    Октябрь 16, 2020 в 8: 14 утра
    #57945

    Значение, считываемое FB ModbusMaster, уже является РЕАЛЬНЫМ значением, поэтому вам не нужно преобразовывать его с помощью оператора TO_REAL, а просто определять переменную. variabile_1 РЕАЛЬНЫЙ тип.

    Поскольку Modbus не определяет порядок следования данных, возвращаемых в нескольких словах, может случиться так, что при получении переменных, выраженных в двух словах (UDINT, DWORD, REAL), вы получите инвертированные MSW и LSW (но мне кажется, что это не так). Если они поменяны местами, вы можете использовать функцию VarSwap исправить их.

    Операторы приведения TO_REAL, TO_INT и т. Д. Не выполняют операций; они служат только для информирования компилятора о том, что программа выполняет передачу значения из переменной одного типа в переменную другого типа.

    Ноябрь 15, 2021 на 4: 25 вечера
    #62115

    Я сталкиваюсь с незнанием Modbus. Мне нужно прочитать из ЦП некоторые значения в Modbus: значение в регистре номер 6, длина 2 слова, 32-битное целое число (это температура, следовательно, 32-битное целое число со знаком).

    Я установил адрес ModbusMaster на 6, указывает на 2. Предположим, что прочитано значение 380. Если я передаю массив Word в качестве буфера, я обнаруживаю, что буфер [0] = 0000 и буфер [1] = 017C .

    Если я передаю DWORD в качестве буфера, я обнаруживаю, что буфер = 017C0000, то есть два СЛОВА обмениваются. Это правильно?

    Чтобы перейти от двух СЛОВ массива первого случая к целочисленному значению, правильно ли умножить buffer [0] на 16 # FFFF и добавить buffer [1]? Есть ли более быстрый способ, функция, которая делает это автоматически?

    Ноябрь 15, 2021 на 4: 43 вечера
    #62122

    Это проблема порядка байтов, о которой я говорил ранее, в Modbus не указано, как управлять передачей переменных длиной более 16 бит, поэтому обычно это зависит от порядка байтов устройства.

    В вашем случае устройство, с которого вы читаете, имеет порядок байтов, отличный от SlimLine.

    Чтобы вычислить правильное значение, выраженное в переменной DINT, вы можете поступить так же, как и вы, но я предлагаю вам использовать функцию VarSwap, передавая адрес буфера Modbus в качестве источника и адрес переменной DINT в качестве пункта назначения. Таким образом, также гарантируется управление отрицательными значениями.

    i:=VarSwap(DINT_TYPE, ADR(Temperature), ADR(buffer[0]));

    Ноябрь 17, 2021 на 12: 03 вечера
    #62123

    Спасибо за ответ. А пока я немного поэкспериментировал со строками, РЕАЛЬНЫМИ значениями и так далее.
    Производитель устройства написал все в руководстве, кроме endiannes: я написал в службу поддержки, надеясь, что они ответят.

    Ноябрь 26, 2021 на 4: 42 вечера
    #62362

    Я не могу понять тривиальной вещи: у меня есть два массива WORD, 32-битное представление РЕАЛЬНОГО значения, с плавающей запятой.

    Array1[0]:=51EB, Array1[1]:=417C

    Поэтому, если я приобретаю через Modbus из системы, которая использует прямой порядок байтов (например, lo SlimLine) предоставляя адрес РЕАЛЬНОЙ переменной в качестве буфера, я получаю правильное значение.

    Если, с другой стороны, я получаю через Modbus из системы, которая использует обратный порядок байтов, я должен использовать функцию VarSwap, это правильно?

    Ноябрь 26, 2021 на 4: 43 вечера
    #62367

    Правильно, вот простой пример в LogicLab, который иллюстрирует проблему.

    VAR
        i : UDINT; (* Auxiliary variable *)
        DArray : ARRAY[0..1] OF WORD;
        RVar : REAL; (* REAL variable *)
    END_VAR
    
        // Esempio in little endian.
    
        DArray[0]:=16#51EB;
        DArray[1]:=16#417C;
        i:=Sysmemmove(ADR(RVar), ADR(DArray[0]), 4);
    
        // Esempio in big endian.
    
        DArray[0]:=16#417C;
        DArray[1]:=16#51EB;
        i:=VarSwap(WORD_TYPE, ADR(DArray[0]), ADR(RVar));

    Как вы можете видеть в случае с прямым порядком байтов, я только скопировал значение, но я также мог записать его напрямую через Modbus в переменные RVar. В то время как в случае с прямым порядком байтов мне пришлось использовать функцию VarSwap.

  • автор

    После

Просмотр 9 сообщений — с 1 по 9 (из 9 всего)

  • Вы должны войти в систему, чтобы ответить на эту тему.

I have been writing a program which reads values of reactive power from power analysed over Modbus RTU.

Reactive power is represented by 32 bits while the MSb determine the sign. Program doesn’t read the whole 32 bits instead of it reads two 16 bits words.

After reading 32 bits I need to convert the value into REAL
data type. So I wrote following conversion code in Structured text:

rQs: REAL := 0.0;
rQs := DINT_TO_REAL(DWORD_TO_DINT((SHL(WORD_TO_DWORD(stLovato_power.iQ_HW),16) + WORD_TO_DWORD(stLovato_power.iQ_LW))))/100.0;

(structure stLovato_power contains in its items 16 bits words, which forms 32 bits representation of reactive power).

It seems that reading is OK but something in the conversion is wrong. I still get 0 despite the values in iQ_HW and iQ_LW are nonzero. Can somebody tell me

Where I have done a mistake?

Thanks.

Мои исследования, если кому интересно будет:
— структура из разнородных массивов, т.е. структура в которую входит массив из 10 word-ов, за ним еще массив из 10 word-ов, за ним еще массив уже из 10 DWord-oв функция MB_SERVER не смогла переварить (хотя компилирование и загрузка успешны), по-крайней мере со стороны клиента выдается сообщение, что не может открыть сессию. Может это и у нас такой modbus TCP клиент.
— serialize/deserialize: функции хорошие. Но ситуация следующая, чтобы сделать то что я хочу, а это из массива на 1024 слова выдернуть нужные слова (учитывая, что 2 слова — это одно real значение) и переконвертировать в real-значения. Сделал функцию в которой берется массив из 12 слов (6 real значений), пропускается через функцию serialize, получается фарш из 24 байт, потом пропускаю эти 24 байта через функцию deserialize и записываю в массив из 6 real (можно в массив из 6 dword, если кому надо, а потом пропускать через CONV). Какие недостатки такой реализации в моем случае, поскольку real значения в буфере хранятся, неправильным для меня образом, два последовательных слова надо менять местами, чтобы получилось правильное real значение, приходится делать предварительную обработку. Кроме этого надо из основного буфера на 1024 слова выдергивать необходимые слова в промежуточный буфер, который подается на serialize. В общем, по итогу, сделать можно, но муторно.
— написал небольшой скрипт на SCL
#temp_dword := #input_1;
#temp_dword := SHL(IN := #temp_dword, N := 16);
#temp_dword := #temp_dword OR #input_2;
#output := DWORD_TO_REAL(#temp_dword);
Т.е. беру два слова, первое слово сдвигаю на 16 бит, делаю логическое или между двумя словами, соответственно получается на выходе DWORD в котором упакованы два слова, затем преобразовываем двойное слово в real значение.

Все это поскольку, скада самописная.

P.S. если честно, извиняюсь и понимаю что на форуме это не принято, но «заипа..и эти самописные скады», потом занимаешься каким-то… :)

Понравилась статья? Поделить с друзьями:
  • Codesys word to array
  • Codes in word document
  • Codes for special characters in word
  • Codes for microsoft word
  • Codes for microsoft excel