Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Программное обеспечение
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

CodeSys указатели на структуры

 Ответить Ответить
Автор
Сообщение
Pasa Смотреть выпадающим
Новичок
Новичок


Присоединился: 26 Июль 2013
Online Status: Offline
Публикации: 12
Свойства публикации Свойства публикации   Ответить, цитируя автора - Pasa Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: CodeSys указатели на структуры
    Опубликовано: 06 Август 2013 19:08
Объявил указатель на структуру. Подскажите синтаксис, как можно обратиться к полям структуры через этот указатель.

Заранее благодарю за помощь.

Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Август 2013 21:20
В области данных объявляется новый тип-структура, например Tstruct1:

TYPE Tstruct1 :
STRUCT
i1, i2: INT;
b1, b2: BYTE;
END_STRUCT
END_TYPE

потом в разделе данных программы создается переменная st1 типа Tstruct1,
и сразу указатель на тип pst1:
-----------------------------------------------
PROGRAM PLC_PRG
VAR
. . . . . . .
st1: Tstruct1;
pst1: POINTER TO Tstruct1;
. . . . . . .
. . . . . . .
END_VAR
------------------------------------------
в самой программе до использования указателя ему надо присвоить адрес переменной:
. . . . . . . .
pst1 := ADR(st1);

и после можно работать с элементами структуры через указатель экземпляра:
. . . . . . .
pst1^.i1 := 1234;

если есть переменная типа INT a1:INT
. . . . . . .
a := pst1^.i2;

можно обратиться к адресу отдельного элемента структуры,
например есть указатель на байт pb1: POINTER TO BYTE:
. . . . . . .
pb1 := ADR(pst1^.b2);

и потом присвоить элементу b2 значение pb1^ = 33;

А ваще всё это есть в мануале и начальные вопросы программирования лучше поднатужиться самому - оно полезно ..

С уважением, SAN
Наверх
Pasa Смотреть выпадающим
Новичок
Новичок


Присоединился: 26 Июль 2013
Online Status: Offline
Публикации: 12
Свойства публикации Свойства публикации   Ответить, цитируя автора - Pasa Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Август 2013 08:35
Спасибо большое. 
Мануалы я конечно же читал. И про указатели , и про структуры. Все объявил в проекте, все компилилось. Только вот момент об указателях на структуры и синтаксис обращения к полям я видимо где-то пропустил.
Теперь все стало ясно.

Наверх
Pasa Смотреть выпадающим
Новичок
Новичок


Присоединился: 26 Июль 2013
Online Status: Offline
Публикации: 12
Свойства публикации Свойства публикации   Ответить, цитируя автора - Pasa Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Август 2013 08:39
p.s. 
как я понимаю(по аналогии как в С typedef)  st1 можно и не объявлять, достаточно просто свой тип данных создать
Наверх
Pasa Смотреть выпадающим
Новичок
Новичок


Присоединился: 26 Июль 2013
Online Status: Offline
Публикации: 12
Свойства публикации Свойства публикации   Ответить, цитируя автора - Pasa Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Август 2013 20:51
Появились нюансы, вот такой код:

tmpQW256  AT %QW256:WORD;

TYPE OUT_VAR_TO_PANEL :
STRUCT
Year:WORD;
Mont:WORD;
Day:WORD;
Hour:WORD;
Minn:WORD;
Sec:WORD;
END_STRUCT
END_TYPE


ptOutVarToPanel : POINTER TO OUT_VAR_TO_PANEL;

ptOutVarToPanel:= ADR(tmpQW256);


В  варианте ниже пишется только 11 (записанные слова читаются панелью):
ptOutVarToPanel^.Year := 11;
ptOutVarToPanel^.Mont     := 22;
ptOutVarToPanel^.Day       := 33 ;
ptOutVarToPanel^.Hour     := 44 ;
ptOutVarToPanel^.Minn := 55 ;
ptOutVarToPanel^.Sec     := 66 ;


А в варианте ниже пишутся все ячейки правильно:

tmpQW256 :=  11;
tmpQW257 := 22;
tmpQW258 := 33;
tmpQW259  := 44;
tmpQW260  := 55;
tmpQW261  := 66;


А вот если работать с областью %MW , то все всегда работает правильно.
Почему запись в область выходов не работает через указатели?


Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 08 Август 2013 21:28

тык, что то не видно объявлений

.. tmpQW257, tmpQW258, tmpQW259, tmpQW260, tmpQW261

%QW - это объявление области выходов,  а если работа идет со словами так и надо объявлять двух-байтовые данные  %MW

С уважением, SAN

Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz