Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 22

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

  1. #1

    По умолчанию struct alignment в макросах

    Поддерживает ли компилятор макросов Конфигуратора СП3хх возможность задавать выравнивание для структур?
    Если да, то как? Может быть есть информация какой компилятор используется в Конфигураторе?

    Вариант
    Код:
    #pragma pack(arg)
    не даёт эффекта.

  2. #2

    По умолчанию

    Цитата Сообщение от andemeno Посмотреть сообщение
    Поддерживает ли компилятор макросов Конфигуратора СП3хх возможность задавать выравнивание для структур?
    Если да, то как? Может быть есть информация какой компилятор используется в Конфигураторе?

    Вариант
    Код:
    #pragma pack(arg)
    не даёт эффекта.
    Просто интересно, а как вы структуру передаёте в панель?
    Вообще то структуры используются в ПЛК , а в панель вам надо передать только готовые цифры для отображения, в нужные регистры с учётом выравнивания.
    Максимум, что можно сделать, это передать в панель массив переменных одного типа, упакованные в String, опять же с учётом выравнивания.
    Последний раз редактировалось kondor3000; 28.10.2021 в 11:18.

  3. #3

    По умолчанию

    Я считываю телеметрию из ПЛК в панель и хочу записать её в структуру.
    Поскольку готовые цифры для отображения нужно правильно интерпретировать.

  4. #4

    По умолчанию

    Цитата Сообщение от andemeno Посмотреть сообщение
    Я считываю телеметрию из ПЛК в панель и хочу записать её в структуру.
    Поскольку готовые цифры для отображения нужно правильно интерпретировать.
    Читайте выше, ещё раз. Вы не сможете передать в панель структуру.

  5. #5
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,147

    По умолчанию

    Цитата Сообщение от andemeno Посмотреть сообщение
    Поддерживает ли компилятор макросов Конфигуратора СП3хх возможность задавать выравнивание для структур?
    Если да, то как? Может быть есть информация какой компилятор используется в Конфигураторе?

    Вариант
    Код:
    #pragma pack(arg)
    не даёт эффекта.

    Код:
    typedef struct 
    
    {
        __packed char	member_1;
        __packed DWORD	member_2;
    } str_name;
    Так будет работать (экземпляр структуры займет 5 байт).

    Но это не сработает, например, для поля типа float.

  6. #6

    По умолчанию

    Я не передаю в панель структуру. Я в панель читаю массив регистров из ПЛК и хочу интерпретировать этот кусок памяти как структуру
    Последний раз редактировалось andemeno; 28.10.2021 в 12:16.

  7. #7

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Код:
    typedef struct 
    
    {
        __packed char	member_1;
        __packed DWORD	member_2;
    } str_name;
    Так будет работать (экземпляр структуры займет 5 байт).

    Но это не сработает, например, для поля типа float.
    Очень жаль.... Но спасибо за ответ.

    В силе остаётся вопрос про компилятор, используемый конфигуратором.

  8. #8

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Ну так и отобрази этот кусок памяти как структуру эквивалентную размещению этого массива регистров.
    Огорчить может только отсутствие ссылок в функциях (c89)
    Вообще то, изначальный вопрос был про компилятор в панели и про возможность Задавать Компилятором, выравнивание структуры в панели.
    В общем случае, структура может быть набита разными типами переменных в произвольном порядке. Отсюда и вопросы к ТС.

    ЗЫ: Так и есть, на 2 стр. автор привёл в пример структуру из двух типов, WORD и REAL. И как ожидалось с выравниванием несвязуха.
    Последний раз редактировалось kondor3000; 29.10.2021 в 14:10.

  9. #9

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Ну так и отобрази этот кусок памяти как структуру эквивалентную размещению этого массива регистров.
    Представьте, что телеметрия от ПЛК состоит из 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

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

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

    По умолчанию

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


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

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

Похожие темы

  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

Ваши права

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