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

Тема: Часть массива перевести в строку

  1. #11

    По умолчанию

    Еще вопрос, по той же теме...
    Есть другой массив 10 ff 90 00 00 07 00 72 43 04 cc ef c8 41 47 5e, в котором часть cc ef c8 41 нужно преобразовать в REAL. Должно получится 25.12.
    Из первого ответа такая обработка не работает, получаю абракадабру...
    Подскажите что тут можно придумать?

  2. #12
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,152

    По умолчанию

    Цитата Сообщение от _Pavel_ Посмотреть сообщение
    Согласен по поводу первого обычный String он байтовый и все хорошо. Просто я подумал что ТС парсит сетевой пакет т.е. сейчас например ему нужно 5656 а потом придет 565656. Хотелость предложить более общее решение и надежное. Вдруг он захочет воспользоваться такой же технологией(указателем) и для других типов в будущем что приведет к известным последствиям.
    например

    кол-во заранее известно

    Код:
    var_input
     index,size : word;
    var_output
     str : string(...);
     overflow : bool;
    ------
    overflow := size >= (sizeof(str) - 1);
    size := min(size,sizeof(str) - 1);
    sysmemcpy(adr(str),adr(buffer[index]),size);
    sysmemset(adr(str) + size,0,1);
    неизвестно

    Код:
    var_input
     index : word;
    var_output
     str : string(...);
     overflow : bool;
    var
     i : word; //без языков
     p : pointer to array[0..65535] of byte;
    -----
    p := adr(str);
    for i := 0 to sizeof(str) - 1 do
     p^[i] := buffer[index + i];
     overflow := false;
     if p^[i] = 0 then exit; end_if
     overflow := true;
    end_for
    Писал на слух. Возможны мелкие очепятки

  3. #13
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    Цитата Сообщение от =Алекс= Посмотреть сообщение
    Еще вопрос, по той же теме...
    Есть другой массив 10 ff 90 00 00 07 00 72 43 04 cc ef c8 41 47 5e, в котором часть cc ef c8 41 нужно преобразовать в REAL. Должно получится 25.12.
    Из первого ответа такая обработка не работает, получаю абракадабру...
    Подскажите что тут можно придумать?
    переверните байты ззеркально, если не получится то сделайте такую последовательность 3,4,1,2

  4. #14
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,152

    По умолчанию

    Предполагаю что тс не понимает о чем речь.
    Строки тут вообще не при делах
    Код:
    function get : real
    var_input
      index : word;
    ----
    sysmemcpy(adr(get),adr(buffer[index]),sizeof(get));
    Вот тут и возможно
    Цитата Сообщение от capzap Посмотреть сообщение
    переверните байты ззеркально, если не получится то сделайте такую последовательность 3,4,1,2
    ps
    дальнейшее форматирование - это вообще другая история
    Последний раз редактировалось Валенок; 05.03.2016 в 12:33.

  5. #15

    По умолчанию

    Написал вот так:
    Код:
    buffer:ARRAY [0..18] OF BYTE:= 16#10, 16#ff, 16#90, 16#00, 16#00, 16#07, 16#00, 16#72, 16#43, 16#04, 16#cc, 16#ef, 16#c8, 16#41, 16#47, 16#5e;
    sysmemcpy(adr(get),adr(buffer[10]),sizeof(get));
    Этот буфер каждый раз читается из com порта, в com порт приходит один и тот же ответ.
    Но при тесте я вижу на первом цикле правильный REAL ответ. А дальше ерунда, и ПЛК перезагружается...
    Надо что-то еще чистить каждый раз?

  6. #16
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,152

    По умолчанию

    Обратите внимание на строчку
    function get : real
    ну и на то, что входной index не может быть больше 15-ти, если
    buffer:ARRAY [0..18] OF BYTE
    Последний раз редактировалось Валенок; 05.03.2016 в 13:16.

  7. #17

    По умолчанию

    Исправил.
    Код:
    buffer:ARRAY [0..15] OF BYTE:= 16#10, 16#ff, 16#90, 16#00, 16#00, 16#07, 16#00, 16#72, 16#43, 16#04, 16#cc, 16#ef, 16#c8, 16#41, 16#47, 16#5e;
    get:REAL;
    ------------------
    sysmemcpy(adr(get),adr(buffer[10]),sizeof(get));
    Первый цикл считает верное значение, далее все не то, а после 8 цикла ребут ПЛК.

    То что писали про function get : real - это именно нужно создать новую функцию и к ней обращаться, или можно так как я тут написал?

    P.S. Попробовал сделал отдельную функцию, как предлагал Валенок. Работает одинакого, т.е. первый ответ есть, а на восьмой запрос ребут.
    Как-то можно увидеть причину ребута? У меня работает код с использованием оператора Case. Пробовал ставить точки останова, но так и не увидел ошибки...
    Последний раз редактировалось =Алекс=; 05.03.2016 в 14:15. Причина: дописал после P.S.

  8. #18
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,152

    По умолчанию

    Цитата Сообщение от =Алекс= Посмотреть сообщение
    ...Первый цикл....
    Ввиду очень широкого трактования слова "цикл" и факта - "вы здесь недавно", рекомендую Вам выложить весь код

    PS
    buffer:ARRAY [0..15]
    Я имел ввиду не размер буфера, а входной индекс отвечающий за выход за его приделы при p[index + 3]^
    Последний раз редактировалось Валенок; 05.03.2016 в 15:17.

  9. #19

    По умолчанию

    Прикрепил свой проект.
    Там 4 запроса, на первый запрос ответа нет (он и не нужен). Второй запрос, ответ от прибора одинаковый, говорит что на связи. Третий запрос получаем адрес прибора, четвертый чтение параметра.
    Ответы: на 1 = нет
    на 2 = 10 ff 3f 37 2a 01 4f 16
    на 3 = 10 ff 90 00 00 07 00 72 16 04 31 32 33 34 17 cc (это 1234)
    на 4 = 10 ff 90 00 00 07 00 72 43 04 cc ef c8 41 37 5e (это 25,12).

    По сниферу порта вижу, что прибор на все запросы ПЛК отвечает, и ответы все одинаковые. Но ПЛК на 5-8 этапе перезагружается.
    Если отключить прибор, то ПЛК будет слать запросы в одну сторону, и ребут ПЛК не делает.
    Видимо косяк в переполнении чего-то при получении ответа...
    Помогите пожалуйста найти и исправить ошибку.
    Последний раз редактировалось =Алекс=; 05.03.2016 в 22:09.

  10. #20
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    как я и писал последовательность 3,4,2,1 получается число 25.1170883178711

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

Похожие темы

  1. МСД-200, теряется часть архива.
    от alexsis_k в разделе Эксплуатация
    Ответов: 40
    Последнее сообщение: 24.02.2015, 14:07
  2. Во что перевести проводимость?
    от жекон в разделе Трёп (Курилка)
    Ответов: 6
    Последнее сообщение: 16.02.2015, 17:32
  3. CRC-16/ARC помогите перевести с С++ на мэк
    от Gvenihvivar в разделе ПЛК3xx (архив)
    Ответов: 16
    Последнее сообщение: 03.07.2014, 12:33
  4. MasterSCADA и средняя часть панели настройки
    от RoMatik в разделе Master SCADA 3
    Ответов: 8
    Последнее сообщение: 10.04.2008, 10:20

Ваши права

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