Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
4
Добавлен:
12.09.2025
Размер:
5.84 Mб
Скачать

Приложение : Операторы и функции МЭК

10.6 Адресные операторы

Внимание: При онлайн коррекции кода, адреса переменных могут измениться. Не забывайте о такой вероятности, используя указатели.

Описанные в этом разделе операторы и функции не предписаны стандартом МЭК.

ADR

Функция адрес

ADR возвращает адрес аргумента в формате DWORD. Полученный адрес может быть передан функции в качестве аргумента или присвоен переменной типа указатель.

Пример IL:

LD

Var 1

ADR

 

ST

Var 2

man_fun1

ADRINST

При вызове функции ADRINST из экземпляра функционального блока она возвращает адрес экземпляра в DWORD. Данный адрес можно передавать в функции и использовать как указатель, либо его можно непосредственно присвоить переменной проекта типа указатель.

Пример ST (внутри экземпляра функционального блока):

dvar:=ADRINST(); (* Присваивание адреса экземпляра переменной dvar *) fun(a:=ADRINST()); (* Адрес экземпляра как аргумент функции *)

Пример IL:

ADRINST ST dvar ADRINST fun

BITADR

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

VAR

var1 AT %IX2.3:BOOL; bitoffset: DWORD;

END_VAR

Пример ST:

Bitoffset := BITADR(var1); (* Результат 19, если byte addressing=TRUE, или 35, если

byte addressing=FALSE*)

Пример IL:

LD Var1

BITADR

CoDeSys V2.3

10-13

Приложение : Операторы и функции МЭК

ST Var2

Косвенный оператор (content)

Косвенное обращение через указатель производится путем добавления оператора "^" после имени указателя.

Пример ST:

pt:POINTER TO INT; var_int1:INT; var_int2:INT;

pt := ADR(var_int1); var_int2:=pt^;

10.7 Вспомогательные функции

INDEXOF

Возвращает внутренний индекс POU.

Пример ST:

var1 := INDEXOF(POU2);

SIZEOF

Возвращает размер переменной в байтах.

Пример IL:

arr1:ARRAY[0..4] OF INT; Var1 INT

LD

arr1

SIZEOF

ST

Var 1 (* Результат 10 *)

Пример ST:

var1 := SIZEOF(arr1);

TIME

Функция TIME возвращает время в миллисекундах от начала работы системы в формате TIME.

Пример IL:

TIME

ST systime (*Результат, например.: T#35m11s342ms *)

Пример ST:

systime:=TIME();

CoDeSys V2.3

10-14

Приложение : Операторы и функции МЭК

Пример FBD:

INI

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

Синтаксис: <bool-Variable> := INI(<FB-instance, TRUE|FALSE)

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

Пример ST: fbinst экземпляр функционального блока fb, в котором определена retain переменная retvar.

Объявление:

fbinst:fb;

b:bool;

Фрагмент реализации:

b := INI(fbinst, TRUE);

ivar:=fbinst.retvar (* => retvar инициализирована *)

Пример IL:

LD fbinst INI TRUE ST b

Пример FBD:

10.8 Оператор вызова

CAL

Вызывает функциональный блок или программу.

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

Пример: Вызов экземпляра функционального блока Inst, где входные переменные Par1 и Par2 равны 0 и TRUE соответственно.

CAL INST(PAR1 := 0, PAR2 := TRUE)

10.9 Явное преобразование типов

Неявное преобразование данных из ‘большего’ типа в ‘меньший’ запрещено стандартом (например, из INT в BYTE или DINT в WORD). Если подобное преобразование действительно необходимо, оно должно быть выражено явно. Явные преобразования работают практически для всех базовых типов данных.

CoDeSys V2.3

10-15

Приложение : Операторы и функции МЭК

Синтаксис: <баз.Тип1>_TO_<баз..Тип2>

Преобразования в строку …_TO_STRING используют выравнивание влево. Если строка оказывается слишком короткой, результат будет обрезан.

BOOL_TO

Преобразование типа BOOL в другой тип:

Для числовых типов результат равен 1, когда операнд TRUE, и 0, если операнд FALSE.

Для типа STRING результат - это слово TRUE или FALSE.

Примеры IL:

 

 

 

 

LD

TRUE

 

 

 

BOOL_TO_INT

 

 

 

ST

I

 

(*Результат: 1 *)

LD

TRUE

 

 

 

BOOL_TO_STRING

 

 

 

ST

str

 

(*Результат: 'TRUE' *)

LD

TRUE

 

 

 

BOOL_TO_TIME

 

 

 

ST

t

 

(*Результат: T#1ms *)

LD

TRUE

 

 

 

BOOL_TO_TOD

 

 

 

ST

 

(*Результат: TOD#00:00:00.001 *)

LD

FALSE

 

 

 

BOOL_TO_DATE

 

 

 

ST

dat

 

(*Результат: D#1970-01-01 *)

LD

TRUE

 

 

 

BOOL_TO_DT

 

 

 

ST

dandt

(*Результат:DT#1970-01-01-00:00:01 *)

Примеры ST:

 

 

 

 

i:=BOOL_TO_INT(TRUE);

 

(* Результат:1 *)

str:=BOOL_TO_STRING(TRUE);

(* Результат:"TRUE" *)

t:=BOOL_TO_TIME(TRUE);

 

(* Результат:T#1ms *)

tof:=BOOL_TO_TOD(TRUE);

 

(* Результат:TOD#00:00:00.001 *)

dat:=BOOL_TO_DATE(FALSE);

 

(* Результат:D#1970 *)

dandt:=BOOL_TO_DT(TRUE);

 

(* Результат:DT#1970-01-01-00:00:01 *)

Примеры FBD:

 

 

 

 

CoDeSys V2.3

10-16

Приложение : Операторы и функции МЭК

(*Результат: 1 *)

(*Результат: 'TRUE' *)

(*Результат: T#1ms *)

(*Результат: TOD#00:00:00.001 *)

(*Результат: D#1970-01-01 *)

(*Результат: DT#1970-01-01-00:00:01 *)

TO_BOOL

Преобразование других типов в BOOL:

Результат TRUE, когда операнд не нулевой, иначе FALSE.

Для типа STRING, если строка состоит из слова "TRUE", результат равен TRUE, иначе FALSE.

Примеры IL:

LD

213

 

BYTE_TO_BOOL

 

ST

b

(*Результат: TRUE *)

LD

0

 

INT_TO_BOOL

 

ST

b

(*Результат: FALSE *)

LD

T#5ms

 

TIME_TO_BOOL

 

ST

b

(*Результат: TRUE *)

LD

'TRUE'

 

STRING_TO_BOOL

 

ST

b

(*Результат: TRUE *)

Примеры ST:

b := BYTE_TO_BOOL(2#11010101);

(* Результат: TRUE *)

b := INT_TO_BOOL(0);

(* Результат: FALSE *)

b := TIME_TO_BOOL(T#5ms);

(* Результат: TRUE *)

b := STRING_TO_BOOL('TRUE');

(* Результат: TRUE *)

Примеры FBD:

CoDeSys V2.3

10-17

Приложение : Операторы и функции МЭК

(*Результат: TRUE *)

(*Результат: FALSE *)

(*Результат: TRUE *)

(*Результат: TRUE *)

Преобразования между целочисленными типами

Преобразования из одного целочисленного типа в другой:

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

Пример ST:

si := INT_TO_SINT(4223);

(* Результат: 127 *)

Число 4223 (16#107F в шестнадцатеричной форме) сокращается до переменной типа SINT, теряя старший байт, и принимает значение 127 (16#7F в шестнадцатеричной форме).

Пример IL:

LD 2 INT_TO_REAL MUL 3.5

Пример FBD:

REAL_TO-/ LREAL_TO

Преобразования типов REAL или LREAL в другие типы:

Значение числа будет округлено вверх до целого и преобразовано в нужный тип. За исключением типов STRING, BOOL, REAL и LREAL. При преобразовании большего типа в меньший, вы рискуете потерять информацию.

При преобразовании в STRING используется до 16 цифр. Если строка имеет не достаточный размер, результат будет обрезан справа.

Пример ST:

 

 

i := REAL_TO_INT(1.5);

(* Результат: 2 *)

j := REAL_TO_INT(1.4);

(* Результат: 1 *)

i := REAL_TO_INT(-1.5);

(* Результат: -2 *)

j := REAL_TO_INT(-1.4);

(* Результат: -1 *)

Пример IL:

 

 

LD

2.7

 

REAL_TO_INT

 

GE

%MW8

 

Пример FBD:

 

 

CoDeSys V2.3

10-18

Приложение : Операторы и функции МЭК

TIME_TO/TIME_OF_DAY

Преобразования типов TIME или TIME_OF_DAY в другие типы:

Физически значение времени сохраняется в переменной типа DWORD, выраженное в миллисекундах (начиная с 0 часов для TIME_OF_DAY). Собственное это число и будет преобразовано. При преобразовании в меньший тип, вы рискуете потерять информацию.

При преобразовании в STRING образуется соответствующая МЭК текстовая строка.

Примеры IL:

 

 

 

LD

T#12ms

 

 

TIME_TO_STRING

 

 

ST

str

(*Результат: 'T#12ms' *)

LD

T#300000ms

 

 

TIME_TO_DWORD

 

 

ST

dw

(*Результат: 300000 *)

LD

TOD#00:00:00.012

 

 

TOD_TO_SINT

 

 

ST

si

(*Результат: 12 *)

Примеры ST:

 

 

 

str :=TIME_TO_STRING(T#12ms);

(* Результат: T#12ms *)

dw:=TIME_TO_DWORD(T#5m);

(* Результат: 300000 *)

si:=TOD_TO_SINT(TOD#00:00:00.012); (* Результат: 12 *)

Примеры FBD:

DATE_TO/DT_TO

Преобразования типов DATE или DATE_AND_TIME в другие типы:

Физически значение даты сохраняется в переменной типа DWORD, выраженное в секундах начиная с 1 января 1970 г. Это число и будет преобразовано. При преобразовании в меньший тип вы рискуете потерять информацию.

При преобразовании в STRING образуется соответствующая МЭК текстовая строка.

Примеры IL:

CoDeSys V2.3

10-19

Приложение

: Операторы и функции МЭК

LD D#1970-01-01

(* Результат FALSE *)

DATE_TO_BOOL

 

ST b

 

LD D#1970-01-15

(*Результат 29952 *)

DATE_TO_INT

 

ST i

 

LD DT#1970-01-15-05:05:05 (*Результат 129 *)

DT_TO_BYTE

ST byt

LD DT#1998-02-13-14:20 (*Результат 'DT#1998-02-13-14:20' *)

DT_TO STRING

ST str

Примеры ST:

b :=DATE_TO_BOOL(D#1970-01-01);

(* Результат: FALSE *)

i :=DATE_TO_INT(D#1970-01-15);

(* Результат: 29952 *)

byt :=DT_TO_BYTE(DT#1970-01-15-05:05:05);

(* Результат: 129 *)

str:=DT_TO_STRING(DT#1998-02-13-14:20);

(*Результат:'DT#1998-02-13-14:20'

*)

 

Примеры FBD:

STRING_TO

Преобразования типа STRING в другие типы:

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

CoDeSys V2.3

10-20

Приложение : Операторы и функции МЭК

Пример IL:

 

 

LD 'TRUE'

(*Результат: TRUE *)

 

STRING_TO_BOOL

 

ST b

 

 

LD 'abc34'

(*Результат: 0 *)

 

STRING_TO_WORD

 

ST w

 

 

LD 't#127ms'

(*Результат: T#127ms *)

 

STRING_TO_TIME

 

ST t

 

 

Примеры ST:

 

 

b :=STRING_TO_BOOL('TRUE');

(* Результат: TRUE *)

w :=STRING_TO_WORD('abc34');

(* Результат: 0 *)

t :=STRING_TO_TIME('T#127ms');

(* Результат: T#127ms *)

Примеры FBD:

TRUNC

Преобразование из REAL в INT. Используется только целочисленная часть аргумента.

При преобразовании в меньший тип вы рискуете потерять информацию.

Примеры ST:

i:=TRUNC(1.9);

(* Результат: 1 *)

i:=TRUNC(-1.4);

(* Результат: 1 *)

LD

2.7

 

TRUNC

 

GE

%MW8

 

CoDeSys V2.3

10-21