SCADA 란 무엇인가?


SCADA는 Supervisory Control and Data Acquisition의 줄임말이고, 한국말로는 감독 제어 및 데이터 수집입니다.

ICS(산업 생산 시설, 기반 시설, 설비 시설 등)를 감시 제어하고 데이터를 취득하는 시스템이라고도 합니다.

 

HMI, PLC 및 RTU 등을 사용해서 광범위한 지리적인 영역에서 고속 제어가 가능하여 ICS에 사용할 수 도 있고요.

전력망, 파이프 공정라인, 철도, 수도시설, 석유 및 가스 시설 등을 원격 제어 스테이션을 사용하여 기본 적인 설정 변경이나 작업을 조정할 수 있으나, 주요 기능은 정보 수집에 특화되어 있습니다.

 

[그림 1. SCADA 구성도]

SCADA 구성도(eep site 이미지 인용)

 


 

DCS 란 무엇인가?


DCS는 Distributed Control Systems의 줄임말이고, 한국말로는 분산 제어 시스템입니다.

과거에 DDC(Direct Digital Control)이라는 중앙 집중 제어 방식을 사용했으나, 공정 전체에 부하가 발생하여 신뢰성이 떨어진다는 문제로 현재는 사용하지 않고 DCS를 사용하고 있습니다.

 

가스 및 석유 시설, 자동차 생산 공장, 발전소 등 복잡한 대규모의 시스템이 갖추어진 시설에서 중앙 시스템으로 분산된 수백, 수천 개의 제어 모듈들의 정보를 수집하거나 제어할 수 있습니다.

주요 기능은 분산된 시스템들의 제어입니다.

 

[그림 2. DCS 구성도]

DCS 구성도 이미지 ( honeywell site 이미지 인용 )

 


 

SCADA와 DCS의 차이점

 


다음 표는 SCDA와 DCS의 차이점을 나타내는 표입니다.

항목 SCADA DCS
정의 감시 제어 및 데이터 수집 중앙 집중 시스템 제어
동작 방식 이슈(이벤트) 처리 방식 실시간 처리 방식
작업 구성 단계별 블록별
데이터 처리 양 소량 대량
데이터 관리 메인 시스템으로만 관리 메인 시스템과 통합관리
분야 원격 감시 및 제어 분야 지속적인 시스템 제어 분야

 

그러나, 현재는 하드웨어의 사양들이 상당히 좋아지고 새로운 장비들이 출시되고 있어서 SCADA와 DCS의 구분이 없다고 합니다.

OT 란?


OTOperational Technology의 줄임말입니다.

한국말로는 운영 기술이라는 뜻입니다.

 

물리적인 장비인 가스 밸브, 온도계, 펌프, 모터를 모니터링하고 제어하는 시스템을 의미합니다.

자동차 공장, 화학 공장, 제약 공장 등에서 실제 사용 중인 물리적 장비의 상태에 대해서 확인한다던지 컨트롤하기 위한 시스템을 의미합니다.

 

다른 말로는 ICS(Industrial Control System)라고도 불립니다.

SCADA, DCS, SIS 시스템과 같은 산업적인 제품 생산에 사용되는 제어 시스템을 통칭하는 용어입니다.

 

스카다(SCADA)와 디씨에스(DCS) 정의 및 차이점

SCADA 란 무엇인가? SCADA는 Supervisory Control and Data Acquisition의 줄임말이고, 한국말로는 감독 제어 및 데이터 수집입니다. ICS(산업 생산 시설, 기반 시설, 설비 시설 등)를 감시 제어하고 데이터를 취..

itot.tistory.com

 

실무에서는 OT와 ICS라는 동일시 여기는 분들도 계시고 다르다는 분들도 계십니다.

하지만, 이 단어에 대해서 정의를 내린 유명한 IT분야 리서치 회사가 있습니다.

 

가트너(Gartner) 그룹입니다.

이 가트너 그룹에서 ICS와 OT의 정의를 내렸습니다.

OT 안에 ICS가 포함되고 그 ICS 안에 SCADA와 DCS가 포함된다라고 말입니다.

 

OT 및 ICS 정의

 

 기능은 크게 2가지로 볼 수 있습니다.

1. 관리자가 시스템의 상태 확인 및 조작할 수 있는 조작 및 모니터링 기능

2. 관리자가 시스템을 제어할 수 있는 제어 기능

 

조작 및 모니터링 기능은 물리적인 장비의 현재 상태를 확인할 수 있으며, 물리적인 장비들의 프로세스의 설정 값(기본, 한계 값 등)을 조작할 수 있는 기능입니다.

제어 기능은 물리적인 장비들을 실질적으로 ON/OFF와 같이 시스템을 직접 제어하는 기능을 의미합니다.

'OT > Overview' 카테고리의 다른 글

스카다(SCADA)와 디씨에스(DCS) 정의 및 차이점  (0) 2021.01.26

숫자 빙고 게임

 


 

public static void map(int n, int m, int pick[], int user[][]) {
	int w = 0;
	boolean ch = false;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			while (true) {
				int tmp = (int) (Math.random() * m) + 1;
				for (int k = 0; k < pick.length; k++) {
					if (tmp == pick[k])
						ch = true;
				}
				if (ch) {
					ch = false;
					continue;
				} else {
					pick[w++] = user[i][j] = tmp;
					break;
				}
			}
		}
	}
}

public static void line(int n, int user[][]) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			System.out.print(user[i][j] + "\t");
		}
		System.out.println();
	}
	System.out.println();

}

public static void ucheck(int user[][], int com[][], int uch) {
	for (int i = 0; i < user.length; i++) {
		for (int j = 0; j < user.length; j++) {
			if (user[i][j] == uch) {
				user[i][j] = 0;
			}
			if (com[i][j] == uch) {
				com[i][j] = 0;
			}
		}
	}
}

public static void ccheck(int m, int com[][], int user[][]) {
	int tmp = 0;
	int cnt = 0, c=0;
	int sa=0;
	

	while (cnt<1) {
		tmp = (int) (Math.random() * m + 1);
		for (int i = 0; i < com.length; i++) {
			for (int j = 0; j < com.length; j++) {
				if (com[i][j] == tmp) {
					com[i][j] = 0;
					sa=tmp;
				}
			}
		}
		
		for (int i = 0; i < user.length; i++) {
			for (int j = 0; j < user.length; j++) {
				if (user[i][j] == sa) {
					user[i][j] = 0;
				}
			}
		}
		cnt+=1;
	}
	System.out.println("컴퓨터 차례 - 고른 숫자는 : "+tmp);
}

public static void bingo(int n,int b,int user[][], int com[][]) {
	int bingo=0, cbingo=0;
	int cnt=0, cntt=0, ccnt=0, ccntt=0;
	
	for(int i=0; i<n; i++) {
		cnt=0; cntt=0; ccnt=0; ccntt=0;
		for(int j=0; j<n; j++) {
			if(user[i][n-1-j]==0) {
				cnt+=1;
				if(cnt==n) {
					bingo+=1;
					cnt=0;
				}
			}
			if(user[n-1-j][i]==0) {
				cntt+=1;
				if(cntt==n) {
					bingo+=1;
					cntt=0;
				}
			}
			
			if(com[i][n-1-j]==0) {
				ccnt+=1;
				if(ccnt==n) {
					cbingo+=1;
					ccnt=0;
				}
			}
			if(com[n-1-j][i]==0) {
				ccntt+=1;
				if(ccntt==n) {
					cbingo+=1;
					ccntt=0;
				}
			}
		}	
	}
	
	if(bingo>=b) {
		System.out.println(bingo+"줄로 유저 승!!");
		System.exit(0);
	}
	else if(cbingo>=b) {
		System.out.println(cbingo+"줄로 컴퓨터 승!!");
		System.exit(0);
	}
	
	else if(bingo>=1 | cbingo>=1) {
		System.out.println("유저 : "+  bingo +" 줄 빙고\n" + "컴퓨터 : " + cbingo + " 줄 빙고");
	}
	
}

public static void main(String[] args) throws IOException {
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	int uch = 0;
	
	
	System.out.print("n * n 배열만큼 뽑을 n을 입력 : ");
	int n = Integer.parseInt(br.readLine());
	System.out.print("빙고값 : 1 ~ m 숫자 m을 입력(m = n*n이상) : ");
	int m = Integer.parseInt(br.readLine());
	System.out.print("빙고 몇줄시 승리 할지 입력(n*2까지 가능) : ");
	int b = Integer.parseInt(br.readLine());

	int user[][] = new int[n][n];
	int com[][] = new int[n][n];
	int upick[] = new int[n * n];
	int cpick[] = new int[n * n];

	map(n, m, upick, user);
	map(n, m, cpick, com);
	System.out.println("[사용자 빙고 판]");
	line(n, user);
	System.out.println("[컴퓨터 빙고 판]");
	line(n, com);

	for(;;) {
	System.out.print("유저차례 - 고를 숫자 입력 :");
	uch = Integer.parseInt(br.readLine());
	ucheck(user, com, uch);
	System.out.println("[사용자 빙고 판]");
	line(n, user);
	System.out.println("[컴퓨터 빙고 판]");
	line(n, com);

	ccheck(m, com, user);
	System.out.println("[사용자 빙고 판]");
	line(n, user);
	System.out.println("[컴퓨터 빙고 판]");
	line(n, com);
	
	bingo(n,b,user,com);
	}
}

 

출력하면 다음과 같습니다.

 

가위바위보 첫 번째

 


 

int ch=0;
int com=0;

while(true) {
	System.out.print("1.가위 2.바위 3.보 4.종료 > ");
	ch = System.in.read()-'0';
	System.in.skip(2);
	
	if(ch < 1 | ch > 4) {
		System.out.println("없는 번호입니다. 다시 고르세요.");
		continue;
	}
	else if(ch == 4) {
		System.out.println("종료합니다.");
		break;
	}
	else {
		com = (int) (Math.random() *3 + 1);
		System.out.println("유저는 " + ((ch == 1)? "가위" : (ch == 2)? "바위" : "보") + "를 내었습니다.");
		System.out.println("컴퓨터는 " + ((com == 1)? "가위" : (com == 2)? "바위" : "보") + "를 내었습니다.");
	}			
	System.out.println();
	
	switch(ch * com) {
		case 2 :
			System.out.println(((ch > com)? "유저" : "컴퓨터") + "가 이겼습니다.");
			break;
		case 3 :
			System.out.println(((ch > com)? "컴퓨터" : "유저") + "가 이겼습니다.");
			break;
		case 6:
			System.out.println(((ch > com)? "유저" : "컴퓨터") + "가 이겼습니다.");
			break;
		default :
			System.out.println("비겼습니다.");
	}
}

 

출력하면 다음과 같습니다.

 

가위바위보 이미지

 


 

가위바위보 두 번째

 


 

int sel = 0;
System.out.println("가위 바위 보");

for (;;) {

	do {
		System.out.println("1.가위 2.바위 3.보 4.종료");
		System.out.print("메뉴> ");

		sel = System.in.read() - 48;
		
		System.in.skip(2);
	} while (sel > 4 || sel < 1);

	if (sel == 4) {
		System.out.println("게임을 종료합니다.");
		break;
	}

	if(sel >= 1 && sel <=4) {
		int com = (int) (Math.random() * 3 + 1);

		System.out.println("사용자 : " + ((sel==1)? "가위" : (sel==2)? "바위" : "보"));
		System.out.println("컴퓨터 : " + ((com==1)? "가위" : (com==2)? "바위" : "보"));
		
		if (sel == 1) {
			if (com == 1) {
				System.out.println("무승부");
			} else if (com == 2) {
				System.out.println("컴퓨터 승");
			} else {
				System.out.println("사용자 승");
			}
		} else if (sel == 2) {
			if (com == 1) {
				System.out.println("사용자 승");
			} else if (com == 2) {
				System.out.println("무승부");
			} else {
				System.out.println("컴퓨터 승");
			}
		} else if (sel == 3) {
			if (com == 1) {
				System.out.println("컴퓨터 승");
			} else if (com == 2) {
				System.out.println("사용자 승");
			} else {
				System.out.println("무승부");
			}
		}
	}
}

 

출력하면 다음과 같습니다.

 

가위바위보 이미지2

 


 

가위바위보 세 번째

 


 

System.out.println("==가위 바위 보 게임==");
System.out.println("1.가위 2.바위 3.보 4.게임종료");

int user = 0;
int com = 0;

String ga = "가위";
String ba = "바위";
String bo = "보";

do {
	System.out.print("입력>");
	user = System.in.read() - 48;
	System.in.skip(2);
	com = (int) (Math.random() * 3 + 1);
	
	if(user==4) {
		System.out.println("게임을 종료합니다");
		System.exit(0);
	}

	if(user >= 1 && user <=4) {
		if (user == 1) {
			System.out.println("사용자: " + ga);
		} else if (user == 2) {
			System.out.println("사용자: " + ba);
		} else {
			System.out.println("사용자: " + bo);
		}

		if (com == 1) {
			System.out.println("컴퓨터: " + ga);
		} else if (com == 2) {
			System.out.println("컴퓨터: " + ba);
		} else {
			System.out.println("컴퓨터: " + bo);
		}
	

		switch (user - com) {
		case -2:
			System.out.println("사용자 승리!!" + "\n");
			break;
		case -1:
			System.out.println("컴퓨터 승리!!" + "\n");
			break;
		case 0:
			System.out.println("비겼습니다!!" + "\n");
			break;
		case 1:
			System.out.println("사용자 승리!!" + "\n");
			break;
		case 2:
			System.out.println("컴퓨터 승리!!" + "\n");
			break;
		default:
			System.out.println("다시 입력하세요!!" + "\n");
		}
	}

} while (user != 4);

 

출력하면 다음과 같습니다.

 

가위바위보 이미지3

사각형(Square) 모양


int num1;
int num2;
		
for(num1 = 0; num1 < 4; num1++) {
	for(num2 = 0; num2 < 5; num2++) {
		if(num2 == 0 | num2 == 4 | num1 == 0 | num1 == 3)
			System.out.print("*");
		else 
			System.out.print(" ");
	}
	System.out.print("\n");
}

 

출력하면 다음과 같은 사각형 모양이 출력 됩니다.

 

사각형 모양

하트(HEART) 모양의 ^ ^ 상단 출력


 JAVA로 하트 모양의 ^^ 상단 출력하는 방법을 우선 적어보도록 하겠습니다.

 

int i , j;
int top = 10;
int topWidth = (top / 2) -2;

for( i = topWidth ; i < top; i += 2 ) { 
	for( j = 0; j <= (top - i); j++ ) {
		System.out.print(" ");
	}
			
	for( j = 0; j <= i * 2; j++ ) {
		System.out.print("*");
	}
			
	for( j = 0; j <= (top - i) * 2; j++ ) {
		System.out.print(" ");
	}
			
	for( j = 0; j <= i * 2; j++ ) {
		System.out.print("*");
	}
	
	System.out.print("\n"); 
}

 

 

top은 *의 개수입니다. ( 개수가 많아지면 옆으로 커집니다. )

 

* topWidth 설명.

for( i = topWidth ; i < top; i += 2 )

[ i = 3; i < 10; i += 2 ]

3개부터 2개씩 먼저 더하면서 출력한다는 의미입니다.

하트 모양의 ^^ 상단

System.out.print(" "); 구문이 2개 있는 걸 보실 수 있습니다.

(" ") 안에 1, 2를 추가해서 출력하게 되면 쉽게 이해하실 수 있습니다.

 

하트 모양의 ^^ 상단2

(" ")를 통해 * 간의 간격을 띄워서 모양을 맞추는 것입니다.

 


 

하트(HEART) 모양의 V 하단 출력


다음은 하트 모양의 V 하단 출력하는 방법을 적어보도록 하겠습니다.

 

int i , j;
int top = 10;
int bottom = top * 2 + 1;
		
for( i = bottom; i >= 0; i -= 2 ){ 
	for( j = 0;  j <= bottom - i; j++ ){ 
		System.out.print(" ");
	}
		
	for( j = 0; j <= i * 2; j++ ) { 
		System.out.print("*");
	}
	
	System.out.print("\n");
}

 

bottom은 top의 * 개수에 맞춰서 출력합니다.

 

하트 모양의 V 하단

그리고, 여기서 또한 (" ")은 띄어쓰기를 통해 별 모양을 잡아주는 겁니다.

 

처음엔 한 칸, 다음은 세 칸, 다섯 칸... 계속 띄어쓰기를 넣어줍니다.

 

하트 모양의 V 하단2

 


 

하트(HEART) 모양 완전체 출력

 


int i , j;
int top = 10;
int topWidth = (top / 2) -2;
int bottom = top * 2 + 1;
		 
for( i = topWidth ; i < top; i += 2 ) { 
	for( j = 0; j <= (top - i); j++ ) {
		System.out.print(" ");
	}
	
	for( j = 0; j <= i * 2; j++ ) {
		System.out.print("*");
	}
			
	for( j = 0; j <= (top - i) * 2; j++ ) {
		System.out.print(" ");
	}
	
	for( j = 0; j <= i * 2; j++ ) {
		System.out.print("*");
	}
			
	System.out.print("\n"); 
}
		
for( i = bottom; i >= 0; i -= 2 ){ 
	for( j = 0;  j <= bottom - i; j++ ){ 
		System.out.print(" ");
	}
			
	for( j = 0; j <= i * 2; j++ ) { 
		System.out.print("*");
	}
			
	System.out.print("\n");
}

 

하트모양 완전체

 

하트 모양이 완성되었습니다.

다이아몬드(DIAMOND) 첫 번째


int num1 = 0;
int num2 = 0;
int num3 = 0;
		
		
for(num1 = 1; num1 < 6; num1++) {
	for(num3 = 0; num3 < 6-num1; num3++) {
		System.out.print(" ");
	}
			
	for(num2 = 0; num2 < num1*2-1; num2++) {
		System.out.print("*");
	}

	System.out.print("\n");
}
		
for(num1 = 6; num1 > 0; num1--) {
	for(num3 = 6-num1; num3 > 0; num3--) {
		System.out.print(" ");
	}
			
	for(num2 = num1*2-1; num2 > 0; num2--) {
		System.out.print("*");
	}
			
	System.out.print("\n");
}

 

출력하면 다음과 같은 모양이 출력됩니다.

 

다이아몬드 모양

 


 

다이아몬드(DIAMOND) 두 번째

 


int num1 = 0;
int num2 = 0;
int num3 = 0;
		
		
for(num1 = 1; num1 < 6; num1++) {
	for(num3 = 6; num3 > num1; num3--) {
		System.out.print(" ");
	}
			
	for(num2 = 1; num2 < num1*2; num2++) {
		System.out.print("*");
	}
			
	System.out.print("\n");
}
		
for(num1 = 6; num1 > 0; num1--) {
	for(num3 = num1; num3 < 6; num3++) {
		System.out.print(" ");
	}
			
	for(num2 = num1*2; num2 > 1; num2--) {
		System.out.print("*");
	}
	
	System.out.print("\n");
}

 

출력하면 다음과 같은 모양이 출력됩니다.

 

다이아몬드 모양

 

카피라이트(Copyright) 란?


 

카피라이트는 저작권, 권리를 뜻하는 단어입니다.

 

창작자가 만든 유형의 무언가에 대하여 권리 및 가치를 인정해주는 것입니다.

 

창작자가 시간과 노력을 들여서 힘들게 만든 창작물을 누군가 자신이 만든 것처럼 복제하여 출시하는 행위 등을 막기 위해 생긴 법입니다. 

 

그래서, 저작권자의 권리를 보호하기 위해서 저작권법 (대한민국, 제9785호)이 존재합니다.

( 국가법령정보센터 www.law.go.kr/lsInfoP.do?lsiSeq=211523#0000 )

 

저작권법 (대한민국, 제9785호) 제2절 제10조를 보면,

"저작권은 저작물을 창작한 때부터 발생하며 어떠한 절차나 형식의 이행을 필요로 하지 아니한다."

라고 명시되어 있습니다.

 

인터넷에 떠도는 자료라고 할지라도 모두 저작권에 의해 보호되고 있는 저작물들입니다.

 


저작권 표기 방법은?


저작권이라 불리는 카피라이트를 표기하는 방법은 다음과 같습니다.

 

표기하는 법을 크게 나누면 5개로 나누어집니다.

저작권표기 연도 저작권자 or 회사 회사 구분 문구
발행 연도 저작권자명 Corp. All rights reserved.
(C)   회사명 Inc. All pictures cannot be copied without permission.
Copyright     Co.  

 

예시)

[저작권 표기 1개] [발행 연도] [저작권자명 or 회사명] [회사 구분 1개] [문구 1개]

 

ⓒ 2021. 회사명 Inc. All rights reserved.

모든 저작권은 회사명에 있습니다.

 

Copyright 2021. 저작권자명 All pictures cannot be copied without permission.

모든 사진들은 저작권자 명의 허가 없이 복사할 수 없습니다.

 

위와 같은 방법으로 표기하시면 됩니다.

 

회사 구분, 문구처럼 어떤 구분 기호를 써야 하고 어떤 문구를 써야하고 어떤 방식으로 써야 하는지 모를 때 찾아보실 텐데요.

 

하지만, 맨 위의 카피라이트(Copyright) 란? 밑을 보시면 제2절 제10조에 관한 내용을 보실 수 있습니다.

 

대한민국에서는 법에 의해 (C) 2021. 회사명 Co. All rights reserved. 와 같은 저작권 표기를 하지 않아도 아무런 문제가 발생하지 않는다는 것을 다시 한번 설명드리고 싶습니다.

 

+ Recent posts