본문 바로가기
프로그래밍

[C#]네트워크 프로토콜 비트 연산

by minimax95 2020. 12. 24.

이번 포스팅에서는 네트워크 프로토콜에서 경보나 Fault 정보를 비트 연산을 통해 비트 별 알람 정보로 담아 송수신하는 방법에 대해 정리해 보겠습니다.

 

아래 이미지는 ESS 안전정보시스템에서 배터리와 관련하여 Warning과 Fault 정보에 대한 프로토콜 정의 일부입니다.

Warning과 Fault의 데이터 Type은 INT형으로 비트연산을 통해 경보나 고장 발생 여부를 송수신하도록 요구하고 있습니다. 실제 LG Chem에서 제공하는 배터리 프로토콜에서 관련 정보를 찾아보면 아래와 같습니다.

실제 Warning과 Fault에 대한 부분은 uint16으로 각 비트별(b0~b15) 경보 및 고장 정보를 담을 수 있도록 제공해 주고 있습니다.

 

안전정보시스템에서 요구하는 Warning과 Fault 정보를 아래와 같이 정리해 보았습니다.

엑셀로 정리한 것 처럼 각 바이트 내 해당 Bit 필드에 필요한 Tag를 매칭 시키고 우측의 Bit필드의 순서를 숫자로 정리하였습니다. (비트 필드 숫자는 시프트연산 값으로 활용됩니다.)

이제 코드상에서 비트연산을 통해 경고 및 고장 정보를 담아 데이터로 변환하는 함수를 만들어보겠습니다.


        public int GetBMSWarningBit(int a, int b, int c, int d, int e, int f, int g, int h, int i)
        {
            if (a > 0) a = 1;
            if (b > 0) b = 1;
            if (c > 0) c = 1;
            if (d > 0) d = 1;
            if (e > 0) e = 1;
            if (f > 0) f = 1;
            if (g > 0) g = 1;
            if (h > 0) h = 1;
            if (i > 0) i = 1;

            int result = 0;
            try
            {
                int v1 = a << 31;
                int v2 = b << 30;
                int v3 = c << 29;
                int v4 = d << 28;
                int v5 = e << 27;
                int v6 = f << 26;
                int v7 = g << 24;
                int v8 = h << 23;
                int v9 = i << 19;
                result = v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 | v9;
            }
            catch { }

            return result;
        }

 


위 함수는 Warning 정보를 인자로 받아 Bit 연산을 통해 int값으로 반환하는 함수로

시프트 연산시 해당 비트 필드의 번호만큼 좌로 이동시킨 후 비트 OR연산을 통해 최종 값을 반환합니다.


        public int GetBMSFaultBit(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j)
        {
            if (a > 0) a = 1;
            if (b > 0) b = 1;
            if (c > 0) c = 1;
            if (d > 0) d = 1;
            if (e > 0) e = 1;
            if (f > 0) f = 1;
            if (g > 0) g = 1;
            if (h > 0) h = 1;
            if (i > 0) i = 1;
            if (j > 0) j = 1;

            int result = 0;
            try
            {
                int v1 = a << 31;
                int v2 = b << 28;
                int v3 = c << 27;
                int v4 = d << 26;
                int v5 = e << 24;
                int v6 = f << 23;
                int v7 = g << 16;
                int v8 = h << 15;
                int v9 = i << 11;
                int v10 = j << 10;
                result = v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 | v9 | v10;

            }
            catch { }

            return result;
        }


위 함수도 Warning 함수와 마찬가지로 Falut 정보를 인자로 받아 Bit 연산을 통해 int값으로 반환하는 함수로

시프트 연산시 해당 비트 필드의 번호만큼 좌로 이동시킨 후 비트 OR연산을 통해 최종 값을 반환합니다.

 

참고로 비트연산 관련하여 예를 들어 보겠습니다.

A = 0101 1100, B = 1100 1010 일 경우

| 연산시 A|B ☞ 1101 1110

<< 연산시 A << 3 ☞ 1110 0000

 

비트 연산과 관련하여 구글링 해보시면 표로 정리된 것을 찾아보실 수 있는데 개념을 이해하시면 크게 어렵지 않은 내용입니다.

 

이상으로 비트연산을 통해 알람 정보를 송수신하는 방법에 대해 알아보았습니다.

감사합니다.

 

댓글