Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 22

Тема: преобразования

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

    По умолчанию

    у Вас вроде в тексте точки в двух местах, а в массиве то два то три. Это с чем связано? А в остальном у вас как раз значения байт, переводите через указатель в строку и получаете требуемый результат

  2. #12

    По умолчанию

    capzap, Да это так сниффер преобразует. Все равно не могу догнать. Если можно, напишите пример. Меня интересует байтовый массив 56 48 50 52 70 57 66 57 48 49, начинаю преобразовывать 56>8; 48>0; в итоге первый интересующий меня байт должен быть равным 80, далее 50,52 второй байт должен быть равным 24 и так далее. Как то вот так!

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

    По умолчанию

    у меня нет возможности пример полазать, не по памяти же исходник выложить по телефону. Сперва создаете указатель на строку размером с массив, присваиваете командой АДР имеющийся массив, дальше строке присваиваете значение указателя. И у Вас сразу появится нужная запись в строке.
    Откройте в инете любую таблицу аскии, 48 соответствует нулю, 65 соответствует английской А

  4. #14

    По умолчанию

    capzap, спасибо за помощь, кое что получилось '$028024F9B901$032C'.

  5. #15
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,405

    По умолчанию

    Если «это так сниффер преобразует» и не принимать во внимание его мусор с долларами, то:
    Код:
    PROGRAM PLC_PRG
    VAR CONSTANT
    	src: ARRAY[0..9] OF BYTE := 56, 48, 50, 52, 70, 57, 66, 57, 48, 49;
    END_VAR
    VAR
    	i: INT;
    	buf: STRING(5) := '16#00';
    	pBuf: POINTER TO ARRAY[0..4] OF BYTE;
    	result: ARRAY[0..4] OF BYTE;
    END_VAR
    
    pBuf := ADR(buf);
    
    FOR i := 0 TO SIZEOF(result) - 1 DO
    	pBuf^[3] := src[i * 2];
    	pBuf^[4] := src[i * 2 + 1];
    	result[i] := STRING_TO_BYTE(buf);
    END_FOR

  6. #16

    Post

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    В лоб число в строку в десятичном виде совсем просто str1 := INT_TO_STRING(x);

    В 16-ый формат так не получится. Я бы написал под это отдельную функцию для преобразования из байта в строку в 16-ом формате:

    FUNCTION Byte_to_hex_str : STRING
    VAR_INPUT
    byIn : BYTE;
    END_VAR
    VAR CONSTANT
    saHEX: ARRAY [0..15] OF STRING(1) := '0','1','2','3','4','5','6','7','8','9','A','B','C ','D','E','F';
    END_VAR

    Byte_to_hex_str := CONCAT(saHEX[SHR(byIn,4)],saHEX[byIn AND 16#0F]);
    В строчке:
    saHEX: ARRAY [0..15] OF STRING(1) := '0','1','2','3','4','5','6','7','8','9','A','B','C ','D','E','F';
    ошибка, необходимо заменить на:
    saHEX: ARRAY [0..15] OF STRING := '0','1','2','3','4','5','6','7','8','9','A','B','C ','D','E','F';

    и + огромное СПАААСИИИБООО!!! ОЧЕНЬ помогло:-)
    Автоматизация Диспетчеризация Сервис
    e-mail: ads-kaluga@mail.ru

  7. #17

    По умолчанию

    Здравствуйте, Цапзап.
    Цитата Сообщение от capzap Посмотреть сообщение
    а в чем ошибка то? Может далее в коде, но здесь то всё очевидно массив строк из одного символа, в Вашем случае, строка может разрастись до 80 символов но ни чем не отличается от первого варианта
    В ходе компиляции у меня ругается на вышеуказанную строку, после внесения изменений программа заработала (CoDeSys 2.3)
    Во вложении сам процесс ругательства.

    Огромное спасибо за наводку. Померил размер занимаемой памяти
    intTemp:=SIZEOF(saHEX);
    и .... ппц.

    Исправил строку на нижеследующую:
    saHEX: ARRAY [0..15] OF STRING(2) := '0','1','2','3','4','5','6','7','8','9','A','B','C ','D','E','F';


    Объем занимаемой памяти снизился с 1296 до 48 байт.

    P. S. Век живи век учись :-)
    Изображения Изображения
    Последний раз редактировалось Gans; 18.06.2019 в 22:07.
    Автоматизация Диспетчеризация Сервис
    e-mail: ads-kaluga@mail.ru

  8. #18

    По умолчанию

    Здравствуйте.
    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    В лоб число в строку в десятичном виде совсем просто str1 := INT_TO_STRING(x);

    В 16-ый формат так не получится. Я бы написал под это отдельную функцию для преобразования из байта в строку в 16-ом формате:

    FUNCTION Byte_to_hex_str : STRING
    VAR_INPUT
    byIn : BYTE;
    END_VAR
    VAR CONSTANT
    saHEX: ARRAY [0..15] OF STRING(1) := '0','1','2','3','4','5','6','7','8','9','A','B','C ','D','E','F';
    END_VAR

    Byte_to_hex_str := CONCAT(saHEX[SHR(byIn,4)],saHEX[byIn AND 16#0F]);
    В строчке:
    saHEX: ARRAY [0..15] OF STRING(1) := '0','1','2','3','4','5','6','7','8','9','A','B','C ','D','E','F';

    Необходимо убрать лишний пробел заменить 'C ' на 'C'.
    Нашел и ткнул носом Цапзап.
    Автоматизация Диспетчеризация Сервис
    e-mail: ads-kaluga@mail.ru

  9. #19

    По умолчанию

    Совсем запутался. Задача такая, есть переменная STRING с номером абонента '9051458992', это значение нужно разбить пополам "90514" и "58992" в формате DWORD и отправить на панель Скады. Помогите пожалуйста

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

    По умолчанию

    Цитата Сообщение от bort992 Посмотреть сообщение
    Совсем запутался. Задача такая, есть переменная STRING с номером абонента '9051458992', это значение нужно разбить пополам "90514" и "58992" в формате DWORD и отправить на панель Скады. Помогите пожалуйста
    а запутались то в чем, какие функции использовали
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Ваши права

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