This is topic Преобразование данных in forum Языки программирования в TRACE MODE 6 / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/33/t/000043.html

Posted by AlKon (Участник № / Member № 1919) on :
 
Вопрос такой:
Как преобразовать целочисленный аргумент (DINT) в 16-форму представления и показать на экране в 16-системе счисления?
Задача у меня такая:
есть два/три аргумента типа (DINT) - необходимо сцепить их и получить строку в виде номера сот.телефона: "E7910..." а потом "E" заменить на "+"?
Каким образом можно это сделать, используя язык ST?
 
Posted by AlKon (Участник № / Member № 1919) on :
 
Вопрос решен, но только почему в программе при обмене с внутренними функциями передаются строки только из 4 символов?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Свяжите строковые аргументы с текстовыми атрибутами каналов, например, КОММЕНТАРИЯМИ.
Тогда Вы сможете манипулировать строковыми переменными длиной до 40 символов.
 
Posted by AlKon (Участник № / Member № 1919) on :
 
Сообщите пожалуйста в чем дело:
Системная переменная @Set_Date возвращает дату и время в секундах с 00:00:00, 01.01.1970 ?
У меня получается, что кол-во секунд смещено на три часа, т.е. на три часа меньше?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Потому что эта переменная показывает абсолютное безсезонное время по Гринвичу, как и все переменные времени в Trace Mode.
При отображении таких переменных они "локализуются" в соответствии с системным временем места наблюдения.
 
Posted by AlKon (Участник № / Member № 1919) on :
 
Может быть подскажете как присвоить переменной типа "Data and Time" значение из переменных типа Int или Real?
т.е. есть переменные дата и время в числовом виде с котроллера, как их перевести в Trace Mode формат?
 
Posted by AlKon (Участник № / Member № 1919) on :
 
И еще:
В программе на ST наблюдается такое:
при делении:
переменных SINT на SINT сообщается, что деление на ноль???
переменных INT на INT результат неправильный???
переменных UINT на UINT результат правильный!!!

В чем особенность ???
переменные использовались простые (60 и 10; 60 и 30 и.т.п.).
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Особенность заключается в том, что операция деления производится только с числами с типом данных REAL (FLOAT).
 
Posted by Grigorovskih (Участник № / Member № 1915) on :
 
Здравствуйте Господа!

Расскажите мне вот, что:

Есть у меня 4-х байтовое число типа FLOAT в памяти в виде отдельных двухбайтовых слов, как мне собрав эти слова в двойное корректно воспроизвести это число в виде собственно самого FLOATа?
т.е. к примеру, есть число 45.56, в памяти это будет выглядеть так 16#42363d71. Есть функция выполненная в виде FBD блока (упаковка слов).
Я искусственно (для проверки) задаю в шестнадцатиричном виде для имеющихся у неё входных аргументов UINT(2шт.) значения 16#4236 и 16#3d71 соответственно, т.е. происходит упаковка слов 16#4236 и 16#3d71 в двойное четырёхбайтовое слово 16#42363d71- Аргумент LREAL (выход функции).
По скольку выход этого FBD блока связан с аргументом типа LREAL, значит как я понимаю должно произойти преобразование во FLOAT. Так вот в окне значений аргументов при отладке в шеснадцатиричном виде он показывает то что надо, а именно 16#42363d71, а вот Float он показывает не 45.56, а 1,11085*10^9. В чём ошибка?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
В Trace Mode встроено преобразование типов, поэтому большое целое число будет большим числом во Float. Реализовать Вашу задачу можно только арифметически. Т.е. выделить мантису, порядок и знак, и преобразовать с помощью программки во Float.

А для каких целей Вам это нужно?
 
Posted by Grigorovskih (Участник № / Member № 1915) on :
 
Просто есть контроллер I7188 с которого надо читать DWORD, который разбит на два двухбайтовых регистра, а ложит он туда число прямо из памяти но в виде FLOATa (там на С програмка написана, которая читает данные по нестандартному протоколу с другого устройства и врегистры MB TCP ложит), ну я и решил пойти легким путём, но увы...
Придётся сделать как Вы говорите, выделить все составляющие и собрать число так сказать "вручную".
 
Posted by Grigorovskih (Участник № / Member № 1915) on :
 
Поступили более изящно!
Написали внешнюю библиотеку которая преобразовывает представленное FLOAT число в обычный REAL.
 
Posted by Grigorovskih (Участник № / Member № 1915) on :
 
Уважаемая тех. поддержка!

Почему Вы не посоветовали мне воспользоваться функцией Rout_Float(3)? Там в текстовике необходимо только указать порядок следования байт и все!
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
У Вас было два регистра с WORD. Алгоритм необходимый для преобразования его во Float нам неизвестен. Помогла бы ли Вам простая перестановка байт на тот момент, мы не знали, поэтому и посоветовать не могли.
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2