Эквивалентно последовательности инициализации 1, 2, 3, 1, 2, 3. — КиберПедия 

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Эквивалентно последовательности инициализации 1, 2, 3, 1, 2, 3.

2020-04-01 141
Эквивалентно последовательности инициализации 1, 2, 3, 1, 2, 3. 0.00 из 5.00 0 оценок
Заказать работу

Если число начальных значений, данных в перечне инициализации превышает число входов массива, лишние (самые* правые начальные значения будут отброшены. Если число начальных значений меньше, чем число входов массива, оставшиеся входы массива будут заполнены неявными начальными значениями для соответствующего типа данных. В любом случае, пользователь будет предупрежден об этой ситуации во время подготовки программы для выполнения.
________________
* Текст документа соответствует оригиналу. - Примечание изготовителя базы данных.


Определенное пользователем присваивание начального значения типа данных является свойством в таблице 11.

 

6.4.4.6 Структурированный тип данных

 

6.4.4.6.1 Общие положения

Объявление структурированного типа данных (STRUCT) указывает, что этот тип данных содержит совокупность подэлементов определенных типов, к которым можно осуществлять доступ под определенным именем, как показано в таблице 11.

Элемент структурированного типа данных представляется двумя или более идентификаторами, разделенными точкой.

Первый идентификатор представляет имя структурированного элемента, а последующие идентификаторы представляют последовательность имен элементов для доступа к конкретному элементу данных в структуре данных.

В качестве типа элемента структуры могут использоваться элементарные и определенные пользователем типы данных, типы функциональных блоков и классы.

Например, элемент типа данных ANALOG_CHANNEL_CONFIGURATION, объявленный в таблице 11, будет содержать подэлемент RANGE типа ANALOG_SIGNAL_RANGE, подэлемент MIN_SCALE типа ANALOG_DATA и подэлемент MAX_SCALE типа ANALOG_DATA.

Максимальное число элементов структуры, максимальное количество данных, которое может содержаться в структуре и максимальное число вложенных уровней адресации структурного элемента определяются разработчиком.

Две структурированных переменных являются совместимыми по присваиванию, только если они имеют одинаковый тип данных.

Пример - Объявление и использование структурированного типа данных и структурированной переменной.

 

a) Объявление структурированного типа данных

 

           

TYPE

 

ANALOG_SIGNAL_RANGE: (BIPOLAR_10V,

UNIPOLAR_10V);  

ANALOG_DATA: INT (-4095.. 4095);

ANALOG_CHANNEL_CONFIGURATION:

STRUCT

RANGE:

ANALOG_SIGNAL_RANGE;

MIN_SCALE: ANALOG_DATA:

MAX_SCALE: ANALOG_DATA;

END_STRUCT;

END_TYPE

b) Объявление структурированной переменной

VAR

MODULE_CONFIG: ANALOG_CHANNEL_CONFIGURATION;

 

     
  MODULE_8_CONF: ARRAY [1..8] OF ANALOG_CHANNEL_CONFIGURATION;


END_VAR

 

c) Использование переменных массива в языке ST:

MODULE_CONFIG.MIN_SCALE:= -2047;

MODULE_8_CONF[5].RANGE:= BIPOLAR_10V.

 

6.4.4.6.2 Инициализация

Неявные значения компонентов структуры даются их индивидуальными типами данных.

Пользователь может инициализировать компоненты структуры значениями, определенными пользователем. Такая инициализация имеет приоритет.

Пользователь может также инициализировать ранее определенную структуру, используя перечень присваиваний компонентам структуры. Данная инициализация имеет более высокий приоритет, чем неявная инициализация и инициализация компонентов.

Пример - Инициализация структуры

 

a) Объявление с инициализацией структурированного типа данных

TYPE

 

         
 

ANALOG_SIGNAL_RANGE:

 

(BIPOLAR_10V,

UNIPOLAR_10V):= UNIPOLAR_10V;

 

ANALOG_DATA: INT (-4095..4095);

ANALOG_CHANNEL_CONFIGURATION;

STRUCT

RANGE:

ANALOG_SIGNAL_RANGE;

MIN_SCALE: ANALOG_DATA:= -4095;

MAX_SCALE: ANALOG_DATA:= -4096;

END_STRUCT;

 

ANALOG_8BI_CONFIGURATION:

ARRAY [1..8] OF ANALOG_CHANNEL_CONFIGURATION

:= [8((RANGE:= BIPOLAR_10V))];

END_TYPE

b) Объявление с инициализацией структурированной переменной

VAR


     
 

MODULE_CONFIG: ANALOG_CHANNEL_CONFIGURATION

:= (RANGE:= BIPOLAR_10V, MIN_SCALE:= -1023);
 

MODULE_8_SMALL: ANALOG_8BI_CONFIGURATION

:= [8 ((MIN_SCALE:= -2047, MAX_SCALE:= 2048))];

END_VAR

6.4.4.7 Относительное положение элементов структурированных типов данных (AT)

 

6.4.4.7.1 Общие положения

Положения (адреса) элементов структурированного типа могут быть определены относительно начала структуры.

В этом случае, за именем компонента этой структуры следует ключевое слово AT и относительный адрес.

Объявление может содержать разрывы в расположении памяти.

Относительный адрес состоит из символа процента, определителя битового или байтового адреса. Байтовый адрес - это целый литерал без знака, обозначающий смещение в байтах. Битовый адрес состоит из смещения в байтах, следующего символа точки и смещения в битах, являющегося целым литералом без знака в диапазоне от 0 до 7. В относительном адресе не допускаются пробельные символы.

Компоненты структуры не должны перекрываться в расположении памяти, за исключением ситуации, когда в объявлении имеется ключевое слово OVERLAP.

Перекрытие строк находится вне области применения настоящего стандарта.

Примечание - Отсчет битового смещения начинается от самого правого бита с 0. Отсчет битового смещения начинается от начала структуры с 0.


Пример - Относительные адреса и перекрытие в структуре

TYPE

Com1_data: STRUCT

 

       
head AT %B0: INT; // в положении 0
length AT %B2: USINT=26; // в положении 2
flag1 AT %X3.0: BOOL; // в положении 3.0
end AT %B25: BYTE; // в положении 25, оставляя разрыв


END_STRUCT;

Com2_data: STRUCT OVERLAP

 

       
head AT %B0: INT; // в положении 0
length AT %B2: USINT; // в положении 2
flag2 AT %X3.3: BOOL; // в положении 3.3
data1 AT %B5: BYTE; // в положении 5, перекрывается
data2 AT %B5: REAL; // в положении от 5 до 8
end AT %B19: BYTE; // по адресу 19, оставляя разрыв


END_STRUCT;

Com_data: STRUCT OVERLAP // C1 и C2 перекрываются

 

C1 at %B0: Com1_data:

 

C2 at %B0: Com2_data;

 

   
  END_STRUCT;

END_TYPE

6.4.4.7.2 Инициализация

Структуры с перекрытием не могут явно инициализироваться.

 

6.4.4.8 Прямо представленные компоненты структуры - частично определенные с использованием.

Символ звездочки в таблице 11 может использоваться, чтобы обозначить еще не полностью определенные адреса для прямо представленных компонентов структуры.

Пример - Присваивание компонентов структуры еще не локализованным входным и выходным переменным.

TYPE

HW_COMP: STRUCT;

 

       
  IN

AT %I*: BOOL;

  VAL

AT %I*: DWORD;

  OUT AT %Q*: BOOL; OUT_VAR AT %Q*: WORD;
 

ITNL_VAR: REAL; // еще не локализован END_STRUCT;

END_TYPE


В случае, когда прямо представленный компонент структуры используется для назначения расположения в части объявлений программы, типа функционального блока или класса, на месте префикса размера и целого со знаком может использоваться звездочка для указания того, что прямое представление еще не полностью определено.

Использование этого свойства требует, чтобы положение структурированной переменной, объявленной таким образом, было полностью определено внутри конструкции VAR_CONFIG...END_VAR конфигурации для каждого экземпляра охватывающего типа.

Переменные такого типа не могут использоваться в секциях VAR_INPUT, VAR_IN_OUT и VAR_TEMP.

Ошибка возникает, если отсутствует какая-либо полная спецификация в конструкции VAR_CONFIG...END_VAR для какой-либо неполной спецификации адреса, выраженной символом в любом экземпляре программы или функционального блока, который содержит такие неполные спецификации.

 

6.4.4.9 Прямо порожденный тип данных

 

6.4.4.9.1 Общие положения

Определенные пользователем типы данных могут быть прямо порождены из элементарного типа данных или определенного пользователем типа данных.

Это может быть использовано для определения специфических для типа начальных значений.

Пример - Прямо порожденный тип данных

TYPE

 

     
  myInt1123: INT:= 123;
 

myNewArrayType: ANALOG_16_INPUT_DATA:= [8(-1023), 8(1023)];

Com3_data: Com2_data:= (head:= 3, length:=40);

END_TYPE

 

.R1: REAL:= 1.0;

R2: R1;

6.4.4.9.2 Инициализация

Неявное начальное значение равно начальному значению типа данных, из которого порожден новый тип. Пользователь может инициализировать тип данных определенным пользователем значением. Такая инициализация имеет приоритет.

Определенное пользователем начальное значение элементов структуры может быть объявлено в перечне, заключенном в скобки и следующим за идентификатором типа данных. Элементы, начальное значение которых не перечислено в перечне инициализации, имеют неявные начальные значения, объявленные для них в объявлении оригинального типа данных.

Пример 1 - Использование определенных пользователем типов данных

С учетом объявлений ANALOG_16_INPUT_DATA в таблице 11 и объявления VAR INS: ANALOG_16_INPUT_DATA; END_VAR переменные от INS[1] до INS[16] могут использоваться везде, где могут использоваться переменные типа INT.

Пример 2

Аналогично, с учетом объявления Com_data в таблице 11 и, дополнительно, объявления VAR telegram: Com_data; END_VAR переменная telegram.length может использоваться везде, где может использоваться тип USINT.

Пример 3

Это правило может применяться рекурсивно:

С учетом объявления ANALOG_16_INPUT_CONFIGURATION, ANALOG_CHANNEL_CONFIGURATION и ANALOG_DATA в таблице 11 и объявления VAR CONF: ANALOG_16_INPUT_CONFIGURATION; END_VAR переменная CONF.CHANNEL[2].MIN_SCALE может использоваться везде, где может использоваться тип INT.

 

6.4.4.10 Указатели

 

6.4.4.10.1 Объявление указателя

Указатель - это переменная, которая содержит только ссылку на переменную или на экземпляр функционального блока. Указатель может иметь значение NULL, то есть он не ссылается ни на что.

Указатели объявляются для определенных типов данных, используя ключевое слово REF_TO и ссылочный тип данных - тип данных, на который производится ссылка. Ссылочный тип данных уже должен быть определен. Им может являться элементарный тип данных или определенный пользователем тип данных.

Примечание - Указатели без привязки к типу данных выходят за пределы настоящего стандарта.


Пример 1

 

TYPE

           
  myArrayType:

ARRAY[0..999] OF INT;

   
  myRefArrType: REF_TO myArrayType; // определение указателя
  myArrOfRefType:

ARRAY [0..12] OF myRefArrType; // определение массива ссылок


END_TYPE

VAR

 

           
  myArray1: myArrayType;      
  myRefArr1: myRefArrType; // определение указателя
  myArrOfRef:END_VAR myArrOfRefType; // определение массива указателей


Ссылка должна ссылаться только на переменные указанного ссылочного типа данных. Указатели на прямо порождаемые типы данных обрабатываются как псевдонимы указателей на базовый тип данных. Прямое порождение может применяться несколько раз.

Пример 2

TYPE

myArrType1: ARRAY[0..999] OF INT;

myArrType2: myArrType1;

myRefType1: REF_TO myArrType1;

myRefType2: REF_TO myArrType2;

END_TYPE

myRefType1 и myRefType2 могут ссылаться на переменные типа ARRAY[0..999] OF INT и производных типов данных.

Ссылочный тип данных указателя может также являться типом функционального блока или классом. Указатель базового типа может также ссылаться на экземпляры, порожденные из этого типа данных.

Пример 3

 

         

CLASS F1...

END_CLASS;

CLASS F2 EXTENDS F1...

TYPE

END_CLASS;
  myRefF1:

REF_TO F1;

  myRefF2:

REF_TO F2;

END_TYPE


Указатели типа myRefF1 могут ссылаться на экземпляры классов F1, F2 и на производные от них классы. Однако указатели типа myRefF2 не могут ссылаться на экземпляры класса F1, а могут ссылаться только на экземпляры класса F2 и производные от него, так как класс F1 может не поддерживать методы и переменные расширенного класса F2.

 

6.4.4.10.2 Инициализация указателей

Указатели могут инициализироваться значением NULL (неявно) или адресом уже объявленных переменных, экземпляров функционального блока или класса.

Пример -

FUNCTION_BLOCK F1... END_FUNCTION_BLOCK;

VAR

 

       
 

myInt:

INT;
 

myRefInt:

REF_TO INT:= REF(myInt);
  myF1:

F1;

 

myRefF1:

REF_TO F1:= REF(myF1);


END_VAR

 

6.4.4.10.3 Операции с указателями

Оператор REF() возвращает указатель на заданную переменную или экземпляр. Ссылочным типом данных возвращенного указателя является тип данных заданной переменной. Применение оператора REF() к временной переменной (например, переменным любой секции VAR_TEMP или любым переменным внутри функций) не разрешается.

Указатель может быть присвоен другому указателю, если его ссылочный тип данных эквивалентен базовому типу или является ссылочным типом данных присвоенного указателя.

Указатели могут присваиваться параметрам функций, функциональных блоков и методов в вызове, если ссылочный тип данных параметра эквивалентен базовому типу или является базовым типом ссылочного типа данных. Ссылки не могут использоваться как входные-выходные переменные.

Если указатель присвоен указателю такого же типа данных, то последний ссылается на ту же самую переменную. В таком случае, прямо порожденный тип данных рассматривается так же, как его базовый тип.

Если указатель присваивается указателю на такой же тип функционального блока или базовый тип функционального блока, то затем этот указатель указывает на тот же самый экземпляр, но является все еще связанным со своим типом функционального блока, то есть может использовать только переменные и методы своего ссылочного типа данных.

Разыменование указателей осуществляется явно.

Указатель разыменовывается использованием предшествующего символа крышки.

Разыменованный указатель может использоваться так же, как прямо используется переменная. Разыменованный указатель на NULL является ошибкой.

Примечание 1 - Возможные проверки указателей на NULL может производиться во время компиляции, системой поддержки выполнения программы или прикладной программой.


Конструкция REF() и оператор разыменования используются в графических языках при определении операндов.

Примечание 2 - Арифметические операции с указателями не рекомендуются и не входят в задачу настоящего стандарта.


Пример 1

TYPE

S1: STRUCT

SC1: INT;

SC2: REAL;

END_STRUCT;

A1: ARRAY[1..99] OF INT;

END_TYPE

VAR

myS1: S1;

myA1: A1;

myRefS1: REF_TO S1:= REF(myS1);

myRefA1: REF_TO A1:= REF(myA1);

myRefInt: REF_TO INT:= REF(myA1[1]);

END_VAR

myRefS1^.SC1:= myRefA1^[12]; // в данном случае, это эквивалентно S1.SC1:= A1[12];

myRefInt:= REF(A1[11]);

 

S1.SC1:= myRefInt^; // присваивает значение переменной A1[11] элементу структуры S1.SC1

Пример 2

Графическое представление операторов из примера 1


В таблице 12 приведены свойства операций с указателями.


Таблица 12 - Операции с указателями

       
Номер Описание

Пример

  Объявление
1 // определение типа указателя

TYPE

      myRefType: REF_TO INT;
   

END_TYPE

 

Присваивание и сравнение

2a Присваивание указателя указателю

<указатель>:= <указатель>

myRefType1:= myRefType2;

2b Присваивание указателя параметру функции, функционального блока или метода

myFB (a:= myRefS1);

Типы должны быть эквивалентными

2a Сравнение с NULL

IF myInt = NULL THEN...

  Создание ссылки 3a REF(<переменная>) Предоставляет типизированную ссылку на переменную

myRefA1:= REF (A1);

3b REF(<экземпляр функционального блока>) Предоставляет типизированную ссылку на экземпляр функционального блока или класса

myRefFB1:= REF(myFB1)

  Разыменование 4 <указатель>^ Предоставляет содержимое переменной или содержимое экземпляра, на которые ссылается переменная указателя

mylnt:= myA1Ref^[12];

6.5 Переменные


Поделиться с друзьями:

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.129 с.