6) 10진아스키 → BCD 4자리/8자리 변환 (DABCD(P), DDABCD(P))

▶[DABCD(P)    (S)    (D)]

(S)로 지정된 디바이스 번호 이후에 저장되어 있는 16진 아스키 데이터를 BCD 4자리 데이터로 변환하여 (D)로 지정된 디바이스 번호에 저장합니다.

예를 들면, (S)이후에 8765H의 아스키 코드를 지정한 경우, (D)에는 다음과 같이 저장됩니다.

(S) ~ (S+1)로 지정된 아스키 데이터는 0~9999의 범위 이내입니다.

각 자리에 설정되는 아스키 코드는 "30H"~"39H" 의 범위 이내입니다.

각 자리에 설정되는 아스키 코드가 "20H"~"00H"일 때는 "30H"로 처리합니다.

▶[DDABCD(P)   (S)     (D)]

(S)로 지정된 디바이스 번호 이후에 저장되어 있는 16진 아스키데이터를 BCD 8자리 데이터로 변환하여 (D)로 지정된 디바이스 번호에 저장합니다.

예를들면, (S)이후에 87654321H의 아스키 코드를 지정한 경우 (D), (D+1)에는 다음과 같이 저장됩니다. (S)~(S+3)로 지정된 아스키 데이터는 0~99999999의 범위 이내입니다. 

각 자리에 설정되는 아스키 코드는 "30H"~"39H"의 범위 이내입니다.

각 자리에 설정되는 아스키 코드가 "20H", "00H"일 때는 "30H"로 처리합니다.

7) 문자열의 길이 검출 (LEN(P))

▶[LEN(P)    (S)    (D)]

(S)로 지정된 문자열의 길이를 검출하여, (D)로 지정된 디바이스 번호 이후에 저장합니다. 

(S)로 지정된 디바이스 번호부터 "00H"가 저장되어 있는 디바이스 번호까지의 데이터를 문자열로 처리합니다.

예를 들면, (S) 이후에 "ABCDEFGHI"가 저장되어 있는 경우, (D)에는 9가 저장됩니다.

8) BIN 16비트/32비트 →문자열 변환(STR(R), DSTR(P))

▶[STR(P)    (S1)   (S2)    (D)]

(S2)로 지정된 BIN16비트 데이터를 (S1)로 지정된 위치에 소수점을 부가하고 문자열로 변환하여, (D)로 지정된 디바이스 번호 이후에 저장합니다. 

(S1)로 지정할 수 있는 전체자리수는 2~8자리 입니다.

(S1+1)로 지정할 수 있는 소수부 자리수는 0~5자리 입니다. 단, 소수부 자리수 ≤ (전체자리수-3)이 되도록 설정하십시오 (S2)로 지정할 수 있는 BIN데이터는 -32768~32767 의 범위입니다.

변환후의 문자열 데이터는 다음에 설명한 것처럼 (D)이후의 디바이스 번호에 저장됩니다.

①부호에는 BIN데이터가 플러스일 때 "20H(스페이스)"를 저장하고, 마이너스일 때 "2DH(-)"를 저장합니다. 

②소수부 자리수를 "0" 이외로 설정한 경우에는 지정한 자리수 +1번째 자리에 자동적으로 "2EH(.)"를 저장합니다.

③소수부 자리수의 값이 BIN데이터의 자리수보다 큰 경우에는, 자동적으로 0을 부가하고 오른쪽 정렬로 변환하여, "0#####"으로 됩니다.

④전체 자리수의 값부터 부호, 소수점을 제외한 자리수가 BIN데이터의 자리수보다 큰 경우에는, 부호화 수치의 사이에 "20H(스페이스)"를 저장합니다. BIN데이터의 자리수가 큰 경우에는 에러가 됩니다. 

⑤변환한 문자열의 마지막에는 자동적으로 "00H"가 저장됩니다.

▶[DSTR(P)    (S1)   (S2)    (D)]

(S2)로 지정된 BIN32비트 데이터를 (S1)로 지정된 위치에 소수점을 부가하고 문자열로 변환하여, (D)로 지정된 디바이스 번호 이후에 저장합니다. (S1)로 지정할 수 있는 전체자리수는 2~13자리 입니다. (S1+1)로 지정할 수 있는 소수부 자리수는 0~10자리입니다. 단 소수부 자리수 ≤ (전체자리수-3)이 되도록 설정하십시오 (S1),(S2+1)로 지정할 수 있는 BIN데이터는 -2147482648~ 2147483647의 범위입니다. 변환 후의 문자열 데이터는 다음에 설명한 것처럼 (D) 이후의 디바이스 번호에 저장됩니다. 

①부호에는 BIN데이터가 플러스일 때 "20H(스페이스)"를 저장하고, 마이너스일 때 "2DH(-)"를 저장합니다. 

②소수부 자리수를 "0" 이외로 설정한 경우에는 지정한 자리수+1 번째 자동적으로 "2EH(.)"를 저장합니다.

③소수부 자리수의 값이 BIN데이터의 자리수보다 큰 경우에는, 자동적으로 0을 부가하고 오른쪽 정렬로 변환하여, "0#####"으로 됩니다.

④전체 자리수의 값부터 부호, 소수점을 제외한 자리수가 BIN데이터의 자리수보다 큰 경우에는, 부호와 수치의 사이에 "20H(스페이스)"를 저장합니다. BIN데이터의 자리수가 큰 경우에는 에러가 됩니다. 

⑤ 변환한 문자열의 마지막에는 자동적으로 "00H"가 저장됩니다.

9) 문자열 → BIN 16비트/32비트 변환(VAL(P), DVAL(P))

▶[VAL(P)    (S)   (D1)    (D2)]

(S)로 지정된 디바이스 번호 이후에 저장되어 있는 문자열을 BIN 16비트 데이터로 변환하여, 자리수와 BIN데이터를 (D1),(D2)에 저장합니다

문자열 → BIN 변환에서는 (S)로 지정된 디바이스 번호로부터 "00H"가 저장되어 있는 디바이스 번호까지의 데이터를 문자열로 처리합니다. 

(S)로 지정된 문자열의 전체 자리수는 2~8문자입니다.

(S)로 지정된 문자열 중, 소수부가 될 문자수는 0~5문자입니다.

단, (전체자리수-3) 이하가 되도록 하십시오

BIN값으로 변환할 수 있는 수치 문자열은 소수점을 무시한 값으로 -32768~32767의 범위 이내입니다. 또 부호, 소수점을 제외한 수치 문자열은 "30H~39H"의 범위 이내만 지정할 수 있습니다.

소수점을 무시한 값이란 예를 들면 "-12345.6" → "123456" 입니다.

부호에는 플러스의 수치를 표시할 경우에는 "20H"를 설정하고, 마이너스의 수치를 표시할 경우에는 "2DH"를 설정합니다. 소수점에는 "2EH"를 설정합니다.

(D1)에 저장할 전체 자리수는 수치를 표시할 문자(부호, 소수점을 포함) 모든 문자수를 저장합니다.

(D1+1)에 저장할 소수부 자리수는 "2EH(.)"이후의 소수부를 표시할 문자 수를 저장합니다.

(D2)에 저장할 BIN데이터는 소수점을 무시한 문자열을 BIN값으로 변환하여 저장합니다.

(S)로 지정될 문자열에서 부호화 최초의 "0"이외의 수치 간에 "20H(스페이스)" 또는 "30H(0)"가 존재하는 경우에는 "20H","30H"를 무시하고 BIN값으로 변환합니다.

▶[DVAL(P)    (S)   (D1)    (D2)]

(S)로 지정된 디바이스 번호 이후에 저장되어 있는 문자열을 BIN32비트 데이터로 변환하여, 자리수와 BIN데이터를 (D1),(D2)에 저장합니다.

문자열→BIN 변환에서는 (S)로 지정된 디바이스 번호로부터 "00H"가 저장되어 있는 디바이스 번호까지의 데이터를 문자열로 처리합니다.

(S)로 지정된 문자열의 전체 자리수는 2~13문자입니다.

(S)로 지정된 문자열 중, 소수부가 될 문자수는 0~10문자입니다.

단, (전체자리수-3) 이하가 되도록 하십시오

BIN값으로 변환할 수 있는 수치 문자열은 소수점을 무시한 값으로 -2147483648 ~2147483647의 범위 이내입니다. 또 부호, 소수점을 제외한 수치 문자열은 "30H"~"39H"의 범위 이내만 지정할 수 있습니다. 소수점을 무시한 값이란 예를 들면 "-12345.6" → "-123456" 입니다.

부호에는 플러스의 수치를 표시할 경우에는 "20H"를 설정하고, 마이너스의 수치를 표시할 경우에는 "2DH"를 설정합니다. 소수점에서는 "2EH"를 설정합니다.

(D1)에 저장할 전체 자리수는 수치를 표시할 문자(부호,소수점을 포함) 모든 문자 수를 저장합니다. (D1+1)에 저장할 소수부 자리수는 "2EH(.)"이후의 소수부를 표시할 문자수를 저장합니다.

(D2)에 저장할 BIN데이터는 소수점을 무시한 문자열을 BIN값으로 변환하여 저장합니다. (S)로 지정된 문자열에서 부호화 최초의 "0"이외의 수치간에 "20H(스페이스)" 또는 "30H(0)"가 존재하는 경우에는 "20H", "30H" 를 무시하고 BIN값으로 변환합니다.

 

'PLC' 카테고리의 다른 글

ASCII (아스키)  (0) 2020.02.21
이진화 십진법  (0) 2020.02.21
[27] 문자열 처리 명령  (0) 2020.02.19
[26]버퍼 메모리 엑세스 명령  (0) 2020.02.19
[25] 데이터 테이블 조작명령  (0) 2020.02.19

1) BIN 16비트 / 32비트 → 10진 아스키 변환(BINDA(P), DBINDA(P))

▶[BINDA(P)   (S)    (D)]

(S)로 지정된 BIN 16비트 데이터를 10진수로 표현했을 때의 수치 각각을 아스키 코드로 변환하여, (D)로 지정된 디바이스 번호 이후에 저장합니다.


(S)로 지정된 BIN데이터는 -32768~32767의 범위 이내입니다.
(D)에 저장되는 연산결과는 다음과 같습니다. 


① "부호"에는 BIN데이터가 플러스 일 때 "20H"를 저장하고, 마이너스일 때 "2DH"를 저장합니다. 

② 유효 자리수 중의 "0"에는 "20H"를 저장합니다. (0 서프레스 합니다.)

③ (D+3) 로 지정된 디바이스에 대한 데이터 저장은 SM701(출력문자수 전환신호)의 ON/OFF상태에 따라 달라집니다.

SM701 OFF시: "0"을 저장합니다

SM701 ON시: "20H"를 저장합니다.

▶DBINDA(P)   (S)   (D)]

(S)로 지정된 BIN16비트 데이터를 10진수로 표현했을 때의 수치 각각을 아스키코드로 변환하여, (D)로 지정된 디바이스 번호 이후에 저장

(S)로 지정된 BIN데이터는 -2147483648~2147483647의 범위 이내입니다. 
(D)로 저장되는 연산 결과는 다음과 같습니다. 

①"부호"에는 BIN데이터가 플러스 일때 "20H"를 저장하고, 마이너스 일때, "2DH"를 저장

②유효 자리수 중의 "0"에는 "20H"를 저장합니다. (0 서프레스 합니다)

③(D+3)로 지정된 디바이스에 대한 데이터 저장은 SM701(출력문자수 전환신호)의 ON/OFF상태에 따라 달라집니다.

SM701 OFF시: "0"을 저장합니다

SM701 ON시: "20H"를 저장합니다.


2) BIN 16비트/32비트 → 16진 아스키 변환(BINHA(P), DBINHA(P))

▶[BINHA(P)   (S)    (D)]

(S)로 지정된 BIN 16비트 데이터를 16진수로 표현했을 때의 수치 각각을 아스키 코드로 변환하여, (D)로 지정된 디바이스 번호 이후에 저장합니다.

(S)로 지정된 BIN데이터는 0H~FFFFH의 범위 이내입니다.
(D)에 저장되는 연산 결과는 다음과 같습니다. 
(D)에 저장하는 연산 결과는 4자리의 16진수로 처리합니다.
따라서, 유효자리수 좌측의 "0"은 "0"으로 처리합니다 (0 서프레스 하지 않습니다.)
(D+2)로 지정된 디바이스에 대한 데이터의 저장은 SM701(출력문자수 전환신호)의 ON/OFF상태에 따라 달라집니다.
SM701 OFF시: "0"을 저장합니다.
SM701 ON시: 변화하지 않습니다.

▶[DBINHA(P)   (S)   (D)]

(S)로 지정된 BIN32비트 데이터를 16진수로 표현했을 때의 수치 각각을 아스키 코드로 변환하여, (D)로 지정된 디바이스 번호이후에 저장합니다.

(S)로 지정된 BIN데이터는 0H~FFFFFFFFH의 범위 이내입니다.
(D)에 저장되는 연산결과는 8자리의 16진수로 처리됩니다.
따라서 유효 자리수 좌측의 "0"은 "0"으로 처리합니다. (0 서프레스 하지 않습니다)
(D+2)로 지정된 디바이스에 대한 데이터 저장은 SM701(출력문자수 전환신호)의 ON/OFF 상태에 따라 달라집니다. 
SM701 OFF시: "0"을 저장합니다.
SM701 ON시: 변화하지 않습니다.


3) BCD 4자리/8자리 → 10진 아스키 변환(BCDDA(P), DBCDDA(P))

▶[BCDDA(P)    (S)    (D)]

(S)로 지정된 BCD 4자리 데이터 수치 각각을 아스키 코드로 변환하여, (D)로 지정된 디바이스 번호 이후에 저장합니다.

(S)로 지정된 BCD 데이터는 0~9999의 범위 이내입니다.
(D)에 저장되는 연산결과 중에서, 유효자리수의 좌측 "0"은 0서프레스 합니다.
(D+2)로 저장된 디바이스에 대한 데이터의 저장은 SM701(출력문자수 전환신호)의 ON/OFF 상태에 따라 달라집니다. SM701 OFF시: "0"을 저장합니다.
SM701 ON시: 변화하지 않습니다.

▶[DBCDDA(P)    (S)   (D)]

(S)로 지정된 BCD 8자리 데이터 수치 각각을 아스키코드로 변환하여, (D)로 지정된 디바이스 번호 이후에 저장

(S)로 지정된 BCD데이터는 0~99999999의 범위 이내입니다.
(D)에 저장되는 연산결과 중에서, 유효자리수의 좌측 "0"은 0서프레스 합니다.
(D+4)로 지정된 디바이스에 대한 데이터의 저장은 SM701의 ON/OFF 상태에 따라 달라집니다.
SM701 OFF시: "0"을 저장합니다.
SM701 ON시: 변화하지 않습니다.

4)10진아스키 → BIN 16비트/32비트 변환(DABIN(P), DDABIN(P))

▶[DABIN(P)   (S)    (D)]

(S)로 지정된 디바이스 번호 이후에 저장되어 있는 10진 아스키 데이터를 BIN 16비트 데이터로 변환하여, (D)로 지정된 디바이스 번호에 저장

(S)~(S+2)로 지정된 아스키 데이터는 -32768~32767의 범위 이내입니다. 

"부호"데이터에는 변환할 데이터가 플러스일때 "20H"을 설정하고, 마이너스 일때 "2DH"를 설정합니다. 각 자리에 설정되는 아스키 코드는 "30H"~"39H"의 범위 이내입니다. 

각자리에 설정되는 아스키코드는 "20H","00H"일 때는 "30H"로 처리합니다.

▶[DDABIN(P)    (S)    (D)]

(S)로 지정된 디바이스 번호 이후에 저장되어 있는 10진 아스키 데이터를 BIN32비트 데이터로 변환하여 (D)로 지정된 디바이스 번호에 저장합니다.

(S)~ (S+5) 로 지정된 아스키 데이터는 -2147483648~2147483647의 범위 이내입니다. 또, +5의 상위 바이트에 저장되어 있는 데이터는 무시합니다. 
"부호"데이터에는 변환할 데이터가 플러스 일 때, "20H"를 설정하고, 마이너스 일때 "2DH"를 설정
각자리에 설정되는 아스키 코드는 "30H"~ "39H" 의 범위 이내입니다.
각 자리에 설정되는 아스키 코드는 "20H", "00H"일때는 "30H"로 처리합니다.

5) 16진 아스키 → BIN 16비트/32비트 변환 (HABAIN(P), DHABIN(P))

▶[HABIN(P)    (S)    (D)]

(S)로 지정된 디바이스 번호 이후에 저장되어 있는 16진 아스키 데이터를 BIN 16비트 데이터로 변환하여, (D)로 지정된 디바이스 번호에 저장합니다.

(S)~ (S+1)로 지정된 아스키 데이터는 0000H~FFFFH의 범위 이내입니다.
각 자리에 설정할 아스키 코드는 "30H" ~ "39H" 및 "41H"~ "46H" 의 범위 이내입니다.

▶[DHABIN(P)   (S)    (D)]

(S)로 지정된 디바이스 번호 이후에 저장되어 있는 16진 아스키 데이터를 BIN32비트 데이터로 변환하여 (D)로 지정된 디바이스 번호에 저장합니다.

(S) ~ (S+3) 로 지정된 아스키 데이터는 0000H~ FFFFFFFFH의 범위 이내입니다.
각자리에 설정할 아스키 코드는 "30H"~"39H" 및 "41H"~"46H"의 범위 이내입니다.

'PLC' 카테고리의 다른 글

이진화 십진법  (0) 2020.02.21
[28] 문자열 처리 명령  (0) 2020.02.19
[26]버퍼 메모리 엑세스 명령  (0) 2020.02.19
[25] 데이터 테이블 조작명령  (0) 2020.02.19
[24] 구조화명령  (0) 2020.02.19

인텔리전트 기능 모듈/특수 기능 모듈은 사전에 모듈만의 특수한 용도로 정의된 버퍼 메모리 라는 것을 가지고 있습니다. 이런 특수한 용도로 정의된 버퍼 메모리를 CPU가 읽고 쓸 수 있도록 엑세스 기능의 명령어 입니다.

최근 이러한 버퍼 메모리 엑세스 명령을 사용하지 않고, 직접 유니트 지정 명령도 사용가능 합니다. 샘플 프로그램에서도 두가지 모두 예시 하였습니다.


1) 인텔리전트 기능 모듈 / 특수기능 모듈에서의 1워드 데이터 읽기 (FROM(P))

▶[FROM(P)  n1 n2 (D) n3]

n1로 지정된 인텔리전트 기능 모듈 / 특수 기능 모듈 내의 버퍼 메모리 n2로 지정된 어드레스로부터 n3점의 워드의 데이터를 읽고, (D)로 지정된 디바이스 이후에 저장

2) 인텔리전트 기능 모듈/특수 기능 모듈에서의 2워드 데이터읽기(DFRO(P))

▶[DFRO(P) n1 n2 (D) n3]

n1로 지정된 인텔리전트 기능 모듈/특수기능 모듈 내의 버퍼메모리 n2로 지정된 어드레스로부터 (n3*2)점의 워드 데이터를 읽고, (D)로 지정된 디바이스 이후에 저장

3) 인텔리전트 기능 모듈/특수 기능 모듈로의 1워드 데이터쓰기 (TO(P))

▶[TO(P) n1 n2 (S) n3]

(S)로 지정된 디바이스로 부터 n3점의 데이터를 n1로 지정된 인텔리전트 기능 모듈/특수 기능 모듈 내의 버퍼 메모리 n2 로 지정된 어드레스 이후에 씁니다.
인텔리전트 기능 모듈/특수 기능 모듈의 버퍼데이터 읽기,  쓰기명령어 FROM,DFRO,TO,DTO는 버퍼메모리의 주소를 H####, K#### 등으로 16진수, 10진수의 표현이 가능합니다.
버퍼메모리 직접지정 명령 U##/G####의 경우에는 10진수 표현만 가능합니다.

'PLC' 카테고리의 다른 글

[28] 문자열 처리 명령  (0) 2020.02.19
[27] 문자열 처리 명령  (0) 2020.02.19
[25] 데이터 테이블 조작명령  (0) 2020.02.19
[24] 구조화명령  (0) 2020.02.19
C언어 포인터란?  (0) 2020.02.19

1)데이터 테이블에 대한 데이터쓰기 (FIFW(P))

▶[FIFW(P)   (S)    (D)]

(S)로 지정된 16비트 데이터를 (D)로 지정된 데이터 테이블에 저장합니다. 
(D)에 테이블에 저장되어 있는 데이터 수를 저장하고, (D)+1 이후에 (S)로 지정된 데이터를 순차적으로 저장해갑니다. FIFW명령을 처음 실행하는 경우에는 (D)로 지정된 디바이스의 값을 클리어 하십시오 
데이터 테이블에 입력한 데이터 수와 데이터 테이블 범위는 사용자가 관리하십시오.

2) 테이블에서의 선입 데이터 읽기(FIFR(P))

▶[FIFR(P)   (S)    (D)]

(D)로 지정된 테이블로부터 가장 먼저 읽혀진 데이터(D+1) 가 (S)로 지정된 디바이스에 저장됩니다.
FIFR명령 실행 후에는 데이터 테이블의 데이터가 1개씩 시프트 됩니다. (D)에 저장되어 있는 값이 0일 때는, FIFR명령을 실행하지 않도록 사용자가 인터록 프로그램을 추가하십시오.

3) 데이터 테이블에서의 후입 데이터 읽기 (FPOP(P))

▶[FPOP(P)   (S)     (D)]

(D)로 지정된 테이블의 마지막에 저장되어 있는 데이터를 (S)로 지정된 디바이스에 저장합니다.
FPOP명령 실행후에는 FPOP명령으로 읽은 데이터를 저장하고 있던 디바이스가 0으로 됩니다. (D)에 저장되어 있는 값이 0일 때는, FPOP 명령을 실행하지 않도록 사용자가 인터록 프로그램을 추가하십시오.

 

'PLC' 카테고리의 다른 글

[27] 문자열 처리 명령  (0) 2020.02.19
[26]버퍼 메모리 엑세스 명령  (0) 2020.02.19
[24] 구조화명령  (0) 2020.02.19
C언어 포인터란?  (0) 2020.02.19
[23] 데이터 처리명령  (0) 2020.02.19

1) For ~ Next (For , Next)

▶[For n]

FOR ~ NEXT 명령간의 처리를 n회 실행하게 되면 무조건 NEXT명령의 다음 스텝을 처리합니다.
n은 1~32767을 지정할 수 있습니다. -32768~0을 지정했을 때는 n=1과 동일한 처리를 합니다.
FOR ~ NEXT 명령 간의 처리를 하지 않을 때는 CJ, SCJ, 명령으로 점프시키십시오. FOR의 네스팅은 16중까지 가능합니다.

다음의 경우에는 연산에러가 되며, 에러플래그(SM0)가 ON하고, 에러 코드가 SD0에 저장됩니다.
FOR명령을 실행 후, NEXT명령을 실행하기 전에 END(FEND)명령을 실행했을 때 (에러코드: 4200)
FOR명령을 실행하기 전에 NEXT 명령을 실행했을 때 (에러코드:4201)
FOR명령의 네스팅을 실행하는 경우, 17번째 네스팅을 실행했을 때(에러코드:4202)

▶[NEXT]

FOR~NEXT 명령간의 처리에서 n에서 지정한 횟수만큼 FOR명령줄로 되돌려(점프) 줍니다.
FOR~NEXT 명령에서 FOR의 네스팅에서 같은 수 만큼 1:1로 NEXT문이 있어야 합니다.

2) FOR~NEXT 강제종료(BREAK(P))

▶[BREAK(P)   (D)  pn]

FOR~NEXT명령에 의한 반복처리를 강제적으로 종료하고, Pn으로 지정된 포인터로 실행위치를 이동합니다. Pn에는 동일 프로그램 파일 내의 포인터만 지정할 수 있습니다. Pn에 다른 프로그램 파일 내의 포인터를 지정한 경우는 연산 에러가 됩니다.
(D)에는 강제종료한 시점의 FOR~NEXT 명령에서의 반복처리 실행 횟수의 잔여수를 저장합니다. 단, 반복처리의 잔여수에는 BREAK 명령 실행시의 횟수도 포함됩니다. BREAK명령은 FOR~NEXT 명령 사이에 서만 사용할 수 있습니다. 
BREAK 명령은 하나의 네스팅에 대해서만 사용할 수 있습니다.
다중네스팅을 강제 종료 시킬 경우는 네스팅만큼의 BREAK 명령을 실행하십시오

3) 서브루틴 프로그램 호출(CALL(P))

▶[CALL(P)  Pn]

CALL(P)명령을 실행하면 Pn으로 지정된 포인터의 서브루틴 프로그램을 실행합니다. 
CALL(P)명령은 동일 프로그램 파일 내의 포인터로 지정한 서브루틴 프로그램과 공통 포인터로 지정한 서브루틴 프로그램을 실행할 수 있습니다.
서브루틴(SubRoutine) - 프로그래밍시 매크로(macro)기능을 자주 사용한다.
매크로란 반복되어 자주 사용되는 명령어를 묶어서 하나의 이름으로 만드는 것을 말한다.
C언어 등의 프로그래밍 언어를 이용하여 프로그래밍시 매크로를 사용하게 되면 컴파일시에 해당 매크로를 사용하는 부분은 매크로의 원문으로 모두 교체되게 되므로 소스코드의 크기가 커지고 그만큼 메모리의 점유율이 높아지는 단점이 있다.

이런 매크로의 단점을 극복하고 반복되는 것을 한번만 사용하여 메모리 사용을 최대한 줄이도록 고안된 것이 서브루틴(Sub-routine)이다. 이는 메인루틴(Main-routine)의 대비되는 개념으로 혼자 쓰이는 것이 아닌 메인루틴에 붙어 보조하는 역할을 한다. 반복되는 특정한 기능을 모아 놓은 이름을 붙여 놓았다는 것은 매크로와 같지만 프로그램 흐름이 메인루틴에 있지 않고, 별도의 공간에 한번만 생긴다는 것이 다르다. 아래 예를 통해서 서브루틴에 대한 개념을 정확히 알아보도록 하자.

▶[CALL(P) Pn(S1)~(S5)]

CALL(P) 명령을 실행하면 Pn으로 지정된 포인터의 서브루틴 프로그램을 실행합니다.
CALL(P) 명령은 동일 프로그램 파일 내의 포인터로 지정한 서브루틴 프로그램과 공통 포인터로 지정한 서브루틴 프로그램을 실행 할 수 있습니다.
서브루틴 프로그램에서 기능(Function) 디바이스(FX,FY,FD)를 사용하는 경우는 (S1)~(S5) 기능 디바이스에 대응하는 디바이스를 지정합니다.
(S1)~(S5)로 지정된 디바이스 내용은 서브루틴 프로그램 실행 전에 비트 데이터의 내용이 FX에, 워드데이터의 내용이 FD에 전송됩니다.
CALL(P) 명령에서는 (S1)~(S5)까지 사용 가능합니다. 서브루틴 프로그램에서 사용하는 기능 디바이스의 수와 CALL(P) 명령의 인수는 동 수로 할 필요가 있습니다. 또한 기능 디바이스와 CALL(P)의 인수 종류는 동일하게 하십시오. 
CALL(P) 명령에서 인수로 지정한 디바이스 번호는 중복되지 않도록 하십시오. 중복되는 경우에는 정상적으로 연산을 할 수 없습니다. CALL(P) 명령에서 인수로 지정한 워드 디바이스(4워드)를 서브 루틴 프로그램에서 사용하지 마십시오. 사용하게 되면 정상적인 연산을 할 수 없습니다. CALL(P)명령의 네스팅은 16중까지 가능합니다. 단 네스팅의 16중은 CALL(P), FCALL(P), ECALL(P), EFCALL(P) 명령의 합계입니다. 
서브 루틴 프로그램 내에서 ON시킨 디바이스는 서브 루틴 프로그램의 비 실행시에서도 유지됩니다. 서브 루틴 프로그램 실행시에 ON시킨 디바이스는 FCALL(P)명령으로 OFF시킬 수 있습니다.

4) 서브루틴 프로그램에서의 리턴(RET)

▶[RET]

서브루틴 프로그램의 종료를 실행합니다. RET 명령을 실행하면 서브 루틴 프로그램을 호출한 CALL(P), FCALL(P), ECALL(P), EFCALL(P) 명령의 다음 스텝으로 복귀합니다.
다음의 경우에 연산 에러가 되며, 에러플래그(SM0)가 ON하고, 에러코드가 SD0 에 저장됩니다.
CALL(P)명령 실행 후, RET 명령을 실행하기 전에 END, FEND, GOEND, STOP 명령을 실행했을 때(에러코드4211)
CAPP(P) 명령을 실행하기 전에 RET 명령을 실행했을 때 (에러코드: 4212)

 

'PLC' 카테고리의 다른 글

[26]버퍼 메모리 엑세스 명령  (0) 2020.02.19
[25] 데이터 테이블 조작명령  (0) 2020.02.19
C언어 포인터란?  (0) 2020.02.19
[23] 데이터 처리명령  (0) 2020.02.19
[22] 데이터 처리 명령  (0) 2020.02.19

포인터란 어떠한 값을 저장하는게 아닌 어떠한 값의 주소를 저장하는 것

어떠한 값의 주소라함은 해당값이 저장된 컴퓨터 메모리상의 주소를 의미한다.

포인터 변수를 만들 때는 변수이름앞에 *를 붙여주면 그 변수는 포인터 변수가 된다.

(사용할 때 일반변수와의 구분을 위해 주로 " *p변수이름" 의 형식으로 사용한다)

이것의 결과를 보면 pnum의 실질적인 값은 num의 주소이며, num의 값을 가리키고 있음

여기서 &연산자는 &오른쪽에 오는 피연산자의 주소값을 반환하는 연산자이다.

그리고 포인터도 가리키고자하는 변수의 자료형에 따라 포인터변수도 그에 맞춰 다르게 선언한다.

ex) duble num;

    double *pnum;  // double형 포인터 변수 pnum 

 

char cha;

char *pcha; // char형 포인터 변수 pcha 

사실 주소값은 동일한 시스템에서 그 크기가 동일하며, 모두 정수의 형태를 띈다. 하지만 모두 다 똑같이 int형으로 포인터 변수를 선언한다면, 다른 사용자나 자신 그리고 시스템은 해당 포인터 변수가 무엇을 가리키는건지 알기 힘듬.

그래서 *이 붙은 자료형은 포인터 형이라 한다. 물론 포인터도 값을 저장하는 변수이기에 자료형의 범주에 포함된다.

또 하나의 사실은 *의 위치는 크게 상관이 없다.

ex) int* pnum;

    int *pnum;

   int * pnum;

위처럼 프로그래머 마음대로 골라 쓰면됨.

*연산자는 포인터가 가리키는 메모리공간에 접근할 때 사용되는 연산자이며, 포인터 변수를 이용해 포인터 변수가 가리키는 변수의 값을 바꿀 수도 있다. 


널 포인터(NULL Pointer)

포인터를 선언만 하고, 초기화해주지 않으면, 내부에는 쓰레기값으로 채워지는데, 이는 그 포인터 변수가 어디를 가리킬지 아무도 알 수 없다.
설령 포인터가 가리키는 주소가 메모리상에서 아주 중요한 공간이라도 모를 것이다.
거기다가 아래의 코드처럼 *연산으로 임의의 수를 저장하면, 프로그램에 치명적인 결과를 가지고 올 수 있다.
그렇다면 초기값을 대충 1234로 해야하나? 이것도 안된다. 왜냐하면 이 1234번지가 메모리의 어디에 있는지 알 수 없다. 고로 쓰레기 값으로 채우는 것과 다를 바없다.
그래서 NULL값을 이용하는 것이다.
이 둘이 의미하는 바는 같다 왜 0과 NULL이 같은 의미를 지니냐면 0은 아스키코드에서 NULL이기 때문이다. 
그리고 0이라는 숫자가 들어가면 *pnum1이 0번지를 가리키진 않는다.
여기서 0(NULL)의 의미는 해당 포인터 변수는 아무것도 가리키고 있지 않다고 할 수 있다.

 

'PLC' 카테고리의 다른 글

[25] 데이터 테이블 조작명령  (0) 2020.02.19
[24] 구조화명령  (0) 2020.02.19
[23] 데이터 처리명령  (0) 2020.02.19
[22] 데이터 처리 명령  (0) 2020.02.19
[21] 데이터 처리명령  (0) 2020.02.19

+ Recent posts