Страница 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
    Адрес
    Центророссийск
    Сообщений
    2,254

    По умолчанию

    Цитата Сообщение от _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
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    Цитата Сообщение от =Алекс= Посмотреть сообщение
    Еще вопрос, по той же теме...
    Есть другой массив 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
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

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

    По умолчанию

    Предполагаю что тс не понимает о чем речь.
    Строки тут вообще не при делах
    Код:
    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
    Адрес
    Центророссийск
    Сообщений
    2,254

    По умолчанию

    Обратите внимание на строчку
    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
    Адрес
    Центророссийск
    Сообщений
    2,254

    По умолчанию

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

    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
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    как я и писал последовательность 3,4,2,1 получается число 25.1170883178711
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

Страница 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 в разделе ПЛК3хх
    Ответов: 16
    Последнее сообщение: 03.07.2014, 13:33
  4. MasterSCADA и средняя часть панели настройки
    от RoMatik в разделе Master SCADA 3
    Ответов: 8
    Последнее сообщение: 10.04.2008, 11:20

Ваши права

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