Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: Проецирование структуры в буфер и наоборот

  1. #1

    По умолчанию Проецирование структуры в буфер и наоборот

    Добрый день Уважаемые.
    Опыта работы с CoDeSys очень мало, поэтому, возможно, вопрос ламерский, но в Гугле как-то не нашел...

    Есть структура следующего типа:
    Код:
    TYPE TiceHeader:
    STRUCT
      CRC       : WORD;
      Size      : WORD;
      Signature : BYTE;
    END_STRUCT
    END_TYPE
    TYPE PiceHeader = POINTER TO TiceHeader;
    Вот объявлен указатель на структуру этого типа:
    Код:
    HDR         : PiceHeader;
    Ну или так:
    Код:
    HDR         : POINTER TO TiceHeader;

    И есть байтовый массив:
    Код:
    DATA        : ARRAY[0..127] OF BYTE;
    Смогу ли я проецировать указатель HDR на адрес массива? Вот так:
    Код:
    HDR := ADR(DATA);
    Это позволило бы мне читать и писать данные внутри массива используя поля структуры
    Код:
    FOR I := 0 TO 5 DO
    HDR := ADR(DATA) + I * SIZEOF(TiceHeader);
    HDR.CRC := GetCRC16;
    HDR.Size := 3;
    HDR.Signature := I;
    END_FOR
    Заранее благодарю за ответ.
    Последний раз редактировалось VaRela; 28.02.2016 в 17:01.

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

    По умолчанию

    на первый взглфд вроде все верно, единственное лучше держать структуру однотипных данных
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  3. #3

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    на первый взгляд вроде все верно, единственное лучше держать структуру однотипных данных
    Хм, а почему?

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

    По умолчанию

    sizeof может не верно давать количество. Но если у Вас всё работает, то можно и не опасаться, единственное зачем Вы спрашивали тогда
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

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

    По умолчанию

    sizeof может не верно давать количество
    Впервые слышу. Откуда информация?

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

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Впервые слышу. Откуда информация?
    если честно, по памяти помню разговоры, кто то убеждал меня что указатели на структуры не адекватны. Искать тему не стал, лень. Для надежности, вариант однотипной структуры ни кому не помешает
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  7. #7

    По умолчанию

    Дело в том, что пока вынужден писать код вслепую без железа, поэтому оцениваю различные способы.
    А на счет неверного sizeof для структуры, я так понимаю такое возможно, если компилятор выравнивает данные, например до слова или двойного слова.

  8. #8
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    357

    По умолчанию

    sizeof в симуляторе не выравнивает данные в структуре, а в живом ПЛК выравнивает кратно 4 байтам.

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

    По умолчанию

    Ход мысли - правильный. Из помех на пути - невозможность обращения проца к слову по нечетному адресу
    Т.к. DATA байтовый, он может залечь легко и с нечетного адреса и при первом же HDR.CRC := получим ёк.
    Гарантировать лежку DATA с четного адреса можно :

    1.
    Рукотворно после проверки и внедрения, при необходимости, например лишнего типа DATA :array[ -1...127] of byte


    2.
    Изначального расположения DATA в FB или в структуре с явными предварительными выравнивающими байтами типа
    VAR_INPUT
    d : dword;
    b1,b2 : byte;
    DATA : ..[0..127]
    В общем развитие варианта 1.


    3.
    Отказа от базового типа DATA как байтового. А нафига байт-то сдался ?
    DATA : array[0..63] of word;


    4.
    Вообще отказа от промежуточных буферов. А на фига буфера-то нужен ?
    НDR : array[0..??] of TiceHeader; //это и есть буфер. Сюда/отсюда и пишем/читаем, и кузнец нам не нужен


    5.
    Простого необращения к полям структур в стремных местах
    X : TiceHeader;

    FOR I := 0 TO 5 DO
    HDR := ADR(DATA) + I * SIZEOF(TiceHeader);
    X.CRC := GetCRC16;
    X.Size := 3;
    X.Signature := I;
    HDR^ := X; //тута нет обращений к полям
    END_FOR


    6.
    Юзания функций типа SysMemCpy (местного аналога) для переноса абстрактных куч байтов

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

    По умолчанию

    5лет назад писал архив для ПЛК 100.
    Получилась достаточно большая структура.
    Эту структуру упаковал в массив 60 строк.
    Вся работа с архивом через символьную адресацию в
    циклах For и выход из них через прерывание цикла exit.
    только указателями я не использовал

    с указателями возможны периодические сбои.
    Изображения Изображения
    • Тип файла: jpg 1.jpg (170.2 Кб, Просмотров: 39)
    Последний раз редактировалось lara197a; 28.02.2016 в 23:11.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. буфер визуализации
    от Иван2 в разделе СПК2хх
    Ответов: 0
    Последнее сообщение: 26.10.2014, 22:05
  2. как организовать буфер (аккум)?
    от K580BB55A в разделе ПЛК1хх
    Ответов: 8
    Последнее сообщение: 23.11.2010, 00:58
  3. как использовать буфер
    от николай72 в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 18.04.2009, 22:25

Метки этой темы

Ваши права

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