• 검색 결과가 없습니다.

모드버스 프로토콜 구조

문서에서 저작자표시 (페이지 31-40)

모드버스 프로토콜은 제어국(master station)과 종속국(slave station)으로 이 루어져 있다. 제어국은 본 논문에서 언급하고 있는 중앙감시서버이며 종속국은 조 명제어 프로토콜 변환기로 대변된다. 제어국에서 종속국으로 데이터의 요청을 보내 면 종속국은 패킷을 분석하여 해당 패킷에 대한 응답을 회신하게 된다. 패킷은 때 로 1개 혹은 그 이상의 복수 포인트에 대한 제어 명령과 포인트의 상태 감시 명령 을 보낼 수도 있으며, 에러코드를 감지할 수 있는 기능도 포함된다. 제어국과 종속 국간의 데이터 송수신 체계는 그림 2-12와 같다[22-23].

그림 2-12 모드버스 프로토콜 주종 통신 체계

그림 2-12와 같이 송수신 메시지에는 디바이스의 주소, 펑션코드(function

code), 데이터, 에러체크로 구성되어 있으며 해당 데이터의 크기는 펑션코드에 의 해 가변적으로 변할 수 있다.

가. 디바이스 어드레스

디바이스 어드레스는 종속국이 가지고 있는 고유의 시리얼 번호이며, 여러 개의 종속국이 멀티드롭 형태로 네트워크를 구성하고 있으면, 중복된 어드레스가 존재할 수 없다. 즉 제어국에서 특정 디바이스를 제어할 때 해당 디바이스의 어드레스를 송신프레임에 포함시켜 해당 디바이스만 응답할 수 있는 체계를 가지고 있는 것이 다. 만일 두 개 이상의 어드레스가 중복이 되면, 네트워크 통신에 에러를 발생할 수 있으며, 두 개 이상의 종속국이 동시에 응답할 수 있으므로 프로토콜 스택을 구 현할 때 주의해야 한다. 그림 2-13은 여러 개의 종속국이 멀티드롭으로 연결되었 을 때의 구조를 보여준다.

그림 2-13 멀티드롭으로 연결된 디바이스

나. 펑션 코드

펑션코드는 종류가 많이 있지만, 본 연구에서 사용된 코드만 기술하도록 하겠다.

펑션코드는 모드버스 프로토콜의 데이터 형태에 따라 달라지는데, 그 내용은 크게 읽고자 하는 데이터가 1개 혹은 그 이상인 경우와 쓰고자 하는 데이터가 1개 혹은 그 이상인 경우로 나뉜다. 펑션코드는 크게 6개로 구분되며 그 내용은 다음과 같 다[22-23].

(1) Read coils(0x01)

Coil의 데이터를 읽고자 하는 경우에 사용되며, 1개 혹은 그 이상의 Coil 값을 읽어 낼 때 사용된다. 비트가 1이면 true인 상태이고, 0 이면 false인 상태이다.

제어국과 종속국간의 데이터 교환의 프레임 예는 표 2-5와 같다.

표 2-5 Read coil 프레임 요구 패킷

Function code 1 Byte 0×01

Starting address 2 Bytes 0×0000 to 0×FFFF Quantity of coils 2 Bytes 1 to 2000 (0×7D0)

표 2-6 Read coil 프레임 응답 패킷

Function code 1 Byte 0×01

Byte count 1 Byte N*

Coil status n Byte n= N or N+1 ※ N = 출력의 개수 / 8, 만일 N이 8로 나누어떨어지지 않으면, N에 1을 더함

한편, 표 2-7은 Read coil을 사용한 송수신 프레임의 예를 보여준다. 표 2-7 에서 보여주는 프레임은 디바이스의 주소와 에러패킷을 제외한 내용이다.

표 2-7 Read coil 송수신 프레임 예

Request Response

Field name (Hex) Field name (Hex)

Function 01 Function 01

Starting address Hi 00 Byte count 03 Starting address Lo 13 Output status 27-20 CD Quantity of outputs Hi 00 Output status 35-28 6B Quantity of outputs Lo 13 Output status 38-36 05

(2) Read discrete inputs(0x02)

Discrete input 데이터를 읽고자 하는 경우에 사용된다. 비트가 1이면 true인 상태이며, 0이면 false인 상태이다.

표 2-8 Read discrete inputs 프레임 요구 패킷

Function code 1 Byte 0×02

Starting address 2 Bytes 0×0000 to 0×FFFF Quantity of inputs 2 Bytes 1 to 2000 (0×7D0)

표 2-9 Read discrete inputs 프레임 응답 패킷

Function code 1 Byte 0×02

Byte count 1 Byte N*

Input status N* × 1 Byte

※ N = 출력의 개수 / 8, 만일 N이 8로 나누어떨어지지 않으면, N에 1을 더함

한편, 표 2-10은 Read discrete input을 사용한 송수신 프레임의 예를 보여준 다.

표 2-10 Read discrete input 송수신 프레임 예

Request Response

Field name (Hex) Field name (Hex)

Function 02 Function 02

Starting address Hi 00 Byte count 03

Starting address Lo C4 Output status 204-197 AC Quantity of outputs Hi 00 Output status 212-205 DB Quantity of outputs Lo 16 Output status 218-213 35

(3) Read holding registers(0x03)

Holding register의 값을 읽어오고자 할 때 사용한다. 총 2바이트로 구성되어 있으며, 시작주소는 0이며 정수형 값을 지원한다.

표 2-11 Read holding register 프레임 요구 패킷

Function code 1 Byte 0×03

Starting address 2 Bytes 0×0000 to 0×FFFF Quantity of inputs 2 Bytes 1 to 125 (0×7D)

표 2-12 Read holding register 프레임 응답 패킷

Function code 1 Byte 0×02

Byte count 1 Byte 2× N*

Register value N* × 2 Bytes ※ N = 레지스터의 개수

표 2-13 Read holding register 송수신 프레임 예

Request Response

Field name (Hex) Field name (Hex)

Function 03 Function 03

Starting address Hi 00 Byte count 06

Starting address Lo 6B Register value Hi (108) 02 Quantity of outputs Hi 00 Register value Lo (108) 2B Quantity of outputs Lo 16 Register value Hi (109) 00 Register value Lo (109) 00 Register value Hi (110) 00 Register value L0 (110) 64

(4) Read input registers(0x04)

Input register의 값을 읽어오고자 할 때 사용한다. 총 2바이트로 구성되어 있 으며, 시작주소는 0이며 정수형 값을 지원한다.

표 2-14 Read input register 프레임 요구 패킷

Function code 1 Byte 0×04

Starting address 2 Bytes 0×0000 to 0×FFFF Quantity of input registers 2 Bytes 0×0001 to 0×007D

표 2-15 Read input register 프레임 응답 패킷

Function code 1 Byte 0×04

Byte count 1 Byte 2 × N* Input registers N* × 2 Bytes

※ N = 레지스터의 개수

표 2-16 Read input register 송수신 프레임 예

Request Response

Field name (Hex) Field name (Hex)

Function 04 Function 04

Starting address Hi 00 Byte count 02

Starting address Lo 08 Input reg. 9 Hi 00 Quantity of input reg. Hi 00 Input reg. 9 Lo 0A Quantity of input reg. Lo 01

(5) Write single coil(0x05) Coil의 값을 읽어오고자 할 때 사용한다.

표 2-17 Write single coil 프레임 요구 패킷

Function code 1 Byte 0×05

Output address 2 Bytes 0×0000 to 0×FFFF Output value 2 Bytes 0×0000 or 0×FF00

표 2-18 Write single coil 프레임 응답 패킷

Function code 1 Byte 0×05

Output address 2 Bytes 0×0000 to 0×FFFF Output value 2 Bytes 0×0000 or 0×FF00

표 2-19 Write single coil 송수신 프레임 예

Request Response

Field name (Hex) Field name (Hex)

Function 05 Function 05

Output address Hi 00 Output address Hi 00 Output address Lo AC Output address Lo AC Output value Hi FF Output value Hi FF Output value Lo 00 Output value Lo 00

(6) Write single register(0x06)

Register의 값을 읽어오고자 할 때 사용한다. 총 2바이트로 구성되어 있으며, 시작주소는 0이며 정수형 값을 지원한다.

표 2-20 Write single register 프레임 요구 패킷

Function code 1 Byte 0×06

Register address 2 Bytes 0×0000 to 0×FFFF Register value 2 Bytes 0×0000 or 0×FFFF

표 2-21 Write single register 프레임 응답 패킷

Function code 1 Byte 0×06

Register address 2 Bytes 0×0000 to 0×FFFF Register value 2 Bytes 0×0000 or 0×FFFF

표 2-22 Write single register 송수신 프레임 예

Request Response

Field name (Hex) Field name (Hex)

Function 06 Function 06

Register address Hi 00 Register address Hi 00 Register address Lo 01 Register address Lo 01 Register value Hi 00 Register value Hi 00 Register value Lo 03 Register value Lo 03

다. CRC 에러 검출 코드

CRC (Cyclic Redundancy Check)는 2바이트로 구성되어 있다. CRC는 전송하 는 장비에 의해 생성이 되며, 보내려고 하는 송신 패킷에 포함하여 전송한다. 이 때 수신 장비는 수신패킷을 모두 CRC 계산법에 의해 계산을 하고, 마지막에 송신 한 CRC 값이 수신된 값과 일치하는지를 파악한 후 처리를 하게 된다. CRC를 처 리하는 과정은 다음과 같다[22-23].

① 16비트의 0xffff 값을 CRC변수에 저장한다.

② 처음 1바이트의 데이터와 16비트의 CRC변수의 하위 바이트를 Exclusive OR 를 한 후에 그 결과를 다시 CRC 변수에 저장한다.

③ CRC변수를 우측으로 1만큼 쉬프트시킨 후 상위 비트는 0으로 채운다.

④ 하위 8비트가 0이면 ③의 과정을 반복하고 1이면 0xA001값과 Exclusive OR를 한다.

⑤ ③과 ④의 과정을 8비트 모두 쉬프트 될 때가지 수행하고 이 과정이 끝나면, 8비트의 데이터를 추출한다.

⑥ 모든 바이트가 추출될 때 까지 ②의 과정을 반복한다.

⑦ 마지막으로 생성된 16비트의 데이터가 CRC 값이다.

⑧ 전송할 때는 상위 8비트와 하위 8비트의 순서를 바꾸어서 전송하도록 한다.

한편, CRC 계산하는 식을 C언어로 표현하면 다음과 같다.

unsigned short CRC16(puchMsg, usDataLen)

unsigned char *puchMsg ; /* message to calculate CRC upon */

unsigned short usDataLen ; /* quantity of bytes in message */

{

unsigned char uchCRCHi = 0xFF ; /* high byte of CRC initialized

*/

unsigned char uchCRCLo = 0xFF ; /* low byte of CRC initialized */

unsigned uIndex ; /* will index into CRC lookup table */

while (usDataLen–– /* pass through message buffer */

{

uIndex = uchCRCHi ^ *puchMsgg++ ; /* calculate the CRC

*/

uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ; uchCRCLo = auchCRCLo[uIndex] ;

}

return (uchCRCHi << 8 | uchCRCLo) ; }

제 3장 내셔널 t o모드버스 프로토콜 변환기 설계

제 1 절 프로토콜 변환기 개요

내셔널사의 조명제어 컨트롤 장치는 현재 국내에 약 2~30%의 점유율을 가지고 일반 마트, 백화점, 아파트 등에 사용되는 조명제어용 컨트롤러 장치이다. 별도의 HMI를 보유하고 있으며, HMI와 통신을 수행할 수 있는 SNU (System Network Unit)와 SIU (System Interface Unit), SCU (System Control Unit), Relay 그 리고 CTU (Control Terminal Unit)으로 구성되어 있다.

그림 3-1은 이러한 조명제어 컨트롤러 유닛들이 IBS용 HMI와 어떻게 연결되어 있는지 그 구조를 나타낸다.

그림 3-1 조명제어 컨트롤러 구성[21]

본 연구에서는 그림 3-1에서 SNU와 통신을 수행하는 프로토콜 변환기를 제작 하고, 이를 IBS HMI와 모드버스 프로토콜을 사용하여 연결될 수 있도록 제작하는 것이 목적이다. 본 연구를 통해 개발된 프로토콜 변환기의 사용범위는 그림 3-2와 같다.

그림 3-2 프로토콜 변환기 사용 예

내셔널사 컨트롤러에서 사용하는 자체 프로토콜을 프로토콜 변환기를 이용하여 변환하고, 이를 빌딩중앙감시용 서버와 연결하여 별도의 장치 및 드라이버 없이 호 환이 될 수 있도록 하는 것이 본 연구의 핵심이다.

제 2 절 프로토콜 변환기 설계

문서에서 저작자표시 (페이지 31-40)

관련 문서