0 + 프로그래밍

[알고리즘] 비트 연산자를 이용한 분류 (산업용 장비, 프로토콜, 통신, Modbus 통신, TCP/IP 주로 사용)

힘들면힘을내는쿼카 2020. 10. 6. 21:47
728x90
반응형



[알고리즘] 비트 연산자를 이용한 분류

(산업용 장비, 프로토콜, 통신, Modbus 통신, TCP/IP 주로 사용)




다양한 프로토콜을 통해 우리는 많은 장비들과 통신 합니다.

통신 과정에서 가장 중요하고 기본적인 장비에서 보낸 데이터를 처리하는 방법에 대해서 알려드리겠습니다.


일단 프로토콜이란 무엇이냐?
프로토콜은 약속입니다. 어떤약속이냐?
서로 어떠한 규칙을 통해서 대화(통신)를 할 것인가? 이 규칙을 정의한 약속입니다.
(※기본적으로 통신은 양방향 입니다.!!)

예를 들어서 한국에서 사람과 사람의 프로토콜은 한국어 입니다.
한국어로 얘기하지 않으면 서로 대화(양방향)를 할 수 없겠죠?

이러한 약속을 컴퓨터는 비트에 데이터를 넣어 정의합니다.
말이 조금 어렵죠?


우리가 알고 있듯이 프로그래밍에서 변수는 바이트(byte)단위의 크기를 갖고 있습니다.

이는 비트(bit) 단위로 우리가 메모리를 관리 할 수 있다는 뜻 입니다.


장비(+산업용)를 사용하는 대부분 프로토콜에서는 비트 단위로 의미하는 바가 다릅니다.

예를 들어 에어컨 시스템의 Fault(문제)관련 메모리라고 하겠습니다.

short Aircon_fault = 0;
에어컨 Fault 메모리#1

보통 2바이트의 메모리는 위와 같습니다.



이 메모리의 비트에 기능을 추가 해보겠습니다.

저는 다음과 같이 설계 하겠습니다.

에어컨 Fault 메모리#2


만약 에어컨에서 Error#1이 발생했다면

Aircon_Fault의 값은 1입니다.

1은 2진수로 0000 0001입니다.


만약 에어컨에서 Error#5가 발생했다면

Aircon_Fault의 값은 16입니다.

16은 2진수로 0001 0000 이기 때문입니다.


마지막으로 에어컨에서 Error#1, Error#3이 발생했다면

Aicon_Fault 값은 5입니다. 

5는 2진수로 0000 0101 입니다.



이제 Aircon에서 보내는 저 메모리 값을 읽는 코드를 알려드겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
short Aircon_Fault = 0;
String Aricon_Fault_msg = "";
String Sum_Aircon_Fault_msg = "";
 
//Aircon 상태를 읽는 함수, 즉 Aircon과 통신해서 Aircon_Fault의 값을 읽어오는 함수
AirconStatus.Read(Aircon_Fault);
 
//Fault가 발생하면
if(Aircon_Fault >= 1)
{
    int temp = 0//
    temp = Aircon_Fault;
    for(int ii = 0; ii < 8; ii++)
    {
        switch(ii)
        {
            case 0 : Aircon_Fault = temp & 128break;
            case 1 : Aircon_Fault = temp & 64break;
            case 2 : Aircon_Fault = temp & 32break;
            case 3 : Aircon_Fault = temp & 16break;
            case 4 : Aircon_Fault = temp & 8break;
            case 5 : Aircon_Fault = temp & 4break;
            case 6 : Aircon_Fault = temp & 2break;
            case 7 : Aircon_Fault = temp & 1break;
        }
        switch(Aircon_Fault)
        {
            case 128 : Aircon_Fault_msg = "Error#8" break;
            case 64 : Aircon_Fault_msg = "Error#7" break;
            case 32 : Aircon_Fault_msg = "Error#6" break;
            case 16 : Aircon_Fault_msg = "Error#5" break;
            case 8 : Aircon_Fault_msg = "Error#4" break;
            case 4 : Aircon_Fault_msg = "Error#3" break;
            case 2 : Aircon_Fault_msg = "Error#2" break;
            case 1 : Aircon_Fault_msg = "Error#1" break;
        }
        Sum_Aricon_Fault_msg = Sum_Aricon_Fault_msg + Aricon_Fault_msg;
    }
    AirconLCD.Display(Sum_Aircon_Fault_msg ); //Aircon LCD에 Error를 표시해주는 함수
}
cs


해석

여기서 제일 중요한 것은 & 연산자 입니다.

&연산자를 통해 해당 비트만 읽어와서 Aircon_Fault_msg에 알맞은 문자열을 넣어주는 것입니다.

예를들어 Aircon_Fault의 값이 10이면 2진수로 0000 1010 입니다.

첫번째 Switch 문을 통해 0000 1010 & 0000 1000 을 하면

0000 1000만 남습니다. 이때 두번 째 Switch문에서 Aircon_Fault_msg = Error#4;


그다음에

temp에 저장한 최초의 Aircon_Fault의 값 0000 1010에서

다시 0000 1010 & 0000 0100 을 합니다.

그리고 두번째 switch문에서 다시 작업합니다.


이러한 과정을 for문이 끝날 때 까지 반복합니다.



궁금하신점 + 오류 있으면 댓글 달아주세요!





728x90
반응형