Страница 1015 из 1044 ПерваяПервая ... 155159159651005101310141015101610171025 ... ПоследняяПоследняя
Показано с 10,141 по 10,150 из 10436

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #10141

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    Порядок не важен.
    Но когда в структуре постоянно чередуются одно- двух- и четырёх-байтовые переменные, а также другие структуры - уследить за выравниванием и "попасть" в нужную переменную по сети будет трудно
    Вот сейчас с этим и бьюсь, не могу подсчитать правильные номера регистров ((

    Например массив структур как распределит переменные по регистрам, сначала первые 12 регистров будут compressors[1], потом 12 регистров compressors[2] итд?

    compressors :ARRAY [1..3] OF COMPRESSOR;

    Код:
    TYPE COMPRESSOR :
    STRUCT
    	bSignal1	:BYTE;(*14-0-7; 26-0-7; 38-0-7*)
    	bSignal2	:BYTE;(*14-8-15; 26-8-15; 38-8-15*)
    	t_1st	:INT;(*15; 27; 39*)
    	t_2st	:INT;(*16; 28; 40*)
    	t_oil	:INT;(*17; 29; 41*)
    	P_1st	:REAL;(*18; 30; 42*)
    	P_2st	:REAL;(*20; 32; 44*)
    	P_oil	:REAL;(*22; 34; 46*)
    	P_water	:REAL;(*24; 36; 48*)
    END_STRUCT
    END_TYPE
    По сути 12 *3 = 36 регистров, у меня так же 18шт DWORD задано, но все же тут получается перекос и следующая переменная хранится в последнем 36-м регистре

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

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    По сути 12 *3 = 36 регистров
    а Вы делали SIZEOF на экземпляр струтктуры COMPRESSOR?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  3. #10143

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Вот сейчас с этим и бьюсь, не могу подсчитать правильные номера регистров ((

    Например массив структур как распределит переменные по регистрам, сначала первые 12 регистров будут compressors[1], потом 12 регистров compressors[2] итд?

    compressors :ARRAY [1..3] OF COMPRESSOR;

    Код:
    TYPE COMPRESSOR :
    STRUCT
    	bSignal1	:BYTE;(*14-0-7; 26-0-7; 38-0-7*)
    	bSignal2	:BYTE;(*14-8-15; 26-8-15; 38-8-15*)
    	t_1st	:INT;(*15; 27; 39*)
    	t_2st	:INT;(*16; 28; 40*)
    	t_oil	:INT;(*17; 29; 41*)
    	P_1st	:REAL;(*18; 30; 42*)
    	P_2st	:REAL;(*20; 32; 44*)
    	P_oil	:REAL;(*22; 34; 46*)
    	P_water	:REAL;(*24; 36; 48*)
    END_STRUCT
    END_TYPE
    По сути 12 *3 = 36 регистров, у меня так же 18шт DWORD задано, но все же тут получается перекос и следующая переменная хранится в последнем 36-м регистре
    Скорее всего первые две байтовые переменные займут не 16, а 32 байта (ДВА регистра), итого сначала получится 5 регистров, поэтому для выравнивания перед первым REAL будет пропущен ещё один регистр

  4. #10144

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Вот сейчас с этим и бьюсь, не могу подсчитать правильные номера регистров ((

    Например массив структур как распределит переменные по регистрам, сначала первые 12 регистров будут compressors[1], потом 12 регистров compressors[2] итд?

    compressors :ARRAY [1..3] OF COMPRESSOR;

    По сути 12 *3 = 36 регистров, у меня так же 18шт DWORD задано, но все же тут получается перекос и следующая переменная хранится в последнем 36-м регистре
    Так и есть 12 регистров занимает 1 структура COMPRESSOR, всего 3 труктуры, 36 регистров или 72 байта
    12 регистров это 6 штук 4 BYTE, это всё уже обсуждалось, можно было взять и посмотреть в этой теме. Даже скрины выкладывал несколько раз. https://owen.ru/forum/showthread.php?t=10555&page=979

    x:=SIZEOF(compressors); получается 72 байта, 36 регистров или 18 шт. 4BYTE. Скрин==>> 1 Размер Структуры.jpg

    И ответ зачем нужен command : DWORD; в структуре original_8AC :STRUCT размер структуры 80 байт (разница адресов S2 - S1=84 байт)
    Последний раз редактировалось kondor3000; 24.11.2023 в 14:43.

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

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    Скорее всего первые две байтовые переменные займут не 16, а 32 байт
    Не несите чушь. 8-битным не нужно выравнивание.
    2 байта подряд стоящие с четного БАЙТА [или 0-ого] (не регистра) это 1 регистр (16-бит)
    -
    Там ровно 12 регистров


    --
    Какие-то странные прения. Непонимающим нужно маляром поработать, буквы через трафарет позакрашивать. Тогда сразу станет понятно как структуры к памяти прикладывать. Это одно и тоже
    Последний раз редактировалось Валенок; 24.11.2023 в 15:49.

  6. #10146

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    а Вы делали SIZEOF на экземпляр струтктуры COMPRESSOR?
    точно, спасибо!
    Интересный размерчик получается...
    2023-11-24_15-49-42.png

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    а Вы делали SIZEOF на экземпляр струтктуры COMPRESSOR?
    SIZEOF в офлайне косячит (точнее - стуктуры в офлайне и онлайне отличаются)

    сравните онлайн/офлайн
    Код:
    struct x
     x : byte;
     y : real;
    end_struct

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

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    ..
    //смещение какого-то поля экземпляра структуры в регистрах
    RegAddr := DWORD_TO_WORD(adr(экземпляр_структуры.какое_то_пол е) - adr(экземпляр_структуры)) / 2

  9. #10149

    По умолчанию

    Подскажите простой и быстрый способ, как можно сразу прочитать несколько дискретных входов контроллера и поместить входные значения в 16 битное слово (WORD). Задача осложняется тем, что дискретные входные сигналы расположены вроде рядышком, но находятся в трех группах (8-и битных), как показано на скрине.2023-11-26_16-33-04.png. Хотелось бы видеть в WORD слове данные D14-D27.

  10. #10150

    По умолчанию

    Не знаю насколько быстро и просто, но что-то типа такого наверное:

    Код:
    B2 AT %IB1.3: BYTE;
    B1 AT %IB1.2 : BYTE;
    B0 AT %IB1.1 : BYTE;
    
    wRESULT : WORD;
    
    wRESULT := DWORD_TO_WORD(SHR(SHL(SHL(BYTE_TO_DWORD(B2),8) OR BYTE_TO_DWORD(B1),8) OR BYTE_TO_DWORD(B0),4));

Страница 1015 из 1044 ПерваяПервая ... 155159159651005101310141015101610171025 ... ПоследняяПоследняя

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

Ваши права

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