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

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

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

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

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
освоился
освоился
Сообщения: 231
Зарегистрирован: 01 фев 2010, 10:37
Имя: Александр
Страна: Россия
город/регион: Брянск
Благодарил (а): 10 раз
Поблагодарили: 27 раз

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

Сообщение SaNNy »

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

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

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

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

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
эксперт
эксперт
Сообщения: 1031
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 34 раза
Поблагодарили: 110 раз

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

Сообщение leon78 »

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

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

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

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

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
Сообщения: 1455
Зарегистрирован: 17 окт 2012, 11:24
Имя: Виталий
Страна: Беларусь
город/регион: Минск
Благодарил (а): 61 раз
Поблагодарили: 181 раз

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

Сообщение Madwolf »

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

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

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

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

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

Сообщение leon78 »

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

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

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
эксперт
эксперт
Сообщения: 2330
Зарегистрирован: 20 дек 2018, 04:45
Имя: Сергей
Страна: РБ/РФ
город/регион: РФ Сергиев Посад
Благодарил (а): 1989 раз
Поблагодарили: 175 раз

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

Сообщение keysansa »

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

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