Страница 4 из 9 ПерваяПервая ... 23456 ... ПоследняяПоследняя
Показано с 31 по 40 из 81

Тема: Функции String

  1. #31

    По умолчанию

    Цитата Сообщение от Vetal10 Посмотреть сообщение
    Ну нет в ST такого. Там есть VAR := ЛЮБОЕ_TO_OBJECT. Из области ANY. ЛЮБОЕ - это INT, REAL ... Какую переменную VAR задашь для результата - такое OBJECT тебе и сделает.
    Но OBJECT может быть только OBJECT_TO_STRING();
    Ещё один реальный вариант дал в 17 сообщении, только вы даже не смотрели его.

  2. #32
    Пользователь
    Регистрация
    22.05.2018
    Адрес
    Сочи, Лазаревское
    Сообщений
    91

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Можно из 4 байт собрать 2 WORD, а потом с помощью функции собрать REAL
    Код:
     W1:=(Byte1+shl(Byte2,8)); 
     W2:=(Byte3+shl(Byte4,8));
    Смотрел. На каком это языке? Что такое "shl" ? Как это применимо к ST ?

  3. #33

    По умолчанию

    Цитата Сообщение от Vetal10 Посмотреть сообщение
    Смотрел. На каком это языке? Что такое "shl" ? Как это применимо к ST ?
    Да вроде нормальный ST:
    a1.png

    И функция сдвига стандартная...

  4. #34
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,574

    По умолчанию

    Цитата Сообщение от Vetal10 Посмотреть сообщение
    Смотрел. На каком это языке? Что такое "shl" ? Как это применимо к ST ?
    прочтите документацию, например функции сдвига
    Вам вообще то предлагали код формирования вещественного числа, да это сложно, но простой вариант не получится
    Код:
    VAR
    	inpW0, inpW1 :DWORD;
    	stuff: ARRAY [0..3] OF BYTE := 234,89,6,61;
    
            k           : REAL;
            sign        : REAL;
            exponent    : REAL;
            mant_mult   : REAL;
            stuffAdd    : DWORD;
            exp_raw     : DWORD;
            mantissa    : DWORD;
            i           : INT;
            negative    : BOOL;
    
    	arrWToReal : REAL;
    END_VAR
    
    
    
    inpW1 :=SHL(BYTE_TO_WORD(stuff[3]),8) OR BYTE_TO_WORD(stuff[2]);
    inpW0 :=SHL(BYTE_TO_WORD(stuff[1]),8) OR BYTE_TO_WORD(stuff[0]);
    stuffAdd := SHL(inpW1, 16) +  inpW0;
    negative := SHR(stuffAdd, 31) > 0;
    mant_mult := 1.0;
    IF negative THEN
    	sign := -1.0;
    ELSE
    	sign := 1.0;
    END_IF;
    exp_raw := SHR((stuffAdd MOD 2147483648), 23);
    exponent := DWORD_TO_REAL(exp_raw) - 127;
    
    mantissa := stuffAdd MOD 8388608;
    FOR i := 0 TO 22 DO
    	IF (SHR(mantissa, (22 - i)) MOD 2) = 1 THEN
           	k := INT_TO_REAL(23 - (22 - i));
                	mant_mult := mant_mult + 1/(EXPT(2,k));
    	END_IF;
    END_FOR;
    
    arrWToReal := sign * (EXPT(2, exponent)) * mant_mult;
    примерно так должно получится требуемое число

    что касается этого утверждения
    Цитата Сообщение от Vetal10 Посмотреть сообщение
    Есть 4 байта вырванных из ответа прибора в виде STRING.
    У Вас же получалось с ComPortByte, который сразу возвращает массив байт, поэтому все и спрашивают зачем строки
    Последний раз редактировалось capzap; 08.08.2024 в 08:48.
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #35
    Пользователь
    Регистрация
    22.05.2018
    Адрес
    Сочи, Лазаревское
    Сообщений
    91

    По умолчанию

    Понятно. Как потом из двух WORD собрать REAL ?

  6. #36

    По умолчанию

    А чем ТС не устраивает объединение:

    aww.png

  7. #37
    Пользователь
    Регистрация
    22.05.2018
    Адрес
    Сочи, Лазаревское
    Сообщений
    91

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение

    У Вас же получалось с ComPortByte, который сразу возвращает массив байт, поэтому все и спрашивают зачем строки
    В ответном массиве куча байт, а мне нужно только 4. Поэтому вырезать их реально с помощью STRING. Есть другой способ? Подскажи.
    ФБ "ComPortByte" выдаёт массив. Его в STRING и обрезаю. Ещё не делал, но думаю получится. Можно из массива сразу убрать лишнее? Подскажи.

    Вот ответ
    11 57 35 85 01 0E EA 59 06 3D 01 00 B9 2D
    и в нём сидит цифра 0.0328006
    Т.е. EA 59 06 3D
    Последний раз редактировалось Vetal10; 08.08.2024 в 08:26.

  8. #38
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,574

    По умолчанию

    Цитата Сообщение от Vetal10 Посмотреть сообщение
    В ответном массиве куча байт, а мне нужно только 4. Поэтому вырезать их реально с помощью STRING. Есть другой способ? Подскажи.
    ФБ "ComPortByte" выдаёт массив. Его в STRING и обрезаю. Ещё не делал, но думаю получится. Можно из массива сразу убрать лишнее? Подскажи.

    Вот ответ
    11 57 35 85 01 0E EA 59 06 3D 01 00 B9 2D
    и в нём сидит цифра 0.0328006
    Т.е. EA 59 06 3D
    Вам сложно из массива использоовать с 6 по 9 элементы?
    owen.png
    Последний раз редактировалось capzap; 08.08.2024 в 08:46.
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  9. #39
    Пользователь
    Регистрация
    22.05.2018
    Адрес
    Сочи, Лазаревское
    Сообщений
    91

    По умолчанию

    Не сложно. Каждый из 4-х элементов массива присвоить переменной?
    Ну это уже детали. Сейчас опробую алгоритм, который Вы прислали.
    Головняк, конечно, ещё тот, с этими преобразованиями. Знал, что не будет легко, но чтоб так ...

  10. #40
    Пользователь
    Регистрация
    22.05.2018
    Адрес
    Сочи, Лазаревское
    Сообщений
    91

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    прочтите документацию, например функции сдвига
    Вам вообще то предлагали код формирования вещественного числа, да это сложно, но простой вариант не получится
    Код:
    VAR
    	inpW0, inpW1 :DWORD;
    	stuff: ARRAY [0..3] OF BYTE := 234,89,6,61;
    
            k           : REAL;
            sign        : REAL;
            exponent    : REAL;
            mant_mult   : REAL;
            stuffAdd    : DWORD;
            exp_raw     : DWORD;
            mantissa    : DWORD;
            i           : INT;
            negative    : BOOL;
    
    	arrWToReal : REAL;
    END_VAR
    
    
    
    inpW1 :=SHL(BYTE_TO_WORD(stuff[3]),8) OR BYTE_TO_WORD(stuff[2]);
    inpW0 :=SHL(BYTE_TO_WORD(stuff[1]),8) OR BYTE_TO_WORD(stuff[0]);
    stuffAdd := SHL(inpW1, 16) +  inpW0;
    negative := SHR(stuffAdd, 31) > 0;
    mant_mult := 1.0;
    IF negative THEN
    	sign := -1.0;
    ELSE
    	sign := 1.0;
    END_IF;
    exp_raw := SHR((stuffAdd MOD 2147483648), 23);
    exponent := DWORD_TO_REAL(exp_raw) - 127;
    
    mantissa := stuffAdd MOD 8388608;
    FOR i := 0 TO 22 DO
    	IF (SHR(mantissa, (22 - i)) MOD 2) = 1 THEN
           	k := INT_TO_REAL(23 - (22 - i));
                	mant_mult := mant_mult + 1/(EXPT(2,k));
    	END_IF;
    END_FOR;
    
    arrWToReal := sign * (EXPT(2, exponent)) * mant_mult;
    ОГРОМНОЕ СПАСИБО !!! РАБОТАЕТ !!!
    Если бы не Ваша помощь, я бы ещё долго голову ломал с этим IEEE754.
    Я, правда, думал, что будет проще.

Страница 4 из 9 ПерваяПервая ... 23456 ... ПоследняяПоследняя

Похожие темы

  1. Длинные строки (STRING)
    от rumkin в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 16.05.2022, 13:45
  2. String и Модбас слейв
    от жекон в разделе Сетевые технологии
    Ответов: 11
    Последнее сообщение: 04.11.2013, 16:59
  3. Длинный STRING
    от Nazar в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 08.03.2011, 13:04
  4. String переменные в архиваторе
    от Антон в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 25.12.2007, 10:53

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •