1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Codesys 3.5, структуры и UNION

PLC, прочие контроллеры, промышленные компьютеры, операторские панели

Модераторы: Глоб.модераторы, специалисты по PLC

Ответить

Автор темы
leon78
эксперт
эксперт
Сообщения: 1146
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 49 раз
Поблагодарили: 134 раза

Codesys 3.5, структуры и UNION

Сообщение leon78 »

Объявляю структуру:

Код: Выделить всё

TYPE sdoName:
STRUCT
    i1: INT;
    i2: INT;  
END_STRUCT
END_TYPE
Объявляю UNION:

Код: Выделить всё

TYPE uName:
UNION
    di : DINT;
    n : sdoName;
END_UNION
END_TYPE
Объявляю переменную:

Код: Выделить всё

VAR
	v: uName;
END VAR
К полям переменной теперь могу обращаться так:

Код: Выделить всё

diX := v.di;
iX1 := v.n.i1; 
iX2 := v.n.i2;
Можно ли как-то объявить UNION, чтобы обращение было без "n"?

Код: Выделить всё

diX := v.di;
iX1 := v.i1; 
iX2 := v.i2;
Например, так, но без ошибки в синтаксисе:

Код: Выделить всё

TYPE uName:
UNION
    di : DINT;
   STRUCT
    i1: INT;
    i2: INT;  
   END_STRUCT
END_UNION
END_TYPE
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

SaNNy
освоился
освоился
Сообщения: 259
Зарегистрирован: 01 фев 2010, 10:37
Имя: Александр
Страна: Россия
город/регион: Брянск
Благодарил (а): 10 раз
Поблагодарили: 33 раза

Codesys 3.5, структуры и UNION

Сообщение SaNNy »

Думаю, что нет, нельзя.
Только, если так

Код: Выделить всё

TYPE uName:
UNION
    di : DINT;
    i1: INT;
    i2: INT; 
END_UNION
END_TYPE

Автор темы
leon78
эксперт
эксперт
Сообщения: 1146
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 49 раз
Поблагодарили: 134 раза

Codesys 3.5, структуры и UNION

Сообщение leon78 »

SaNNy писал(а): 26 авг 2022, 08:09 КОД: ВЫДЕЛИТЬ ВСЁ

TYPE uName:
UNION
di : DINT;
i1: INT;
i2: INT;
END_UNION
END_TYPE
В таком случае i1, i2, и 2 младших байта di будут лежать в одних ячейках памяти.
Мне надо, чтобы i1 лежал в младших байтах di, а i2 в старших
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

Автор темы
leon78
эксперт
эксперт
Сообщения: 1146
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 49 раз
Поблагодарили: 134 раза

Codesys 3.5, структуры и UNION

Сообщение leon78 »

Помогли на одном зарубежном форуме:

Код: Выделить всё

TYPE uName EXTENDS sdoName :
UNION
	di : DINT;
END_UNION
END_TYPE
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
Аватара пользователя

keysansa
эксперт
эксперт
Сообщения: 2471
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 2121 раз
Поблагодарили: 208 раз

Codesys 3.5, структуры и UNION

Сообщение keysansa »

leon78 писал(а): 30 авг 2022, 13:50 Помогли на одном зарубежном форуме:
Я бы не использовал, даже, если это работает.
Это не очевидно. Используется "расширение" типа с его преобразованием (struct->union).
Union обычно используется только для преобразования.
Преобразование - удел функций.
Запихиваете данные типы внутрь функции (GetDintFrom2Int(Int, Int): Dint), и только в ней используете раздражающее вас "n".

Отправлено спустя 42 минуты 30 секунд:
ЗЫ. И с рефакторингом и поддержкой кода будет беда.
При изменении входных данных, при использовании функций для преобразования, вы поменяете только ее объявление, а компилятор вам подскажет, где надо поменять вызовы.
При прямом использовании типов, да еще и с наследованием, будете чесать голову, потому, что вспомнить, почему именно так - вы не сможете уже года через 2-3.
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 1457
Зарегистрирован: 17 окт 2012, 11:24
Имя: Виталий
Страна: Беларусь
город/регион: Минск
Благодарил (а): 61 раз
Поблагодарили: 182 раза

Codesys 3.5, структуры и UNION

Сообщение Madwolf »

Если остальной код пишется как в примере:

diX := v.di;
iX1 := v.n.i1;
iX2 := v.n.i2;

то уже завтра хрен в нём с наскока разберёшься ))) :crazy0to:

Автор темы
leon78
эксперт
эксперт
Сообщения: 1146
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 49 раз
Поблагодарили: 134 раза

Codesys 3.5, структуры и UNION

Сообщение leon78 »

Конечно, в реальной программе имена не i, x, n и т.д., а значащие ("a" например :lol: )
Немного юмора, надеюсь, никто не обидится:
[+]
Американский форум. Задаёшь вопрос, потом тебе отвечают.
Израильский форум. Задаёшь вопрос, потом тебе задают вопрос.
Русский форум. Задаёшь вопрос, потом тебе долго рассказывают, какой ты мудак.
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
Аватара пользователя

keysansa
эксперт
эксперт
Сообщения: 2471
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 2121 раз
Поблагодарили: 208 раз

Codesys 3.5, структуры и UNION

Сообщение keysansa »

Madwolf писал(а): 05 сен 2022, 14:02 diX := v.di;
iX1 := v.n.i1;
iX2 := v.n.i2;
Чутка не так:
v.di := diX;
iX1 := v.n.i1;
iX2 := v.n.i2;
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.

srthrdhd
новенький
новенький
Сообщения: 1
Зарегистрирован: 25 май 2021, 09:00
Имя: Бронеслав Краснозадович
Благодарил (а): 5 раз

Codesys 3.5, структуры и UNION

Сообщение srthrdhd »

Можно применить массив

Код: Выделить всё

TYPE uName:
UNION
    di : DINT;
    i: ARRAY [0 .. 1] OF INT;
END_UNION
END_TYPE
Использование

Код: Выделить всё

diX := v.di;
iX1 := v.i[0]; 
iX2 := v.i[1];
Пример:
https://youtu.be/VT9tjcbY8HU?t=544
Аватара пользователя

keysansa
эксперт
эксперт
Сообщения: 2471
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 2121 раз
Поблагодарили: 208 раз

Codesys 3.5, структуры и UNION

Сообщение keysansa »

srthrdhd писал(а): 22 дек 2023, 15:13 Можно применить массив
Мне и нравится (номерные переменные - в массиве) и не нравится (конкретно в этом применении).
Массив - не особо переносимый тип. В разных системах - может храниться по разному. Да, сейчас более-менее везде одинаково, но встречаются еще исключения.
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.

mf_
осмотрелся
осмотрелся
Сообщения: 190
Зарегистрирован: 09 апр 2019, 19:52
Имя: Денис
Страна: Россия
город/регион: Saint-Petersburg
Благодарил (а): 62 раза
Поблагодарили: 21 раз

Codesys 3.5, структуры и UNION

Сообщение mf_ »

Задаю структуру

Код: Выделить всё

TYPE F :
	STRUCT
			ALIGN : BOOL := 0; //Для выравнивания. Должно быть 0
			SUN : BOOL; 
			MON : BOOL; 
			TUE : Bool; 
			WED : BOOL; 
			THU : Bool; 
			FRI : Bool; 
			SAT : BOOL; 
	END_STRUCT
END_TYPE
Задаю объединение

Код: Выделить всё

TYPE FILTER EXTENDS F :
UNION
	WEEK : USINT;
END_UNION
END_TYPE
Хочу работать с битовой маской байта WEEK. При компиляции пишет предупреждение, что "Наследование не предназначено для типа данных UNION : FILTER"
WEEK изменяет значение от 0 до 1 при изменении F.ALIGN
Недавно взял Codesys 3.5, пытаюсь портировать проект из TIA. Прошу подсказать, что я тут напутал.

Автор темы
leon78
эксперт
эксперт
Сообщения: 1146
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 49 раз
Поблагодарили: 134 раза

Codesys 3.5, структуры и UNION

Сообщение leon78 »

Замените тип BOOL на BIT. BOOL занимает 1 байт, как и USINT
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

mf_
осмотрелся
осмотрелся
Сообщения: 190
Зарегистрирован: 09 апр 2019, 19:52
Имя: Денис
Страна: Россия
город/регион: Saint-Petersburg
Благодарил (а): 62 раза
Поблагодарили: 21 раз

Codesys 3.5, структуры и UNION

Сообщение mf_ »

leon78, спасибо, всё заработало как нужно. Риторический вопрос, наверное, зачем здесь 8 бит в BOOL :ges_hmm:

Автор темы
leon78
эксперт
эксперт
Сообщения: 1146
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 49 раз
Поблагодарили: 134 раза

Codesys 3.5, структуры и UNION

Сообщение leon78 »

Во всех языках программирования, с которыми сталкивался, BOOL занимает 1 байт. Это же минимальная единица выравнивания в памяти.
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

mf_
осмотрелся
осмотрелся
Сообщения: 190
Зарегистрирован: 09 апр 2019, 19:52
Имя: Денис
Страна: Россия
город/регион: Saint-Petersburg
Благодарил (а): 62 раза
Поблагодарили: 21 раз

Codesys 3.5, структуры и UNION

Сообщение mf_ »

leon78 писал(а): 23 июл 2024, 18:14 Во всех языках программирования, с которыми сталкивался, BOOL занимает 1 байт.
На всякий случай: в STEP7 TIA Portal переменная типа BOOL занимает 1 бит.
Аватара пользователя

keysansa
эксперт
эксперт
Сообщения: 2471
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 2121 раз
Поблагодарили: 208 раз

Codesys 3.5, структуры и UNION

Сообщение keysansa »

Имхо, лучше в данном случае использовать не структуру, а USINT. (0 бит - воскресенье/понедельник, 1 - понедельник/вторник и так далее)
и процедуру (Например, IsADay(ASource, const ADay) аналог TestBit или что-то свое, с константами, например, DAY_MONDAY...). Константы памяти особо не жрут, функции - тоже. Плюс, обмен упрощается (не надо структуру по сети пересылать, простой int16 - с запасом на всех протоколах).
И читаемый код получаем.
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.

Автор темы
leon78
эксперт
эксперт
Сообщения: 1146
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 49 раз
Поблагодарили: 134 раза

Codesys 3.5, структуры и UNION

Сообщение leon78 »

keysansa писал(а): 30 авг 2024, 21:59 Имхо, лучше в данном случае использовать не структуру, а USINT
Тогда лучше перечисление с типом USINT
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
Ответить

Вернуться в «Средний уровень автоматизации (управляющий)»