Language reference
언어 참조

프로젝트 구조

공통 오브젝트

SFC 언어

FC 언어

FBD 언어

LD 언어

ST 언어

IL 언어

표준 operators / function blocks / functions


Project architecture
 프로젝트 구성 (Architecture)

ISaGRAF 프로젝트는 복수 프로그램으로 성립되어 있습니다. 각각의 프로그램이 tree구성으로 연결 되고, 하나의 프로젝트를 형성하고 있습니다. 프로그램은 SFC, FC（Flow Chart）,FBD, LD, ST, IL의 ６-언어 에서 만들어집니다.

프로그램

Cyclic 및 sequential 동작

서브-SFC and FC 프로그램

Functions 과 서브-프로그램(sub-programs)

Function Blocks

6언어 설명

실행 규칙


Programs
프로그램

프로그램은 하나의 unit한 것으로, 프로세스 중의 변수사이의 조작을 기술하고 있습니다.

프로그램에는 sequential한 부분과 Cyclic한 부분이 있습니다.

Cyclic한 프로그램과는 타겟의 Scan마다 실행되는 프로그램이고,

sequential한 프로그램은 ＳＦＣ언어 또는 ＦＣ언어의 룰에 기초해서 실행됩니다.

각 프로그램은 서로 계층적으로 link되고 있습니다.

top레벨의 프로그램은 시스템에 따라 작동됩니다. 서브프로그램（서브 계층）은 이들의 Father프로그램에 따라 작동됩니다. 각 프로그램은 ６종류의 언어의  장소에 따라서 그 중 하나의 언어로 기술됩니다:

Sequential Function Chart (SFC) 고급 레벨 프로그램

Flow Chart (FC) 고급 레벨 프로그램

Function Block Diagram (FBD)  cyclic complex 동작

Ladder Diagram (LD) 2진 값 동작만

Structured Text (ST) 모든cyclic 동작

Instruction List (IL) 낮은 레벨 동작

LD와 FBD가 동일 프로그램 중에 같이 사용할 수 있다는 것을 제거하면, 동일 프로그램에는 복수 프로그램을 섞이게 할 수 없습니다.


Cyclic and sequential operations
Cyclic 및 sequential 동작

프로그램 계층은 5개의 메인 그룹(Section)으로 나눠집니다.:

Begin	매 사이클의 처음에 실행 되는 프로그램

Sequential	다이나믹한 룰에 따른 SFC / FC 프로그램

End	매 사이클 마지막에 실행 되는 프로그램

Functions	서브 프로그램 집합

'Begin' 과 'End' 섹션은 Cyclic한 동작을 기술하고, 시간에 의존하지 않는 프로그램입니다. Sequential 섹션 프로그램은 sequential한 동작을 기술하고, 같은 시기 등의 시간 의존형 프로그램입니다. 'Begin' 섹션 메인 프로그램은 runtime사이클마다 처음에 실행됩니다. 'End' 섹션 메인 프로그램은 runtime사이클 마지막에 실행됩니다. sequential' 섹션 메인 프로그램은 SFC와 FC 다이나믹 룰에 기초해서 실행됩니다.

"액션" 섹션 프로그램은 프로젝트 내의 다른 프로그램에서 호출되는 서브 프로그램을 나타냅니다.

"액션"　섹션 프로그램은 같은 섹션 프로그램을 호출할 수 있습니다.

sequential섹션에서의 메인 Child프로그램은 반드시 ＳＦＣ 또는 ＦＣ언어로 기술되어야만 합니다. 사이클릭 섹션의begin과  end는 ＳＦＣ 또는 ＦＣ언어에서는 기술할 수 없습니다. 어느 프로그램도 하나 이상의 서브프로그램을 가질 수 있습니다. sequential 섹션 프로그램은 하나 이상의 ＳＦＣ, ＦＣ Child프로그램을 가질 수 있습니다. 서브프로그램은 ＳＦＣ 또는 ＦＣ언어로 기술할 수 없습니다.

Begin 섹션 프로그램은 입력 디바이스 필터링해서 집어넣는 초기적인 처리（변환 관수 등）에 사용되는 일이 많습니다. 이렇게 집어넣은 변수는 자주 sequential섹션 으로 사용됩니다. End 섹션 프로그램은 sequential섹션 으로 사용된 후 처리（내부변수를 외부 출력 디바이스로 송출하는 것같이 처리）를 할대 사용됩니다.


Child SFC and FC programs
서브-SFC / FC 프로그램

sequential섹션의 어떤 ＳＦＣ, ＦＣ프로그램도 다른 ＳＦＣ, ＦＣ프로그램을 컨트롤할 수 있습니다.

Child ＳＦＣ 프로그램은 parallel처리프로그램으로 다루어집니다. 즉, Father프로그램에서 작동, 정지(kill), 동결(frozen), 재작동 시킬 수 있습니다. 단, Father프로그램도 Child 프로그램도 ＳＦＣ언어로 적혀져 있어야만 합니다.　 Child ＳＦＣ프로그램은 지역변수, 지역정의를 가질 수 있습니다.

Father프로그램이 Child ＳＦＣ 프로그램을 작동 시켰을때 ＳＦＣ token을Child ＳＦＣ 프로그램 이니셜 스텝에 set합니다. 이 작동 커맨드는 GSTART 스테이트먼트로 기술됩니다. 만약 Father프로그램이 Child ＳＦＣ 프로그램을 정지(kill)시키면 Child 프로그램 스텝에 존재하고 있던 모든 token을 clear시킵니다. 이 정지 커맨드는GKILL statement로 기술됩니다

Father프로그램이 Child ＳＦＣ 프로그램을 동결(frozen)시키면 Child 프로그램 존재하고 있던 모든 token을 clear하지만, 이들의 상태는 메모리에 보존됩니다.　이 동결 커맨드는GFREEZE 스테이트먼트로 기술됩니다. Father프로그램이 동결한 Child ＳＦＣ 프로그램을 재작동하면, 동결시에 clear된 token가 복원됩니다. 이 재작동 커맨드는 GRST 스테이트먼트로 기술됩니다.

ＦＣ프로그램에서 sequential섹션 ＦＣ프로그램은 다른 ＦＣ 서브프로그램（ChildＦＣ프로그램）을 읽어 낼 수 있습니다. ＳＦＣ과 다른 FatherＦＣ프로그램은 ＦＣ서브프로그램이 실행 중에는 처리가 서스펜드되어 있습니다. ＦＣ프로그램에서는 Father프로그램과 ＦＣ서브프로그램이 동시에 실행할 수 없습니다.

서브프로그램은 Father프로그램에서 작동됩니다. 단, 이때 Father프로그램의 실행은 서브프로그램이 종료할 때까지 suspend 됩니다.


Functions and sub-programs
Functions 과 서브-프로그램 (sub-programs)

main	서브-프로그램

어떤 섹션 프로그램도 하나 이상의 서브프로그램을 가질 수 있습니다. 서브프로그램은 한사람의 Father프로그램에 따라 소유됩니다. 서브프로그램은 지역변수와 지역정의를 가질 수 있습니다. ＳＦＣ, ＦＣ이외의 프로그램은 서브프로그램으로서 기술할 수 있습니다. "Function" 섹션 프로그램은 프로젝트내의 다른 프러그램에서 호출되는 서브프로그램으로서 사용됩니다. "Function" 섹션 프로그램은 같은 섹션의 다른 프로그램을 호출할 수 있습니다.

주의:	 ISaGRAF는 Recursive한 처리를 지원 하고 있지 않습니다. 만약 "Function" 섹션 프로그램이 자신과 자기의 서브프로그램에서 호출되는 경우와 같은 runtime에러가 발생합니다.

서브프로그램의 interface는 타입과 유일한(unique) 이름을 입출력 파라미터를 갖고 정확하게 정의되어야만 합니다. ST언어의 룰에 기초해서 출력 파라미터명은 서브프로그램과 같은 이름 이어야 할 필요가 있습니다..

다음에서 서브프로그램 본체에 출력 파라미터를 설정하는 방법을 언어마다 정리합니다.:

ST:	출력파라미터는 서브프로그램명과 같게 합니다

(the same name as the sub-program):

   subprog_name := <expression>;

IL:	sequence 마자막 에서 현재 결과의 값（IL register）이 출력 파라미터에 설정 합니다:

   LD      10

   ADD   20   (* return 파라미터 value = 30 *)

FBD:	출력 파라미터와 서브프로그램명을 같게 합니다:

서브프로그램명(subprog_name)

LD:	출력 파라미터와 서브프로그램명을 같게 합니다:

서브프로그램명(subprog_name)


Function Blocks

Function blocks 은 LD, FBD, ST 또는 IL 을 사용하여 작성 할 수 있다 :

function block의 지역 변수들은 각각의 인스턴스를 복사 하면서 초기화를 한다는 의미이다. 프로그램 내에서 block을 호출 한다는 것은 , block의 인스턴스를 호출 하는 것 이다:

주의:

- function block이 IEC 언어중 하나로 기술되었다면 다른function block을 호출 하는 것은 불가능 하다: instanciation mechanism 은 단지block의 지역변수 자체만 관여 하기 때문이다. 다음은 표준 function block의 항목들 이다. 역시IEC function block 내에서는 사용 불가능 하다:

SR, RS, R_Trig, F_Trig, SEMA, CTU, CTD, CTUD, TON, TOF, TP, CMP, StackInt, AVERAGE, HYSTER, LIM_ALRM, INTEGRAL, DERIVATE, BLINK, SIG_GEN

- 같은 이유로 다음은 사용이 불가능 하다 : Positive / Negative 연결 / 코일 / Set / Reset 코일.

- 타이머를 시작/정지 시키기 위한 TSTART -- TSTOP functions 은 function block에서 사용 가능 하다.(버젼3.2 이후 가능)

- function block내에서 루프가 필요한 경우,루프를 사용하기 전에 지역변수를 사용 하여야 한다.

동작 않함:	동작:


Description language
6-언어 설명

프로그램은 다음의 6-언어(그래픽/문법)중 어느것으로도 작성 가능 합니다:

Sequential Function Chart (SFC) 고급 레벨 프로그램

Flow Chart (FC) 고급 레벨 프로그램

Function Block Diagram (FBD)  cyclic complex 동작

Ladder Diagram (LD) 2진 값 동작만

Structured Text (ST) 모든cyclic 동작

Instruction List (IL) 낮은 레벨 동작

LD와 FBD가 동일 프로그램 중에 같이 사용할 수 있다는 것을 제거하면, 동일 프로그램에는 복수 프로그램을 섞이게 할 수 없습니다.


Execution rules
실행 규칙

ISaGRAF는 동기형시스템(Synchronous System)입니다. 모든 처리는 기본 clock에 따라 작동됩니다. 이 clock의 주기를 여기서는 사이클 타임이라 부릅니다.（PLC에서는 "ScanTime" 이라 부르는 경우도 있지만 ISaGRAF 에서는 Scan에 사용하지 않는 Free타임을 포함한 기간을 나타냅니다.）:

이 시스템은 다음을 가능하게 합니다.:

- 사이클 타임중엔 입력변수는 같은 값인 것이 보증 됩니다

- 출력변수는 사이클 타임중엔 １회만 변경됩니다

- 다른 프로그램에서 글로벌 변수를 안전하게 다룰 수 있습니다

- 어플리케이션 전체 응답시간을 예측 또는 제어할 수 있습니다


Common objects
 공통 오브젝트

여기서는ISaGRAF 프로그램 데이터페이스의 공통 오브젝트에 관해서 설명 합니다.

이 공통 오브젝트는SFC, FBD, LD, ST 또는 IL 언어 중에 사용됩니다.

기본타입

정수표현

변수

주석

예약어


Basic types
기본 타입

프로그램에서 사용되는 정수,변수에는 이하의 기본 타입이 있습니다.

그래픽한 프로그램에서도 언어 base프로그램에서도 이 타입은 같이 다루어집니다:

이진형(BOOLEAN):	참/거짓 논리값

실/정수형(ANALOG):	정/실수 연속값

타임형(TIMER):	시변값

메세지형(MESSAGE):	문자열

타임형 값은 최대가 하루의 길이로 시간을 보존하기 위해 사용할 수 없습니다.


Constant expressions
상수 표현

상수는 한 타입만 가질 수 있습니다.

다른 타입으로 같은 표현의 상수는 정의할 수 없습니다.

(Boolean) 이진형 정수

(Integer analog) 정수형

(Real analog) 실수형 정수

(Time) 타임형 정수

메세지형 정수


Boolean constant expressions
(Boolean) 이진형 정수

boolen형 정수에는 이하의 두가지가 있습니다:

TRUE	정수값 1과 같다

FALSE	정수값 0과 같다

"True" 와 "False" 는 키워드에 등록되어 있고, 대소문자의 구별은 없습니다.


Integer analog constant expressions
(Integer analog) 정수형

정수값은 번호붙인 32Bit값으로 2147483647에서 +2147483647의 값을 가집니다. 이하의 기술 방법으로 표현됩니다. Prefix에 따라 base를 정하고 있습니다.

base	Prefix	예
DECIMAL	(none)	-908
HEXADECIMAL	"16#"	16#1A2B3C4D
OCTAL	"8#"	8#1756402
BINARY	"2#"	2#1101_0001_0101_1101

BINARY표현에서 사용되고 있는 언더스코어('_')는 구분에 목적이 있고, 의미는 없습니다. ２진수를 읽기 쉽게 하기 위한 것입니다.


Real analog constant expressions
(Real analog) 실수형 정수

실수형 정수표현은１０진수 및 유동 소수점이 표시됩니다. 정수값 과의 차이를 표현하기 위해 소수점('.')을 사용합니다. 유동 소수점 표현은 Ｅ 또는Ｆ를 사용해서 exponent부분을 표시합니다. exponent부는 37에서 +37의 값을 가집니다. 이하에 실수형 정수표현 예를 나타냅니다.

3.14159、	-1.0E+12、

+1.0、	1.0F-15、

-789.56、	+1.0E-37

"123"은 실수형 정수가 아닙니다. 바른 표현 방법은 "123.0"입니다


Timer constant expressions
(Time) 타임형 정수

타임형 정수값은 ０초에서 23시간59분59초999미리초（23h59m59s999ms）까지 정의 가능합니다. 최소단위는 ms입니다.

Hour	"h" 가 시간 뒤에 붙습니다.

Minute	"m" 이 분 뒤에 붙습니다.

Second	"s"가 초 뒤에 붙습니다.

Millisecond	"ms"가  milisec 뒤에 붙습니다.

타임형 정수를 표기할 때는 반드시 "T#" 또는 "TIME#" prefix를 첨가할 필요가 있습니다. 대소문자의 구별은 없습니다.

T#1H450MS	1 hour, 450 milliseconds

time#1H3M	1 hour, 3 minutes

예를 들면 "0"은 타임형 정수는 아니고, 단순한 정수형 정수값이 됩니다.


Message string constant expressions
메세지형 정수

문자열 또는 문자열형 정수는 반드시‘ ’（모두 반각문자）로 정리할 필요가 있습니다.

ST프로그램 등에서 사용될 때 따를 필요가 있습니다. 예를 들면

                        이것은 문자열입니다.'

 	(‘）는 문자열형 정수 안에 포함시킬 수 없습니다. 문자열형 정수는 소스코드 내에 1행에 전부 담겨져야 합니다. 최대 255반각 문자（스페이스도 포함）길이입니다.

공란의 문자열형 정수는 두개의 어프스토로피 （‘’）로 표현됩니다.

터브와 스페이스는 포함되지 않습니다.

''   (* 공란의 문자열형 정수  *)

변수목록 편집기에서 문자열형 정수의 초기치를 줄 경우에는 최대장을 지정하고,（‘）을 부치지 않고 직접   문자열형을 씁니다.

인쇄 불가능한 문자를 표현할 경우에 ('$')심벌을 사용합니다. 이하에서는 몇 개의 예를 나타냅니다.

문자표현	의미	Ascii (hexa)	예
$$	'$' character	16#24	'I paid $$5 for this'
$'		16#27	'Enter $'Y$' for YES'
$L		16#0a	'next $L line'
$R		16#0d	'   llo $R He'
$N	새로운 행	16#0d0a	'This is a line$N'
$P	새 페이지	16#0c	'lastline $P first line'
$T	터브	16#09	'name$Tsize$Tdate'
$hh   (*)	임의 문자	16#hh	'ABCD = $41$42$43$44'

(*) "hh" 는 표현하고 싶은 문자16진수 ASCI 코드를 나타냅니다.


Variables
변수

변수는 지역(local)과 전역(global)의 구별이 있습니다.

지역변수는 편집중인 프로그램에서만 참조 가능합니다.

전역변수는 동일 프로젝트의 어느 프로그램에서도 참조 가능합니다.

예약어

직접표현변수(Directly represented variables)

이진변수

아날로그 변수

시변수(Timer)

문자열 변수

변수명은 이하의 규칙에 따를 필요가 있습니다.

- 최대 16반각문자

- 최초의 문자는 （a - z）

- 이후 문자는 문자, 숫자 중에서.


Reserved keywords
예약어

예약어로서는 이하의 것들이 있습니다.

이 예약어들은 프로그램, 변수명, Ｃ언어 Function, Ｃ언어 FunctionBlock 등의 이름에는 사용할 수 없습니다:

A	ANA, ABS, ACOS, ADD, ANA, AND, AND_MASK, ANDN, ARRAY, ASIN, AT, ATAN,

B	BCD_TO_BOOL, BCD_TO_INT, BCD_TO_REAL, BCD_TO_STRING, BCD_TO_TIME, BOO, BOOL, BOOL_TO_BCD, BOOL_TO_INT, BOOL_TO_REAL, BOOL_TO_STRING, BOOL_TO_TIME, BY, BYTE,

C	CAL, CALC, CALCN, CALN, CALNC, CASE, CONCAT, CONSTANT, COS,

D	DATE, DATE_AND_TIME, DELETE, DINT, DIV, DO, DT, DWORD,

E	ELSE, ELSIF, EN, END_CASE, END_FOR, END_FUNCTION, END_IF, END_PROGRAM, END_REPEAT, END_RESSOURCE, END_STRUCT, END_TYPE, END_VAR, END_WHILE, ENO, EQ, EXIT, EXP, EXPT,

F	FALSE, FEDGE, FIND, FOR, FUNCTION,

G	GE, GFREEZE, GKILL, GRST, GSTART, GSTATUS, GT,

I	IF, INSERT, INT, INT_TO_BCD, INT_TO_BOOL, INT_TO_REAL, INT_TO_STRING, INT_TO_TIME,

J	JMP, JMPC, JMPCN, JMPN, JMPNC,

L	LD, LDN, LE, LEFT, LEN, LIMIT, LINT, LN, LOG, LREAL, LT, LWORD,

M	MAX, MID, MIN, MOD, MOVE, MSG, MUL, MUX,

N	NE, NOT,

O	OF, ON, OPERATE, OR, OR_MASK, ORN,

P	PROGRAM

R	R, REDGE, READ_ONLY, READ_WRITE, REAL, REAL_TO_BCD, REAL_TO_BOOL, REAL_TO_INT, REAL_TO_STRING, REAL_TO_TIME, REDGE, REPEAT, REPLACE, RESSOURCE, RET, RETAIN, RETC, RETCN, RETN, RETNC, RETURN, RIGHT, ROL, ROR,

S	S, SEL, SHL, SHR, SIN, SINT, SQRT, ST, STN, STRING, STRING_TO_BCD, STRING_TO_BOOL, STRING_TO_INT, STRING_TO_REAL, STRING_TO_TIME, STRUCT, SUB, SYS_ERR_READ, SYS_ERR_TEST, SYS_INITALL, SYS_INITANA, SYS_INITBOO, SYS_INITTMR, SYS_RESTALL, SYS_RESTANA, SYS_RESTBOO, SYS_RESTTMR, SYS_SAVALL, SYS_SAVANA, SYS_SAVBOO, SYS_SAVTMR, SYS_TALLOWED, SYS_TCURRENT, SYS_TMAXIMUM, SYS_TOVERFLOW, SYS_TRESET, SYS_TWRITE, SYSTEM,

T	TAN, TASK, THEN, TIME, TIME_OF_DAY, TIME_TO_BCD, TIME_TO_BOOL, TIME_TO_INT, TIME_TO_REAL, TIME_TO_STRING, TMR, TO, TOD, TRUE, TSTART, TSTOP, TYPE,

U	UDINT, UINT, ULINT, UNTIL, USINT,

V	VAR, VAR_ACCESS, VAR_EXTERNAL, VAR_GLOBAL, VAR_IN_OUT, VAR_INPUT, ,VAR_OUTPUT,

W	WHILE, WITH, WORD,

X 	XOR, XOR_MASK, XORN

언더스코어 ('_')로 시작되는 키워드는 내부 키워드로 인스트럭션에는 사용할 수 없습니다.


Directly represented variables
직접표현변수

I/O변수가 접속되어 있지 않은I/O채널은 free채널이라 합니다.

ISaGRAF 직접표현 변수는 이 free채널을 프로그램 소스 코드 안에서 직접 다룰 수 있습니다. 직접표현변수의 식별자로서 반드시 % 문자로 시작되는 변수명이 됩니다.

이하에 싱글I/OBoard에 대한 직접표현 이름 부치는 법에 대해 나타냅니다.

여기서  "s"는 보드 슬롯 번호를 나타냅니다. "c" 는 I/O채널 번호를 나타냅니다.

%IXs.c	boolen형 입력Board 프리채널

%IDs.c	정수형 입력Board 프리채널

%ISs.c	문자열형 입력Board 프리채널

%QXs.c	boolen형 출력Board 프리채널

%QDs.c	정수형 출력Board 프리채널

%QSs.c	문자열형 출력Board 프리채널

이하에 복수I/O보드 에서 성립되어 있는 I/O장치기기에 대한 직접표현 이름 부치는 법에 대해 나타냅니다. 여기서  "s" 는 보드 슬롯 번호 나타냅니다. "b" 는 I/O장치기기 안에서의 싱글 보드 인덱스번호를 나타냅니다. "c" 는I/O채널 번호를 나타냅니다.

%IXs.b.c	boolen형 입력Board 프리채널

%IDs.b.c	정수형 입력Board 프리채널

%ISs.b.c	문자열형 입력Board 프리채널

%QXs.b.c	boolen형 출력Board 프리채널

%QDs.b.c	정수형 출력Board 프리채널

%QSs.b.c	문자열형 출력Board 프리채널

이하에 그 예를 나타냅니다.

%QX1.6	Board 슬롯번호1,  I/O 채널번호6인 boolen형 출력Board

%ID2.1.7	Board 슬롯번호2인 I/O 장치기기로 보드 번호가1, I/O채널 번호7인 정수형 입력 보드

직접표현 변수는 데이터 타입을 가질 수 없습니다.


Boolean variables
이진변수

논리값 변수는 TRUE, FALSE중에 boolen형 값을 가질 수 있습니다.

boolen형은 이하의 속성을 가질 수 있습니다.

내부:	프로그램에 따라 변경되는 메모리 상의 변수

입력:	입력 디바이스와 접속되는 변수 (시스템에서 refresh)

출력:	출력 디바이스와 접속되는 변수

       정수:	      읽기전용 내부변수

boolen형 변수를 설정할 때는 TRUE, FALSE 문자열을 다른 문자열로 바꿔두기가 가능합니다.

단, 이 바꿔놓는 문자열은 프로그램에서는 다룰 수 없습니다.

정의 워드로 설정되어 있는 경우는 이외적으로 다룰 수 있습니다


Analog variables
아날로그 변수

정수형 변수에는 정수와 실수 두 타입이 있습니다. 각각의 형식을 이하에서 나타냅니다.

정수	32 bit 부호붙인 정수	-2147483647 에서 +2147483647
실수	IEEE 32 bit 유동 소수값（단정도）	1 부호bit + 23 유효숫자부 bit + 8 export부 bit（실수 export부 -37 ～ +37　사이가 됩니다.）

이하의 속성을 가집니다.

내부:	프로그램에 따라 변경되는 메모리상의 변수

입력:	입력 디바이스와 접속되는 변수 (시스템에서 refresh)

출력:	출력 디바이스와 접속되는 변수

정수:	읽기전용 내부변수

실수형 변수가 외부I/O디바이스에 접속되는 경우는 I/O드라이브는 정수형 변수로서 다룹니다.

정수형과 실수형의 값은 동일 정수형 연산식으로 mix하여 사용할 수 없습니다.


Timer variables
시변수(Timer)

타임형 변수는 타임과 카운터로 사용됩니다. 타임형 변수는 32bit를 사용합니다.

타임형 변수는 정수로 최대２３시간５９분５９초９９９ｍｓ까지 저의 가능합니다.

타임형 변수의 속성은 내부에서만 입출력 속성을 지정할 수 없습니다.

타임 값은 ISaGRAF에 따라 자동적으로 변경됩니다.

타임과 카운터 때는타겟의 realtime clock에서 읽어낸 신호로 자동 변경됩니다.

ＳＴ프로그램 에서는 이하의 스테이트먼트가 사용됩니다.

TSTART	타임 자동 refresh작동

TSTOP	타임 자동 refresh를 정지


Message string variables
문자열 변수

문자열형 또는 문자열 변수는 문자열을 포함하고 있습니다.

문자열 변수의 길이는   입니다.

단,   문자열형 변수를 변수목록 편집기로 설정한 때의 최대 길이를 넘을 수 없습니다.

최대255반각 문자까지 가능합니다.

문자열형 변수는 이하의 속성을 가질 수 있습니다.

내부:	프로그램에 따라 변경되는 메모리상의 변수

입력:	입력 디바이스와 접속되는 변수(시스템refresh)

출력	출력 디바이스와 접속되는 변수

정수:	읽기전용 내부변수

문자열형 변수는 ASCI코드 ０~255 까지 중의 코드를 포함할 수 있습니다.

ＮＵＬＬ（０）캐릭터를 문자열에 포함시키는 것도 가능합니다.

단, "Ｃ" Function에 따라 Ｎｕｌｌ를 포함하는 문자열을 처리할 수 없는 경우도 있습니다.


Comments
주석

ＳＴ프로그램, ＩＬ프로그램에서는 커맨드를 삽입할 수 있습니다.

"(*"로 시작되고,  "*)"로 종료할 필요가 있습니다.

ＳＴ프로그램의 어디라도 커맨드 삽입이 가능합니다.

또한 복수형에 걸친 커맨드도 가능합니다.

다음에 그 예를 나타냅니다.

counter := ivalue;   (* assigns the main counter *)

                  (* ２행에 걸친 커맨드행　 *)

c := counter (*커맨드는 어디라도 삽입가능합니다. *) + base_value + 1;

커맨드 내부에는 "(*"문자는 포함할 수 없습니다.

ＩＬ프로그램에서 커맨드 삽입 장소는 인스트럭션 마지막으로 한정되어 있습니다.


Defined words
예약어

ISaGRAF에서 정수표현, 이진형 변수인 TRUE, FALSE표현, 키워드, ST로 사용되는 복잡한 표현들을 별명으로 재정의할 수 있습니다. 정의 워드에 따라 바꿔넣기가 가능합니다. 예를 들면

정의 워드	정의 내용

YES	TRUE

PI	3.14159

OK	(auto_mode AND NOT (alarm))

YRS, PI, OK 는 예를 들면 ST 프로그램 어디에서나 다룰 수 있는 복잡한 표현을 바꿔넣을 수 있습니다. 이하에 ＳＴ프로그램 정의 워드（식별자）를 이용한 예를 나타냅니다.

If OK Then

   angle := PI / 2;

   isdone := YES;

End_if;

정의 워드는 그 프로그램에서만 참조 가능한 지역 정의, 동일 프로젝트 내의 어떤 프로그램에서도 참조 가능한 전역 정의, 어떤 프로그램에서도 참조 가능한 공통 정의로 나눠집니다.

만약, 동일의 정의 워드에 대해 ２회 이상 정의된 경우는 마지막에 적힌 정의가 사용됩니다.

예를 들면

정의 붙이기:	（ 정의 워드）	（정의 내용）

　OPEN	　FALSE

　OPEN	　TRUE

와 ２회 정의하면, 결국

의미:	　OPEN	　TRUE

정의 워드명은 이하 규칙에 따를 필요가 있습니다.

•	최대16반각 문자

•	최초 문자는 (a - z)

•	이후 문자는 문자, 숫자 중에

정의에서 정의 워드는 사용할 수 없습니다. 예를 들면 이하의 예는 무효입니다.

PI	3.14159

PI2 	PI*2 	：무효

PI2 	6.28318


IL language
 IL 언어

명령 리스트（ＩＬ）는 낮은 레벨의 언어입니다. 적은 어플리케이션과 어플리케이션 특정부분에 가장 적절합니다. 인스트럭션은 항상 현재 결과（즉, ＩＬregister）에 관련되어 있습니다. operation은 현상 값과 operation사이에서 반드시 행해집니다. 그 결과는 다시 현재 결과로 저장 됩니다.

IL 문법

IL 동작


IL main syntax
IL 문법

IＬ프로그램은 인스트럭션 리스트에도 있습니다. 각각의 인스트럭션은 새로운 라인에 적혀, operator（명령）와 수식자（수식자） 필요에 응해서 하나 이상의 operator 에 이루어져 잇습니다. 이 요소들은 콤마（，）로 구분되어 있습니다. 라벨 ：을 인스트럭션 앞에 놓는 것도 가능합니다. 만약, 커맨드를 기입할 경우는 라인의 마지막에 추가 가능합니다. 단, (*   로 시작되고 *)로 끝나야 합니다. 공백 라인도 인정되고, 여기에 커맨드를 기입할 수도 있습니다.

라벨

명령 수식자

지연 조작

이하에 인스트럭션의 샘플을 나타냅니다.

라벨	operator(명령)          operand	  주석

Start:	LD	IX1     	(* 누르기 버턴 *)

ANDN	MX5	       (* 금지되어 있지 않는 경우는 *)

ST	    	  QX2	       (* 모터 스타트 *)


Labels
라벨

라벨명 뒤에는 콤마（：）가 붙습니다. 인스트럭션는 이 라벨 뒤에서부터 적힙니다. 라벨은 공백행에 적힙니다. 라벨명은 다른 인스트럭션 안에서 점프 전에 operand에서 사용되는 일이 있습니다. 라벨명은 이하의 룰에 따릅니다.

  이름은１６문자 이내

  최초의 문자는 레터（ａ－ｚ）

  그 이후는 레터, 숫자, '_'

같은 라벨명은 동일 ＩＬ프로그램 안에서는 사용할 수 없습니다. 단, 변수명과 동일 라벨명을 정의할 수는 있습니다.


Operator modifiers
명령 수식자

취급가능한 명령 수식자를 이하에 나타냅니다. 수식자 문자는 명령을 완전한 형으로 합니다. 수식자 사이에 스페이스를 포함하면 안됩니다.

N	operand의 반전

(	지연 조작

C	조건 조작

'N' 수식자는 boolean operand의 반전을 의미합니다.

예를 들면,

ORN IX12 는 ＳＴ에선 이하와 같이 됩니다.

result := result OR NOT (IX12)

'(' 수식자는 ')' 가 발견될 때까지 괄호로 둘러 싸인 인스트럭션의 실행을 먼저 보내게 됩니다.

'C' 수식자는 이하의 인스트럭션은 현재 결과가 ＴＲＵＥ（boolean형 변수 이외의 경우는 ０이외의 값）일때만 실행되도록 하는 조건 입니다. 'C' 수식자는　'N' 수식자와 합쳐서 사용할 수도 있습니다. 이 경우는 현재 결과가 ＦＡＬＳＥ（boolean형 변수 이외의 경우는０）일때만 이하의 인스트럭션이 실행됩니다.


Delayed operations
지연 조작

하나의 ＩＬ register （즉, 현재 결과）밖에 없기 때문에 어떤 처리는 지연 조작（먼저 보내기）되어야 합니다. 인스트럭션 실행 순서가 변경됩니다.

'('	수식자	처리의 먼저 보내기를 의미합니다.
')'	명령	먼저 보내져 있던 처리를  실행합니다.
'(' 수식자는 ')' 가 발견될 때까지 괄호로 둘러 싸인 인스트럭션의 실행을 먼저 보내게 됩니다.

예를 들면,

AND(	IX12

OR	IX35

)

는 이하와 같이 해석됩니다.

result := result AND ( IX12 OR IX35 )


IL operators
IL 명령

이하의 테이블은 ＩＬ언어의 표준명령을 종합한 것입니다.

명령어	수식자	동작	설명

LD	N	변수, 상수	로드

ST	N	변수	현재결과저장

S	BOO 변수	TRUE설정

R	BOO 변수	FALSE재설정

CAL	C   N	FB instance 명	function block호출

JMP	C   N	라벨	라벨 점프

RET	C   N	리턴

 ) 	지연조작 실행

Function	function / 서브프로그램 호출

AND	N   (	BOO	boolean AND

&	N   (	BOO	boolean AND

OR	N   (	BOO	boolean OR

XOR	N   (	BOO	exclusive OR

ADD	(	변수, 상수	Addition

SUB	(	변수, 상수	Subtraction

MUL	(	변수, 상수	Multiplication

DIV	(	변수, 상수	Division

GT	(	변수, 상수	Test: >

GE	(	변수, 상수	Test: >=

EQ	(	변수, 상수	Test: =

LE	(	변수, 상수	Test: <=

LT	(	변수, 상수	Test: <

NE	(	변수, 상수	Test: <>

이하에 ＩＬ고유의 명령만 나타냅니다. 기타 표준 명령은「표준 명령, Function Block, Function」으로 해설합니다.


LD operator
LD 명령

operation	: 현재 결과에 값을 로드합니다.

취급가능한 수식자	: N

operand	: 정수 또는 내부, 입력, 출력 변수

Example:

(* EXAMPLES OF LD OPERATIONS *)

LDex:	LD	false	(* result := FALSE boolean 상수 *)

LD	true	(* result := TRUE boolean 상수 *)

LD	123	(* result := integer 상수 *)

LD	123.1	(* result := real 상수 *)

LD	t#3ms	(* result := time 상수 *)

LD	boo_var1	(* result := boolean 변수 *)

LD	ana_var1	(* result := analog 변수 *)

LD	tmr_var1	(* result := timer 변수 *)

LDN	boo_var2	(* result := NOT ( boolean 변수 ) *)


ST operator
ST 명령

operation	: 현재 결과를 저장 합니다. 현재 결과는 이 조건에서 변화하지 않습니다.

취급 가능한 수식자	: N

operand	: 내부, 출력 변수

STboo:	LD	false

ST	boo_var1	(* boo_var1 := FALSE *)

STN	boo_var2	(* boo_var2 := TRUE *)

STana:	LD	123

ST	ana_var1	(* ana_var1 := 123 *)

STtmr:	LD	t#12s

ST	tmr_var1	(* tmr_var1 := t#12s *)


S operator
S 명령

operation:	현재 결과가 TRUE일때  boolean형 변수에 TRUE을 저장 합니다. 만약, 현재 결과가 FALSE일때는 아무것도 처리하지 않습니다. 이 조작에 따라 현재 결과는 변화하지 않습니다.

취급 가능한 수식자 :	(none)

operand:	출력, 입력 변수 boolean형 변수

SETex:	LD	true	(* current result := TRUE *)

S	boo_var1	(* boo_var1 := TRUE *)

(* current result is not modified *)

LD	false	(* current result := FALSE *)

S	boo_var1	(* nothing done - boo_var1 unchanged *)


R operator
R 명령

operation:	현재 결과가 TRUE일때  boolean형 변수에 FALSE일때는 스토어합니다. 만약, 현재 결과가 FALSE일때는 아무것도 처리하지 않습니다. 이 조작에 따라 현재 결과는 변화하지 않습니다.

취급 가능한 수식자:	(none)

operand：	출력, 입력 변수 boolean형 변수

RESETex:	LD	true	(* current result := TRUE *)

R	boo_var1	(* boo_var1 := FALSE *)

(* current result is not modified *)

ST	boo_var2	(* boo_var2 := TRUE *)

LD	false	(* current result := FALSE *)

R	boo_var1	(* nothing done - boo_var1 unchanged *)


JMP operator
JMP 명령

operation :	특정 라벨로 점프

취급 가능한 수식자:	C   N

operand :	동일 IL프로그램에서 정의된 라벨

예：

(* 이하의 예는 아나로그 selector을 테스트합니다.  (0 or 1 or 2) 	*)

(* 세개의 출력 boolean형에１을 set. Selector 내용이 ０일때 점프합니다.　*)

JMPex:	LD	selector	(* selector is 0 or 1 or 2 *)

BOO	(* conversion to boolean *)

JMPC	test1	(* if selector = 0 then *)

LD	true

ST	bo0	(* bo0 := true *)

JMP	JMPend	(* end of the program *)

test1:	LD 	selector

SUB	1	(* decrease selector:  is now 0 or 1 *)

BOO	(* conversion to boolean *)

JMPC	test2	(* if selector = 0 then *)

LD	true

ST	bo1	(* bo1 := true *)

JMP	JMPend	(* end of the program *)

test2:	LD	true	(* last possibility *)

ST	bo2	(* bo2 := true *)

JMPend:	(* end of the IL program *)


RET operator
RET 명령

operation :	현 명령 리스트를 종료합니다. 만약,

IL sequence가 서브 프로그램일때는 IL register(현재결과)가 Father프로그램에 되돌리기 값으로 되돌아 옵니다.

취급 가능한 수식자 :	C   N

operand :	(none)

예：

(*이하의 예는 Analog selector의 값을 테스트합니다.  (0 or 1 or 2) *)

(*3개의 출력 boolean형에１을 set.  Selector 내용이 ０일때 점프합니다. *)

JMPex:	LD	selector	(* selector is 0 or 1 or 2 *)

BOO	(* conversion to boolean *)

JMPC	test1	(* if selector = 0 then *)

LD	true

ST	bo0	(* bo0 := true *)

RET	(* end - return 0 *)

(* decrease selector *)

test1:	LD 	selector

SUB	1	(* selector is now 0 or 1 *)

BOO	(* conversion to boolean *)

JMPC	test2	(* if selector = 0 then *)

LD	true

ST	bo1	(* bo1 := true *)

LD	1	(* load real selector value *)

RET	(* end - return 1 *)

(* last possibility *)

test2:	RETNC	(* returns if the selector has *)

(* an invalid value *)

LD	true

ST	bo2	(* bo2 := true *)

LD	2	(* load real selector value *)

 	(* end - return 2 *)


")" operator
")" 명령

operation	 지연(먼저 보내기)되어 있던 처리를 실행합니다. 먼저 보내져 있던 처리는 '(' 으로 시작되고 있습니다.

취급 가능한 수식자:	(none)

operand:	(none)

예：

(* 지연 조작을 포함한 예 *)

Delayed:	LD	a1	(* result := a1; *)

ADD(	a2	(* delayed ADD - result := a2; *)

MUL(	a3	(* delayed MUL - result := a3; *)

SUB	a4	(* result := a3 - a4; *)

)	(* execute delayed MUL - result := a2 * (a3-a4); *)

MUL	a5	(* result := a2 * (a3 - a4) * a5; *)

)	(* execute delayed ADD *)

(* result := a1 + (a2 * (a3 - a4) * a5); *)

ADD	a6	(* result := a1 + (a2 * (a3 - a4) * a5) + a6; *)

ST	res	(* store current result in 변수 res *)


Calling sub-programs or functions
서브-프로그램과 function 호출

ＩＬ, ＳＴ, ＬＤ, ＦＢＤ으로 적힌 서브프로그램과 Function은 ＩＬ에서 호출 가능합니다. 서브프로그램명을 명령으로서 배정합니다.

operation :	서브프로그램과 Function을 실행합니다.  서브프로그램에서 되돌리기 값은괿굂 register(현재결과)에 저장 됩니다.

취급 가능한 수식자:	(none)

operand :	최초의 파라미터는 괿굂 register에 스토어 됩니다. 이하의 파라미터는 커맨드로 구분되고 operand필드에 적힙니다.

예：

 (* call프로그램 : analog값을 time 값으로 변환 *)

Main:	LD	bi0

SUBPRO	bi1,bi2	(* call sub-program to get analog value *)

ST	result	(* result := value returned by sub-program *)

GT	vmax	(* test value overflow *)

RETC	(* return if overflow *)

LD	result

MUL	1000	(* converts seconds in milliseconds *)

TMR	(* converts to a timer *)

ST	tmval	(* stores converted value in a timer *)

(* 읽어 낼수 있는 서브프로그램 'SUBPRO' : Analog 값의 평가 *)

(* 3개의 vinally boolean : in0, in1, in2가 서브프로그램의 입력 파라미터 *)

LD	in2

ANA	(* result = ana (in2); *)

MUL	2	(* result := 2*ana (in2); *)

ST	temporary	(* temporary := result *)

LD	in1

ANA

ADD 	temporary	(* result := 2*ana (in2) + ana (in1); *)

MUL	2	(* result := 4*ana (in2) + 2*ana (in1); *)

ST	temporary	(* temporary := result *)

LD	in0

ANA

ADD	temporary	(* result := 4*ana (in2) + 2*ana (in1)+ana (in0); *)

ST	SUBPRO	(* return current result to calling program *)


Calling function blocks: CAL operator
function block 호출: CAL 명령

operation: 	FunctionBlock의 호출

취급 가능한 수식자:	C   N

operand:	FunctionBlock instance명

FunctionBlock 입력 파라미터는 call되기 전에 LD/ST 명령 으로 할당해 둘 필요가 있습니다.

예１：

 (*  SR의 call : SR1은SR의instance *)

LD	auto_mode

AND	start_cmd

ST	SR1.set1

LD	stop_cmd

ST	SR1.reset

CAL	SR1

LD	SR1.Q1

ST	command

(* FBD 등가 : *)

Example 2

(*R_TRIG1은 R_TRIG Block instance, CTU1은 CTU Block instance*)

LD	command

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ST	CTU1.cu

LDN	auto_mode

ST	CTU1.reset

LD	100

ST	CTU1.pv

CAL	CTU1

LD	CTU1.Q

ST	overflow

LD	CTU1.cv

ST	result

(* FBD 등가: *)


ST language
 ST 언어

ST (STructured Text)는 High Level의 구조화 언어 입니다. 이 언어는 주로 그래픽 언어로 충분히 표현하기 어려운 수속을 나타내는데 적용됩니다. ST은ＳＦＣ언어의 transition과 스텝 내의 Function 기술 디폴트 언어입니다.

ST 문법

표현법과 괄호

Function / function block 호출

ST 특수 boolean 명령

ST 기본

ST 확장


ST main syntax
ST 문법

ST프로그램은 ST스테이트먼트 리스트입니다. 각 스테이트먼트의 마지막에 세미콜론（；）separator가 필요합니다. 소스 코드중의 변수는inactive separator（스페이스, Tab 등）와 보관함 separator（：＝、＜、＞등）으로 구분됩니다. 커맨드는 (*  *)로 에워 싸입니다.

기본 ST statement는 이하의 것이 있습니다.

•	스테이트먼트 할당 (variable := expression;)

•	서브프로그램, Function 호출

•	Ｃ언어 FunctionBlock 호출

•	선택 스테이트먼트　(IF, THEN, ELSE, CASE...)

•	반복 스테이트먼트 (FOR, WHILE, REPEAT...)

•	컨트롤 스테이트먼트 (RETURN, EXIT...)

•	ＳＦＣ등 기타 언어와 link용의 특수 statement

Inactive separator는 Active separator, 정수, 식별자 사이에 있으면 자유롭게 삽입 가능합니다. Inactive separator 는 스페이스, Tab, End of Line캐릭터입니다. 이하의 룰을 지켜 Inactive separator 를 사용하면 읽기 쉬운 ST프로그램을 만들 수 있습니다.

•	한 행에 하나 이상의 스테이트먼트는 적을 수 없습니다.

•	복잡한 스테이트먼트는 Tab키를 사용해서 intend 합니다.

•	커맨드를 가능한 삽입합니다.

소스 코드 쉽게 읽기 예：

Low readability	High readability
imax := max_ite; cond := X12; if not(cond (* alarm *) then return; end_if; for i (* index *) := 1 to max_ite do if i <> 2 then Sp호출(); end_if; end_for; (* no effect if alarm *)	(* imax : number of iterations *) (* i: FOR STatement index *) (* cond: process validity *) imax := max_ite; cond := X12; if not (cond) then     return; end_if; (* process loop *) for i := 1 to max_ite do     if i <> 2 then         Sp호출 ();     end_if; end_for;


Expression and parentheses
표현법과 괄호

ST표현은 ST조작자와 변수, 정수를 편성해서 행합니다. 하나의 표현에 대해서 operand 타입은 같아야 합니다. 이들의 편성에 따라 복잡한 표현을 기술합니다. 예를 들면,

(boo_var1 AND boo_var2)	논리형

not (boo_var1)	논리형

(sin (3.14) + 0.72)	실수형

(t#1s23 + 1.78)	부정한 표현값

괄호 표현은 전체 표현 가운데 어떤 부분을 독립시키는 것으로, 조작의 우선 순위를 높입니다. 괄호가 없는 표현에서의 조작은 ST조작자 간의 암시적인 우선 순위에 따릅니다. 예를 들면,

2 + 3 * 6 	equals 2+18=20	승산은 가산보다 우선 순위가 높다.

(2+3) * 6	equals 5*6=30	괄호에 따라 우선 순위를 변경

주의：	하나의 ST표현 내에 최대 ８레벨까지 괄호가 인정됩니다.


Function or function block calls
Function / function block 호출

표준적인 ST에 따라 Function 호출로 다음의 Function을 호출할 수 있습니다.

•	프로그램

•	ＩＥＣ언어로 적힌 라이브러리 Function

•	Ｃ언어 Function, Ｃ언어 FunctionBlock

•	형 변환 함수

서브프로그램(sub-programs) / function 호출

function block 호출


Calling sub-programs or functions
서브프로그램(sub-programs) / function 호출

이름:	서브프로그램명 또는 IEC와 C언어로 적힌 라이브러리 Function

의미:	ST, IL, LD, FBD 로 적힌 서브프로그램과 Function과 언어의호출, 되돌리기 값을 얻는다.

문법:	<variable> := <subprog> (<par1>, ... <parN> );

operand :	되돌리기 값과 인수 타입은 서브프로그램에서 정의 된 파라미터정의에 따라야 합니다.

되돌리기 값

서브프로그램 호출은 각종 표현으로 호출됩니다. ＳＦＣ프로그램 transition 내부에도 사용됩니다.

예１： 서브프로그램 호출

(* Main ST program *)

(*서브프로그램에서 정수형 값을 받아 타임형 값으로 변환 *)

ana_timeprog := SPlimit ( tprog_cmd );

appl_timer := tmr (ana_timeprog * 100);

(* 호출되는 ＦＢＤ 서브프로그램, 이름은　'SPlimit' *)

Example2: Function 호출

limited_value := min (16, max (0, input_value) );

rol_msg := right (message, mlen (message) - 1) + left (message, 1);


Calling function blocks
function block 호출

이름:	FunctionBlock inSTance명

의미:	ISaGRAF라이브러리에 등록되어 있는 FunctionBlock을 호출해서 출력 파라미터를 사용한다.

문법:	(* 호출 of the function block *)

<blockname> ( <p1>, <p2> ... );

(gets its return 파라미터s *)

<result> := <blockname>. <ret_param1>;

...

<result> := <blockname>. <ret_paramN>;

operand:	파라미터타입은 FunctionBlock 에서 정의되고 있는 타입과 일치해야 합니다.

되돌리기 값:	문법 참조

Function의 의미, 파라미터형, 되돌리기 값형 등은 ISaGRAF라이브러리에 등록되어 있는 것을 참조.

FunctionBlock inSTance는 반드시 모음으로 등록해  둡니다.

예：

(*FunctionBlock을 호출하는 ST프로그램의 예 *)

(*FunctionBlock instance를 모음으로 설정해 놓습니다. *)

(* trigb1 : block R_TRIG  오르기 검출*)

(* ST언어에서 읽어내기 *)

If (trigb1.Q) Then nb_edge := nb_edge + 1; End_if;


ST specific boolean operators
ST 특수 boolean 명령

다음의 boolean명령은 특수한 ST언어입니다.

REDGE	오르기 검출

FEDGE	내리기 검출

기타 기본 boolean명령을 이하에 나타냅니다.

•	NOT	논리 반전

•	AND (&)	AND（논리적）

•	OR	OR（논리화）

•	XOR	XOR（배타적 논리화）


"REDGE" operator
"REDGE" 명령

이름	REDGE

의미	boolean형 변수의 오르기 검출

문법	<edge> := REDGE ( <boo_expression>,<memo_variable> );

operand 	<boo_expression> 오르기 검출 하는 boolean형 변수<memo_variable> 직전의 변수 상태를 스토어하기 위한  내부변수

되돌리기 값	TRUE / FALSE에서 TRUE로 변화한 때

FALSE 위와 다른 경우

REDGE() 을 사용한 오르기 검출은 1회 실행 Scan에 ２회 이상은 검출되지 않습니다. 오르기 검출이 ＳＦＣ transition조건에 사용되는 경우는 있습니다.

주의： 	<memo_variable>변수는 변수 직전의 상태를 보관하기 위해 사용되는 것으로, 다른 오르기 검출 등을 목적으로 동시 사용은 불가능합니다.

통상, 오르기 검출을 하고  싶은 변수명이 "xxx"일때, <memo_variable>로서는　"EDGE_xxx"을 사용합니다. 따라서 다른 REDGE조작에 의해 표서되는 일은 없습니다.

예：

(* ST program using REDGE operator *)

(* this program counts the rising edges of a boolean input *)

(* Bi120 is an input boolean variable *)

(* Edge_Bi120 is the memory of the Bi120 variable STate *)

If REDGE (Bi120, Edge_Bi120) Then

Counter := Counter + 1;

End_if;

주의：이 명령은 IEC1131-3에 포함되어 있지 않습니다. 호환성을 위해서는 R_TRIG표준 Block의 이용을 권합니다.


"FEDGE" operator
"FEDGE" 명령

의미	boolean형 변수의 오르기 검출

문법	<edge> := FEDGE ( <boo_expression>, <memo_variable> );

operand	<boo_expression> 오르기 검출하는 boolean형 변수 <memo_variable>직전의 변수 상태를 스토어하기 위한 내부 변수

되돌리기	TRUE  -　TRUE 에서 FALSE로 변화한 때

FALSE - 위와 다른 경우

FEDGE() 을 사용해서 오르기 검출은 1회 실행 Scan에 ２회 이상은 검출되지 않습니다. 오르기 검출이 ＳＦＣ transition조건에 사용되는 경우는 있습니다.

주의： <memo_variable> 변수는 변수 직전의 상태를 보관하기 위해 사용되는 것으로, 다른 오르기 검출 등을 목적으로 동시 사용은 불가능합니다.

통상, 오르기 검출을 하고  싶은 변수명이 "xxx"일때, <memo_variable>로서는　"EDGE_xxx"을 사용합니다. 따라서 다른 FEDGE조작에 의해 표서되는 일은 없습니다.

예：

(* ST program using FEDGE operator *)

(* this program counts the falling edges of a boolean input *)

(* Bi120 is an input boolean variable *)

(* Edge_Bi120 is the memory of the Bi120 variable STate *)

If FEDGE (Bi120, Edge_Bi120) Then

Counter := Counter + 1;

End_if;

이 명령은 IEC1131-3에 포함되어 있지 않습니다. 환성을 위해서는 F_TRIG표준 Block의 사용을 권합니다.


ST basic statements
ST 기본

ST언어의 기본 스테이트먼트에는 이하의 것이 있습니다.

Assignment

RETURN

IF-THEN-ELSIF-ELSE 구조

CASE

WHILE

REPEAT

FOR

EXIT


Assignment

이름	:=

의미	표현을 변수에 Assign

문법	<variable> := <any_expression> ;

operand	변수는 내부, 또는 출력 변수이어야 합니다.

변수와 표현 타입이 일치해야 합니다.

<any_expression>는 서브프로그램과 ISaGRAF라이브러리 Ｃ언어 Function이라도 상관없습니다.

예：

(*Assign을 사용한 ST프로그램 *)

(* variable <<= variable *)

bo23 := bo10;

(* variable <<= expression *)

bo56 := bx34 OR alrm100 & (level >= over_value);

result := (100 * input_value) / scale;

(* 서브프로그램의 되돌리기 값을 Assign *)

rc := PSelect ( );

(* Function 호출을 Assign *)

limited_value := min (16, max (0, input_value) );


RETURN statement
RETURN

이름	RETURN

의미	현재 실행 중인 프로그램을 종료한다.

문법	RETURN ;

operand	(none)

ＳＦＣ 액션Block에서 RETURN 스테이트먼트는 그 액션Block만의 종료를 의미합니다.

예：

(* FBD프로그램 카운터 예*)

(* RETURN스테이트먼트를 사용한 ST프로그램 예 *)

If not (CU) then

Q := false;

CV := 0;

RETURN;   (*프로그램의 종료 *)

end_if;

if R then

CV := 0;

else

if (CV < PV) then

CV := CV + 1;

end_if;

end_if;

Q := (CV >= PV);


IF-THEN-ELSIF-ELSE statement
IF-THEN-ELSIF-ELSE

이름:	IF ... THEN ... ELSIF ... THEN ... ELSE ... END_IF

의미：	ST스테이트먼트를 boolean형 표현의 값에 따라 선택해서 실행합니다.

문법:	IF <boolean_expression> THEN

   <스테이트먼트> ;

   <스테이트먼트> ;

   ...

ELSIF <boolean_expression> THEN

  < 스테이트먼트 > ;

   < 스테이트먼트 > ;

   ...

ELSE

   < 스테이트먼트 > ;

   < 스테이트먼트 > ;

   ...

END_IF;

ELSE와 ELSIF 스테이트먼트는 옵션입니다. 만약, ELSE 스테이트먼트가 적혀 있지 않는 경우는 조건이 FALSE일땐 아무것도 실행되지 않습니다.

예：

(* IF 스테이트먼트를 사용한 ST프로그램 *)

IF manual AND not (alarm) THEN

level := manual_level;

bx126 := bi12 OR bi45;

ELSIF over_mode THEN

level := max_level;

ELSE

level := (lv16 * 100) / scale;

END_IF;

(* IF STructure without ELSE *)

If overflow THEN

alarm_level := true;

END_IF;


CASE statement
CASE

이름:	CASE ... OF ... ELSE ... END_CASE

의미:	복수 ST 스테이트먼트 중에 정수표현 내용에 따라 스테이트먼트를 선택해 실행합니다.

문법:	CASE <integer_expression> OF

   <value> : <STatements> ;

   <value> , <value> : <STatements> ;

   ...

ELSE

   <STatements> ;

END_CASE;

Case <value>값은 반드시 정수 이어야만 합니다. 복수<value>를 comma(,)로구분해 나열한 경우는 같은 스테이트먼트를 실행하는 것ㅇㄹ 의미합니다. ELSE 스테이트먼트는 옵션입니다.

예：

(* CASE 스테이트먼트를 사용한 ST프로그램 *)

CASE error_code OF

255:	err_msg := 'Division by zero';

fatal_error := TRUE;

1:	err_msg := 'Overflow';

2, 3:	err_msg := 'Bad sign';

ELSE

err_msg := 'Unknown error';

END_CASE;


WHILE statement
WHILE

이름갌	WHILE ... DO ... END_WHILE

의미：	ST 스테이트먼트 그룹을 반복 실행합니다. 반복 전에 반복 조건을 평가합니다.

문법갌	WHILE <boolean_expression> DO

   <STatement> ;

   <STatement> ;

   ...

END_WHILE ;

ISaGRAF 는 사이클 타임이 같은 기간인 시스템이기 때문에 예를 들면, 입력 변수는 ＷＨＩＬＥ의 반복 실행 중에는 변화하지 않습니다. 즉, 정수와 입력 변수를 직접 ＷＨＩＬＥ 반복 조건에 사용할 수 없습니다.（무한loop가 되어버립니다.）

예：

(* WHILE 스테이트먼트를 사용한 ST프로그램 *)

(* ＣFunction을 Real 보드에서 문자 읽어내기에 사용하고 있습니다. *)

STring := ''; (* empty STring *)

nbchar := 0;

WHILE ((nbchar < 16) & ComIsReady ( )) DO

STring := STring + ComGetChar ( );

nbchar := nbchar + 1;

END_WHILE;


REPEAT statement
REPEAT

이름:	REPEAT ... UNTIL ... END_REPEAT

의미:	ST 스테이트먼트 그룹을 반복 실행합니다. 반복 후에 반복 조건을 평가합니다.

문법:	REPEAT

   < 스테이트먼트 > ;

   < 스테이트먼트 > ;

  ...

UNTIL <boolean_condition>

END_REPEAT ;

주의： ISaGRAF은 사이클 타임이 같은 기간인 시스템이기 때문에 예를 들면, 입력 변수는 ＲＥＰＥＡＴ의  반복 실행  중에는 변화하지 않습니다. 즉, 정수와 입력 변수를 직접 ＲＥＰＥＡＴ 반복 조건에 사용할 수 없습니다.（무한loop가 되어버립니다.）

예：

(* REPEAT 스테이트먼트를 사용한 ST프로그램 *)

(* Ｃ Function을 Real Board에서 문자 읽어내기에 사용하고 있습니다. *)

STring := ''; (* empty STring *)

nbchar := 0;

IF ComIsReady ( ) THEN

REPEAT

STring := STring + ComGetChar ( );

nbchar := nbchar + 1;

UNTIL ( (nbchar >= 16) OR NOT (ComIsReady ( )) )

END_REPEAT;

END_IF;


FOR statement
FOR

이름:	FOR ... TO ... BY ... DO ... END_FOR

의미：	유한 회수분의 반복 조작을 정수형 변수를 index 취급법에 따릅니다.

문법:	FOR <index> := <mini> TO <maxi> BY <STep> DO

    < 스테이트먼트 > ;

    < 스테이트먼트 > ;

END_FOR;

Operand:	index:	내부 정수형 변수로 매회 증가

mini:	index의 초기 값

maxi:	index의 최대값

STep:	index의 매회 증가폭

[ BY STep ] 스테이트먼트는 옵션입니다. 아무 지정이 없으면 STEP은 １입니다.

ISaGRAF은 사이클 타임이 같은 기간인 시스템이기 때문에 예를 들면, 입력 변수는 ＦＯＲ의  반복 실행  중에는 변화하지 않습니다.

이하에서는 FOR 스테이트먼트와 등가한 WHILE스테이트먼트를 나타냅니다.

index := mini;

while (STep <= maxi) do

   <STatement> ;

   <STatement> ;

   index := index + STep;

end_while;

예：

(* FOR스테이트먼트를 사용한 ST프로그램 *)

(* 문자열에서 수치 캐릭터를 집어냅니다. *)

length := mlen (message);

target := ''; (* empty STring *)

FOR index := 1 TO length BY 1 DO

code := ascii (message, index);

IF (code >= 48) & (code <= 57) THEN

target := target + char (code);

END_IF;

END_FOR;


EXIT statement
EXIT

이름:	EXIT

의미：	FOR, WHILE, REPEAT 반복 스테이트먼트에서 EXIT

문법:	EXIT;

operand :	(none)

EXIT는 통상 IF스테이트먼트 내에서 사용됩니다.

예：

(* EXIT스테이트먼트를 사용한 ST프로그램 *)

(* 문자열에서 캐릭터를 검색합니다. *)

length := mlen (message);

found := NO;

FOR index := 1 TO length BY 1 DO

code := ascii (message, index);

IF (code  = searched_char) THEN

found := YES;

EXIT;

END_IF;

END_FOR;


ST extensions
ST 확장

이하에서는 ST언어의 확장 부분에 대해서 설명합니다.

TSTART - TSTOP: timer 제어

이하의 스테이트먼트와 Function은 child ＳＦＣ프로그램을 컨트롤할 때에 사용됩니다.  ACTION(): ... END_ACTION; ＳＦＣ스텝 내에서 사용됩니다.

GSTART	SFC 프로그램 동작

GKILL	SFC 프로그램 정지

GFREEZE	SFC 프로그램 동결

GRST	동결된 SFC 프로그램 재동작

GSTATUS	SFC 프로그램 현재의 STatus취득

주의： 이 Function은 IEC 1131-3에는 포함되어 있지 않습니다. IEC1131-3에 준거하는 경우는GSTART와 GKILL 대신에 다음의 문법으로 얻을 수 있습니다.

child_name(S); (* GSTART(child_name); 등가 *)

child_name(R); (* GKILL(child_name); 등가  *)

또한, ＳＦＣ스텝의 STatus를 확인하는데 이하의 예가 있습니다.

GSnnn.x	스텝의 활성／비활성 상태를 boolean값으로 얻는다.

GSnnn.t	스텝이 활성 상태된 후의 경과시간을 얻는다.

("nnn" 는 ＳＦＣ스텝 refresh번호입니다.)

다른 ＳＦＣ프로그램 스텝의 활성 상태는 다음 표현으로 얻을 수 있습니다.

GSnnn(progname).x

주의：	다른 프로그램의 참조에 대해서 이 표현은 IEC1131-3에는 포함되어 있지 않습니다. IEC1131-3에 준거하는 경우는 글로벌 변수（ref_STep_X）를 설정해서 이것에 참조하고 싶은 스텝 상태를 Assign시킵니다. 즉, 스텝 안에서 Ｎ액션 qualifier를 사용해서 액션을 기술합니다. (ref_STep_X(N);) 이러한 상태에서 스텝 상태를 테스트（참조）하고 싶은 장소에서 글로벌 변수（ref_STep_X）를 사용합니다.

이하에 프로그램을 나타냅니다.

Prog프로그램의 스텝상태를 사용하고 싶은 다른프로그램


TSTART statement
TSTART

이름:	TSTART

의미:	타임형 변수의 카운터를 현재 값에서 갱신합니다.

TSTART 커맨드로 타임형 변수는 변경되지 않습니다.

문법:	TSTART ( <timer_variable> );

operand:	비활성 상태의 타임 변수

되돌리기:	(none)

예：

 (* TSTART,  TSTOP스테이트먼트를 사용한 ST프로그램 *)

타임 값은 사이클 중에는 같은 값을 유지합니다.


TSTOP statement
TSTOP

이름	TSTOP

의미	타임형 변수의 갱신을 정지합니다.

TSTOP커맨드로 타임형 변수는  변경되지 않습니다.

문법	TSTOP ( <timer_variable> );

operand	활성 상태의 타임 변수

되돌리기	(none)

예：위의 TSTART를 참조 바랍니다.


GSTART statement
GSTART

이름	GSTART

의미	child SFC 프로그램을 각 초기 스텝에 token을 set해서 작동시킵니다.

문법	GSTART ( <child_program> );

operand	작동되는 child SFC프로그램은 GSTART 스테이트먼트가 적혀 있는 SFC프로그램의 child SFC프로그램이어야 합니다.

되돌리기	(none)

child ＳＦＣ프로그램의 child（손자ＳＦＣ프로그램）는 자동으로 작동시킬 수 없습니다.

주의： 	GSTART는 IEC 1131-3에는 포함되어 있지 않습니다. 이하와 같이 Ｓ qualifier을 사용해서 child프로그램을 작동합니다.

Child_name(S);

Example: Use of GSTART and GKILL

(* Sequence 'Sfather' *)	(* Sequence 'Schild' *)


GKILL statement
GKILL

이름	GKILL

의미	child SFC프로그램에 있는 실행 token을 없애면 child SFC프로그램을 정지 합니다.

문법	GKILL ( <child_program> );

operand	지정되는 SFC프로그램은 GKILL 스테이트먼트가 적혀있는 SFC프로그램의 child SFC프로그램이어야 합니다.

되돌리기	(none)

child ＳＦＣ프로그램의 child（손자ＳＦＣ프로그램）도 자동으로 정지됩니다.

주의：	GKILL은 IEC 1131-3 norm에 포함되어 있지 않습니다. 이하와 같이 Ｒ  qualifier을 사용해서 child프로그램을 정지 시킵니다.


GFREEZE statement
GFREEZE

제목	GFREEZE

의미	child ＳＦＣ프로그램이 있는 실행 token을 없애고, child ＳＦＣ프로그램을 정지합니다. 나중에 GRST 스테이트먼트로 재작동 가능합니다.

문법	GFREEZE ( <child_program> );

operand	지정되는 SFC프로그램은 GFREEZE 스테이트먼트가 적혀있는 SFC프로그램의 child-SFC프로그램이어야 합니다.

되돌리기	(none)

child ＳＦＣ프로그램의 child（손자 ＳＦＣ프로그램）도 자동적으로 동결됩니다.

주의：	GFREEZE는 IEC 1131-3에는 포함되지 않습니다.

Example:


GRST statement
GRST

이름:	GRST

의미:	GFREEZE 스테이트먼트로 동결되어 있던 child ＳＦＣ프로그램을 재작동합니다. GFREEZE에서 없어진 실행 token이 되돌아 옵니다.

문법:	GRST ( <child_program> );

operand:	지정되는 child-SFC프로그램은 GRST 스테이트먼트가 적혀있는 SFC프로그램의 child -SFC프로그램이어야 합니다.

되돌리기:	(none)

동결되어 있던 child ＳＦＣ프로그램의 child（손자 ＳＦＣ프로그램）도 자동적으로 재작동 됩니다.

주의：	GRST은 IEC 1131-3에 포함되지 않습니다.

예： 위 GFREEZE 스테이트먼트를 참조


GSTATUS statement
GSTATUS

이름	GSTATUS

의미	child SFC프로그램의 현재상태를 되돌립니다.

문법	<ana_var> := GSTATUS ( <child_program> );

operand	지정되는 child SFC프로그램은 GSTATUS 스테이트먼트가 적혀있는 SFC프로그램의 child SFC프로그램이어야 합니다.

되돌리기	0 = 프로그램이 비활성 상태 (killed)

1 = 프로그램이 활성 상태 (STarted)

2 = 프로그램이 동결 상태 (frozen)

예：


FBD language
 FBD 언어

Functional Block Diagram (FBD)은 아래의 세부 항목을 참고 하시기 바랍니다

FBD 형식

리턴

점프 / 라벨

이진 반전

FBD에서 function / function block 의 호출


FBD diagram main format
FBD 형식

Functional Block Diagram (FBD)은  각종 타입의 장방형（상자）으로 나타낸 펑션블록이 접속된 그래픽표현 방법의 하나입니다. 상자 좌측에는 펑션의 입력이, 우측에는 펑션의 출력이 접속됩니다. 변수가 논리적인 링을 가진 상자에 접속됩니다. 출력은 다른 펑션의 입력에 접속되는 일도 있습니다.

FBD프로그램의 입력은 function block의 입력 연결에 설정 되어야 합니다. 입력변수의 타입은 관련된 타입과 동일한 타입 이어야 합니다. FBD입력타입은 다음과 같다.(상수, 내부, 입력, 출력)

FBD프로그램의 출력은 function block의 출력 연결에 설정 되어야 합니다. 입력변수의 타입은 관련된 타입과 동일한 타입 이어야 합니다. FBD 는 모든 내부, 출력 변수, 프로그램명 (단,sub-programs)이 사용 가능 합니다.출력연결이 현재 편집중인 sub-program인경우 ,sub-program (호출한program으로 값 반환)의 반환값을 할당 하게 됩니다.

function blocks 의 입력, 출력 변수는 연결라인 으로 연결 되어 있습니다.

- 입력변수는 function block의 입력측

- 출력변수는 다른 function block 의 입력단 으로 연결됨

- 출력변수는function block 의 출력측

관련 데이타를 좌측 끝에서 우측 끝으로 이동한다는 의미로 좌/우의 타입은 동일하여야 합니다.

다중 우측 접속역시 마찬 가지 이다.

모든 연결의 타입은 동일 하여야 합니다.


RETURN statement
리턴

"<리턴>" 은 출력측에 사용하게 됩니다. 반듯이 function block의 이진 출력측에 연결되어야 합니다. 리턴 명령은 조건부 마침인데, 예를 들어 TRUE 값이 설정 되어 있는 경우라면 나머지 부분은 실행이 되지 않습니다.

(* FBD내에서 리턴 명령의 사용 예 *)

(* ST equivalence: *)

If auto_mode OR alarm Then

Return;

End_if;

bo67 := (bi10 AND bi23) OR x_cmd;


Jumps and labels
점프 / 라벨

점프/라벨은 다이어 그램의 실행을 제어 하는 수단으로 사용 됩니다.

다음명령어를 참고 하세요:

>>LAB	라벨명으로 점프 (라벨명 "LAB")

LAB:	라벨 정의 (라벨명 "LAB")

연결선 좌측의 이진 값이 TRUE 인경우 프로그램 실행은 상응 하는 라벨로 직접 점프 합니다

(* 라벨/점프 를 사용한 FBD 프로그램의 예 *)

(* IL Equivalence: *)

ld	manual

and	b1

jmpc	NOMODIF

ld	input1

or	input2

st	result

NOMODIF:	ld	result

and	valid

st	cmd10


Boolean negation
이진 반전

입력측에 단일 연결은 function block에서 이진 반전이 가능 합니다

작은 원 모양으로 표시되는데, 이진 반전이 사용된 경우 좌/우 타입은 이진 타입으로 설정 되어야 합니다.

(*FBD에서 라벨/점프 사용 예 *)

(* ST equivalence: *)

output1 := input1 AND NOT (input2);


Calling function or function blocks from the FBD
FBD 에서 function / function block 호출

FBD 언어는 sub-프로그램, function, function block 의 호출이 가능 합니다. sub-프로그램, function, function block 은 function box로 나타 나는데, Box에 적힌 이름은 sub-프로그램, function, function block의 이름 입니다. sub-프로그램, function 의 경우엔 반환값은 function box의 출력 값 입니다.

function block은 하나 이상의 출력을 갖습니다..

(*SUB PROGRAM block을 사용한 FBD 프로그램 예 *)

(* ST Equivalence *)

net_weight := Weighing (mode, delta); (* call sub-program *)

If (net_weight = 0) Then Return; End_if;

weight := net_weight + tare_weight;


SFC language
 SFC 언어

SFC언어는 sequential한 프로세스 operation을 기술할 때 사용합니다.

프로세스 액션을 표현하는 부분（스텝）과 스텝간의 이동조건을 표현하는 부분（transition）의 두 가지 그래픽 기호로 이루어져 있습니다.

스텝 안의 액션은 다른 언어（ＳＴ, ＩＬ, ＬＤ, ＦＢＤ）로 상세히 기술됩니다.

SFC chart 메인

SFC 기본 구성요소

분기와 결합

매크로스텝

스텝에서 액션

transition조건

SFC 다이나믹 규칙

SFC 프로그램 계층


SFC chart main format
SFC chart 메인

SFC프로그램은 방향을 가진 link에 따라 접속된 스텝과 transition 구조에 따라 나타납니다.

Multiple link는 분기와 결합을 나타내는데 사용됩니다.

Main Chart 프로그램의 일부를 Macro Step이라는 기호로 바꿔 다른 장소에 분리해서 기술할 수 있습니다.

SFC의 기본적인 규칙은 다음과 같습니다.

•	스텝 후에 따른 스텝을 연결할 수 없습니다.

•	transition 후에 다른 transition을 연결할 수 없습니다.


SFC basic components
SFC 기본 구성요소

SFC 언어의 기본 구성요소는:

스텝/ 시작스텝

Transitions

Oriented links

Jump to a step


Steps and initial steps
스텝 / 시작스텝

스텝은 하나의 정방향에 따라 표현되고, 각 스텝은 정방향 안에 적힌 reference번호에 따라 참조됩니다.

스텝의 주된 내용을 나타내는 커맨드가 스텝 기호에 link된 장방형 안에 기술됩니다. 이 커맨드는 프로그램언어의 일부분이 아니기 때문에 마음대로 기술 가능합니다.

이러한 표현방식을 스텝 레벨１표현이라 합니다.

실행 시에는 활성화 상태 스텝에는 token이 나타납니다.

Active step:	Inactive step:

SFC프로그램의 초기 상태는 이중테두리로 싸인 Initial Step 기호로 나타냅니다. 프로그램은 자동적으로 각 Initial Step에서 실행 개시됩니다.

Initial step:

 SFC프로그램은 적어도 하나의 Initial Step을 포함하고 있어야만 합니다.

아래의 스텝이 가지고 있는 속성 데이터를 나타냅니다.

다른 프로그램 언어에서도 이 데이터들을 사용할 수 있습니다.

GSnnn．x　스텝의 활성상태(boolean값)

GSnnn．t　스텝 활성지속 시간(타임 값)

（여기서 ｎｎｎ은 스텝 reference번호）


Transitions
Transition

transition은 접속link에 교차하는 수평 바에 따라 나타냅니다. 각 transition은 transition 기호 아래에 적힌reference번호에서 참조됩니다.

transition의 주된 내용은 transition기호 우측에 커맨드로 기술 가능합니다. 이 커맨드는 프로그램 언어의 일부분이 아니고 자유롭게 기술 가능합니다. 이러한 기술법을 transition Level 1표현이라 합니다.


Oriented links
연결(Oriented links)

스텝과 transition을 접속하기 위해 방향을 가진 Link（Oriented Link）라는 하나의 라인이 이용됩니다.

Link 방향이 명시적으로 주어져 있지 않을때는 위에서 아래로 Link됩니다.


Jump to a step
점프

transition에서 스텝에 Link을 접속할 때에 항상 접속 라인을 그릴 필요 없이 점프 기호를 이용할 수 있습니다. 점프 전에 목적스텝 번호를 기술할 필요가 있습니다.

스텝에서 transition으로는 점프 기호를 이용할 수 없습니다.

점프의 예 - 아래의 두 가지 차트는 동일합니다.


Divergences and convergences
분기와 결합

분기란 하나의 SFC기호(스텝 또는 transition)에서 기타 복수 SFC기호에 분기하는 다중접속 link을 의미합니다.

결합이란 복수 SFC기호에서 하나의 SFC기호에 모아서 묶어 놓은 다중접속 link을 의미합니다.

분기와 결합에는 각각 선택（ＯＲ）과 병렬（ＡＮＤ）２종류가 있습니다.

선택(OR)분기

병렬(AND)분기


Single divergences
선택(OR)분기

선택 분기(OR)란 하나의 스텝에서 복수 transition으로의 분기로 복수 분기 내의 하나만을 선택하는 것을 허용합니다.

또한, 선택 분기와 복수 transition에서 하나의 스텝에서의 결합으로 통상의 선택 분기에 따라 시작된 SFC분기를 모으는데（결합시키는） 사용됩니다.

선택 분기와 선택 결합은 하나의 평행 선으로 나타납니다.

주의：	선택 분기 직후의 복수transition은 암시적인 배타조건에 해당되지는 않습니다. 배타성은 실행시에 복수분기 내의 하나만 선택되는 것을 보증하기위해 transition 조건중에 암시적으로 기술될 필요가 있습니다.

이하에 선택 분기와 선택 결합의 예를 나타냅니다.

(*선택 분기와 선택 결합 SFC프로그램 *)


Double divergences
병렬(AND)분기

병렬 분기는 하나의 transition에서 복수 스텝으로의 분기이고, 프로세스의 병행실행을 의미합니다. 또한, 병렬 결합은 복수 스텝에서 하나의 transition으로의 결합입니다. 일반적인 병렬 결합은 병렬 분기에 따라 시작된 SFC분기를 모으는데（결합시키는）사용 됩니다. 병렬 분기와 병렬 결합은 이중 수평선으로 나타납니다.

병렬 분기와 병렬 결합의 예:

(*병렬 분기와 병렬 결합을 가진 SFC프로그램 *)


Macro steps
매크로 스텝

Macro 스텝은 복수 스텝과 transition의 유니크하게 편성된 하나의 서버프로세스를 나타냅니다. Macro 스텝 body（내용）는 같은 SFC프로그램 안의 다른 장소에 독립적으로 기술합니다.

Macro 스텝은 메인 SFC차트에 한 개의 기호로 나타납니다.

아래 그림은 Macro 스텝에 사용되는 기호입니다.

Macro 스텝기호 안에 적힌 reference번호는 Macro 스텝 본체의 선두 스텝의 reference번호입니다. Macro 스텝 body는 개시 스텝으로 시작되어 종료 스텝으로 끝나야 하며, 스스로 완결되어야 합니다.

시작 스텝은 어떠한 위쪽 link (직전의transition)도 가지지 않고 또한, 종료 스텝은 어떠한 아래쪽 link (직후의 transition)도 가지지 않습니다. Macro 스텝 기호를 다른 Macro 스텝에서 이용할 수 있습니다.

주의:Macro 스텝은 복수 스텝과 transition의 unique하게 편성된 하나의 SFC프로그램에 따라 같은 Macro Step을 ２회 이상 읽어낼 수 없습니다.

Macro 스텝의 예：(*Macro 스텝을 갖는 SFC프로그램 *)

(* Main chart *)	(* Body of the macro step *)


Actions within the steps
스텝 내의 액션

SFC스텝의 레벨２표현은 그 스텝이 활성상태 사이에 실행해야 할 액션의 상세한 기술 방식입니다.

이 기술은 SFC의 서식 규칙과 예를 들면 ＳＴ와 같은 다른 언어를 이용해서 표현합니다.

액션의 기본형은：

Boolean

ST언어로된(Pulse)

ST언어로된(Non-stored)

SFC 액션

하나의 스텝 안에 같은 형 또는 다른 형의 복수 액션을 기술할 수 있습니다.

다른 언어의 사용을 가능 하게 하는 방법은 아래의 두 가지 입니다.

서브 프로그램 호출

IL 언어 표현


Boolean actions
Boolean

boolean 액션이란 현재 스텝의 상태를 내부 _ 외부의 boolean 변수에 할당하는 것입니다. 그것은 스텝 활동의 시작되거나 멈출때 매회 할당됩니다.

이하에 기본적인 boolean 액션 문법을 나타냅니다.（<>는 입력하지 않습니다.）

< boolean형 변수명> (N);	스텝 활동상태를 변수에 할당

< boolean형 변수명 >;	 	(N 속성은 옵션)

/ < boolean형 변수명 >;	스텝 활동상태의 반전을 변수에 할당

그 밖에 스텝 상태가 활성화된 때의 변수치를 set 또는 reset할 수도 있습니다.

이하에 이 문법들을 나타냅니다.

< boolean형 변수명 > (S);

스텝 상태가 TRUE가 되었을때 변수치를 TRUE로 한다.

< boolean형 변수명 > (R);

스텝 상태가 TRUE가 되었을때 변수치를 FALSE로 한다.

boolean형 변수는 내부 또는 출력 변수이어야만 합니다.

이하에 나타나는 프로그램 예와 그 행동을 나타냅니다.

boolean 액션의 예：

(*boolean액션을 사용한 SFC프로그램 예 *)


Pulse actions
ST언어로된(Pulse)

pulse액션（Ｐ）는 스텝 상태가 활성화 상태가 된 때 일회만 실행되는 ＳＴ또는ＩＬ로 적힌 명령입니다. 다음과 같은 구문으로 적을 필요가 있습니다.

ACTION (P) :

(* ＳＴ Instruction *)

END_ACTION ;

이하에 pulse액션 행동을 나타냅니다.

예제...


Non-stored actions
ST언어로된(Non-stored)

normal 액션은 스텝 상태가 활성시 Target Cycle 실행되는 ＳＴ 또는ＩＬ로 적힌 명령입니다. 다음과 같은 문법으로 사용 합니다.

ACTION (N) :

(* Instruction *)

END_ACTION ;

이하에 Normal 액션 행동을 나타냅니다.：

예제...


SFC actions
SFC 액션

SFC액션에서는 child SFC sequence을 커맨드roll합니다. 즉, 스텝상태에 따라 작동, 정지합니다.　SFC액션에는 Ｎ（Normal）, Ｓ（Set）, Ｒ（Reset）식별자가 붙습니다.이하에 문법을 나타냅니다.

< child 프로그램 > (N) ;

스텝이 활성상태 시에  child sequence을 작동하고, 비활성 상태시에

child sequence을 정지(Kill)시킨다.

< child 프로그램 > ;	(N 식별자는 옵션)

< child 프로그램 > (S) ;

스텝이 활성상태된 때에 child sequence을 작동하고, 비활성 상태때

child sequence에 대해 아무 것도 하지 않는다.

< child 프로그램 > (R) ;

스텝이 활성상태된 때에 child sequence을 정지걁kills걂하고, 비활성

상태때 아무 것도 하지 않는다.

액션으로 지정되어 있는 SFC 는 현재 편집중인 프로그램 child SFC프로그램일 필요가 있습니다.

주의: 	SFC액션으로 사용되는 Ｓ（Set）, Ｒ（Reset）식별자는 ＳＴ언어에 따라 pulse액션으로 프로그램된 GSTART, GKILL스테이트먼트와 같은 의미를 가집니다.

아래는 SFC액션의 한 예입니다. FatherSFC프로그램은 SeqMlx와 SeqPump라는 두개의 Child-SFC을 가지고 있습니다.

(* SFCFunction을 가진 SFC프로그램 *)


Calling function and function blocks from an action
서브 프로그램 호출

ＳＴ，ＩＬ，또는 ＦＢＤ언어로 기술된 서브프로그램, Function, Function블록 또는C언어 Function과 C언어 Function블록은 이하와 같은 구문에 따라 SFC액션 블록에서 직접 call가능합니다.

서브프로그램, Function, "C"Function:

ACTION (P) :

result := sub_program ( ) ;

END_ACTION;

or

ACTION (N) :

result := sub_program ( ) ;

END_ACTION;

"C" 또는 ST, IL, LD, FBD언어로 기술된 FunctionBlock:

ACTION (P) :

Fbinst(in1, in2);

result1 := Fbinst.out1;

result2 := Fbinst.out2;

END_ACTION;

or

ACTION (N) :

Fbinst(in1, in2);

result1 := Fbinst.out1;

result2 := Fbinst.out2;

END_ACTION;

상세한 문법에 대해서는 ＳＴ언어 섹션을 참조 바랍니다.

이하에서는 FunctionBlock에서 Sub프로그램을 call한 예를 나타냅니다.

(*FunctionBlock에서 서버프로그램을 읽어낸S F C 프로그램 *)


IL convention
IL 언어 표현

아래 구문을 이용해서 SFC액션Block 중에 ＩＬ언어로 기술된 프로그램을 직접 끼워 넣을 수 있습니다.

ACTION (P) :	(* or N *)

#info=IL

     <instruction>

     <instruction>

     ....

#endinfo

END_ACTION;

"#info=IL" 와 "#endinfo"라는 특별한 키워드를 사용할 때는 정확하게 위의 구문을 지키 십시오. 키워드 전후에 스페이스와 Tab을 삽입할 수 없습니다. 이하는 FunctionBlock 중의 ＩＬ프로그램의 예를 나타냅니다.

(* FunctionBlock에서ＩＬ프로그램을 읽어낸 SFC프로그램 예 *)


Conditions attached to transitions
transitions 조건

각transition에는 transition을 clear（통과）하기 위한 조건을 규정할 논리식이  attach 됩니다. 통상 이 조건기술에는 ＳＴ언어가 이용됩니다.

이것을 transition레벨２표기라고 합니다.

또한 다른 언어을 사용하는 것도 가능합니다.

ST 언어

LD 언어

IL 언어

transition 에서 서브프로그램 호출

주의: 	transition에 조건기술이 없는 경우 디폴트 조건으로서 ＴＲＵＥ가 설정됩니다.


ST convention
ST 언어

transition조건을 기술하기 위해 ＳＴ언어를 사용할 수 있습니다. 조건은 boolean이어야만 하고, 아래 구문 규정에 나타나는 것처럼 세미콜론 으로 끝나야 합니다.

< boolean형 변수 > ;

조건 기술은 참／거짓 상수, 하나의 입력 또는 내부 논리형（Boolean）변수，또는 boolean을 도출하는 변수의 구조를 나타냅니다.

이하에서는transition조건을 기술하는 ＳＴ프로그램의 예를 나타냅니다.

(*transition에 ＳＴ프로그램을 사용한 SFC프로그램의 예 *)


LD convention
LD 언어

transition조건을 기술하기 위한 LD언어를 사용할 수 있습니다. 여기서는 ＬＤ프로그램은 하나의 rung만 됩니다. 코일에는 변수명을 할당할 필요가 없습니다.

이하에 transition 조건을 기술하는LD프로그램의 예를 나타냅니다.


IL convention
IL 언어

아래의 구문에 따라 transition을 ＩＬ언어로 직접 기술할 수 있습니다.

#info=IL

<instruction>

<instruction>

....

#endinfo

ＩＬ sequeence실행 결과（ＩＬ레지스터）에 보존되는 값에 따라 transition 조건 판정 결과가 결정됩니다.

current result = 0 	 	FALSE

current result <> 0	TRUE

"#info=IL" 와 "#endinfo"라는 특별한 키워드를 사용할 때는 정확하게 위의 구문을 지켜주십시오. 키워드 전후에 스페이스와 Tab의 삽입은 허용되지 않습니다. 이하는 FunctionBlock 내의 ＩＬ프로그램의 예를 나타냅니다.

(*transition에 ＩＬ프로그램을 사용한 SFC프로그램의 예 *)


Calling functions from a transition
transition 에서 서브프로그램 호출

transition조건을 평가 판단하기 위해 ＦＢＤ와 ＬＤ，ＳＴ，ＩＬ로 기술된 서버프로그램을 call가능합니다.

구문은 아래와 같습니다.

< sub_program > ( ) ;

서버프로그램 되돌리기 값에 따라 조건 판단이 결정됩니다.

return value = 0	FALSE

return value <> 0	TRUE

transition중의 서버프로그램 예

 (*transition에서 서버프로그램을 읽어낸 SFC프로그램 예 *)


SFC dynamic rules
SFC 다이나믹 규칙

SFC언어의 5가지 다이나믹 규칙을 아래에 나타냅니다.

 초기 상태

초기 상태는 초기 스텝에서 표현됩니다. 처리 개시 때는 이 스텝은 활성 상태로 됩니다. 각 SFC프로그램에는 적어도 하나의 초기 스텝이 있어야만 합니다

 transition 통과

transition에는enable상태와 disable상태가 있습니다. 여기서 enable상태란 직전 스텝이 활성（token이 존재）상태일 때를 말합니다. 직전 스텝이 활성이 아닐땐 disable상태라고 합니다. transition은 이하의 조건이 갖춰져 있을때 token이 통과합니다.

  - 직전 스텝이 활성일 때 동시에

 - transition조건이 TRUE일때

 활성화 스텝의 상태변화

transition을 token이 통과하는 동시에 다음 스텝으로 token이 이동하고서 활성상태가 됩니다. 그 결과 transition 직전의 스텝은 비활성 상태가 됩니다.

 transition의 동시통과

병렬분기는 token이동이 동시에 되는 것을 나타냅니다. transition가 따로 표시되어 있을 때는 직전의 스텝 활성상태를 조건으로서 해서 사용됩니다.

 스텝의 동시 활성화와 비활성화

처리 중에 스텝이 동시에 활성, 비활성이 되는 경우에 우선 순위는 활성화에 있습니다.


SFC program hierarchy
SFC 프로그램 계층

ISaGRAF에서는 SFC 프로그램의 계층적인 구조를 구축할 수 있습니다. 각 SFC프로그램은 다른 SFC프로그램에 대해 작동, 정지 등을 컨트롤할 수 있습니다. 컨트롤 되는 프로그램은 child SFC프로그램이라 합니다. SFC프로그램은“Father - Child”관계로 계층적으로 link되어 있습니다.

계층적 구성에는 이하의 기본적인 규칙이 있습니다.

•	Father SFC프로그램을 가지고 있지 않은 SFC프로그램은 메인 SFC프로그램이라 합니다.

•	메인 SFC프로그램이 sequential섹션으로 처음에 실행됩니다.

•	하나의 SFC프로그램은 복수 child SFC프로그램을 가질 수 있습니다.

•	child SFC프로그램은 두 가지 이상의 FatherSFC프로그램을 가질 수 없습니다.（하나의 Father 프로그램만）

•	child SFC프로그램은 Father SFC프로그램에서만 컨트롤 됩니다.

•	Father SFC프로그램은 자신의 child SFC프로그램의 child SFC프로그램（손자SFC프로그램）을 컨트롤할 수 없습니다.

Father SFC프로그램이 그 child SFC프로그램에 대해 컨트롤 가능한 액션을 이하에 나타냅니다.

Start	(GSTART) child SFC프로그램 작동： child프로그램의 각 초기 스텝을 활성상태로 합니다. 손자 프로그램은 자동으로 작동되지 않습니다.

Kill	(GKILL) child SFC프로그램의 정지： child 프로그램의 활성상태 스텝을 모두 비활성 상태로 합니다. 이때 손자 프로그램도 동시에 정지됩니다.

Freeze	(GFREEZE) child SFC프로그램 동결： child 프로그램의 활성 스텝을 동결 상태로 합니다. 단, 이 상태로 메모리에 보관한 후 다시 시작 가능한 상태로 둡니다. 손자 프로그램도 동시에 동결됩니다.

Restart	(GRST) 동결된 SFC프로그램 재작동：동결되어 있던 스텝을 전부 활성화 되면 프로그램을 재작동 시킵니다. 손자 프로그램은 자동으로 재작동 되지않습니다.

Get status	(GSTATUS) child SFC프로그램의 현재 상황을 취득합니다.（활성 상태, 비활성 상태, 동결 상태 중에）


LD language
 LD 언어

ＬＤ는 boolean연산의 그래픽한 표현방식 입니다. 입력（접점, 또는 콘텍트）과 출력（코일）의 편성으로 이루어져 있습니다. ＬＤ다이아그램은 전기relay회선과 함께 다룰 수 있습니다. ＬＤ다이아그램은 좌우 수직 모선으로 접속되어야 합니다.

모선 / 접속선

다중 접속

LD 접점 과 코일

리턴

점프 와 라벨

LD내의 Block

These are basic graphic components of an LD diagram:

좌 모선

우 모선

수평 접속선

수직 접속선

멀티플 접속선

접점

코일


Power rails and connection lines
모선 / 접속선

ＬＤ 다이아그램은 좌우 수직 라인 즉, 좌/우 모선에 접속되어야 합니다

ＬＤ 다이아그램에서의 그래픽 심벌은 접속선（connection라인）으로 모선 또는 다른 심벌에 접속됩니다. 접속선는 수직 또는 수평 라인입니다.

각 라인 Segment는 boolean상태의 FALSE 또는 TRUE의 값을 가집니다. 이 상태는 직접 접속되어 있는 Segment는 같은 값을 가집니다. 수직인 좌우 모선에 접속된 수평라인은 TRUE상태를 가집니다.


Multiple connection
다중 접속

싱글 수평라인은 좌우 하나의 라인으로 되어 있지만, 수평라인과 수평라인을 편성해서 복수라인을 모을 수 있습니다.（ multiple라인） multiple라인에 따라boolean상태는 이하의 룰을 가집니다.

좌측에 multiple 라인을 가질 경우, 즉, 복수 수평 라인이 좌 모선에서 접속되어 심벌을 자유롭게 우측에서 하나의 수평라인으로 접속되는 경우는 우측의 boolean상태는 좌측 라인의 논리 ＯＲ을 가지게 됩니다.

(* 좌측의 multiple라인 *)

(* 우측의 상태는 (v1 OR v2 OR v3) *)

우측 multiple connetion 의 경우는 즉, 좌측의 하나의 수평라인이 하나 이상의 라인이 되어 우측에 접속되는 경우는 좌측 논리상태가 우측으로 전달됩니다.

(* 우측 multiple라인 *)

(* 등가한 ＳＴ언어 *)

output1 := input1;

output2 := input1;

좌우 multiple라인의 경우는 즉, 좌우측이 복수 라인으로 좌우 수직라인에 접속되는 경우, 우측 논리 상태는 좌측 복수 라인의 논리 ＯＲ이 됩니다.

(* 좌우 multiple라인 예 *)

(* 등가한 ＳＴ언어 *)

output1 := input1 OR input2;

output2 := input1 OR input2;

output3 := input1 OR input2;


Basic LD contacts and coils
기본 접점과 코일

입력 접점（콘텍트）에는 몇 개의 종류가 있습니다.

a접점 (Direct contact)

b접점 (Inverted contact)

오르기 접점

내리기 접점

출력 코일에는 몇 개의 종류가 있습니다.

코일

반전 코일

SET 코일

RESET 코일

오르기 검출 코일

내리기 검출 코일

boolean변수명은 이 그래픽 심벌 위에 적힙니다.


Direct contact
a접점(Direct contact)

ａ접점은 boolean형 변수와 접속선 사이에서boolean을 조작합니다.

콘텍트 우측 접속선의 상태는 콘텍트 좌측 접속선과 콘텍트에 할당된 변수와의 논리적 ＡＮＤ의 결과입니다.

(* ａ접점의예 *)

(* 등가한 ＳＴ언어 *)

output1 := input1 AND input2;


Inverted contact
b접점(Inverted contact)

ｂ접점은 접속선과  boolean형 변수의 반전과 boolean을 조작합니다.

콘텍트의 우측 접속선의 상태는 콘텍트 좌측 접속선과 콘텍트에 할당된 변수의 반전과의 논리적인 ＡＮＤ의 결과입니다.

(* ｂ접점의 예 *)

(* 등가한 ＳＴ언어 *)

output1 := NOT (input1) AND NOT (input2);


Contact with rising edge detection
오르기 접점

 오르기 접점은 접속선과 논리 변수의 오르기와 boolean을 조작합니다.

콘텍트의 우측 접속선은 좌측 접속선이 ＴＲＵＥ인 동시에 boolean형 변수가ＦＡＬＳＥ에서 ＴＲＵＥ로 변화한 때만 ＴＵＲＥ가 됩니다. 이외의 상태에서는 ＦＡＬＳＥ가 됩니다.

(*오르기 접점의 예 *)

(* 등가한 ＳＴ언어 *)

output1 := input1 AND (input2 AND NOT (input2prev));

(* input2prev is the value of input2 at the previous cycle *)


Contact with falling edge detection
내리기 접점

 내리기 접점은 접속선과 논리 변수의 내리기와 boolean을 조작합니다.

콘텍트의 우측 접속선은 좌측 접속선이 ＴＲＵＥ인 동시에 boolean형 변수가ＴＲＵＥ에서 ＦＡＬＳＥ로 변화한 때만 ＴＵＲＥ가 됩니다. 이외의 상태에서는 ＦＡＬＳＥ가 됩니다.

(*내리기 접점의 예 *)

(* 등가한 ＳＴ언어 *)

output1 := input1 AND (NOT (input2) AND input2prev);

(* input2prev is the value of input2 at the previous cycle *)


Direct coil
코일

코일은 접속선 boolean상태를 boolean입력합니다.

좌측 접속선 상태가 코일에 할당된 논리 출력변수에 할당됩니다. 좌측 접속선 상태는 그대로 우측 접속선으로 전달됩니다. 우측 접속선은 통상 우 모선에 접속됩니다.

코일에 할당된 논리 출력변수는 내부변수 또는 외부 출력 변수이어야 합니다.

변수명은 프로그램명（단, 서버프로그램명만）을 사용하는 것도 가능합니다. 이 경우 변수명은 서버프로그램의 출력 parameter에 일치해야 합니다.

(* 코일의 예 *)

(* 등가한 ＳＴ언어 *)

output1 := input1;

output2 := input1;


Inverted coil
반전 코일

반전 코일은 접속선 boolean상태의 반전을 boolean출력합니다.

좌측 접속선의 반전 상태가 코일에 할당된 논리 출력 변수에 할당됩니다. 좌측 접속선의 반전 상태는 그대로 우측 접속선에 전달됩니다. 우측 접속선은 통상 우 모선에 접속됩니다.

코일에 할당되는 논리 출력 변수는 내부 변수 또는 외부 출력 변수이어야 합니다.

변수명은 프로그램명（단, 서버프로그램명만）을 사용하는 것도 가능합니다. 이 경우 변수명은 서버프로그램의 출력 parameter에 일치해야 합니다.

(*반전 코일의 예 *)

(* 등가한 ＳＴ언어 *)

output1 := NOT (input1);

output2 := input1;


SET coil
SET 코일

set코일은 접속선 boolean상태를 boolean출력합니다.

할당된 출력변수는 좌측 접속선 상태가 ＴＲＵＥ가 된때에 ＴＲＵＥ에 set됩니다. 출력변수는 이 상태를 reset코일에서 반전 될 때 까지 계속합니다. 좌측 접속선 상태는 그대로 우측 접속선에 전달됩니다. 우측 접속선은 통상 우 모선에 접속됩니다.

할당 되는 변수는 내부 변수 또는 외부 출력 변수이어야 합니다.

(* set, reset의 예 *)

(* 등가한 ＳＴ언어 *)

IF input1 THEN

   output1 := TRUE;

END_IF;

IF input2 THEN

   output1 := FALSE;

END_IF;


RESET coil
RESET 코일

reset 코일은 접속선 boolean상태를 boolean출력합니다.

할당된 출력변수는 좌측 접속선 상태가 TRUE가 되었을때 FALSE에 reset됩니다. 출력변수는 이 상태를 reset코일에서 반전 될 때 까지 계속합니다. 좌측 접속선 상태는 그대로 우측 접속선에 전달됩니다. 우측 접속선은 통상 우 모선에 접속됩니다.

할당 되는 변수는 내부 변수 또는 외부 출력 변수이어야 합니다.

(* set, reset의 예 *)

(*ＳＴ언어 *)

IF input1 THEN

   output1 := TRUE;

END_IF;

IF input2 THEN

   output1 := FALSE;

END_IF;


Coil with rising edge detection
오르기 검출 코일

오르기 검출 코일은 접속선 boolean를 출력합니다.

 이 코일은 Quick LD에디터를 사용한 경우에만 유효합니다.

할당된 변수는 좌측 접속선의 상태가 FALSE에서 ＴＲＵＥ로 올라 갔을 때TRUE에 set됩니다. 출력변수는 FALSE에 reset됩니다. 좌측 접속선 상태는 그대로 우측 접속선에 전달됩니다. 우측 접속선은 통상 우 모선에 접속됩니다.

할당 되는 변수는 내부 변수 또는 외부 출력 변수이어야 합니다.

(* 오르기 검출 코일의 예 *)

(* 등가한 ＳＴ언어 *)

IF (input1 and NOT(input1prev)) THEN

   output1 := TRUE;

ELSE

   output1 := FALSE;

END_IF;

(* input1prev is the value of input1 at the previous cycle *)


Coil with falling edge detection
내리기 검출 코일

내리기 검출 코일은 접속선 boolean를 출력합니다. 이 코일은 Quick LD 에디터를 사용한 경우에만 유효합니다.

할당된 변수는 좌측 접속선의 상태가 TRUE에서 FALSE로 내려 갔을 때에TRUE에 set됩니다. 출력 변수는 FALSE에 reset됩니다. 좌측 접속선 상태는 그대로 우측 접속선에 전달됩니다. 우측 접속선은 통상 우 모선에 접속됩니다.

할당 되는 변수는 내부 변수 또는 외부 출력 변수이어야 합니다.

(*내리기 검출 코일*)

(* 등가한 ＳＴ언어 *)

IF (NOT(input1) and input1prev) THEN

   output1 := TRUE;

ELSE

   output1 := FALSE;

END_IF;

(* input1prev is the value of input1 at the previous cycle *)


RETURN statement
리턴

RETURN라벨은 조건 종료에 사용됩니다. RETURN의 우측에는 아무것도 접속되지 않습니다.

RETURN라벨 좌측 라인의 논리 상태가 TRUE일 때 프로그램은 이하의 프로그램을 실행하지 않고 RETURN 합니다.

주의：	ＬＤ프로그램이 서버프로그램일 때는 프로그램명과 같은 이름을 RETURN 값에서 set해서Father프로그램에 RETURN 해야 합니다.

(* RETURN심벌의 예 *)

(* 등가한 ＳＴ언어 *)

If Not (manual_mode) Then RETURN; End_if;

result := (input1 OR input3) AND input2;


Jumps and labels
점프 / 라벨

라벨과 조건 부치기（조건 없음）점프을 사용해서 다이아그램의 실행 제어가 가능합니다. 라벨과 점프 심볼의 우측에 라인 접속은 할 수 없습니다.

>>LAB	라벨명 "LAB"로 점프

LAB:	라벨명 "LAB"의 내용

점프 심벌 좌측의 논리 상태가 TRUE일 때 프로그램은 대응한 라벨 심벌로 점프한 후에 실행됩니다.

(*점프와 라벨의 예*)

(* 등가한 ＩＬ언어 *)

ldn	manual_mode

jmpc	other

ld	input1

st	result

jmp	END

OTHER:	ld	input2

st	result

END:	(* end of program *)


Blocks in LD
LD내의 Block

QuickLD에디터를 사용해서 Function（Block）을 라인으로 접속할 수 있습니다. 여기서 Function은 연산자, FunctionBlock, Function을 가리킵니다. 모든 Block이 반드시boolean형 입출력을 가지고 있는 것을 제한하지 않기 위해, 새로운 ＥＮ, ＥＮＯparameter를 입출력 interface에 추가합니다. 단, ＦＢＤ／ＬＤ에디터에서는 필요한 형태의 변수를 직접 접속 가능케 하기 위해, ＥＮ, ＥＮＯ는 표현되지 않습니다.

"EN" 입력

"ENO" 출력

"EN" 와 "ENO"


The "EN" input
 "EN" 입력

연산자, FunctionBlock, Function 최초의 parameter가 boolean형이 아닐 경우는 자동적으로 ＥＮ이라는 입력parameter가 삽입됩니다. 이 ＥＮ가 TRUE일때만 Block이 실행됩니다. 이하에 비교 명령의 예와 등가한 ＳＴ언어 표현을 나타냅니다.

	IF rung_state THEN    q := (value1 > value 2); ELSE    q := FALSE; END_IF; (* continue rung with q state *)


The "ENO" output
"ENO" 출력

연산자, FunctionBlock, Function 최초의 parameter가 boolean형이 아닐 경우는 자동적으로 ＥＮＯ라는 입력parameter가 삽입됩니다. 이 ＥＮＯ는 항상 최초의 입력parameter 값을 가집니다. 이하에 평균수명의 예와 등가한 ＳＴ언어 표현을 나타냅니다.

	AVERAGE(rung_state, Signal, 100); OutSignal := AVERAGE.XOUT; eno := rung_state; (* continue rung with eno state *)


Using both "EN" and "ENO"
"EN" 와 "ENO"

어떤 경우는 ＥＮ, ＥＮＯ 둘 다 필요한 경우가 있습니다. 이하에 산술연산의 예와 등가한 ＳＴ언어 표현을 나타냅니다.

	IF rung_state THEN    result := (value1 + value2); END_IF; eno := rung_state; (* continue rung with eno state *)


Standard operators, function blocks and functions
 표준 명령, function block 과 function

표준 명령

표준 function block

표준 function

알파벳 순서


Standard operators
표준 명령

이하에 IEC 1131에 정의 되어 있는 표준 명령을 나타냅니다.

데이터 조작:

1 gain	Assignment

Neg	Analog negation (부호반전)

Boolean 조작:

& (AND)	Boolean AND

>=1 (OR)	Boolean OR

=1 (XOR)	Boolean Exclusive OR

수식 연산

 + 	덧셈

 - 	뺄셈

 * 	곱셈

 / 	나눗셈

논리 조작:

AND_MASK	bit마다 AND mask

OR_MASK	bit마다 OR mask

XOR_MASK	bit마다 Exclusive OR mask

NOT_MASK	bit반전

비교:

 < 	Less than

 <= 	Less or equal to

 > 	Greater than

 >= 	Greater or equal to

 = 	Is equal to

 <> 	Is not equal to

데이타 변환:

BOO	(Boolean변환)

ANA	(Integer Analog 변환)

REAL	(Real Analog 변환)

TMR	(Timer 변환)

MSG	(Message 변환)

기타:

CAT	Message concatenation

SYSTEM	System access

OPERATE	Operate I/O channel


1 gain

Arguments:

IN	모든 타입

Q	모든 타입

설명:

어떤 변수를 다른 변수에 assign 합니다.

이 블록은 입력과 출력을 직접 접속하는 블록입니다. 논리의 반전（○심벌）도 합쳐서 사용 가능합니다.

(* Assignment블록을 이용한 ＦＢＤ예 *)

(* ST 등가: *)

ao23 := ai10;

bo100 := NOT (bi1 AND bi2);

(* IL 등가: *)

LD	ai10

ST 	ao23

LD	bi1

AND	bi2

STN	bo100


NEG

인수:

IN	정수갋실수형	입력, 출력parameter는 같은 타입

Q	정수갋실수형

설명:

변수의 반전(부호반전)assign

(* Negation 블록을 이용한 ＦＢＤ예 *)

(* ST 등가: *)

ao23 := - (ai10);

ro100 := - (ri1 + ri2);

(* IL 등가: *)

LD	ai10

MUL	-1

ST 	ao23

LD	ri1

ADD	ri2

MUL	-1.0

ST	ro100


& AND

주의: 이 명령은 확장 명령이라 합니다. 입력수의 변경은 가능합니다.

인수:

(inputs)	boolean형

output	boolean형	입력 parameter의 논리적

설명:

두개 이상의 입력 parameter의 논리곱

(*"AND"  블록을 이용한 ＦＢＤ예*)

(* ST 등가: *)

bo10 := bi101 AND NOT (bi102);

bo5 := (bi51 AND bi52) AND bi53;

(* IL 등가 *)

LD	bi101	(* current result := bi101 *)

ANDN	bi102	(* current result := bi101 AND not(bi102) *)

ST	bo10	(* bo10 := current result *)

LD	bi51	(* current result := bi51;

&	bi52	(* current result := bi51 AND bi52 *)

&	bi53	(* current result := (bi51 AND bi52) AND bi53 *)

ST	bo5	(* bo5 := current result *)


>=1 OR

주의: 	이 명령은 Enhanced operator라고 합니다. 입력 변경은 가능합니다.

인수:

(inputs)	boolean형

output	boolean형 	입력 parameter의 논리합

설명:

두개 이상의 입력 parameter의 논리합

(*"OR" 블록을 이용한 ＦＢＤ예 *)

(* ST 등가: *)

bo10 := bi101 OR NOT (bi102);

bo5 := (bi51 OR bi52) OR bi53;

(* IL 등가: *)

LD	bi101

ORN	bi102

ST	bo10

LD	bi51

OR	bi52

OR	bi53

ST	bo5


=1 XOR

인수:

IN1	boolean형

IN2	boolean형

Q	boolean형 	두개의 boolean입력의 배타적 논리합

설명:

두개의 boolean입력의 배타적 논리합

(*"XOR" 블록을 이용한 ＦＢＤ예 *)

(* ST 등가: *)

bo10 := bi101 XOR NOT (bi102);

bo5 := (bi51 XOR bi52) XOR bi53;

(* IL 등가: *)

LD	bi101

XORN	bi102

ST	bo10

LD	bi51

XOR	bi52

XOR	bi53

ST	bo5


+

주의: 	이 명령은 Enhanced operator라고 합니다. 입력수의 변경은 가능합니다.

인수:

(inputs)	정수갋실수형	(모든 입력은 동일 타입)

output	정수갋실수형	모든 입력 부호 더하기

설명:

정수갋실수형 변수의 부호 더하기

(* 가산 블록을 이용한 ＦＢＤ예*)

(* ST 등가: *)

ao10 := ai101 + ai102;

ao5 := (ai51 + ai52) + ai53;

(* IL 등가: *)

LD	ai101

ADD	ai102

ST	ao10

LD	ai51

ADD	ai52

ADD	ai53

ST	ao5


-

인수:

IN1	정수갋실수형

IN2	정수갋실수형 	(IN1과 IN2는 같은 타입)

Q	정수갋실수형 	감산 결과 (IN1 - IN2)

설명:

두개의 정수갋실수형 변수의 빼기(1번째-2번째)

(* 감산 블록을 이용한 ＦＢＤ예 *)

 (* ST 등가: *)

ao10 := ai101 - ai102;

ao5 := (ai51 - 1) - ai53;

(* IL 등가: *)

LD	ai101

SUB	ai102

ST	ao10

LD	ai51

SUB	1

SUB	ai53

ST	ao5


*

주의: 	이 명령은 확장형 명령이라고 합니다. 입력수의 변경은 가능합니다.

인수:

(inputs)	정수갋실수형 	(모든 입력은 같은 타입)

output	정수갋실수형 	입력부호 곱하기

설명:

두개 이상의 정수갋실수형  변수의 곱하기

(* 승산 블록을 이용한 ＦＢＤ예*)

(* ST 등가 *)

ao10 := ai101 * ai102;

ao5 := (ai51 * ai52) * ai53;

(* IL 등가: *)

LD	ai101

MUL	ai102

ST	ao10

LD	ai51

MUL	ai52

MUL	ai53

ST	ao5


/

인수:

IN1	정수갋실수형

IN2	정수갋실수형 	괥이 아닐 것

(IN1과 IN2는 같은 타입)

Q	정수갋실수형 	부호 나누기(IN1/ IN2)

설명:

두개의 정수갋실수형 변수의 나누기(1번째/2째)

(* 제산 블록을 이용한 ＦＢＤ예*)

(* ST 등가: *)

ao10 := ai101 / ai102;

ao5 := (ai5 / 2) / ai53;

(* IL 등가: *)

LD	ai101

DIV	ai102

ST	ao10

LD	ai51

DIV	2

DIV	ai53

ST	ao5


AND_MASK

인수:

IN	정수형

MSK	정수형

Q	정수형 	IN과 MSK의 bit마다 논리곱

설명:

정수형 변수의 논리적으로 IN의 각 bit과 MSK의 각 bit와의 논리곱

(*Analog AND_MASK 블록을 이용한 ＦＢＤ예*)

(* ST 등가: *)

parity := AND_MASK (xvalue, 1); (* 1 if xvalue is odd *)

result := AND_MASK (16#abc, 16#f0f); (* equals 16#a0c *)

(* IL 등가: *)

LD	xvalue

AND_MASK	1

ST	parity

LD	16#abc

AND_MASK	16#f0f

ST	result


OR_MASK

인수:

IN	정수형

MSK	정수형

Q	정수형 	IN과 MSK의 bit마다 논리합

설명:

정수형 변수의 논리화에서 IN의 각 bit과 MSK의 각 bit와의 논리합

(*Analog OR_MASK블록을 이용한 ＦＢＤ예*)

(* ST 등가: *)

is_odd := OR_MASK (xvalue, 1); (* makes value always odd *)

result := OR_MASK (16#abc, 16#f0f); (* equals 16#fbf *)

(* IL 등가: *)

LD	xvalue

OR_MASK	1

ST	is_odd

LD	16#abc

OR_MASK	16#f0f

ST	result


XOR_MASK

인수:

IN	정수형

MSK	정수형

Q	정수형 	IN과MSK의 bit마다 배타적 논리합

설명:

정수형 변수의 배타적 논리화로 IN의 각 bit과 MSK의 각 bit과의 배타적

논리합

(*XOR_MASK블록을 이용한 ＦＢＤ예 *)

(* ST 등가: *)

crc32 := XOR_MASK (prevcrc, nextc);

result := XOR_MASK (16#012, 16#011); (* equals 16#003 *)

(* IL 등가: *)

LD	prevcrc

XOR_MASK	nextc

ST	crc32

LD	16#012

XOR_MASK	16#011

ST	result


NOT_MASK

인수:

IN	정수형

Q	정수형 	32bit표현 IN의 각 bit의 반전

설명:

정수형 변수의 각 bit의 반전

(*NOT_MASK 블록을 이용한 ＦＢＤ예*)

(*ST 등가: *)

result := NOT_MASK (16#1234);

(* result is 16#FFFF_EDCB *)

(* IL 등가: *)

LD	16#1234

NOT_MASK

ST	result


<

인수:

IN1	정수형갋실수형-

타임형 문자열형

IN2	정수갋실수형-

타임형 문자열형	 두개의 입력은 동일 타입

Q	boolean형	만약,  IN1 < IN2이면 TRUE

설명:

모든 타입의 두개의 변수 사이에서의 비교(LESS THAN)

(*"Less than" 블록을 이용한 ＦＢＤ예*)

(* ST 등가: *)

aresult := (10 < 25); (* aresult is TRUE *)

mresult := ('z' < 'B'); (* mresult is FALSE *)

(* IL 등가: *)

LD	10

LT	25

ST	aresult

LD	'z'

LT	'B'

ST	mresult


<=

인수:

IN1	정수갋실수형 문자열형

IN2	정수갋실수형 문자열형	두개의 입력은 동일 타입

Q	boolean형	만약, IN1 <= IN2이면TRUE

설명:

두개의 정수, 실수, 문자열형 변수 사이에서의 비교

(LESS THAN or EQUAL)

(*"Less or equal to" 블록을 이용한 ＦＢＤ예*)

(* ST 등가: *)

aresult := (10 <= 25); (* aresult is TRUE *)

mresult := ('ab' <= 'ab'); (* mresult is TRUE *)

(* IL 등가: *)

LD	10

LE	25

ST	aresult

LD	'ab'

LE	'ab'

ST	mresult


>

인수:

IN1	정수갋실수형-

타임형 문자열형

IN2	정수갋실수형-

타임형 문자열형 두개는 동일 타입

Q	boolean형	(IN1 > IN2에서TRUE)

설명:

두개의 변수 사이에서의 비교(GREATER THAN)

(*"Greater than" 블록을 이용한 ＦＢＤ예*)

(* ST 등가: *)

aresult := (10 > 25); (* aresult is FALSE *)

mresult := ('ab' > 'a'); (* mresult is TRUE *)

(* IL 등가: *)

LD	10

GT	25

ST	aresult

LD	'ab'

GT	'a'

ST	mresult


>=

인수:

IN1	정수갋실수형 문자열형

IN2	정수갋실수형 문자열형 	두개의 입력은 동일 타입

Q	boolean형	 IN1 >= IN2에서TRUE

설명:

두개의 변수 사이에서의 비교(GREATER THAN or EQUAL TO)

(*"Greater or Equal to"블록을 이용한 ＦＢＤ예 *)

(* ST 등가: *)

aresult := (10 >= 25); (* aresult is FALSE *)

mresult := ('ab' >= 'ab'); (* mresult is TRUE *)

(* IL 등가: *)

LD	10

GE	25

ST	aresult

LD	'ab'

GE	'ab'

ST	mresult


=

인수:

IN1	정수갋실수형 문자열형

IN2	정수갋실수형 문자열형 	두개의 입력은 동일 타입

Q	boolean형  (IN1 = IN2에서TRUE)

설명:

두개의 변수 사이에서의 비교 (EQUAL TO)

(*"Is Equal to"블록을 이용한 ＦＢＤ예*)

(* ST 등가: *)

aresult := (10 = 25); (* aresult is FALSE *)

mresult := ('ab' = 'ab'); (* mresult is TRUE *)

(* IL 등가: *)

LD	10

EQ	25

ST	aresult

LD	'ab'

EQ	'ab'

ST	mresult


<>

인수:

IN1	정수갋실수형 문자열형

IN2	정수갋실수형 문자열형 	두개의 입력은 동일 타입

Q	boolean형	(IN1 <> IN2에서TRUE)

설명:

두개의 변수 사이에서의 비교 (NOT EQUAL TO)

(*  "Is Not Equal to" 블록을 이용한 ＦＢＤ예 *)

(* ST 등가: *)

aresult := (10 <> 25); (* aresult is TRUE *)

mresult := ('ab' <> 'ab'); (* mresult is FALSE *)

(* IL 등가: *)

LD	10

NE	25

ST	aresult

LD	'ab'

NE	'ab'

ST	mresult


BOO

인수:

IN	모든 타입	걁boolean형 이외:

Q	boolean형 	TRUE : 0이외

FALSE : 0

TRUE: 'TRUE' 문자열

FALSE: 'FALSE' 문자열

설명:

변수의 boolean형으로의 변환

(*  "boolean형  변환 블록을 이용한 FBD예 *)

(* ST 등가: *)

ares := BOO (10);	(* ares is TRUE *)

tres := BOO (t#0s);	(* tres is FALSE *)

mres := BOO ('false');	(* mres is FALSE *)

(* IL 등가: *)

LD	10

BOO

ST	ares

LD	t#0s

BOO

ST	tres

LD	'false'

BOO

ST	mres


ANA

인수:

IN	모든 타입	(정수형 이외)

Q	정수형	0 :IN이FALSE일 때

                                 1 :IN이 TRUE일 때

타임 ms수치

실수 변수의 정수부분

문자열의 10진수 표현

설명:

변수의 정수형으로의 변환

(*"Convert to Analog"블록을 이용한 FBD 예 *)

(* ST 등가: *)

bres := ANA (true);	(* bres is 1 *)

tres := ANA (t#1s46ms);	(* tres is 1046 *)

mres := ANA ('0198');	(* mres is 198 *)

(* IL 등가: *)

LD	true

ANA

ST	bres

LD	t#1s46ms

ANA

ST	tres

LD	'0198'

ANA

ST	mres


REAL

인수:

IN	boolean형 정수형-

타임형	실수, 문자열형 이외

Q	실수형	0.0 :IN이 FALSE / 1.0 : IN이 TRUE

타임 ms수치

정수형과 같은 수치

설명:

변수의 실수형으로의 변환

(*"Convert to Real" 블록을 이용한 FBD예 *)

(* ST 등가: *)

bres := REAL (true);	(* bres is 1.0 *)

tres := REAL (t#1s46ms);	(* tres is 1046.0 *)

ares := REAL (198);	(* ares is 198.0 *)

(* IL 등가: *)

LD	true

REAL

ST	bres

LD	t#1s46ms

REAL

ST	tres

LD	198

REAL

ST	ares


TMR

인수:

IN	정수갋실수형	(타임 이외)

Q	타임형	IN으로 표현되는 타임 값 ms표시

IN이 실수일 때는 그 정수부분

설명:

정수/실수형 변수의 타임 값으로의 변환

(*  "Convert to Timer"블록을 이용한 FBD예 *)

 (* ST 등가: *)

ares := TMR (1256);	(* ares := t#1s256ms *)

rres := TMR (1256.3);	(*rres := t#1s256ms *)

(* IL 등가: *)

LD	1256

TMR

ST	ares

LD	1256.3

TMR

ST	rres


MSG

인수:

IN	boolean형-

실수형  실수형	(문자열형 이외)

Q	문자열형	'false' 또는 'true' : IN이 boolean형 일 때  	１０진수 표현IN이 정수, 실수형 일 때

설명:

변수의 문자열형으로의 변환

(* "Convert to Message" 블록을 이용한 FBD 예 *)

(* ST 등가: *)

bres := MSG (true); (* bres is 'TRUE' *)

ares := MSG (125); (* ares is '125' *)

(* IL 등가: *)

LD	true

MSG

ST	bres

LD	125

MSG

ST	ares


CAT

주의: 	이 명령은 확장형 명령이라 합니다. 입력수의 변경은 가능합니다.

인수:

(inputs)	문자열형	(모든 문자열형 변수의 결합, 출력 문자열의 최대 치를

           넘지 않을 것)

output	문자열형  입력 문자열의 결합

설명:

복수 문자열을 하나로 결합

(*  "Message Concatenation" 블록을 이용한 FBD예 *)

(* ST 등가: use the + operator *)

myname := ('Mr' + ' ') + 'Jones';

(* means: myname := 'Mr Jones' *)

(* IL 등가: *)

LD	'Mr'

ADD	' '

ADD	'Jones'

ST	myname


SYSTEM

인수:

Mode	정수형	시스템parameter의 식별자, 또는 access 모드

Arg	정수형     타임형 적어 넣기 모드일 때 적어넣을 값

Param	정수형	access 결과 값

설명:

시스템parameter의 access

이하에 다룰 수 있는 SYSTEM Function 커맨드（모드）예를 나타냅니다. 이들 커맨드는 정의 종료 워드입니다.

Command	Meaning
SYS_TALLOWED	허용 사이클 타임 읽어 내기
SYS_TCURRENT	현재 사이클 타임 읽어 내기
SYS_TMAXIMUM	최대 사이클 타임 읽어 내기
SYS_TOVERFLOW	사이클 타임 over follow회수 읽어 내기
SYS_TRESET	다이나믹 카운터reset
SYS_TWRITE	사이클 타임의 변경
SYS_ERR_TEST	런타임 에러 체크
SYS_ERR_READ	최신 런타임 에러 읽어 내기

이하에 ＳＹＳＴＥＭFunction 각각의 커맨드에 대한 인수를 나타냅니다.

Command	인수	되돌리기 값
SYS_TALLOWED	0	허용 사이클 타임
SYS_TCURRENT	0	현재 사이클 타임
SYS_TMAXIMUM	0	최대 사이클 타임
SYS_TOVERFLOW	0	Over follow회수
SYS_TRESET	0	0
SYS_TWRITE	새로운 사이클 타임	적어 넣은 사이클 타임
SYS_ERR_TEST	0	에러가 없으면 ０
SYS_ERR_READ	0	최신 에러 코드

(*"System"블록을 이용한 ＦＢＤ예*)

(* ST 등가: *)

alarm := (SYSTEM (SYS_TOVERFLOW, 0) <> 0);

If (alarm) Then

nb_err := nb_err + 1;

rc := SYSTEM (SYS_TRESET, 0);

End_If;


OPERATE

인수:

IO	모든 타입	입출력 변수

Funct	정수형	지정 Function

Arg	정수형 	I/O액션에 대한 인수

Q	정수형 	되돌리기 값

설명:

I/O채널로 access

ＯＰＥＲＡＴＥ 처리 내용은 Ｉ／Ｏ드라이브에 따라 결정됩니다. 상세한 것은 대응하는 Ｉ／Ｏ드라이브의 기술 메모 등을 참조 바랍니다.


Standard function blocks
표준 function block

ISaGRAF에 따라 support되고 있는 표준 FunctionBlock을 이하에 나타냅니다. 이들은 표준으로 구비되어 있기 때문에ISaGRAF library에 등록할 필요가 없습니다.

Booleans:

SR	set우선 쌍안정

RS	Reset우선 쌍안정

R_TRIG	오르기 검출

F_TRIG	내리기 검출

SEMA	Semaphore

Counting:

CTU	Up 카운터

CTD	Down 카운터

CTUD	Up-down 카운터

Timers:

TON	On-delay timing

TOF	Off-delay timing

TP	Pulse timing

Integer analogs:

CMP	완전비교

STACKINT	정수 아날로그Stack

Real analogs:

AVERAGE	평균치

HYSTER	hysteresis

LIM_ALRM	hysterises 를 가진 상한／하한 limit

INTEGRAL	적분

DERIVATE	미분

Signal generation:

BLINK	boolean형 신호 BLINK

SIG_GEN	신호 발생기

주의： 	새로운 Ｃ언어 FunctionBlock이 만들어진 경우에도 FBD에서 호출 가능 합니다.


SR

인수:

SET1	boolean형	TRUE이면 Q1은 TRUE (set우선함)

RESET	boolean형 	TRUE이면Q1을 FALSE에 reset

Q1	boolean형 	boolean형 메모리 상태

설명:

set우선 쌍안정：이하의 테이블 참조

Set1 	Reset	Q1	result Q1

0 	0	0	0

0	0	1	1

0	1	0	0

0	1	1	0

1	0	0	1

1	0	1	1

1	1	0	1

1	1	1	1

(*"SR"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: We suppose SR1 is an instance of SR block *)

SR1((auto_mode & start_cmd), stop_cmd);

command := SR1.Q1;

(* IL 등가: *)

LD	auto_mode

AND	start_cmd

ST	SR1.set1

LD	stop_cmd

ST	SR1.reset

CAL	SR1

LD	SR1.Q1

ST	command


RS

인수:

SET	boolean형 	TRUE로 Q1을TRUE에 set

RESET1	boolean형 	TRUE로 Q1을 FALSE에 reset (reset우선함)

Q1	boolean형 	boolean형 메모리 상태

설명:

reset우선 쌍안정：이하의 테이블 참조

Set 	Reset1	Q1	result Q1

0 	0	0	0

0	0	1	1

0	1	0	0

0	1	1	0

1	0	0	1

1	0	1	1

1	1	0	0

1	1	1	0

(* FBD program using "RS" block *)

(* ST 등가: We suppose RS1 is an instance of RS block *)

RS1(start_cmd, (stop_cmd OR alarm));

command := RS1.Q1;

(* IL 등가: *)

LD	start_cmd

ST	RS1.set

LD	stop_cmd

OR	alarm

ST	RS1.reset1

CAL	RS1

LD	RS1.Q1

ST	command


R_TRIG

인수:

CLK	boolean형

Q	boolean형 	TRUE : CLK이 FALSE가 TRUE로 올렸을 때 FALSE:이외의 경우

설명:

boolean형 변수의 오르기 검출:(사이클 전 값과 비교)

(*"R_TRIG"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: We suppose R_TRIG1 is an instance of R_TRIG block *)

R_TRIG1(cmd);

nb_edge := ANA(R_TRIG1.Q) + nb_edge;

(* IL 등가: *)

LD	cmd

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ANA

ADD	nb_edge

ST	nb_edge


F_TRIG

인수:

CLK	boolean형

Q	boolean형 	TRUE:CLK이 TRUE에서 FALSE로 내렸을

                          때 FALSE:이외의 경우

설명:

boolean형 변수의 내리기 검출은(1사이클 전 값과 비교해서)

(*"F_TRIG"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: We suppose F_TRIG1 is an instance of F_TRIG block *)

F_TRIG1(cmd);

nb_edge := ANA(F_TRIG1.Q) + nb_edge;

(* IL 등가: *)

LD	cmd

ST	F_TRIG1.clk

CAL	F_TRIG1

LD	F_TRIG1.Q

ANA

ADD	nb_edge

ST	nb_edge


SEMA

인수:

CLAIM	boolean형	"테스트와 set" 커맨드

RELEASE	boolean형 	SEMA fo  release

BUSY	boolean형 	SEMA fo 상태

설명:

(* "x" 는 boolean형 변수로 FALSE에 초기화*)

busy := x;

If claim Then

x := True;

Else

If release Then

busy := False;

x := False;

End_if;

End_if;


CTU

인수:

CU	boolean형 	카운터 입력 ( CU가 TRUE에서 카운터)

RESET	boolean형 	reset커맨드(우선)

PV	정수형	최대 설정치

Q	boolean형 	over follow갌 CV = PV에서TRUE

CV	정수형	카운터 결과

주의： 	ＣＴＵ는 입력ＣＵ의 오르기, 내리기를 검출할 수 없습니다. 반드시 "R_TRIG" 또는 "F_TRIG" 을 사용해서 pulse카운터를 만들 필요가 있습니다.

설명:

카운터 수(정수형)는 0에서 1씩 increment

(*"CTU"블록을 이용한 ＦＢＤ프로그램*)

(*등가한 ＳＴ언어: R_TRIG1은 R_TRIG블록 instance  CTU1은 CTU 블록 instance *)

CTU1(R_TRIG1(command),NOT(auto_mode),100);

overflow := CTU1.Q;

result := CTU1.CV;

(* IL 등가: *)

LD	command

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ST	CTU1.cu

LDN	auto_mode

ST	CTU1.reset

LD	100

ST	CTU1.pv

CAL	CTU1

LD	CTU1.Q

ST	overflow

LD	CTU1.cv

ST	result


CTD

인수:

CD	boolean형	카운터 입력

(CD 가 TRUE일 때 카운터down)

LOAD	boolean형	로드 커맨드 (우선)

(CV = PV 에서 LOAD가 TRUE)

PV	정수형	초기 카운터 값

Q	boolean형 	종료 신호: CV = 0에서 TRUE

CV	정수형	카운터 결과

주의：	ＣＴＤ는 입력ＣＤ의 오르기, 내리기를 검출할 수 없습니다. 반드시 "R_TRIG" 또는 "F_TRIG"을 사용해서 pulse 카운터를 만들 필요가 있습니다.

설명:

카운터 수(정수형)는 PV값에서 1씩 감소

(*"CTD"블록을 이용한 ＦＢＤ프로그램*)

 (* ST 등가: We suppose F_TRIG1 is an instance of F_TRIG block and CTD1 is an instance of CTD block*)

CTD1(F_TRIG1(command),load_cmd,100);

underflow := CTD1.Q;

result := CTD1.CV;

(* IL 등가: *)

LD	command

ST	F_TRIG1.clk

CAL	F_TRIG1

LD	F_TRIG1.Q

ST	CTD1.cd

LD	load_cmd

ST	CTD1.load

LD	100

ST	CTD1.pv

CAL	CTD1

LD	CTD1.Q

ST	underflow

LD	CTD1.cv

ST	result


CTUD

인수:

CU	boolean형	updown카운터 입력 (CU가TRUE에서 카운터)

CD	boolean형 	down카운터 입력 (CD가TRUE에서 카운터)

RESET	boolean형 	reset커맨드 (우선)

(R 이 TRUE일 때 CV = 0)

LOAD	boolean형 	LOAD커맨드(LD 가TRUE일때 CV = PV)

PV	정수형	최대 카운터 값

QU	boolean형 	over follow갌 TRUE when CV = PV

QD	boolean형 	under follow갌 TRUE when CV = 0

CV	정수형	카운터 결과

주의：	ＣＴＵＤ는 입력ＣＵ, ＣＤ의 오르기, 내리기, 내리기를 검출할 수 없습니다. 반드시 "R_TRIG" 또는 "F_TRIG"을 사용해서 pulse 카운터를 만들 필요가 있습니다.

설명:

카운터 수(정수형)는 0에서 PV값까지 1씩 increment, 또는

카운터 수(정수형)는 현재 값에서 1씩 감소

(*"CTUD"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: We suppose R_TRIG1 and R_TRIG2 are two instances of R_TRIG block and CTUD1 is an instance of CTUD block*)

CTUD1(R_TRIG1(add_elt), R_TRIG2(sub_elt), reset_cmd, load_cmd,100);

full := CTUD1.QU;

empty := CTUD1.QD;

nb_elt := CTUD1.CV;

(* IL 등가: *)

LD	add_elt

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ST	CTUD1.cu

LD	sub_elt

ST	R_TRIG2.clk

CAL	R_TRIG2

LD	R_TRIG2.Q

ST	CTUD1.cd

LD	reset_cmd

ST	CTUD1.reset

LD	load_cmd

ST	CTUD1.load

LD	100

ST	CTUD1.pv

CAL	CTUD1

LD	CTUD1.QU

ST	full

LD	CTUD1.QD

ST	empty

LD	CTUD1.CV

ST	nb_elt


TON

인수:

IN	boolean형	오르기 검출로 타임값 increment

내리기 검출로 타임 값 정지, reset

PT	타임형	타임up설정치

Q	boolean형 	TRUE:타임up설정치가 경과

ET	타임형	현재 경과 타임값

설명:

내부 값을 지정된 값(PT)까지 increment

타임 차트:


TOF

인수:

IN	boolean형	내리기 검출로 타임값 increment

오르기 검출로 타임 값 정지, reset

PT	타임형	설정 타임 값

Q	boolean형 	TRUE: 설정 타임 값 까지 경과하지 않음

ET	타임형	현재 경과 타임값

설명:

내부 타임 값을 지정된 값(PT)까지 increment

타임 차트:


TP

인수:

IN	boolean형	오르기 검출에서 타임 값의 increment(increment 중이 아니면) 만약, FALSE상태에서 타임 값이 경과한 때는 타임 값을 reset. 타임 increment 중은IN의 변화는 무시됩니다.

PT	타임형	설정 타임값

Q	boolean형	TRUE: 타임이 increment중

ET	타임형	현재 경과 타임값

설명:

내부 타임 값을 지정된 값(PT)까지 increment

타임 차트:


CMP

인수:

VAL1	정수형	부호부치기 정수

VAL2	정수형	부호부치기 정수

LT	boolean형	TRUE: VAL1 < VAL2

EQ	boolean형  TRUE: VAL1 = VAL2

GT	boolean형 	TRUE: VAL1 > VAL2

설명:

두개의 정수형 값 비교:3개의 결과 중에 택합니다.(<,=,>)

(*"CMP"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: We suppose CMP1 is an instance of CMP block *)

CMP1(level, max_level);

pump_cmd�:= CMP1.LT OR CMP1.EQ;

alarm�:= CMP1.GT AND NOT(manual_mode);

(* IL 등가: *)

LD	level

ST	CMP1.val1

LD	max_level

ST	CMP1.val2

CAL	CMP1

LD	CMP1.LT

OR	CMP1.EQ

ST	pump_cmd

LD	CMP1.GT

ANDN	manual_mode

ST	alarm


STACKINT

인수:

PUSH	boolean형 	push커맨드: 오르기 검출에 따라 IN값을stack top에 추가

POP	boolean형 	pop커맨드: 오르기 검출에 따라 stack top (마지막에 push된 값)을 삭제

R1	boolean형 	stack을 공백 상태에 reset한다.

IN	정수형	push되는 값

N	정수형 	stack 사이즈

EMPTY	boolean형 	TRUE: stack 이 공백일 때

OFLO	boolean형 	TRUE:stack이 가득참

OUT	정수형 	stack top의 값

설명:

 정수형 값 stack의 관리

STACKINT FunctionBlock은 ＰＵＳＨ, ＰＯＰ의 입력에 대해 오르기 검출 기능도 포함하고 있습니다. 최대 stack 사이즈는１２８입니다. Stack 사이즈 Ｎ은 １에서１２８의 값이어야만 합니다.

OFLO값은 일단 reset된 후에만 유효.（즉, R1는 한번 TRUE에 set된 후에FALSE되돌아 가야 합니다.）

(*"STACKINT" 블록을 이용한 ＦＢＤ프로그램 : error management *)

(* ST 등가: We suppose STACKINT1 is an instance of STACKINT block *)

STACKINT1(err_detect, acknoledge, manual_mode, err_code, max_err);

appli_alarm�:= auto_mode AND NOT(STACKINT1.EMPTY);

err_alarm�:= STACKINT1.OFLO;

last_error�:= STACKINT1.OUT;

(* IL 등가: *)

LD	err_detect

ST	STACKINT1.push

LD	acknoledge

ST	STACKINT1.pop

LD	manual_mode

ST	STACKINT1.r1

LD	err_code

ST	STACKINT1.IN

LD	max_err

ST	STACKINT1.N

CAL	STACKINT1

LD	auto_mode

ANDN	STACKINT1.empty

ST	appli_alarm

LD	STACKINT1.OFLO

ST	err_alarm

LD	STACKINT1.OUT

ST	last_error


AVERAGE

인수:

RUN	boolean형	TRUE:run  /  FALSE:reset

XIN	실수형	실수치 입력

N	정수형	평균을 내야할 샘플수(매 사이클1회입력)

XOUT	실수형 	 XIN값의 사이클 개수(N개)의 평균값

설명:

매 사이클 XIN을 집어 넣고, 과거 샘플값(샘플수N)의 평균치를 구합니다. 최신의 N개 데이터가 축적되어 있습니다.

센플Ｎ은 최대１２８입니다. "RUN" 커맨드가 FALSE일때（reset모드）, 출력치는 입력치와 같은 값이 됩니다.

축적된 센플이 N이 되면, 처음에 축적된 값은 삭제됩니다.

(*"AVERAGE"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: AVERAGE1 instance of AVERAGE block *)

AVERAGE1((auto_mode & store_cmd), sensor_value, 100);

ave_value�:= AVERAGE1.XOUT;

(* IL 등가: *)

LD	auto_mode

AND	store_cmd

ST	AVERAGE1.run

LD	sensor_value

ST	AVERAGE1.xin

LD	100

ST	AVERAGE1.N

CAL	AVERAGE1

LD	AVERAGE1.XOUT

ST	ave_value


HYSTER

인수:

XIN1	실수형	실수

XIN2	실수형 	실수(XIN1이 XIN2+EPS을 넘든지 테스트된다)

EPS	실수형 	hysteresis 값(>0)

Q	boolean형	TRUE: XIN1, XIN2+EPS을 한번은 넘고, 아직 XIN2-EPS를 하회하고 있지 않은 때

설명:

실수치의 상한 값을 위한 hysteresis

타임 차트 예:


LIM_ALRM

인수:

H	실수형	상한 설정치

X	실수형 	입력치

L	실수형 	하한 설정치

EPS	실수형 	hysteresis 값 ( >0)

QH	boolean형	상한alrm, TRUE: X가 상한값 H를 넘은 다음에 H-EPS를 하회 할 때 까지

Q	boolean형 	alrm, TRUE: QH또는 QL

QL	boolean형 	하한 alrm, TRUE: X가 하한값 L을 하회한 다음에,L+EPS를 넘을 때까지

설명:

실수치에 대해 상하한에 대한 hysteresis

hysteresis가 상한, 하한 리미터에 주어집니다. 상하한에 사용되는hysteresis데이터 양은 ＥＰＳ parameter의 절반이 됩니다.

타임 차트 :


INTEGRAL

인수:

RUN	boolean형	모드, TRUE=적분 / FALSE=홀드

R1	boolean형 	표서reset

XIN	실수형 입력치

X0	실수형	초기값

CYCLE	타임형	샘플링 주기

Q	boolean형 	R1의 반전

XOUT	실수형	적분 결과

설명:

실수치의 적분

"CYCLE" parameter값이 ＩＳａＧＲＡＦ 사이클 타임보다도 짧은 경우는 샘플링 간격은 사이클 타임에 맞춰집니다.

(*"INTEGRAL"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: INTEGRAL1 instance of INTEGRAL block *)

INTEGRAL1(manual_mode, NOT(manual_mode), sensor_value, init_value, t#100ms);

controlled_value := INTEGRAL1.XOUT;

(* IL 등가: *)

LD	manual_mode

ST	INTEGRAL1.run

STN	INTEGRAL1.R1

LD	sensor_value

ST	INTEGRAL1.XIN

LD	init_value

ST	INTEGRAL1.X0

LD	t#100ms

ST	INTEGRAL1.CYCLE

CAL	INTEGRAL1

LD	INTEGRAL1.XOUT

ST	controlled_value


DERIVATE

인수:

RUN	boolean형	모드갅TRUE=run / FALSE=reset

XIN	실수형	입력치

CYCLE	타임형	샘플링 주기

XOUT	실수형 	미분 결과

설명:

실수치의 미분

"CYCLE" parameter값이ＩＳａＧＲＡＦ 사이클 타임보다도 짧은 경우는 샘플링간격은 사이클 타임에 맞춰집니다.

(*"DERIVATE"블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: DERIVATE1 instance of DERIVATE block *)

DERIVATE1(manual_mode, sensor_value, t#100ms);

derivated_value := DERIVATE1.XOUT;

(* IL 등가: *)

LD	manual_mode

ST	DERIVATE1.run

LD	sensor_value

ST	DERIVATE1.XIN

LD	t#100ms

ST	DERIVATE1.CYCLE

CAL	DERIVATE1

LD	DERIVATE1.XOUT

ST	derivated_value


BLINK

인수:

RUN	boolean형	모드, TRUE= blink  / FALSE=출력을 reset

CYCLE	타임형	blink 주기

Q	boolean형 	blink 출력 번호

설명:

blink 신호 생성

타임 차트:


SIG_GEN

인수:

RUN	boolean형 	모드 TRUE=run / FALSE=reset

PERIOD	타임형	샘플시간(pulse폭)

MAXIMUM	정수형	최대 카운터 값

PULSE	boolean형 	각 샘플시간마다 반전

UP	정수형	각 샘플시간마다 up카운터

END	boolean형 	TRUE: up카운터 종료때

SINE	정수형	사인파형 신호(파형 반주기는 up카운터 시간)

설명:

각종 신호의 동시 발생(pulse파형, up카운터 , 사인파형)카운터가 최대값이 되면, 0 에서 restart 합니다. END신호는 1 PERIOD분만 TRUE가 됩니다.

타임 차트:


Standard functions
표준 functions

ＩＳａＧＲＡＦ에서 support되고 있는 표준 Function을 이하에 나타냅니다. 이들은 표준으로 준비되어 있기 때문에ＩＳａＧＲＡＦ library에 등록할 필요가 없습니다.

계산:

ABS	절대값

EXPT	지수관수

LOG	상용대수

POW	지수관수

SQRT	평방근

TRUNC	소수점이하 잘라 버리기

삼각함수:

ACOS	A 코사인

ASIN	A 사인

ATAN	A 탄젠트

COS	코사인

SIN	사인

TAN	탄젠트

레지스터 컨트롤:

ROL	좌회전

ROR	우회전

SHL	좌 Shift

SHR	우 Shift

Data manipulation:

MIN	최소값

MAX	최대값

LIMIT	상하근

MOD	잉여산

MUX4	Multiplexer (4 entries)

MUX8	Multiplexer (8 entries)

ODD	홀수parity

RAND	Random 값

SEL	binary선택

데이타 변환:

ASCII	Character  ASCII code

CHAR	ASCII code  Character

문자열 조작:

DELETE	삭제

INSERT	문자열 추가

FIND	찾기

MLEN	문자열길이

LEFT	좌측 문자열 조출

MID	문자열 조출

REPLACE	문자열 교체

RIGHT	우측 문자열 졸출

DAY_TIME	일시

배열 조작:

ARCREATE	배열 작성

ARREAD	배열 요소 읽어 내기

ARWRITE	배열 요소 적어 내기

Binary 파일 관리:

F_ROPEN	읽어 내기 모드로 파일 오픈

F_WOPEN	써넣기 모드로 파일 오픈

F_CLOSE	파일 close

F_EOF	파일 최종 검출

FA_READ	파일에서 정수값 읽어 내기

FA_WRITE	파일로 정수값 적어 넣기

FM_READ	파일에서 문자열 읽어 내기

FM_WRITE	파일로 문자열 적어 넣기


ABS

인수:

IN	실수형	실수치 입력

Q	실수형 	절대값

설명:

실수의 절대값 계산

(*"ABS"블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

over := (ABS (delta) > range);

(* IL 등가: *)

LD	delta

ABS

GT 	range

ST	over


EXPT

인수:

IN	실수형 	부호 부치기 실수(base부)

EXP	정수형	정수(exponent부)

Q	실수형 	(IN EXP)

설명:

실수의 지수관수： (base exponent) 'base' 가 최초의 인수, 'exponent' 가 두번째 인수로 정수

(* ST 등가: *)

tb_size := ANA (EXPT (2.0, range) );

(* IL 등가: *)

LD	2.0

EXPT	range

ANA

ST	tb_size


LOG

인수:

IN	실수형	실수치(>0)

Q	실수형 	입력 값의 상용대수(base 10)

tjfaud:

실수 입력의 상용대수(base 10)

(*"LOG"블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

xpos := ABS (xval);

xlog := LOG (xpos);

(* IL 등가: *)

LD	xval

ABS

ST	xpos

LOG

ST	xlog


POW

인수:

IN	실수형 	실수치(base부)

EXP	실수형 	실수치(exponent부)

Q	실수형 	(IN EXP)

1.0 , IN<> 0.0, EXP= 0.0

0.0 , IN= 0.0 , EXP < 0.0

0.0 , IN =0.0 , EXP = 0.0

0.0 , IN < 0

설명:

실수의 지수관수갌 (base exponent) 'base' 가 최초의 인수, 'exponent' 두번째 인수로 정수

(*"POW" 블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

result := POW (xval, power);

(* IL 등가: *)

LD	xval

POW	power

ST	result


SQRT

인수:

IN	실수형	실수치(>= 0)

Q	실수형 	입력치의 평방근

설명:

실수 입력치 평방근

(*"SQRT"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

xpos := ABS (xval);

xroot := SQRT (xpos);

(* IL 등가: *)

LD	xval

ABS

ST	xpos

SQRT

ST	xrout


TRUNC

인수:

IN	실수형 	실수치

Q	실수형 	IN>0, 정수부분

IN<0, 정수부분

설명:

실수치의 정수부분

(*"TRUNC"블록을 이용한 ＦＢＤㅇ프로그램*)

(* ST 등가: *)

result := TRUNC (+2.67) + TRUNC (-2.0891);

(* means: result := 2.0 + (-2.0) := 0.0; *)

(* IL 등가: *)

LD	2.67

TRUNC

ST	temporary	(* temporary result of first TRUNC *)

LD	-2.0891

TRUNC

ADD	temporary

ST	result


ACOS

인수:

IN	실수형 	[-1.0 .. +1.0]

Q	실수형 	입력치 어코사인[0.0 .. PI]

= 0.0 :부정한 입력치일 때

설명:

실수치 어코사인의 계산

(*"COS" 과 "ACOS"블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

cosine := COS (angle);

result := ACOS (cosine); (* result is equal to angle *)

(* IL 등가: *)

LD	angle

COS

ST	cosine

ACOS

ST	result


ASIN

인수:

IN	실수형 	 [-1.0 .. +1.0]

Q	실수형 	입력치 어사인 [-PI/2 .. +PI/2]

= 0.0:부정한 입력일 때

설명:

실수 입력 어사인의 계산

(*"SIN" 과 "ASIN"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

sine := SIN (angle);

result := ASIN (sine); (* result is equal to angle *)

(* IL 등가: *)

LD	angle

SIN

ST	sine

ASIN

ST	result


ATAN

인수:

IN	실수형	실수치

Q	실수형	입력치 어탄젠트 [-PI/2 .. +PI/2]

= 0.0:부정한 입력치일 때

설명:

실수치 어탄젠트의 계산

(*"TAN" 과 "ATAN" 블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

tangent := TAN (angle);

result := ATAN (tangent); (* result is equal to angle*)

(* IL 등가: *)

LD	angle

TAN

ST	tangent

ATAN

ST	result


COS

인수:

IN	실수형	실수치

Q	실수형	실수치 코사인 [-1.0 .. +1.0]

설명:

실수치 코사인의 계산

(*"COS" 와 "ACOS"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

cosine := COS (angle);

result := ACOS (cosine); (* result is equal to angle *)

(* IL 등가: *)

LD	angle

COS

ST	cosine

ACOS

ST	result


SIN

인수:

IN	실수형	실수치

Q	실수형 	입력치 사인[-1.0 .. +1.0]

설명:

실수치 사인의 계산

(*"SIN" 과 "ASIN"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

sine := SIN (angle);

result := ASIN (sine); (* result is equal to angle *)

(* IL 등가: *)

LD	angle

SIN

ST	sine

ASIN

ST	result


TAN

인수:

IN	실수형	PI/2이외

Q	실수형 	입력치 탄젠트

= 1E+38 : 부정한 입력에 대해서

설명:

실수치 탄젠트의 계산

(*"TAN" 과 "ATAN"블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

tangent := TAN (angle);

result := ATAN (tangent); (* result is equal to angle*)

(* IL 등가: *)

LD	angle

TAN

ST	tangent

ATAN

ST	result


ROL

인수:

IN	정수형 	정수치

NbR	정수형 	회전 시키는 bit수 [1..31]

Q	정수형 	좌회전한 결과

변화 없음 : nb_rotation <= 0일때

설명:

정수치 bit 좌회전. 회전은 32bit에서 됩니다.

(*"ROL"블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

result := ROL (register, 1);

(* register = 2#0100_1101_0011_0101*)

(* result    = 2#1001_1010_0110_1010*)

(* IL 등가: *)

LD	register

ROL	1

ST	result


ROR

인수:

IN	정수형	정수치

NbR	정수형 	회전시키는 bit수 [1..31]

Q	정수형 	회전한 결과

변화 없슴 :  nb_rotation <= 0일때

설명:

정수치 bit우회전. 회전은 32bit으로 됩니다.

(*"ROR" 블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

result := ROR (register, 1);

(* register = 2#0100_1101_0011_0101 *)

(* result    = 2#1010_0110_1001_1010 *)

(* IL 등가: *)

LD	register

ROR	1

ST	result


SHL

인수:

IN	정수형 	정수치

NbS	정수형 	bit시프트 수 [1..31]

Q	정수형 	좌 시프트한 결과

변화 없슴 : nb_shift <= 0일때

(LSB에는 0이 삽입됩니다.)

설명:

정수치 bit 표현으로 좌 Shift 합니다. 32bit단위로 합니다.

(*"SHL"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

result := SHL (register,1);

(* register = 2#0100_1101_0011_0101 *)

(* result    = 2#1001_1010_0110_1010 *)

(* IL 등가: *)

LD	register

SHL	1

ST	result


SHR

인수:

IN	정수형 	정수치

NbS	정수형 	bit 시프트 수 [1..31]

Q	정수형 	우 시프트한 결과

변화 없슴 :  nb_shift <= 0일때

(MSB에는 같은 값이 copy됩니다.)

설명:

정수치 bit표현으로 좌 시프트합니다. 32bit단위로 합니다.

(*"SHR"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

result := SHR (register,1);

(* register = 2#1100_1101_0011_0101 *)

(* result    = 2#1110_0110_1001_1010 *)

(* IL 등가: *)

LD	register

SHR	1

ST	result


MIN

인수:

IN1	정수형	정수치

IN2	정수형 	정수치

Q	정수형 	두개의 입력 최소값

설명:

두개의 정수치의 최소값

(*"MIN" 과 "MAX"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

new_value := MAX (MIN (max_value, value), min_value);

(* bounds the value to the [min_value..max_value] set *)

(* IL 등가: *)

LD	max_value

MIN	value

MAX	min_value

ST	new_value


MAX

인수:

IN1	정수형 	정수치

IN2	정수형 	정수치

Q	정수형 	두개의 입력 최대값

설명:

2개의 정수치 최대값

(*"MIN" 과 "MAX" 블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

new_value := MAX (MIN (max_value, value), min_value);

(* bounds the value to the [min_value..max_value] set *)

(* IL 등가: *)

LD	max_value

MIN	value

MAX	min_value

ST	new_value


LIMIT

인수:

MIN	정수형 	최소값 설정치

IN	정수형 	정수 입력치

MAX	정수형 	최대값 설정치

Q	정수형 	입력치: 입력치가 범위 내( 최대값 / 최소값）일 때

최대값 : 입력치가 최대값을 넘었을 때

최소값: 입력치가 최소값을 하회한 때

설명:

입력치에 상하근를 설치합니다. 입력치가 최대값과 최소값 사이일때는 입력치 그대로. 최대값을 넘었을 때는 최대값에, 최소값을 하회한 때는 최소값이 됩니다.

(*"LIMIT"블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

new_value := LIMIT (min_value, value, max_value);

(* bounds the value to the [min_value..max_value] set *)

(* IL 등가: *)

LD	min_value

LIMIT	value, max_value

ST	new_value


MOD

인수:

IN	정수형	입력치

Base	정수형 	입력치(>0)

Q	정수형 	잉여산의 계산

-1:Base <= 0일때

설명:

입력치 (IN)를 Base로 나눈때의 잉여

(*"MOD" 블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

division_result := (value / divider); (* integer division *)

rest_of_division := MOD (value, divider); (* rest of the division *)

(* IL 등가: *)

LD	value

DIV	divider

ST	division_result

LD	value

MOD	divider

ST	rest_of_division


MUX4

인수:

SEL	정수형	select입력치 [0..3]

IN1..IN4	정수형 	입력치

Q	정수형 	= IN1,SEL = 0 일 때

= IN2,SEL = 1 일 때

= IN3,SEL = 2 일 때

= IN4,SEL = 3 일 때

= 0 ,SEL이 상기 이외일 때

설명:

4점 입력용 multiplexer갌4개의 정수 입력치 중에서 하나를 선택

(* "MUX4" 블록을 이용한 FBD 프로그램 *)

(* ST 등가: *)

range := MUX4 (choice, 1, 10, 100, 1000);

(* select from 4 predefined ranges, for example, if choice is 1, range will be 10 *)

(* IL 등가: *)

LD	choice

MUX4	1,10,100,1000

ST	range


MUX8

인수:

SEL	정수형	select입력치 [0..7]

IN1..IN4	정수형 	입력치

Q	정수형 	= IN1.SEL = 0일때

= IN2.SEL = 1 일때

= IN3.SEL = 2 일때

.....

= IN8.SEL = 7 일때

= 0  .SEL가 상기 이하일때

설명:

8점 입력용 multiplexer : 여덟개 정수입력치 중에서 하나를 선택

(*"MUX8"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

range := MUX8 (choice, 1, 5, 10, 50, 100, 500, 1000, 5000);

(* select from 8 predefined ranges, for example, if choice is 3, range will be 50 *)

(* IL 등가: *)

LD	choice

MUX8	1,5,10,50,100,500,1000,5000

ST	range


ODD

인수:

IN	정수형	정수 입력

Q	boolean형	TRUE, 입력치가 홀수일 때

FALSE, 입력치가 짝수일 때

설명:

정수 입력치 verity체크 : 홀수인지 짝수인지 판단

(*"ODD"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

If Not (ODD (value)) Then Return; End_if;

value := value + 1;

(* makes value always even *)

(* IL 등가: *)

LD	value

ODD

RETNC

LD	value

ADD	1

ST	value


RAND

인수:

base	정수형	random값의 최대값

Q	정수형	random값 발생 [0..base-1]

설명:

정수값 에서 주어진 범위에서 random값 발생

(*"RAND" 블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

selected := MUX4 ( RAND (4), 1, 4, 8, 16 );

(*

random selection of 1 of 4 pre-defined values

the value issued of RAND call is in set [0..3],

so 'selected' issued from MUX4, will get 'randomly' the value

1 if 0 is issued from RAND,

or 4 if 1 is issued from RAND,

or 8 if 2 is issued from RAND,

or 16 if 3 is issued from RAND,

*)

(* IL 등가: *)

LD	4

RAND

MUX4	1,4,8,16

ST	selected


SEL

인수:

SEL	boolean형	선택용

IN1, IN2	정수형	정수치

Q	정수형 	= IN1: SEL이FALSE일때

= IN2: SEL이TRUE일때

설명:

vinally선택: 두개의 정수치 에서 하나를 선택

(*"SEL" 블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

ProCmd := SEL (AutoMode, ManuCmd, InpCmd);

(* process command selection *)

(* IL 등가: *)

LD	AutoMode

SEL	ManuCmd,InpCmd

ST	ProCmd


ASCII

인수:

IN	문자열형 NULL이외의 문자열

Pos	정수형	문자열 중에 선택된 캐릭터를 지시하는 번호

 [1.. len] (len은 IN 문자열 장)

Code	정수형 	선택된 캐릭터 ASCII코드

 [0 .. 255]

=0 ,Pos가 문자열 장을 넘고 있었던 경우

설명:

입력 문자열 중에서 지정된 캐릭터에 대한 ASCII코드

(*"ASCII"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

FirstChr := ASCII (message, 1);

(* FirstChr is the Ascii code of the first character of the string *)

(* IL 등가: *)

LD	message

ASCII	1

ST	FirstChr


CHAR

인수:

Code	정수형	캐릭터 ASCII 코드 [0 .. 255]

Q	문자열형	캐릭터 문자

ASCII 코드(Code)에 대한 캐릭터

Code는256 잉여산을 사용합니다.

설명:

주어진 ASCII 코드에 대한 캐릭터

(*"CHAR"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

Display := CHAR ( value + 48 );

(* value is in set [0..9] *)

(* 48 is the ascii code of '0' *)

(* result is one character string from '0' to '9' *)

(* IL 등가: *)

LD	value

ADD	48

CHAR

ST	Display


DELETE

인수:

IN	문자열 	NULL이외의 문자열

NbC	정수형	문자열에서 삭제하는 문자수

Pos	정수형	삭제하는 최초의 문자열 장소를 나타내는 번호

(최초의 문자는 Pos = 1)

Q	문자열형	 지정 문자열이 삭제되고 수정된 문자열

=빈 문자열 : Pos < 1

=최초의 문자: Pos > IN의 문자열장

=최초의 문자: NbC <= 0

설명:

입력 문자열에서 지정되어 연속적인 문자열을 삭제

(*"DELETE"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

complete_string := 'ABCD' + 'EFGH'; (* complete_string is 'ABCDEFGH' *)

sub_string := DELETE (complete_string, 4, 3); (* sub_string is 'ABGH' *)

(* IL 등가: *)

LD	'ABCD'

ADD	'EFGH'

ST	complete_string

DELETE	4,3

ST 	sub_string


INSERT

인수:

IN	문자열형 	기본이 되는 문자열

Str	문자열형 	삽입되는 문자열

Pos	정수형	삽입 장소를 지정하는 번호, 삽입 문자열은 번호 앞이 됩니다.	(> 1 )

Q	문자열형 	문자열이 삽입된 결과의 문자열

=빈 문자열: Pos <= 0

=두개의 문자열의 연결:Pos가 IN문자열장의 길이를 넘은 경우

설명:

기본 문자열에 지정된 문자열을 삽입해서 새로운 문자열이 생성

(*"INSERT"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

MyName := INSERT ('Mr JONES', 'Frank ', 4);

(* MyName is 'Mr Frank JONES' *)

(* IL 등가: *)

LD	'Mr JONES'

INSERT	'Frank ',4

ST 	MyName


FIND

인수:

In	문자열형 	입력 문자열

Pat	문자열형 	검색하는 문자열 버턴

Pos	정수형	= 0: 문자열 버턴이 발견되지 않을 때

= 검색하는 문자열이 최초에 발견된 위치

　(첫째 문자가 있으면 1)

　대소문자 구별 있음

설명:

문자열 안에서 지정한 문자열을 검색해서, 발견된 경우는 그 장소를 되돌립니다.

(*"FIND"블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

complete_string := 'ABCD' + 'EFGH'; (* complete_string is 'ABCDEFGH' *)

found := FIND (complete_string, 'CDEF'); (* found is 3 *)

(* IL 등가: *)

LD	'ABCD'

ADD	'EFGH'

ST	complete_string

FIND	'CDEF'

ST 	found


MLEN

인수:

IN	문자열형 	문자열

NbC	정수형   	IN문자열의 문자열장

설명:

문자열의 문자열 수(문자열장)

(*"MLEN"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

nbchar := MLEN (complete_string);

If (nbchar < 3) Then Return; End_if;

prefix := LEFT (complete_string, 3);

(* this program extracts the 3 characters on the left of the string and put the result in the prefix message variable

nothing is done if the string length is less than 3 characters *)

(* IL 등가: *)

LD	complete_string

MLEN

ST	nbchar

LT	3

RETC

LD	complete_string

LEFT	3

ST	prefix


LEFT

인수:

IN	문자열형 	공백 없는 문자열

NbC	정수형 	        졸출되는 문자수

(<= IN문자열장)

Q	문자열형 	IN문자열 좌측 문자열(문자열의 길이는NbC)

=빈 문자열 : NbC <= 0

=완전한 IN문자열 :  NbC >= IN문자열장

설명:

기본 문자열에서 지정된 문자수만 좌측에서 빼낸다.

(*"LEFT" 와 "RIGHT"블록을 이용한 ＦＢＤ프로그램 *)

(* ST 등가: *)

complete_string := RIGHT ('12345678', 4) + LEFT ('12345678', 4);

(* complete_string is '56781234'

the value issued from RIGHT call is '5678'

the value issued from LEFT call is '1234'

*)

(* IL 등가: First done is call to LEFT *)

LD	'12345678'

LEFT	4

ST	sub_string 	(* intermediate result *)

LD	'12345678'

RIGHT	4

ADD	sub_string

ST 	complete_string


MID

인수:

IN	문자열형 	공백이 아닌 문자열

NbC	정수형   	졸출되는 문자수

(<= IN문자열장)

Pos	정수형   	졸출되는 문자열의 최초 번호

 (최초의 문자 번호는 1)

Q	문자열형 	졸출된 문자열 (NbC은 문자열장)

=빈 문자열:지정된 인수가 부정일 때

설명:

기본 문자열에서 지정된 장소에서 지정된 문자수의 문자열을 졸출

(*"MID"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

sub_string := MID ('abcdefgh', 2, 4);

(* sub_string is 'de' *)

(* IL 등가: *)

LD	'abcdefgh'

MID	2,4

ST	sub_string


REPLACE

인수:

IN	문자열형 	기본 문자열

Str	문자열형 	삽입되는 문자열(NbC문자를 바꿔둔다.)

NbC	정수형   	소거되는 문자수

Pos	정수형   	삽입되는 최초의 문자 장소의 지정

(최초의 문자는 Pos = 1)

Q	문자열형 	지정문자열이 치환된 결과 문자열

- 우선, NbC문자가 Pos장소에서 삭제됩니다.

- 다음에 삭제되는 문자열  Str가 이 장소에 삽입됩니다.

 = 빈 문자열:Pos <= 0

=두개의 문자열의 결합(IN + Str)( Pos > IN문자열장=기본 문자열)NbC <= 0

설명:

기본 문자열의 일부를 다른 문자열로 치환

(*"REPLACE"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

MyName := REPLACE ('Mr X JONES, 'Frank', 1, 4);

(* MyName is 'Mr Frank JONES' *)

(* IL 등가: *)

LD	'Mr X JONES'

REPLACE	'Frank',1,4

ST	MyName


RIGHT

인수:

IN	문자열형	공백이 아닌 문자열

NbC	정수형	졸출되는 문자수

(<= IN문자열장)

Q	문자열형	IN문자열의 우측 문자열(문자열의 길이는NbC)

=빈 문자열: NbC <= 0

=완전한 IN문자열 : NbC >= IN문자열장

설명:

기본 문자열에서 지정된 문자수만 우측에서 뽑아 낸다.

(*"LEFT" 와 "RIGHT"블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

complete_string := RIGHT ('12345678', 4) + LEFT ('12345678', 4);

(* complete_string is '56781234'

the value issued from RIGHT call is '5678'

the value issued from LEFT call is '1234'

*)

(* IL 등가: First done is call to LEFT *)

LD	'12345678'

LEFT	4

ST	sub_string 	(* intermediate result *)

LD	'12345678'

RIGHT	4

ADD	sub_string

ST 	complete_string


DAY_TIME

인수:

SEL	정수형	출력 선택

 0= 날짜

 1= 시각

 2= 요일

Q	문자열형	일시 문자열

 'YYYY/MM/DD' : SEL = 0

 'HH:MM:SS' : SEL = 1

 요일  : SEL = 2 (예: 'Monday')

설명:

문자열로 일시, 요일을 되돌린다.

(*"DAY_TIME" 블록을 이용한 ＦＢＤ프로그램*)

(* ST 등가: *)

Display := Day_Time (0) + ' ; ' + Day_Time (1);

(* Display text format is: 'YYYY/MM/DD ; HH:MM:SS' *)

(* IL 등가: First done is call to day_time(1) *)

LD	1

DAY_TIME

ST	hour_str 	(* intermediate result *)

LD	0

DAY_TIME

ADD	' ; '

ADD	hour_str

ST 	Display


ARCREATE

인수:

ID	정수형	배열 식별자(0 ~15)

Size	정수형 	배열 요소 수

ok	정수형 	실행 결과 :

=1 정상으로 배열 작성된때

=2 부정한 배열 식별자, 또는 이미 배열 작성 종료때

=3 부정한 배열 요소 수

=4 메모리 부족

설명:

정수 배열을 작성

주의： 	어플리케이션은 최대１６배열（ａｒｒａｙ）을 정의할 수 있습니다. 배열 요소는 정수형 값입니다. 배열 사이즈가 남은 메모리 양에 근접할 경우는 시스템 에러를 일으키는 것도 생각할 수 있습니다.

(* FBD program creating an array of integers *)

(* FBD program creating an array of integers *)

(* ST 등가: *)

array_error := (ARCREATE (ident, 16) <> 1));

(* IL 등가: *)

LD	ident

ARCREATE	16

NE 	1

ST	array_error


ARREAD

인수:

ID	정수형	배열 식별자 (0 ~` 15)

Pos	정수형 	배열 내의 요소 포지션

(0 ~ size-1)

value	정수형 	요소의 값

= 0 (인수가 부정한 때)

설명:

정수치 배열 중에서 지정한 요소를 읽어 낸다.

(* 배열을 다루는 ＦＢＤ프로그램*)

(* ST 등가: *)

If (array_error) Then Return; End_if;

read_value := ARREAD (ident, index);

(* array_error comes from the ARCREATE call *)

(* IL 등가: *)

LD	array_error

RETC

LD	ident

ARREAD	index

ST	read_value


ARWRITE

인수:

ID	정수형 	배열 식별자(0 ~` 15)

Pos	정수형 	배열 요소 포지션

(0 ~ size-1)

IN	정수형 	적어 넣어진 요소값

ok	정수형 	실행 결과

=1  적어 넣기가 정상 종료

=2  부정한 배열 식별자

=3  부정한 포지션 지정

설명:

정수치 배열요소에 값 적어 넣기

(* 배열을 다루는 ＦＢＤ프로그램*)

(* ST 등가: *)

If (array_error) Then Return; End_if;

write_status := ARWRITE (Ident, Index, value);

(* array_error comes from the ARCREATE call *)

(* IL 등가: *)

LD	array_error

RETC

LD	ident

ARWRITE	index,value

ST	write_status


F_ROPEN

인수：:

Path    문자열형	파일명

이 파일명에는 패스명을 나타내는 기호( / , \ )을 포함합니다.

ID	정수형 	파일 번호

= 0에러 발생시 (파일이 발견되지 않았던 것 등)

설명：:

binary파일을 리드모드로 열립니다. FX_READ,  F_CLOSE가 오픈 후에 사용됩니다. 이 Function은 ISaGRAF시뮤레이터 기능에는 포함되어 있지 않습니다.

(* 파일 관리용 ＦＢＤ프로그램*)

(* ST 등가: *)

file_id := F_ROPEN('c:\data \data.bin');

error := (file_id=0);

(* IL 등가: *)

LD	'c:\data\data.bin'

F_ROPEN

ST	file_id

EQ	0

ST	error


F_WOPEN

인수：:

Path    문자열형	파일명

이 파일명은 패스명을 나타내는 기호( /, \ )를 포함합니다.

ID	정수형 	파일 번호

= 0에러 발생시(파일이 발견되지 않았던 것 등)

설명:

binary파일을 리드모드로 열립니다. FX_READ,  F_CLOSE가 오픈 후에 사용됩니다. 이 Function은 ISaGRAF시뮤레이터 기능에는 포함되어 있지 않습니다.

(* 파일 관리용 ＦＢＤ프로그램*)

(* ST 등가: *)

file_id := F_WOPEN('c:\data \data.bin');

error := (file_id=0);

(* IL 등가: *)

LD	'c:\data\data.bin'

F_WOPEN

ST	file_id

EQ	0

ST	error


F_CLOSE

인수：:

ID	      정수형	파일 번호（F_ROPEN、F_WOPEN되돌리기 값）

ok	boolean형	되돌리기 값

=TRUE:  정상으로 클로즈

=FALSE: 에러 발생

설명：:

F_WOPEN, F_ROPEN에서 열려진 binary파일을 클로즈합니다. 이 Function은ISaGRAF 시뮤레이터 기능에는 포함되어 있지 않습니다.

(* 파일 관리용 ＦＢＤ프로그램*)

(* ST 등가: *)

file_id := F_ROPEN('data.bin');

ok := F_CLOSE(file_id);

(* IL 등가: *)

LD	'data.bin'

F_ROPEN

ST	file_id

F_CLOSE	(* file_id is already in the current IL result *)

ST 	ok


F_EOF

인수：:

ID	정수형	파일 번호(F_ROPEN , F_WOPEN되돌리기 값)

ok	boolean형	파일의 엔트를 나타냅니다.

=TRUE: 파일 읽어내기, 적어 넣기, Function에서 파일 마지막에 도달한 때

(FM_READ로 읽어 낸 마지막 내용은 마지막 문자가 EOF가 아니면, 맞지 않을 가능성이 있습니다.)

설명：:

파일 마지막에 도달했는가를 체크합니다. ISaGRAF 시뮤레이터 기능에는 포함되어 있지 않습니다.

(* 파일 관리용 ＦＢＤ프로그램*)

(* ST 등가: *)

file_id := F_ROPEN('data.bin');

WHILE not(F_EOF(file_id))

VAL := FA_READ(file_id);

END_WHILE;

MESSAGE := 'last val = ' + msg(VAL);

ok := F_CLOSE(file_id);

(* IL 등가: *)

LD	'data.bin'

F_ROPEN

ST	file_id

LD 	file_id

F_EOF

JMPC	END_OF_FILE

NOT_EOF:	LD 	file_id

FA_READ

ST	VAL

LD 	file_id

F_EOF

JMPNC	NOT_EOF 	(* if not eof, go on reading *)

END_OF_FILE:	LD	VAL

MSG

ST	val_msg	(* conversion of VAL into a message *)

LD	'last val = '

ADD	val_msg

ST	MESSAGE

LD 	file_id

F_CLOSE

ST	ok


FA_READ

인수：:

ID	정수형	파일 번호(F_ROPEN되돌리기 값)

Q	정수형	파일에서 읽어 낸 정수치

설명：:

binary에서 정수치를 읽어냅니다.  F_ROPEN, F_CLOSE와 함께 사용합니다. 앞의 장소에서 sequential한 파일에 access 합니다. F_ROPEN call후 최초의 call에서는 파일의 ４바이트를 읽어냅니다.

매회 call로 읽어내고 있는 장소를 stack에 push합니다.

파일 마지막에 도달한 것을 체크하기 하기 위해 F_EOF를 사용합니다.

이 Function은 ISaGRAF simulator에는 포함되지 않습니다.

(* 파일 관리용 ＦＢＤ프로그램*)

(* ST 등가: *)

file_id := F_ROPEN('voltramp.bin');

vstart := FA_READ(file_id);

vend := FA_READ(file_id);

vinc := FA_READ(file_id);

delta_tim := tmr(FA_READ(file_id));

ok := F_CLOSE(file_id);

(* IL 등가: *)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

FA_READ	(* read vstart *)

ST	vstart

LD 	file_id

FA_READ	(* read vend *)

ST	vend

LD 	file_id

FA_READ	(* read vinc *)

ST	vinc

LD 	file_id

FA_READ	(* read delta_tim *)

TMR	(* conversion into a timer *)

ST	delta_tim

LD 	file_id

F_CLOSE

ST	ok


FA_WRITE

인수：:

ID	정수형	파일 번호(F_WOPEN되돌리기 값)

IN	정수형	파일 적어 넣은 정수치

OK	boolean형	실행 결과

=TRUE : 정상 종료

설명：:

binary에서 정수치를 읽어냅니다.  F_WOPEN, F_CLOSE와 함께 사용합니다. 앞의 장소에서 sequential한 파일에 access 합니다. F_ WOPEN call후 최초의 call에서는 파일의 ４바이트를 읽어냅니다.

매회 call로 읽어내고 있는 장소를 stack에 push합니다.

파일 마지막에 도달한 것을 체크하기 하기 위해 F_EOF를 사용합니다.

이 Function은 ISaGRAF simulator에는 포함되지 않습니다.

(* ＦＢＤ프로그램 예 *)

(* ST 등가: *)

file_id := F_WOPEN('voltramp.bin');

nb_written  := 0;

nb_written := nb_written + ana(FA_WRITE(file_id,vstart));

nb_written := nb_written + ana(FA_WRITE(file_id,vend));

nb_written := nb_written + ana(FA_WRITE(file_id,vinc));

nb_written := nb_written + ana(FA_WRITE(file_id,ana(delta_tim)));

ok := F_CLOSE(file_id);

IF ( nb_written <> 4) THEN

ERROR := ERR_FILE;

END_IF;

(* IL 등가: *)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

LD	0

ST	nb_written

LD 	file_id	(* write vstart *)

FA_WRITE	vstart

ANA

ADD	nb_written

ST	nb_written

LD 	file_id	(* write vend *)

FA_WRITE	vend

ANA

ADD	nb_written

ST	nb_written

LD 	file_id	(* write vinc *)

FA_WRITE	vinc

ANA

ADD	nb_written

LD	(* write delta_tim *)

ANA	(* convert it to an integer *)

ST	ana_delta_tim

LD 	file_id

FA_WRITE	ana_delta_tim

ANA

ADD	nb_written

ST	nb_written

F_CLOSE

ST	ok

LD	nb_written

EQ	4

RETC	(* return if equal 4 *)

LD	ERR_FILE	(* else error *)

ST	ERROR


FM_READ

인수：:

ID	정수형	파일 번호(F_ROPEN되돌리기 값)

Q	문자열형	 파일에서 읽혀진 문자열

설명：:

binary에서 정수치를 읽어냅니다.  F_ROPEN, F_CLOSE와 함께 사용합니다. 앞의 장소에서 sequential한 파일에 access합니다. F_ROPEN call후 최초의 call에서는 지정장소에서 최초 문자열을 읽어 낼수 있습니다.

매회 call로 읽어내고 있는 장소를 stack에 push합니다.

문자열 마지막에는 NULL(0)  EOF ('\n')또는 개행('\r')이 붙어 있습니다

파일 마지막에 도달한 것을 체크하기 하기 위해 F_EOF를 사용합니다.

이 Function은 ISaGRAF simulator에는 포함되지 않습니다.

(* 파일 관리용 ＦＢＤ프로그램*)

(* ST 등가: *)

file_id := F_ROPEN('voltramp.bin');

status1 := FM_READ(file_id);

status2 := FM_READ(file_id);

IF (F_EOF(file_id)) THEN

ERROR := ERR_FILE;

unused_eof_mes := FM_READ(file_id);

END_IF;

ok := F_CLOSE(file_id);

(* IL 등가: *)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

FM_READ	(* read status1 *)

ST	status1

LD 	file_id

FM_READ	(* read status2 *)

ST	status2

LD 	file_id

F_EOF

JMPNC	CLOSE_FILE (* if end of file jump not done *)

LD	ERR_FILE

ST	ERROR

LD 	file_id

FM_READ	(* read unused_eof_mes *)

ST	unused_eof_mes

CLOSE_FILE	LD 	file_id

F_CLOSE

ST	ok


FM_WRITE

인수：:

ID	정수형	 파일 번호(F_WOPEN되돌리기 값)

IN	문자열형  파일에 적어 넣은 문자열

ok	boolean형	실행 결과

=TRUE : 정상 종료

설명：:

binary에서 정수치를 적어 넣기.

F_CLOSE와 함께 사용합니다. 앞의 장소에서

문자열 마지막은 NULL(0)로 적어넣습니다.

앞의 장소에서 sequential한 파일에 access 합니다.

F_WOPEN call후에 최초의 call에서는 지정 장소에서 최초의 문자열을 파일에 적어 넣습니다.

매회 call로 읽어내고 있는 장소를 stack에 push합니다.

이 Function은 ISaGRAF simulator에는 포함되지 않습니다.

(* 파일 관리용 ＦＢＤ프로그램*)

(* ST 등가: *)

file_id := F_WOPEN('trace.txt');

ok := FM_WRITE(file_id,'First message');

ok := FM_WRITE(file_id,'Last message');

ok := F_CLOSE(file_id);

(* IL 등가: *)

LD	'trace.txt'

F_WOPEN

ST	file_id

FM_WRITE	'First message'	(* write first msg *)

ST	ok

LD 	file_id

FM_WRITE	'Last message'	(* write second msg *)

ST	ok

LD 	file_id

F_CLOSE

ST	ok


Alphabetical index

-	ARWRITE	F_ROPEN	MSG	SHR
& (AND)	ASCII	F_TRIG	MUX4	SIG_GEN
*	ASIN	F_WOPEN	MUX8	SIN
/	ATAN	FA_READ	Neg	SQRT
+	AVERAGE	FA_WRITE	NOT_MASK	SR
<	BLINK	FIND	ODD	STACKINT
<=	BOO	FM_READ	OPERATE	SYSTEM
<>	CAT	FM_WRITE	OR_MASK	TAN
=	CHAR	HYSTER	POW	TMR
=1 (XOR)	CMP	INSERT	R_TRIG	TOF
>	COS	INTEGRAL	RAND	TON
>=	CTD	LEFT	REAL	TP
>=1 (OR)	CTU	LIM_ALRM	REPLACE	TRUNC
1 gain	CTUD	LIMIT	RIGHT	XOR_MASK
ABS	DAY_TIME	LOG	ROL
ACOS	DELETE	MAX	ROR
ANA	DERIVATE	MID	RS
AND_MASK	EXPT	MIN	SEL
ARCREATE	F_CLOSE	MLEN	SEMA
ARREAD	F_EOF	MOD	SHL


FC language
 FC 언어

Flow Chart(FC)는 sequential 동작을 기술할 그래픽컬 언어입니다. Flow Chart는 Function과 테스트라는 불록에 성립되어 있고. 이 Block들 사이를  링으로 접속하고 있습니다. 액션과 테스트의 내용은 ST, IL, LD 중의 언어로 기술 가능합니다. Function과 FunctionBlock 섹션에서 프로그램을 읽어 내는 것도 가능합니다. Flow Chart는 다른 Flow Chart 읽어낼 수 있습니다. 이때 읽어낸 Flow Chart를 FC서브프로그램이라 합니다.

FC 기본 요소

FC [예] 복잡한 구조

FC 다이나믹

FC 문법검사


FC components
FC 기본요소

Flow Chart 언어는 다음의 기본요소로 성립되어 있습니다.

FC chart 시작

FC chart 종료

links

FC 액션

FC 조건

FC 서브-프로그램

FC I/O 액션

FC 연결

FC 주석


Beginning of FC chart
FC chart 시작

"Begin" symbol은 Flow Chart 개시에 반드시 필요합니다. Flow Chart가 작동된 때의 처음 상태（처음의 사이클）를 유지합니다. 이하에서는 "Begin" symbol을 나타냅니다.

"Begin" symbol은 반드시 하부보다 차트의 다른 오브젝트에 접속됩니다. 만약, 이  접속이 되지 않을 것 같은 Flow Chart는 실행되지 않습니다.


Ending of FC chart
FC chart 종료

"End" symbol은 Flow Chart에 반드시 필요하게 됩니다. "End" symbol은 통상 차트의 다른 symbol에서 상부로 접속됩니다만 다른 오브젝트에서 접속되지 않는 경우도 있습니다. 이 경우는 이 Flow Chart는 항상 loop처리를 하게 됩니다. 단, 이러한 경우에도 "End" symbol은 차트 하부에 표시됩니다. "End" symbol은 차트 처리의 종료를 나타냅니다. 이 symbol이 처리되는 차트의 종료 상태를 유지하게 됩니다. 이하에서는 "End" symbol을 나타냅니다.

"End" symbol은 일반적으로 chart의 다른 오브젝트에 연결 되 있다. 그러나 FC는 End 오브젝트에 연결 되지 않을 수도 있는데 이때  "End" 오브젝트 는 chart의 맨 밑에 여전히 나타난다.


FC flow links
links

Flow Link는 차트 두개 포인트 사이의 처리 흐름을 의미합니다. Flow Link는 반드시 화살표를 유지합니다. 이하에서는 Flow Link를 나타냅니다.

두개의 Flow Link는 동일 소스 오브젝트에서 끄집어 낼 수 없습니다.


FC actions
FC 액션

액션 심벌은 실행되는 액션을 나타냅니다. 액션은 번호와 이름으로 식별됩니다. 이하에서는 액션 심벌을 나타냅니다.

차트에서 두개의 다른 액션 심벌은 동일의 이름 또는 번호를 가질 수 없습니다. 액션 프로그램 기술에는 ST, LD，IL중의 언어로 사용 가능합니다. 액션 심벌은 반드시 하나의Link이 들어가고, 하나의 Link이 나갑니다.


FC conditions
FC 조건

테스트（조건）심벌은 Boolean형의 테스트를 합니다. 테스트 심벌은 번호와 이름에 따라 식별됩니다. 테스트 프로그램은 ST, LD, IL 중의 언어로 기술됩니다. 테스트평가 내용에 따라 Flow가 YES 또는NO 패스로 흐릅니다. 이하에 테스트 심벌의 예를 나타냅니다.

두개의 다른 테스트 심벌이 동일 번호 또는 이름을 가질 수 없습니다. 테스트 내용은 아래 중의  하나의 언어로 기술됩니다.

•	ST언어에 따르는 표현식

•	一행의 rung로 표시되는LD（이때 코일에 변수 명을 할당할 필요는 없습니다.）

•	복수 행으로 된 IL언어, IL레지스터 표현치가 테스트（조건） 결과에 사용됩니다.

ST언어로 프로그램된 때는 표현식 마지막에 세미콜론(;) 찍을 수 있지만, 찍지 않아도 에러는 되지 않습니다. 평가 결과와 흐름은 아래와 같이 됩니다.

•	0 또는 FALSE ： NO

•	1 또는 TRUE ：YES

테스트 심벌은 반드시 하나의 Link가 들어 오고, YES, NO두개의 Link가 나갑니다. 두개의 Link은 반드시 다른 오브젝트에 접속되어야만 합니다.


FC sub-program
FC 서브-프로그램

Flow Chart 프로그램에서는 계층적으로 프로그램을 구축할 수 있습니다. 각 Flow Chart 프로그램은 다른 Flow Chart를 읽어낼 수 있습니다. 읽어낸 프로그램은 Child프로그램, 또는 FC 서브프로그램라고 합니다. FC 서브프로그램을 읽어내는 프로그램을 Father프로그램이라 합니다. FC 서브프로그램은 아무리 크더라도 하나의  Father프로그램만을 가질 수 있습니다. FC프로그램은 이하와 같이 계층구조를 가질 수 있습니다.

Flow Chart에서의 서브프로그램 심벌은 FC서브프로그램을 읽어 냅니다. FC서브프로그램이 실행되고 있을 때는 이 처리가 종료할 때까지의 사이에 Father프로그램의 실행은 support됩니다. FC서브프로그램은 번호와 이름에 따라 식별됩니다. 이하에서는 FC서브프로그램을 읽어내는 서브프로그램 심벌을 나타냅니다.

같은 차트에서 두개의 다른 서브프로그램은 동일 번호를 가질 수 없습니다. FC프로그램 계층구조에선 이하의 규칙이 이용됩니다.

•	FC프로그램에서 Father프로그램을 갖고 있지 않는 FC프로그램을 메인 FC프로그램이라 합니다.

•	메인FC프로그램은 어플리케이션이 실행된 때에 작동됩니다.（Begin섹션 실행 후에）

•	프로그램은 복수FC서브프로그램을 가질 수 없습니다.

•	FC서브프로그램은 하나의 Father프로그램만을 가질 수 없습니다.

•	FC서브프로그램은 Father프로그램으로만 읽어 냅니다.

•	FC서브프로그램끼리의 읽어내기는 불가능합니다.

동일 FC서브프로그램이 Father프로그램 차트 안에서 복수회에 걸쳐 읽어내는 일도 있습니다. 서브프로그램 심벌은 차트내의 액션 심벌 같이 Flow Link 접속 규칙이 적용됩니다.


FC I/O specific action
FC I/O 액션

FC I/O조작 Block은  액션 심벌과 같은 모양으로 다루어집니다. 단, 통상의 액션 심벌과 형태를 다르게 하고, 프로그램 내에서의 처리를 나중에 읽기 쉽게 하기 위해, 구별해서 사용하는 것도 가능합니다. 이하에서는 FC I/O조작 Block의 예를 나타냅니다.

I/O조작 Block 프로그램은 액션 심벌과 같은 모양으로 ST, LD, IL중의 언어로 서술됩니다.

주의： 	I/O조작이라고 하는 Block에서는 실행 Platform에 의존하는 기술을 하는 케이스가 있기 때문에 이러한 명칭이 붙어 있습니다. 특히 이 Block으로 I/O처리한다는 것을 의미하지는 않습니다.


FC connectors
FC 연결

connector는 차트 내의 두가지 포인트를 직접 follow link에서 접속하는 대신에취급가능한  link입니다. connector는 원형으로 표시되어 흐름의 소스에서 접속됩니다. link앞은 차트 오브젝트의 번호와 이름에 따라 지정됩니다. 이하에 connector의 예를 나타냅니다.


FC comments
FC 주석

주석 심벌은 follow차트 실행과는 전혀 관련이 없습니다. 차트 내의 공백 장소에 배치할 수 있습니다. 프로그램 해설에 사용할 수 있습니다. 이하에 커맨드 심벌의 예를 나타냅니다.


FC complex structures examples
FC [예] 복잡 구조

여기서는 follow차트의 편성 구조체의 예를 나타냅니다. 이들은 기본 오브젝트（테스트, 액션, link）로 편성되어 있습니다.

	IF / THEN / ELSE (1)  "THEN" 액션을 삽입합니다. (2)  "ELSE" 액션을 삽입합니다.
	REPEAT / UNTIL (3) repeat할 액션을 삽입합니다.
	WHILE / DO (4) repeat할 액션을 삽입합니다.


FC dynamic behavior
FC 다이나믹

follow차트 타겟 상에서의 실행 규칙은 이하와 같이 설명할 수 있습니다.

•	Begin심벌은 타겟 상에서 처음의１사이클을 사용합니다.

•	End심벌은 타겟 상에서 마지막 １사이클을 사용하고, 차트 실행을 종료합니다. 이 심벌에는 도달한 다음 타겟 상에서의 사이클에서는 차트 상의 어떠한 액션도 실행되지 않습니다.

•	Begin와End심벌 중간 타겟 상에서 사이클에서는 테스트와 액션 심벌이 실행되지만, １사이클 내에 실행되어 처리되는 것은 SFC과 달리 하나의 테스트와 액션Block에 한정된 것은 아닙니다. 처리 판단이 성립되어 있는 한 실행이 계속되고, 한번 실행한 처리를 다시 반복하려면 loop를 검출하면 사이클을 뽑아 내게 됩니다. 구체적으로SFC로 한 스텝 내에서 기술되어야만 처리에서도 FC는 복수 테스트와 액션 심벌로 기술 가능하게 됩니다.

•	실행되고 있는 테스트와 액션심벌은 시뮬레이션과 debug중에는 SFC경우와 같이 색깔이 있어 다른 심벌과 구별할 수 있습니다.

주의: 	SFC가 상태 이동을 표현하는 것에 대해 FC는 판단 follow을 표현하게 됩니다. 프로그램시에 실행 규칙（algorithm）을 고려한 후에 프로그램하는 것이 필요합니다. ISaGRAF 샘플 프로젝트로 SFC, FC를 비교하고 각각의 특징을 살려서 프로그램을 행하는 것이 필요합니다.


FC checking
FC 문법검사

레벨2 프로그램을 기술하고 있는 ST, LD, IL프로그램 문법 체크와는 별도로 이하와 같은 follow차트 자체의 문법 체크가 있습니다.

메인 문법 체크：

•	모든 심벌에 있어 접속 포인트는 반드시 follow link에서 접속되어야만 합니다.（단, End 심벌만은 이 접속을 생략할 수 있습니다.）

•	기타 심벌과 독립한 심벌과 차트는 존재할 수 없습니다.

•	Connctor심벌에서 접속 전에 있는 오브젝트가 바르게 지정되어야만 합니다.

기타 규칙：

•	공백 액션（즉, 레벨２ 프로그램이 존재하지 않는 액션 심벌）은 실행시에는 아무것도 처리되지 않습니다.

공백 테스트（즉, 레벨２ 프로그램이 존재하지 않는 테스트 심벌）는 실행시에는 항상 TRUE로 간주됩니다.