This is topic Преобразование данных in forum Языки программирования в TRACE MODE 6 / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.
Вопрос такой: Как преобразовать целочисленный аргумент (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 нам неизвестен. Помогла бы ли Вам простая перестановка байт на тот момент, мы не знали, поэтому и посоветовать не могли.