Руководство пользователя по программированию плк в CoDeSys 3
Скачать 5.57 Mb.
|
TYPE < Имя > : < Целый тип > (<от>..<до>) END_TYPE; < Имя> любой допустимый МЭК идентификатор, <Целый тип> один из типов SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD). < от> константа, определяющая начало диапазона значений включительно. < до> константа, определяющая конец диапазона значений включительно. Пример: TYPE SubInt : INT (-4095..4095); END_TYPE Ограничение диапазона при объявлении переменной: VAR i : INT (-4095..4095); ui : UINT (0..10000); END_VAR При попытке присвоить переменной с ограниченным диапазоном константы, не попадающей в за- данный диапазон (например i := 5000;), CoDeSys даст сообщение об ошибке. Для контроля значений «ограниченных» переменных в процессе исполнения применяются функ- ции CheckRangeSigned или CheckRangeUnsigned. Они позволяют обрабатывать ошибки произ- вольным образом. Например, ограничить присваиваемое значение или сформировать флаги ошиб- ки. Первая функция работает для переменных со знаком, вторая для переменных без знака (unsigned). Изменять идентификаторы этих функций нельзя. Пример: Здесь применяется функция CheckRangeSigned, контролирующая переменные со знаком (как, на- пример, объявленная выше i). Функция «обрезает» присваиваемые значения по границам диапазо- на. FUNCTION CheckRangeSigned : DINT VAR_INPUT value, lower, upper: DINT; END_VAR IF (value < lower) THEN CheckRangeSigned := lower; ELSIF(value > upper) THEN CheckRangeSigned := upper; ELSE CheckRangeSigned := value; END_IF Приложение С: Типы данных CoDeSys CoDeSys V2.3 10-41 Функция вызывается автоматически при соответствующих операциях присваивания. Она получает три параметра: присваиваемое значение (value) и обе границы диапазона (lower, upper). Фактически присваивается возвращаемое CheckRangeSigned значение. Например, при присваивании i:=10*y происходит неявный вызов: i := CheckRangeSigned(10*y, -4095, 4095); В результате, даже если y > 1000, i не получит значение более 4095. Аналогично объявляется и функция CheckRangeUnsigned: FUNCTION CheckRangeUnsigned : UDINT VAR_INPUT value, lower, upper: UDINT; END_VAR Замечание: Если функции CheckRangeSigned или CheckRangeUnsigned не включены в проект, ограничение границ диапазонов во время исполнения работать не будет. Внимание: Если функции «обрезают» значения, как в вышеописанном примере существует опасность получить бесконечный цикл. Это может случиться, если условие окончания итераций цикла не достигается из-за искусственного ограничения значений переменной! Пример. Переменная ui не превысит 10000, и цикл FOR ни когда не закончится: VAR ui : UINT (0..10000); END_VAR FOR ui:=0 TO 10000 DO END_FOR Внимание: Функции CheckRange…, содержащащиеся в библиотеке Check.Lib, представляют собой пример реализации. Прежде чем использовать эту библиотеку, убедитесь, что данные функции работает так, как нужно в вашем случае, либо создайте собственные функции непосредственно в вашем проекте. Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-42 Приложение D: Библиотеки CoDeSys Стандартная библиотека Standard.lib Строковые функции Внимание: В многозадачных проектах необходимо сосредоточить всю работу со строками в одной задаче. При одновременном вызове одной и той же строковой функции из нескольких параллельных процессов возможно нарушение ее работы (перекрытие данных). LEN Возвращает длину строки. Аргумент STR типа STRING, возвращаемое значение типа INT. Пример IL: LD 'SUSI' LEN ST VarINT1 (* Результат: 4 *) Пример FBD: Пример ST: VarSTRING1 := LEN (‘SUSI’); LEFT Возвращает левую значимую часть строки заданной длины. Входная строка STR типа STRING, размер SIZE типа INT, возвращаемое значение STRING. LEFT (STR, SIZE) означает: взять первых SIZE символов от строки STR. Пример IL: LD 'SUSI' LEFT 3 ST VarSTRING1 (* Результат ‘SUS’ *) Пример FBD: Пример ST: VarSTRING1 := LEFT (‘SUSI’,3); RIGHT Возвращает правую значимую часть строки заданной длины. Входная строка STR типа STRING, размер SIZE типа INT, возвращаемое значение STRING. Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-43 RIGHT (STR, SIZE) означает: взять последних SIZE символов от строки STR Пример IL: LD 'SUSI' RIGHT 3 ST VarSTRING1 (*Результат: ‘USI’ *) Пример FBD: Пример ST: VarSTRING1 := RIGHT (‘SUSI’,3); MID Возвращает часть строки с указанной позиции указанной длины. Входная строка STR типа STRING, размер LEN и POS типа INT, возвращаемое значение STRING. MID (STR, LEN, POS) означает: вырезать LEN символов из STR строки, начиная с POS. Пример IL: LD 'SUSI' RIGHT 2,2 ST VarSTRING1 (* Результат: ‘US’ *) Пример FBD: Пример ST: VarSTRING1 := MID (‘SUSI’,2,2); CONCAT Конкатенация (объединение) двух строк. Обе входных строки STR1 и STR2 как и результат типа STRING. Пример IL: LD 'SUSI' CONCAT ‘WILLI’ ST VarSTRING1 (* Результат: ‘SUSIWILLI’ *) Пример FBD: Пример ST: VarSTRING1 := CONCAT (‘SUSI’,’WILLI’); Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-44 Обратите внимание: Функция CONCAT не работает при более чем 5 вложениях. INSERT INSERT вставляет строку в указанную позицию другой строки. Входные переменные STR1 и STR2 - типа STRING, POS - типа INT, возвращаемое значение - строка STRING. INSERT(STR1, STR2, POS) означает: вставить STR2 в STR1 в позиции POS. Пример IL: LD 'SUSI' INSERT ‘XY’,2 ST VarSTRING1 (* Результат: ‘SUXYSI’ *) Пример FBD: Пример ST: VarSTRING1 := INSERT (‘SUSI’,’XY’,2); DELETE DELETE удаляет часть строки с указанной позиции. Входные переменные STR типа STRING, LEN и POS типа INT, возвращаемое значение строка STRING. DELETE(STR, L, P) означает: удалить L символов из STR, начиная с позиции P. Пример IL: LD 'SUXYSI' DELETE 2,23 ST Var1 (* Результат: ‘SUSI’ *) Пример FBD: Пример ST: Var1 := DELETE (‘SUXYSI’,2,3); REPLACE REPLACE заменяет часть строки другой строкой с указанной позиции заданной длины. Входные переменные STR1 и STR2 типа STRING, LEN и POS типа INT, возвращаемое значение строка STRING. Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-45 REPLACE(STR1, STR2, L, P) означает: заменить L символов строки STR1 на STR2 начиная с по- зиции P. Пример IL: LD 'SUXYSI' REPLACE 'K', 2,2 ST VarSTRING1 (* Результат: ‘SKYSI’ *) Пример FBD: Пример ST: VarSTRING1 := REPLACE (‘SUXYSI’,’K’,2,2); FIND FIND ищет заданный контекст в строке. Входные переменные STR1 и STR2 типа STRING, возвращаемое значение INT. FIND(STR1, STR2) означает: найти позицию в строке STR1, где впервые встречается подстрока STR2. Нумерация позиций в строке начинается с 1. Если STR2 не найдена, STR1 возвращает 0. Пример IL: LD 'SUXYSI' FIND 'XY' ST VarINT1 (* Результат: ‘3’ *) Пример FBD: Пример ST: VarINT1 := FIND (‘SUXYSI’,’XY’); Переключатели SR Переключатель с доминантой включения: Q1 = SR (SET1, RESET) означает: Q1 = (NOT RESET AND Q1) OR SET1 Входные переменные SET1 и RESET - как и выходная переменная Q1 типа BOOL. Пример объявления: SRInst : SR ; Пример IL: Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-46 CAL SRInst(SET1 := VarBOOL1, RESET := VarBOOL2) LD SRInst.Q1 ST VarBOOL3 Пример FBD: Пример ST: SRInst(SET1:= VarBOOL1 , RESET:=VarBOOL2 ); VarBOOL3 := SRInst.Q1 ; RS Переключатель с доминантой выключения: Q1 = RS (SET, RESET1) означает: Q1 = NOT RESET1 AND (Q1 OR SET) Входные переменные SET и RESET1 - как и выходная переменная Q1 типа BOOL. Пример объявления: RSInst : RS ; Пример IL: CAL RSInst(SET := VarBOOL1, RESET1 := VarBOOL2) LD RSInst.Q1 ST VarBOOL3 Пример FBD: Пример ST: RSInst(SET:= VarBOOL1 , RESET1:=VarBOOL2 ); VarBOOL3 := RSInst.Q1 ; SEMA Программный семафор. BUSY = SEMA(CLAIM, RELEASE) означает: BUSY := X; IF CLAIM THEN X:=TRUE; ELSE IF RELEASE THEN BUSY := FALSE; X:= FALSE; END_IF X - это внутренняя BOOL переменная, изначально имеющая значение FALSE. Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-47 Входные переменные CLAIM и RELEASE - как и выходная переменная BUSY типа BOOL. (CLAIM – запрос захвата, RELEASE - освобождение) Семафор предназначен для организации асинхронного доступа к одному аппаратному ресурсу. Если при вызове семафора с CLAIM = TRUE возвращаемое значение BUSY = FALSE, то ресурс свободен (запрашивается впервые или уже освобожден вызовом RELEASE = TRUE). Возвращае- мое значение BUSY = FALSE, это означает, что ресурс занят. Пример объявления: SEMAInst : SEMA ; Пример IL: CAL SEMAInst(CLAIM := VarBOOL1, RELEASE := VarBOOL2) LD SEMAInst.BUSY ST VarBOOL3 Пример FBD: Пример ST: SEMAInst(CLAIM:= VarBOOL1 , RELEASE:=VarBOOL2 ); VarBOOL3 := SEMAInst.BUSY; Детекторы импульсов R_TRIG Функциональный блок R_TRIG генерирует импульс по переднему фронту входного сигнала. FUNCTION_BLOCK R_TRIG VAR_INPUT CLK : BOOL; END_VAR VAR_OUTPUT Q : BOOL; END_VAR VAR M : BOOL := FALSE; END_VAR Q := CLK AND NOT M; M := CLK; END_FUNCTION_BLOCK Выход Q равен FALSE до тех пор, пока вход CLK равен FALSE. Как только CLK получает значе- ние TRUE, Q устанавливается в TRUE. При следующем вызове функционального блока выход сбрасывается в FALSE. Таким образом, блок выдает единичный импульс при каждом переходе CLK из FALSE в TRUE. Пример объявления: RTRIGInst : R_TRIG ; Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-48 Пример IL: CAL RTRIGInst(CLK := VarBOOL1) LD RTRIGInst.Q ST VarBOOL2 Пример FBD: Пример ST: RTRIGInst(CLK:= VarBOOL1); VarBOOL2 := RTRIGInst.Q; F_TRIG Функциональный блок F_TRIG генерирует импульс по заднему фронту входного сигнала. FUNCTION_BLOCK F_TRIG VAR_INPUT CLK: BOOL; END_VAR VAR_OUTPUT Q: BOOL; END_VAR VAR M: BOOL := FALSE; END_VAR Q := NOT CLK AND NOT M; M := NOT CLK; END_FUNCTION_BLOCK Выход Q равен FALSE до тех пор, пока вход CLK равен TRUE. Как только CLK получает значе- ние FALSE, Q устанавливается в TRUE. При следующем вызове функционального блока выход сбрасывается в FALSE. Таким образом, блок выдает единичный импульс при каждом переходе CLK из TRUE в FALSE. Пример объявления: FTRIGInst : F_TRIG ; Пример IL: CAL FTRIGInst(CLK := VarBOOL1) LD FTRIGInst.Q ST VarBOOL2 Пример FBD: Пример ST: FTRIGInst(CLK:= VarBOOL1); Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-49 VarBOOL2 := FTRIGInst.Q; Счетчики CTU Функциональный блок ‘инкрементный счетчик’. Входы CU, RESET и выход Q типа BOOL, вход PV и выход CV типа WORD. По каждому фронту на входе CU (переход из FALSE в TRUE) выход CV увеличивается на 1. Вы- ход Q устанавливается в TRUE, когда счетчик достигнет значения заданного PV. Счетчик CV сбрасывается в 0 по входу RESET = TRUE. Пример объявления: CTUInst : CTU ; Пример IL: CAL CTUInst(CU := VarBOOL1, RESET := VarBOOL2, PV := VarINT1) LD CTUInst.Q ST VarBOOL3 LD CTUInst.CV ST VarINT2 Пример FBD: Пример ST: CTUInst(CU:= VarBOOL1, RESET:=VarBOOL2 , PV:= VarINT1); VarBOOL3 := CTUInst.Q ; VarINT2 := CTUInst.CV; CTD Функциональный блок ‘декрементный счетчик’. Входы CD, LOAD и выход Q типа BOOL, вход PV и выход CV типа WORD. По каждому фронту на входе CD (переход из FALSE в TRUE) выход CV уменьшается на 1. Когда счетчик достигнет 0, счет останавливается, выход Q переключается в TRUE. Счетчик CV загружа- ется начальным значением, равным PV по входу LOAD = TRUE. Пример объявления: CTDInst : CTD ; Пример IL: CAL CTDInst(CD := VarBOOL1, LOAD := VarBOOL2, PV := VarINT1) LD CTDInst.Q ST VarBOOL3 LD CTDInst.CV ST VarINT2 Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-50 Пример FBD: Пример ST: CTDInst(CD:= VarBOOL1, LOAD:=VarBOOL2 , PV:= VarINT1); VarBOOL3 := CTDInst.Q ; VarINT2 := CTDInst.CV; CTUD Функциональный блок ‘инкрементный / декрементный счетчик’. Входы CU, CD, RESET, LOAD и выходы QU и QD типа BOOL, PV и CV типа WORD. По входу RESET счетчик CV сбрасывается в 0, по входу LOAD загружается значением PV. По фронту на входе CU счетчик увеличивается на 1. По фронту на входе CD счетчик уменьшается на 1 (до 0). QU устанавливается в TRUE, когда CV больше или равен PV. QD устанавливается в TRUE, когда CV равен 0. Пример объявления: CTUDInst : CUTD ; Пример IL: CAL CTUDInst(CU := VarBOOL2, RESET := VarBOOL3, LOAD := VarBOOL4, PV := VarINT1) LD CTUDInst.QU ST VarBOOL5 LD CTUDInst.QD ST VarBOOL6 LD CTUDInst.CV ST VarINT2 Пример FBD: Пример ST: CTUDInst(CU := VarBOOL1, CU:= VarBOOL2, RESET := VarBOOL3, LOAD:=VarBOOL4 , PV:= VarINT1); VarBOOL5 := CTUDInst.QU ; VarBOOL6 := CTUDInst.QD ; Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-51 VarINT2 := CTUDInst.CV; Таймеры TP Функциональный блок ‘таймер’. TP(IN, PT, Q, ET) Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогич- но типов BOOL и TIME. Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. При переходе IN в TRUE выход Q уста- навливается в TRUE и таймер начинает отсчет времени (в миллисекундах) на выходе ET до дос- тижения длительности, заданной PT. Далее счетчик не увеличивается. Таким образом, выход Q ге- нерирует импульс длительностью PT по фронту входа IN. Временная диаграмма работы TP: Пример объявления: TPInst : TP; Пример IL: CAL TPInst(IN := VarBOOL1, PT := T#5s) LD TPInst.Q ST VarBOOL2 Пример FBD: Пример ST: TPInst(IN := VarBOOL1, PT:= T#5s); VarBOOL2 :=TPInst.Q; TON Функциональный блок ‘таймер с задержкой включения’. TON(IN, PT, Q, ET) Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET анало- гично типов BOOL и TIME. Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. Как только IN становится TRUE, начина- ется отсчет времени (в миллисекундах) на выходе ET до значения, равного PT. Далее счетчик не увеличивается. Q равен TRUE, когда IN равен TRUE и ET равен PT, иначе FALSE. Таким образом, выход Q устанавливается с задержкой PT от фронта входа IN. Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-52 Временная диаграмма работы TON: Пример объявления: TONInst : TON ; Пример IL: CAL TONInst(IN := VarBOOL1, PT := T#5s) LD TONInst.Q ST VarBOOL2 Пример FBD: Пример ST: TONInst(IN := VarBOOL1, PT:= T#5s); TOF Функциональный блок ‘таймер с задержкой выключения’. TOF(IN, PT, Q, ET) Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET анало- гично типов BOOL и TIME. Если IN равен TRUE, то выход Q = TRUE и выход ET = 0. Как только IN переходит в FALSE, на- чинается отсчет времени (в миллисекундах) на выходе ET. При достижении заданной длительно- сти отсчет останавливается. Выход Q равен FALSE, если IN равен FALSE и ET равен PT, иначе - TRUE. Таким образом, выход Q сбрасывается с задержкой PT от спада входа IN. Временная диаграмма работы TOF: Пример объявления: TOFInst : TOF ; Пример IL: CAL TOFInst(IN := VarBOOL1, PT := T#5s) LD TOFInst.Q ST VarBOOL2 Приложение D: Библиотеки CoDeSys CoDeSys V2.3 10-53 Пример FBD: Пример ST: TOFInst(IN := VarBOOL1, PT:= T#5s); VarBOOL2 :=TOFInst.Q; RTC Функциональный блок ‘часы реального времени’. После установки начального значения, RTC вы- дает текущие время и дату. RTC(EN, PDT, Q, CDT) Входы EN и PDT, выходы Q и CDT типов BOOL и DATE_AND_TIME со- ответственно. Пока EN равен FALSE, выход Q равен FALSE и CDT равен DT#1970-01-01-00-00:00:00. При включении EN = TRUE в часы загружается время PD и начинается отсчет времени. На выходе CDT. Если EN перейдет в FALSE, CDT сбросится в начальное значение DT#1970-01-01-00- 00:00:00. Обратите внимание, что установка времени PDT происходит по фронту. Библиотека UTIL.LIB Данная библиотека содержит дополнительный набор различных функций и функциональных бло- ков, применяемых для BCD и бит/байт преобразований, дополнительных математических функ- ций, а также регуляторов, генераторов и преобразований аналоговых сигналов. Специальная версия этой библиотеки UTIL_NO_REAL не содержит функций и функциональных блоков, использующих переменные типа REAL. |