Показано с 1 по 10 из 22

Тема: struct alignment в макросах

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Ну так и отобрази этот кусок памяти как структуру эквивалентную размещению этого массива регистров.
    Представьте, что телеметрия от ПЛК состоит из 3 регистров.
    Я читаю эти регистры в массив:
    Код:
    const int plctm_regs_count = 3;
    const WORD plctm_addr = 0;
    static WORD plctm_regs[plctm_regs_count];
    Reads(PLC, slave_id, MODBUS_RTU_REGS_3X, plctm_addr, plctm_regs_count, &plctm_regs);
    Дальше я хочу скопировать этот массив в следующую структуру:
    Код:
    typedef struct plctm_telemetry_ {
      WORD reg;
      float real;
    } plctm_telemetry_t;
    plc_telemetry_t plctm;
    
    memcpy(&plctm, plctm_regs, sizeof(plctm_regs));
    Но этот код не работает так, как ожидается, потому что для компилятора структура выглядит так:
    Код:
    typedef struct plctm_telemetry_ {
      WORD reg;
      WORD reg_stub; // компилятор добавил это для 4-ехбайтного выравнивания
      float real;
    } plctm_telemetry_t;
    и при копировании второй регистр телеметрии попадёт в reg_sub

    А задать выравнивание для структуры, как выяснилось, возможности нет

  2. #2
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,842

    По умолчанию

    Контроллер не ОВЕН?
    Потому, что кодесис выравнял бы автоматом и сделал бы для real четный адрес


    И читать в панели пришлось бы не 3, а 4 регистра и все попало бы куда нужно.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  3. #3

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Контроллер не ОВЕН?
    Потому, что кодесис выравнял бы автоматом и сделал бы для real четный адрес


    И читать в панели пришлось бы не 3, а 4 регистра и все попало бы куда нужно.
    Нет, не ОВЕН

  4. #4

    По умолчанию

    Цитата Сообщение от andemeno Посмотреть сообщение
    Представьте, что телеметрия от ПЛК состоит из 3 регистров.
    и при копировании второй регистр телеметрии попадёт в reg_sub
    Вот как раз про это я и намекал. Что вам мешает переставить местами WORD reg; float real;
    Будет float real; WORD reg; ваши 3 регистра, а добавленный WORD reg_stub просто отбрасывать, или тупо добавить ещё один WORD и сделать структуру из 4 регистров.

  5. #5

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Что вам мешает переставить местами WORD reg; float real;
    Мешает другой соисполнитель, который не захочет это делать, потому что все протоколы уже согласованы на верхнем уровне...

Похожие темы

  1. Ответов: 9
    Последнее сообщение: 22.10.2018, 16:18
  2. Работа с памятью в макросах
    от Aleksandr в разделе Панели оператора (HMI)
    Ответов: 7
    Последнее сообщение: 26.06.2018, 10:42
  3. иероглифы в макросах
    от evg3798 в разделе Панели оператора (HMI)
    Ответов: 1
    Последнее сообщение: 28.04.2017, 08:13
  4. ВЕЩЕСТВЕННЫЕ ЭЛЕМЕНТЫ В МАКРОСАХ
    от rovki в разделе Среда программирования OWEN Logic
    Ответов: 6
    Последнее сообщение: 18.04.2016, 16:53
  5. структуированные данные. Struct.
    от Юрий Поляков в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 11.06.2010, 01:57

Ваши права

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