Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 18

Тема: Как правильно объявить структуру?

  1. #1

    По умолчанию Как правильно объявить структуру?

    Здравствуйте!
    Я новичок, только изучаю CoDeSys. Пробую в разделе глобальных переменных создать структуру по примеру из руководства:
    PHP код:
    VAR_GLOBAL
    TYPE STRUCT1
        STRUCT
        p1
    :INT;
        
    p2:INT;
        
    p3:DWORD;
    END_STRUCT
    END_VAR 
    Ругается (скрин ошибок ниже). Скажите пожалуйста, что не так делаю? Прилагаю проект.
    Изображения Изображения
    • Тип файла: jpg 1.jpg (48.4 Кб, Просмотров: 122)
    Вложения Вложения
    • Тип файла: zip main.zip (3.6 Кб, Просмотров: 23)

  2. #2

    По умолчанию

    VAR_GLOBAL уберите.

  3. #3

    По умолчанию

    Убрал. Но и сам пробовал уже. Ругается
    Код:
    Ошибка 4024: Global_Variables (1): Должно быть VAR_GLOBAL перед 'TYPE'

  4. #4

    По умолчанию

    Все верно. Потому что структуры нужно объявлять в особом месте, читаем справку Codesys :
    PHP код:
    Структуры 
    Структуры создаются на вкладке  Типы данных Организатора Объектов
    Объявление должно начинаться с ключевых слов TYPE и STRUCT и заканчиваться строками END_STRUCT и END_TYPE.

    Синтаксис:

    TYPE <Имя _структуры>:

    STRUCT

     
    <Объявление переменной 1>

     .

     .

     <
    Объявление переменной n>

    END_STRUCT

    END_TYPE

    <Имя _структурыобразует новый тип данныхкоторый может быть использован в любой части проекта наряду с базовыми типами.

    Вложенные структуры допускаютсяЕдинственное ограничение заключается в запрете размещения элементов структуры по прямым адресам (AT объявления недопустимы!).

    Пример объявления структуры по имени Polygonline:

    TYPE Polygonline:

    STRUCT

     Start
    :ARRAY [1..2OF INT;

     
    Point1:ARRAY [1..2OF INT;

     
    Point2:ARRAY [1..2OF INT;

     
    Point3:ARRAY [1..2OF INT;

     
    Point4:ARRAY [1..2OF INT;

     
    End:ARRAY [1..2OF INT;

    END_STRUCT

    END_TYPE

     

    Пример инициализации структуры
    :

    Poly_1:polygonline := ( Start:=3,3Point1 =5,2Point2:=7,3Point3:=8,5Point4:=5,7End := 3,5);

    Для доступа к элементам структуры используется следующий синтаксис:

    <
    Имя_структуры>.<Имя_компонента>

    Напримерструктура "Week" содержит компонент "Monday"обращение к которому будет выглядеть так:

    Week.Monday 

  5. #5

    По умолчанию

    Спасибо большое!
    Сам виноват, две страницы вниз не пролистал..
    Тему можно закрывать.

  6. #6

    По умолчанию

    ограничение заключается в запрете размещения элементов структуры по прямым адресам
    Вот эта штука сильно осложняет жизнь Нет ли какого либо обходного пути? Проблема такая - в var_global пара сотен переменных на которые забиндены адреса в modbus slave. Тяжело работать с таким количеством имён, вот если бы их как-то разделять на секции по устройствам (часто одинаковым) или по назначению, структуры бы подошли идеально, но...

  7. #7

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    А зачем увлекаться прямым заданием глобальных переменных, неужели нельзя проще в самом слейв-устройстве присвоить имя каждому каналу, вот и будет Вам группировка по секциям и точно так же в процессе работы они станут глобальными переменными
    Это плохая идея. Слейв там один, через него идёт обмен с сенсорной панелью и скадой. А теперь представьте что вы поменяли тип CPU, у вас ес-но слетел PLC Configuration и вам надо заново при помощи мыши заполнить всю эту богодельню (повторяю, около 200 переменных только обмен с сенс. панелью). Переменные однозначно надо описывать в VAR_GLOBAL, много проще переправить адреса в текстовом файле если что.

    Как образец реальный кусок обмена с паналью на конкурирующей системе (не CoDeSys, физ. адреса не нужны):
    =========================
    Код:
    TYPE
        PI : STRUCT
            PB        : REAL := 0.0;
            TI        : REAL := 0.0;
            DBand  : REAL := 0.0;
            FMT     : REAL := 0.0;(*Full movement time - s*)
            MinBreakTime    : REAL := 0.0; (*ms*)
            MinPulseTime    : REAL := 0.0; (*ms*)
        END_STRUCT;
    END_TYPE
    
            netPID : PI; // PI regulator of the network circuit
            b1PID : PI; // PI regulator of burner 1
            b2PID : PI; // PI regulator of burner 2
    =========================
    CoDeSys:
    Код:
    	iHWSPump1manSt		AT %QX6.4.0.0: BOOL;(*B24*)
    	iHWSPump2manSt		AT %QX6.4.0.1: BOOL;(*B25*)
    	alarmFlowIHWS		AT %QX6.4.0.2: BOOL;(*B26*)
    	alarmMot1IHWS		AT %QX6.4.0.3: BOOL;(*B27*)
    	alarmMot2IHWS		AT %QX6.4.0.4: BOOL;(*B28*)
    
    _здесь выкинут кусок переменных других устройств_
    
    	iHWSHiLimit		AT %QW6.45.0: WORD;(*W38*)
    	iHWSLoLimit		AT %QW6.46.0: WORD;(*W39*)
    	IHWSdelay		AT %QW6.47.0: WORD;(*W40*)
    
    _здесь выкинут ещё кусок ещё других устройств_
    _и снова булевские_
    
    	IHWSMan3WayLess	AT %QX6.140.0.2: BOOL;(*B2111*)
    	IHWSMan3WayMore	AT %QX6.140.0.3: BOOL;(*B2111*)
    _и т.д.
    Как бы это примерно могло выглядеть в CoDeSys:
    Код:
    iHWS : STRUCT (*Насос ГВС*)
    	pump1manSt		AT %QX6.4.0.0: BOOL;(*B24*)
    	pump2manSt		AT %QX6.4.0.1: BOOL;(*B25*)
    	alarmFlow		AT %QX6.4.0.2: BOOL;(*B26*)
    	alarmMot1		AT %QX6.4.0.3: BOOL;(*B27*)
    	alarmMot2		AT %QX6.4.0.4: BOOL;(*B28*)
    	man3WayLess		AT %QX6.140.0.2: BOOL;(*B2111*)
    	man3WayMore		AT %QX6.140.0.3: BOOL;(*B2111*)	
    	hiLimit			AT %QW6.45.0: WORD;(*W38*)
    	loLimit			AT %QW6.46.0: WORD;(*W39*)
    	delay			AT %QW6.47.0: WORD;(*W40*)
    END_STRUCT;
    
    iNet : STRUCT (*Насос сети*)
    	pump1manSt		AT %QX6.3.0.1: BOOL;(*B17*)
    	pump2manSt		AT %QX6.3.0.2: BOOL;(*B18*)
    _И Так Далее._
    
    END_STRUCT;
    Нет, жить можно, но когда за месяц проходят через руки несколько проектов на одну тему но с разными вводными - рехтование каждый раз общей свалки малость удручает. И просто думаешь - а вдруг я пропустил что-то очевидное, что используют другие.

    P.S. - Мда, чем больше я на свою-же статью смотрю, тем больше понимаю что основное зло не столько в запрете на структуры, сколько в самих физ адресах... Ладно, не важно.

  8. #8

    По умолчанию

    В развитие ответа capzap — указатель на структуру.
    Способ очень интересный, спасибо. Единственно сразу нашлась ложка дёгтя - биты напрямую упаковывать не удастся, поскольку CoDeSys под булевую переменную отводит 1 байт, после маппинга на абс. адрес в "PLC Config" получается что 1 это 1, 2 это 256, 4 это 65536 и т.д., т.е. в двойном слове без дополнительных извратов можно передать не более 4 булевых переменных, да ещё при этом на стороне скады/панели эту ситуёвину разруливать. Ну или и там структуру нарисовать если пакет программирования позволит.

  9. #9

    По умолчанию

    Угу, хорошо. Попробуем нарисовать тест:

    PHP код:
    (**********Структура************)
    TYPE singlePump : (*Насос с одним двигателем*)
    STRUCT
    (*    pumpEn    :bool; (*Пуск разрешён*)
        
    pumpManSt    :bool; (*Ручной пуск*)
    *)
        
    bools        :WORD;(*Булевые переменные (см.выше)*)
        
    img        :WORD; (*маска состояния 2#1-руч;2#10авар.;2#100раб.;*)
        
    flowDelay    :WORD; (*начальная задержка по протоку сек.*)
        
    maxGapTime    :WORD; (*максимальный провал на установленном потоке сек.*)
    END_STRUCT
    END_TYPE

    (**********Константы битов************)
    VAR_GLOBAL CONSTANT
        pumpEn
    :INT := 0; (*Пуск разрешён*)
        
    pumpManSt:INT := 1; (*Ручной пуск*)
    END_VAR

    (**********Экземпляры структур************)
    VAR_GLOBAL
        pump1
    ,pump2,pump3:POINTER TO singlePump;
    END_VAR

    (**********PLC_PRG************)
    (*
    Настраиваем начальные адреса структур (надо-бы перевесить на "Event Start")*)
    pump1 := ADR(%QW6.1.0);(*начальный адрес слейва панели*)
    pump2 := pump1 SIZEOF(pump1^);
    pump3 := pump2 SIZEOF(pump1^) ;

    (*
    Проверка доступности полей*)
    pump2^.pumpManSt := TRUE;
    pump1^.flowDelay := 5
    Ну в общем почти... Единственно что не нравится это секция "VAR_GLOBAL CONSTANT" - лишняя она, но с другой стороны пользовать "pump1^.bools.1" и каждый раз выяснять в комментах что это такое - тоже не дело.

  10. #10

    По умолчанию

    При тестировании выплыл ещё один косячок.

    Так размер структуры равен 8 байт:
    STRUCT
    bools :WORD;
    img :INT;
    temp :REAL;
    END_STRUCT

    А вот так 12 байт:
    STRUCT
    bools :WORD;
    temp :REAL;
    img :INT;
    END_STRUCT

    Данные при передаче понятно тоже сдвигаются. Помнится в Сях на этот случай был ключик #pragma pack. Здесь аналога похоже нет, так что надо иметь в виду...

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

Ваши права

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