Доступ к полям блока данных
Абсолютный доступ к блокам данных В этом случае доступ похож к случаю обращения памяти CPU. Сначала задается идентификатор DB, сопровождаемый ключевым словом «D», потом префикс размера (например, X — для бита) и, наконец, адрес относительно начала DB. DWord := DB2. D11; //Обращение к двойному слову б) Индексированный доступ к блокам данных Индексированный доступ состоит из идентификатора DB… Читать ещё >
Доступ к полям блока данных (реферат, курсовая, диплом, контрольная)
Имеется различные способа доступа к полям блока данных. Ниже рассмотрим этих способов.
а) Абсолютный доступ к блокам данных В этом случае доступ похож к случаю обращения памяти CPU. Сначала задается идентификатор DB, сопровождаемый ключевым словом «D», потом префикс размера (например, X — для бита) и, наконец, адрес относительно начала DB.
Пример:
Bit := DB2. DX13.1; //Обращение к биту.
Byte := DB2. DB10; //Обращению к байту.
Word := DB2. DW20; //Обращение к слову.
DWord := DB2. D11; //Обращение к двойному слову б) Индексированный доступ к блокам данных Индексированный доступ состоит из идентификатора DB, идентификатора адреса (ключевое слово «D» и префикс размера) и индекса.
Пример
Bit := DB2. DX[Word_No, Bit_No]; //Обращение к биту.
Word := DB2. DW[5]; //Обращение к слову в) Структурированный доступ к блокам данных В этом случае для обращения к полям блока данных используется составное имя, разделенное с помощью точки. Например, для обращения к полю Val аналогового сигнала An[2] в блоке данных DB_Analog может использоваться следующее составное имя:
Val := DB_Analog.An[2]. Val;
Пример. Обработка:
FOR i:=1 TO 6 BY 1 DO.
Берем ссылку на текущий An из массива DB_Analog:
An := DB_Analog.An[i];
Формирование значения аналогового сигнала:
IF I0.0 = 0 THEN An. Val := 0.0; END_IF;
IF I0.0 = 1 THEN An. Val := 200.0; END_IF;
Проверка на аварийный уровень:
IF An. Val < An. rAlarmMin THEN An. bAlarmMin := 1; END_IF;
IF An. Val > An. rAlarmMax THEN An. bAlarmMax := 1; END_IF;
Если входим на диапазон, то аварийный сигнал снимаем:
IF An. Val > (An.rAlarmMin*1.05) THEN An. bAlarmMin := 0; END_IF;
IF An. Val < (An.rAlarmMax*0.95) THEN An. bAlarmMax := 0; END_IF;
Сохраняем обратно в блоке данных:
DB_Analog.An[i]: =An;
END_FOR;
Пример:
FUNCTION_BLOCK FB3.
VAR.
AUXVAR: REAL ;
MEASVAL: STRUCT //Структура для записи данных.
VOLTAGE:REAL ;
RESISTANCE:REAL ;
SIMPLEARR: ARRAY [1.2, 1.2] OF INT ;
END_STRUCT ;
PROCVAL: STRUCT //Структура для исходных данных.
VOLTAGE: REAL ;
RESISTANCE: REAL ;
SIMPLEARR: ARRAY [1.2, 1.2] OF INT ;
END_STRUCT ;
END_VAR.
BEGIN.
Присвоение структуры в целом:
MEASVAL := PROCVAL ;
Присвоение компонента структуры компоненту структуры:
MEASVAL.VOLTAGE := PROCVAL. VOLTAGE ;
Присвоение компонента структуры переменной того же типа:
AUXVAR := PROCVAL. RESISTANCE ;
Присвоение константы компоненту структуры:
MEASVAL.RESISTANCE := 4.5;
Присвоение константы элементу массива в структуре:
MEASVAL.SIMPLEARR[1,2] := 4;
END_FUNCTION_BLOCK.
Вызов функциональных блоков.
Когда Вы вызываете функциональный блок, Вы можете использовать как глобальные блоки данных, так и локальные блоки данных.
Вызов глобальным блоком данных В команде вызова определяются:
- * Имя функционального блока,
- * Блок данных,
- * Параметры функционального блока.
Вызов функции с глобальным блоком данных может быть абсолютным или символическим.
Пример. Абсолютный вызов функции:
FB10.DB20 (X1:=5,X2:=78,…);
Пример. Символический вызов функции:
DRIVE.ON (X1:=5,X2:=78,…);
Вызов как локального экземпляра FB.
В команде вызова определяются:
- * Имя локального экземпляра
- * Параметры FB
Вызов локального экземпляра всегда символический. Вы должны объявить символическое имя в разделе объявления вызывающего блока.
MOTOR (X1:=5,X2:=78,…);
Задание параметров функционального блока При вызове функционального блока Вы можете задать следующие параметры:
- * Входные параметры
- * Вход/выходные параметры
При вызове FB выходные параметры определять не нужно.
При задании параметров должны удовлетворяться следующие правила:
- * Присвоения могут идти в любом порядке.
- * Типы формальных и фактических параметров должны совпадать.
Использование входных/выходных параметров для получения результата При вызове функции на входные/выходные параметры можно закрепить переменную. Внутри функции вычисляется значение переменной. За пределами функции эту переменную можно использовать для получения вычисленного значения.
Пример:
FUNCTION_BLOCK TEST // Функц. блок TEST = FB17.
VAR_INPUT.
FINALVAL: INT; //Входной параметр
END_VAR.
VAR_IN_OUT.
IQ1: REAL; // Вход/выходной параметр
END_VAR.
VAR_OUTPUT.
CONTROL: BOOL; // Выходной параметр
END_VAR.
VAR.
INDEX: INT;
END_VAR.
BEGIN.
CONTROL :=FALSE;
FOR INDEX := 1 TO FINALVAL DO.
IQ1 :=IQ1*2;
IF IQ1 > 10 000 THEN.
CONTROL := TRUE;
END_IF;
END_FOR;
END_FUNCTION_BLOCK.
Вызов.
Для вызова FB, Вы можете выбрать один из следующих вариантов. Предполагается, что переменная VARIABLE1 была объявлена в вызывающем блоке как REAL.
Абсолютный вызов, глобальный экземпляр:
FB17.DB10 (FINALVAL:=10, IQ1:=VARIABLE1);
Символический вызов, глобальный экземпляр:
TEST.TEST1 (FINALVAL:=10, IQ1:= VARIABLE1);
После исполнения блока величина, вычисленная для входного/выходного параметра IQ1, доступна через переменную VARIABLE1.
Использование выходного параметра для чтения результата Два следующих примера показывают два возможных способа чтения выходного параметра CONTROL.
Выходной параметр доступен через:
RESULT:= DB10. CONTROL;
Использование выходного параметра:
FB17.DB12 (INP1:=DB10.CONTROL);
Пример.
FOR i:=1 TO 6 BY 1 DO.
Берем ссылку на текущий An из массива DB_Analog.
An := DB_Analog.An[i];
Формирование значения аналогового сигнала:
IF I0.0 = 0 THEN An. Val := 0.0; END_IF;
IF I0.0 = 1 THEN An. Val := 200.0; END_IF;
Проверка на аварийный уровень:
IF An. Val < An. rAlarmMin THEN An. bAlarmMin := 1; END_IF;
IF An. Val > An. rAlarmMax THEN An. bAlarmMax := 1; END_IF;
Если входим на диапазон, то аварийный сигнал снимаем:
IF An. Val > (An.rAlarmMin*1.05) THEN An. bAlarmMin := 0; END_IF;
IF An. Val < (An.rAlarmMax*0.95) THEN An. bAlarmMax := 0; END_IF;
Сохраняем обратно в блоке данных:
DB_Analog.An[i]: =An;
END_FOR;