1. INTRODUCTION
1.1 Description
마이크로프로세서는 주변장치를 통해서 외부와 정보를 교환할 수 있으며 일반적으로 정보를 외부와 교환하는 방법으로는 병렬통신과 직렬통신 두 가지로 나눌 수 있다.
Parallel Communication CPU, DSP 등을 이용한 하드웨어 보드는 고속 정보교환을 위하여 한꺼번에 많은 정보를 처리할 수 있는 병렬통신 방식-현재는 주변 소자와의 통신을 위하여 고속 직렬 통신방식을 이용하기도 함-을 주로 이용한다. 이것은 대량의 정보를 빠른 시간에 한꺼번에 처리함으로써 하드웨어 보드나, 컴퓨터등의 속도와 성능을 향상 시킬 수가 있다, 이 방법의 대표적인 예로서 PC CPU의 데이터 비트수의 확장을 들 수 있다. 80286은 16비트의 외부 데이터 비트, 80386, 80486은 32비트의 외부 데이터 비트, 비록 내부에서는 32비트로 동작되지만 64비트의 외부 데이터 비트를 갖는 펜티엄 계열을 보아도 알 수 있다.) 그외 HDD, FDD, VIDEO 카드등이 대표적인 병렬통신 방식을 사용하는 장치이다.
Serial Communication 직렬통신 방식이란 데이터비트를 1개의 비트단위로 외부로 송수신하는 방식으로 구현하기 쉽고, 기존의 통신선로(전화선등)를 쉽게 활용할 수가 있어 비용의 절감이 크다는 장점이 있다. 직렬통신의 대표적인 것으로 모뎀, LAN, RS232 및 X.25등이 있다. 하지만 크게 직렬통신을 구분하면 비동기식 방식과 동기식 방식 두 가지로 나누어진다. 많은 사람들이 비동기식 통신방식을 RS232로 알고있는데 실질적으로 RS232라는 것은 비동기식 통신 콘트롤러에서 나오는 디지털신호를 외부와 인터페이스 시키는 전기적인 신호 방식의 하나일 뿐이지만 가장 일반적으로 사용되고 있는 방식이기 때문에 보통RS232를 비동기식 통신방식으로 인식되고 있다.
Asynchronous Communication 비동기식 통신방식을 지원하는 대표적인 콘트롤러는 NS사의 16C450과 16C550이며 그외 호환되는 콘트롤러가 다수의 회사에서 생산되고 있다. 아울러 기존에 NS와 비교해서 호환은 되지 않지만 성능상에는 차이가 없는 수십가지의 비동기 통신 콘트롤러가 시장에 나와있다. 비동기식 통신콘트롤러를 일반적으로 UART(Universal Asynchronous Receiver/ TransmItter)라 부른다. UART에서 나오는 신호는 보통 TTL신호레벨을 갖기 때문에 노이즈에 약하고 통신거리에 제약이 있어 각종 드라이버를 통하여 신호의 전기적인 규격을 변환하여 보내주게 되는데 일반적으로 RS232/485/422등이 있다. 주로 많이 이용하는 비동기 인터페이스 방식의 간단한 특성을 요약하면 아래 표와 같다.

표 1 RS 232C/422/485 Communication Comparison
*Half duplex(반이중) 통신: 1개의 신호선으로 양 방향 통신 동작을 하므로 동시에 보내고 받을 수는 없고, 번갈아 가면서 통신 동작을 한다. *Full duplex(전이중) 통신: 보내는 신호와 받는 신호가 별도로 분리되어 있어 동시에 데이터를 주고 받을 수 있다.
RS-232은 통신방식은 외부의 노이즈 환경에 대하여 아주 민감한 특성을 가지므로 RS422과 RS485에 비해서 통신속도가 늦고 통신거리가 짧은 단점이 있고 또한 일대일 통신만 할 수 있다.
2. SERIAL COMMUNICATION
2.1 Description
Baud Rate 보드(Baud)라고 말하는 단위는 19세기 후반에 5단위 부호를 고안한 프랑스 전신 공사의 Jean Maurice Baudot씨의 이름에서 유래한다.보드(Baud)는 원래 변조율이나 1초간 통신선의 신호 변경 회수를 가리키는 단어로서 사용되고 있었다.이것은 BPS(bit per second)와 항상 똑같은 것은 아니다. 2개의 시리얼 디바이스를 접속한 경우에는 보드(Baud)와 BPS는 사실상 똑같다. 만약 통신 속도를 19,200BPS로 통신하고 있다면, 1초간에 19,200회 선을 통과한 신호가 변화한다고 말할 수 있다.보드레이트(Baud Rate)는 종래의 통신 회선으로는 최대 2400보오(Baud)까지로 제한되고 있다.이것은 전화회사에 의하여 공급되는 전화선의 물리적인 한계치이지만 최근에는 종래의 통신회선이라도 9,600BPS혹은 그 이상의 데이터 전송이 가능해지고 압축 기술등의 발달에 의하여 보다 고속의 데이터 통신이 가능해지고 있다.일반적으로 PC에서는 보드(Baud) 와 BPS는 같다. 그러나 각 신호에 복수의 2진 데이터를 중첩시키는 장치를 사용하는 고속 데이터 전송 분야에서는 BPS가 보드(Baud) 속도보다 빠르다.
Bit Data Transmission 시리얼통신에서는 1 바이트를 8개의 비트로 분리해서 한번에 1비트(Bit)씩 통신선로로 전송한다. 수신측에서는 통신선로를 통해 수신한 비트들을 조립해서 1바이트(Byte)를 만들어내야 하는데 이때 1바이트의 범위를 식별하기 위하여 사용하는 것이 스타트 비트와 스톱 비트이다. 일단 스타트 비트를 송신하면 송신측(계측 장치)에서는 계속해서 데이터비트를 송신한다.데이터 비트는 설정한 값에 따라 보통 5,6,7,8가 설정될 수 있다. 수신측(PC측) 과 송신측(계측 장치)은 이러한 데이터 비트수와 보드레이트의 값을 일치하게 설정해야 한다. 거의 대부분의 장비는 7 또는 8-RTM-100은 8 비트의 데이터비트를 쓴다- 데이터 비트를 사용해서 데이터 전송을 한다. 7 데이터 비트라고 설정되어 있는 경우에는 127보다 큰 ASCII값을 보낼 수 없다. 똑같이 5 데이터 비트의 경우는 31이상의 ASCII 값을 취급할 수 없다.데이터를 송출하면 마지막으로 스톱 비트를 보낸다.스톱 비트의 값은 1의 값 또는 기호이다.기호라면 이전 데이터 비트의 값이 1이라도 확실하게 스톱 비트로서 잡는 것이 가능하다.스톱비트의 데이터 길이는 1,1.5,2비트 중에 하나로 설정할 수 있다.
Parity Bit 스타트 비트와 스톱 비트에 의하여 데이터의 단락을 나타내지만,패리티 비트라고 불리는 것을 이용하여 데이터의 구조를 확인하는 경우가 있다.송신 중에 데이터에 어떠한 누락이나 에러가 생기고 있지 않을까 해서 그것을 체크하는 것이 패리티 비트이다.패리티에는 짝수 패리티(Even parity),홀수 패리티(Odd parity),혹은 패리티 없음(None at all)을 선택할 수 있다. 짝수 또는 홀수 패리티를 이용하면 각 데이터 바이트 중의 1의 개수를 헤아리고 보내진 그 수가 짝수 또는 홀수가 되도록 패리티 비트를 송신한다. 예를 들어 짝수 패리티를 선택했다면 데이터 중에 1이 짝수개 있는 경우,패리티 비트는 0로 된다. 즉,바이너리 데이터 0110 0011에 대한 짝수 패리티는 0 이다.역으로 바이너리 데이터 1101 0110 의 경우,패리티 비트는1로 된다.홀수 패리티는 이 반대로 생각한다.데이터 중에 기수개의 1 이 있는 경우,그것은 0 이 된다.패리티 비트에 의한 에러 체크는 기본적인 방법이다.에러가 발생한 때에 에러의 존재를 알리는 것은 가능하지만 그것이 어느 데이터 중에 있는가 그 소재를 알리는 기능은 있지 않다.또,짝수개의 에러가 데이터 중에서 발생한 경우 패리티 비트로 에러를 검출하는 것이 불가능하다.
Cable Length RS232C 규격으로는 케이블의 길이는 약150cm로 되어 있다.그러나 실제 고품질로 실드(shielded)된 케이블을 사용한다면 최장 3km정도까지 향상시키는 것이 가능하다.실드가 불충분한 케이블의 경우,외부 환경이 크게 영향을 준다.전기적인 노이즈가 발생하기 쉬운 환경에서는 짧은 케이블을 이용해도 노이즈에 영향을 받는다.

표 2 Baud Comparison(RS232C)
2.2 RS232C RS232C는 EIA(Electronic Industries Association)에 의해 규정되어 졌으며 그 내용은 데이터단말기(DTE: Data Terminal Equipment)와 데이터통신기(DCE: Data Communication Equipment)사이의 인터페이스에 대한 전기적인 인수, 컨트롤 핸드쉐이킹, 전송속도, 신호 대기시간, 임피던스 인수등을 정의하였으나 전송되는 데이터의 포맷과 내용은 지정하지 않으며 DTE간의 인터페이스에 대한 내용도 포함하지 않는다. 같은 규격이 CCITT(Consultative Committee for International Telegraph and Telephony) 에서도 CCITT V.24에서 DTE와 DCE간의 상호 접속회로의 정의, 핀번호와 회로의 의미에 대해서 규정을 하고 있다.
*DTE: 데이터 단말장치(Data Terminal Equipment)의 약어이고,
*DCE: 데이터 통신장치(Data Communications Equipment)의 약어이다.
*보통 PC는 DTE 장치이고 그 반면에 대부분의 다른 디바이스(예:시리얼 디바이스)는 보통 DCE 장치이다.
단순히 DTE 장치를 그냥 PC라 하고 DCE 장치를 원격장치(Remote Device)라고 바꾸어 읽어도 괜찮다. *RS232C스탠더드에서는 DTE장치는 25핀의 수컷 커넥터를 사용하고, DCE장치는 25핀의 암컷 커넥터를 사용한다. DTE장치를 DCE장치에 접속하는 경우에는 스트레이트 케이블을 이용한다.역으로 2개의 같은 종류의 장치를 접속하는 경우는 널모뎀(Null Modem) 케이블,즉 크로스 케이블(송신라인과 수신라인을 서로 꼬인 케이블)을 사용한다.
Signal Line
TXD- Transmit Data
비동기식 직렬통신 장치가 외부 장치로 정보를 보낼 때 직렬통신 데이터가 나오는 신호선
RXD- Receive Data
외부장치에서 들어오는 직렬통신 데이터를 입력받는 신호선
RTS- Ready To Send
컴퓨터와 같은 DTE장치가 모뎀 또는 프린터와 같은 DCE장치에게 데이터를 받을 준비가 됐음을 나타내는 신호선이다.
CTS- Clear To Send
모뎀 또는 프린터와 같은 DCE 장치가 컴퓨터와 같은 DTE 장치에게 데이터를 받을 준비가 됐음을 나타내는 신호선이다.
DTR- Data Terminal Ready
컴퓨터 또는 터미널이 모뎀에게 자신이 송수신 가능한 상태임을 알리는 신호선이며 일반적으로 컴퓨터등이 전원 인가후 통신 포트를 초기화한 후 이 신호를 출력한다.
DSR- Data Set Ready
모뎀이 컴퓨터 또는 터미널에게 자신이 송수신 가능한 상태임을 알려주는 신호선이며 일반적으로 모뎀에 전원 인가 후 모뎀이 자신의 상태를 파악한 후 이상이 없을 때 이 신호를 출력
DCD- Data Carrier Detect
모뎀이 상대편 모뎀과 전화선등을 통해서 접속이 완료되었을 때 상대편 모뎀이 캐리어신호를 보내오며 이 신호를 검출하였음을 컴퓨터 또는 터미널에 알려주는 신호선
RI- Ring Indicator
상대편 모뎀이 통신을 하기 위해서 먼저 전화를 걸어오면 전화 벨이 울리게 된다. 이때 이 신호를 모뎀이 인식하여 컴퓨터 또는 터미널에 알려주는 신호선이며 일반적으로 컴퓨터가 이 신호를 받게 되면 전화벨 신호에 응답하는 프로그램을 인터럽트등을 통해서 호출하게 된다.
Connector Specification

그림 1 DB-25 RS232 Connector

그림 2 DB-9 RS232 Connector
Connection Diagram

그림 3 DTE to DCE Connection

그림 4 DTE to DTE Connection
2.3 RS422
RS422는 EIA에 의해서 전기적인 사양이 규정되어 있으나 물리적인 컨넥터 및 핀에 대한 사양은 아직 규정되어 있지 않다. 아래 그림에 나오는 컨넥터는 한 예로서 나타낸 것이다. RS422에서는 Point To Point 모드와 Multi-Drop 모드 두 가지가 있다. Point To Point 모드인 경우 RS232와 신호선당 2개의 라인이 필요한 것만 빼고 사용하는 방법에 있어서 별다른 필요가 없다. 하지만 Multi-Drop 모드인 경우는 사용법이 좀 복잡하다. 컨넥터의 사양, RS422 신호선과 케이블 결선도 및 Multi-Drop에 대한 사양은 아래와 같다.
Connector Specification

그림 5 DB-25 RS422 Connector

그림 6 DB-9 RS422 Connector
Signal Line
신호선에 대한 설명은 RS232와 별차이가 없고 다만 물리적으로 하나의 신호선에 두 개의 라인이 필요한데 그들의 표현은 신호선 이름 뒤에 + 와 -로 구분표기 한다. 즉, 예를 들면 RS232의 TXD 신호선이 RS422에서는 TXD+와 TXD-로 나누어 질 뿐이다.
Connection Diagram

그림 7 Point to Point Mode
l GND 는 연결하지 않아도 된다.

그림 8 Multi-Drop Mode
RS422 Multi-Drop Mode
Multi-Drop모드가 사용되는 시스템은 하나의 마스터에 여러개의 슬레 이브가 연결되어 마스터가 어떤 슬레이브와 통신을 할 것인지를 결정하고 해당 슬레이브를 호출하면 호출된 슬레이브가 응답을 하는 체제로 구성되어진다. (앞 쪽의 Multi-Drop 모드 결선도 참조) 하나의 마스터에 드라이버가 지원한다면 최대 256개까지 연결될 수 있지만 32개를 넘지않는 것이 좋은데 물론 Repeater를 연결한다면 확장할 수 있다. 마스터는 Point To Point모드로 설정되어 있어도 상관없으나 슬레이브는 반드시 Multi-Drop 모드로 설정 되어져 있어야 한다.
2.4 RS485
RS485도 EIA에 의해서 전기적인 사양이 규정되어 있으나 물리적인 컨넥터 및 핀에 대한 사양은 아직 규정되어 있지 않고 아래의 컨넥터 핀 지정은 임의의 예를 보인 것 이다. RS485인 경우 RS232나 RS422처럼 Full Duplex가 아닌 Half Duplex 전송방식만 지원하기 때문에 RS422의 Multi-Drop 모드의 슬레이브처럼 RS485의 모든 마스터는 TXD신호를 멀티포인트 버스(RS485의 모든 마스터가 공유하는 신호라인을 그렇게 부른다.)에 접속 또는 단락 시켜야만 할뿐만 아니라 RXD신호 역시 모드에 따라서는 접속, 단락(이하 Open)의 제어를 하여야 한다. RS485에서는 Echo 모드와 Non Echo 모드 두 가지가 있다.
Connector Specification

그림 9 DB-25 RS485 Connector

그림 10 DB-9 RS485 Connector
Signal Line
신호선에 대한 설명은 RS232와 별차이가 없고 다만 물리적으로 하나의 신호를 보내기 위해 두 개의 라인이 필요한데 그들의 표현은 신호선 명뒤에 + 와 -로 구분표기 한다. 하지만 UART의 TXD, RXD신호선이 멀티포인트 버스에 의하여 공동으로 사용하게 됨에 유의하여야 한다. 즉 하나의 마스터는 멀티포인트 버스를 출력이면 출력, 입력이면 입력으로 구분하여 공통으로 사용한다.
Connection Diagram

그림 11 Master to Master Mode
RS485 Echo or Non-Echo Mode
멀티포인트 버스를 사용하는 시스템은 하나의 버스에 여러개의 마스터가 연결되어 사용한다. 이 때문에 하나의 마스터가 다른 마스터와 통신을 할 경우에는 반드시 출력 개폐를 하여야만 한다. 이것의 원리는 RS422의 Multi-Drop 모드와 동일하다. 하지만 동시에 여러개의 마스터가 출력을 하여 데이터가 충돌하는 현상이 발생하기 때문에 이러한 문제는 S/W에 의하여 해결되어야 한다. 이렇게 충돌 여부를 확인하는 방법 중 하나가 자기가 보낸 정보를 자기가 받아보아 충돌여부를 확인하는 것인데 이것을 RS485 Echo 모드라 부른다. 즉, 어떤 마스터가 멀티포인트 버스에 예를 들어 "ABC"라는 데이터를 보내면 이것이 자동적으로 되돌아 오므로(Echo) 이것을 읽어와 "ABC"여부를 확인하여 동일한 정보가 아니거나 들어온 데이터의 수가 틀리면 충돌한 것으로 보고 적절한 시간의 지연을 거쳐 다시 출력시켜 정확한 값이 되돌아 올 때 까지 되풀이하면 된다. 이때 마스터의 RXD신호선은 항상 멀티포인트 버스에 접속되어 있어 자신의 데이터 뿐만 아니라 다른 어느 마스터가 보내는 데이터를 받을 수가 있다. 이러한 데이터를 자신에게 필요한 정보 인지를 판단 하는 것은 S/W에 의해서 결정된다. 위의 내용을 요약하면 RS485 Echo 모드는 마스터의 RXD신호선은 항상 멀티포인터 버스 에 접속되어 있고 TXD신호선은 데이터를 출력할 때만 멀티포인터 버스에 접속시키야 하고 나머지는 반드시 Open시켜야 한다. 만약 Open시키지 않으면 다른 마스터가 데이터를 보내도 충돌이 발생하여 올바른 송신이 될 수없다. 위의 RS485 Echo 모드에서 자기가 보낸 데이터가 자기자신에게 되돌아 오는 기능을 없앤 것이 RS485 Non Echo 모드이다. RS485 Non Echo 모드는 TXD신호선을 멀티포인트 버스에 접속시키면 그 즉시 RXD신호선 이 멀티포인트 버스에서 Open되고, TXD신호선을 멀티포인트 버스에서 Open시키면 그 즉시 RXD신호선이 멀티포인트 버스에 접속하게 된다. 일반적으로 RS485 개폐신호는 RTS나 DTR신호중 하나를 사용하며 대부분 RTS신호를 사용한다.
PC to RT−V100 Communication via RS485
PC에서 RTM-100과 연결하기 위해서는 우선 RS232/485 컨버터가 필요하다. 일단 PC의 RS232신호를 RS485로 변환하고 그 변화된 신호가 RS485 단자가 RTM-100의 485 단자를 통하여 연결된다. 즉 PC가 마스터가 되고 RTM-100이 슬레이브가 되는 Multi-Drop 모드이다. RS232/485 컨버터-RTS 자동 개폐 모드를 지원하는 종류 추천-는 일반 시중에 얼마든지 구할 수 있다.


NP100
그림 12 Master to Slave 485 Communication
RS-485 노이즈에 강해 원격 자동화에 많이 사용되는 RS-485 통신의 기본 원리와 회로도, 프로토콜 제작에 대해 알아본다. | RS-232는 그라운드와 데이터 신호의 전압 차이로 상대 기기에 전달된다. 그래서 통신 선로가 길수록 전압 저하로 노이즈에 약하고 고속이나 장거리에는 부적합 한 것이 단점이다. 반면 RS-422(EIA-422)는 고속 및 장거리 노이즈에 상대적으로 강한 통신 방법이다. 232가 불평형 통신 선에 의한 인터페이스라면 485는 평행형 통신 선이며, 쌍방 접속으로 최대 10Mbps로 수 Km까지 전송이 가능하다. 485는 표 1에 나타낸 것처럼 422와 전기적으로 다른 것 이외에는 유사하다.
 |
항목 |
RS-232 |
RS-423 |
RS-422 |
RS-485 |
모드 타입 |
불평형 |
불평형 |
평형 |
평형 |
최대수 |
Driver(송신) |
1 |
1 |
1 |
32 |
Receive(수신) |
1 |
10 |
10 |
32 |
최대 케이블 길이(m) |
15 |
1200 |
1200 |
1200 |
최대 Bps |
20K |
100K |
10M |
10M |
Transmit Level |
Max |
±15V |
±6V |
경우에 따라 다름 |
- |
Min |
±5V |
±3.6V |
±2V |
±1.5V |
수신감도 |
±3V |
±0.2V |
±0.2V |
±0.2V |
Load Impedance(Ω) |
3K∼7K |
450이하 |
100이하 |
60이하 |
Output Current Limit |
500mA∼(Vcc 또는 GND) |
150mA∼GND |
150mA∼GND |
150mA∼GND |
Driver ZOUT 최소값(Power Off) |
300Ω |
60kΩ |
60kΩ |
60kΩ |
그림 1은 RS-485 IC의 내부 구조 및 연결 방법을 나타낸 것이다. LTC485와 MAX465는 Pin-to-Pin으로써 전기적 차이는 약간 있으나 기능 핀 구성이 같다. 언급된 제품 이외에 상당수 더 있지만 필자는 LTC485를 통해 실험했다. 그림1의 왼쪽은 IC 핀 구성과 내부 구조를 나타내며, 오른쪽은 IC를 이용해서 원거리를 케이블로 연결했을 경우를 매뉴얼에서 언급한 대로 나타냈다. 선로 상의 A, B 사이에 있는 RI는 종단 저항을 나타내며, 선로 임피던스마다 다르지만 보통 50~150Ω을 병렬로 연결해서 사용한다. 수신 쪽에서 정보를 보냈을 경우 반대편에 부딪혀서 메아리처럼 되돌아오는 신호를 소멸시키기 위해서이다. 빨래 줄처럼 한 개의 신호 선에 여러 대의 장비가 서로 통신할 경우에는, 장비마다 종단 저항을 전부 연결하는 것이 아니고 보내는 장비와 가장 멀리 위치한 받는 장비 한 대씩 두대만 종단 저항을 연결한다. 그래서 485 통신 보드에는 보통 100Ω의 종단 저항에 점프 핀으로 선택적인 연결을 할 수 있도록 해서, 선로 상의 마지막에 해당하는 보드에 종단 저항 설치가 가능하게끔 구성한다. 통신 선로 상에 직렬로 되어 있는 R14~R17의 1Ω 저항값은 선로로 과 전압이 들어오면 내부 기기를 보호하기 위한 보호 저항이다(신뢰성 없음). 선로 상에 이상 전압이 예상되거나 전기적으로 서로 절연(Isolation)하기 위해서는 포토 커플러를 485 드라이브 IC와 TTL 로직 IC 사이에 놓고 설계하기도 한다(그림 2 참조).

|
그림 2. RS-485와 RS-232 통신 설계 |
SYN |
SYN |
SOH |
Header |
STX |
Text |
ETX |
BCC |
SYN : Synchronous Idle SOH : Start Of Heading STX : Start Of Text ETX : End Of Text BCC : Block Check Character
|
그림 3. 동기식 메시지 형식 |
2개 이상의 스테이션 사이에 정보를 전송하기 위한 순서 규약이 프로토콜이며, 이에 의해 통신이 제어된다. 통신 규약의 목적은 기기 사이의 연결을 시작하거나 끝내고 송?수신부를 지정하며, 오류 확인, 데이터 전송에 관련된 모든 제어 기능을 관리하는 데 있다. 232에서도 약간 언급했지만 데이터 전송에는 동기식과 비동기식이 있다. 동기식 방법에는 문자 지향적 프로토콜(Character-Oriented Protocol)과 비트 지향적 프로토콜(Bit-Oriented Protocol) 이 있다. 대부분의 통신 코드는 문자 지향적 방법의 변형을 이용하여 비동기식으로 통신하는 알고리즘이다. 데이터 전송을 담당하는 통신 제어 문자를 표 2에 나타냈는데, 이들 문자를 약속된 절차에 따라 서로 주고받으면서 통신하는것이다. 문자 지향적 형식은 헤더(Header) 영역과 텍스트(Text) 영역, 그리고 오류 검사(Error Check) 영역으로 나뉘며 이를 메시지(Message)라 한다. 그림 3은 동기식 문자 지향적 프로토콜의 전형적인 메시지 형식을 나타낸다. SYN은 상호 약속에 의해 송신부와 수신부의 동기를 돕는 것으로 0110100의 특수 문자를 사용하는데, HDLC(High-level Data Link Control)같은 비트 지향적 프로토콜에는 플래그 0111 1110을 사용한다. 필자가 구현한 통신 프로토콜은 시리얼 통신모드1을 사용한 비동기식이고, 메시지 형식은 문자 지향적인 방법을 이용했다. 특히 동기 맞추는 부분은 제외한 자작 프로토콜을 이용했다. 표 2는 서로 떨어져 있는 보드 사이를 통신하기 위해 미리 정의한(현재 통용되고 있음) 문자 기호를 나타내며 16진 Hex값이 이에 해당한다. 여기서부터는 이런 기호를 이용해서 장비와 장비간에 서로 통신하는 방법과 프로토콜을 정의하고자 한다. 궁극적인 목적은 넓은 범위에서 사각지대 없이 여러 대의 기기가 원활하게 서로 통신하며 정보를 주고받는 것이다. 데이터 수수를 위해 가장 먼저 해야 할 일은 신뢰성에 기반을 둔 통신이다. Mast, Slave의 개념을 쉽게 이해하기 위해서 이제부터는 대장/부하 개념으로 설명하겠다. 대장보드와 부하보드 상호간에는 비동기 통신, Polling, Selecting, Response 프로토콜을 사용한다. 통신 속도는 변경할 수 있지만, 기본적으로 19,200Bps에 고정되어 있다. 데이터 길이는 8비트, Stop 비트는 1, 패리티 비트는 없으며(8N1) 16진(Hex)과 ASCII 코드 또는 BCD 코드를 사용한다. 각 기기에는 고유의 UAD(Unit Address)가 Dip S/W에 의해 설정돼 있다. 그래서 사람 이름을 부르는 것과 같이 상대방의 UAD를 이용하여 통신하게 된다. 통신은 정해진 전문 형식에 의해 이루어진다. 통신할 데이터가 없더라도 일정한 시간이 되면 대장보드가 부하보드의 어드레스를 불러 주는데 이를 정기적 Polling라 한다(이하 POL). POL은 회선이 끊어졌는지 확인하며 기기가 정상적으로 동작하는지 체크하는 데도 이용된다. Selecting은(이하 SEL) 대장보드가 부하보드를 UAD로 불러 데이터를 송신할 때 이용되며, Response(이하 RSP)는 POL에서 해당 UAD가 응답할 내용을 대장보드에게 보낼 때 사용된다. |
기호 |
Hex |
의미 |
기능 |
STX |
02 |
Start Of Text |
블록의 시작 |
ETX |
03 |
End Of Text |
블록의 끝 |
EOT |
04 |
End Of Transmission |
전송의 끝 |
INQ |
05 |
Inquiry |
명령 실행응답 문의 |
ACK |
06 |
Acknowledge |
인식했음을 알림 |
DLE |
10 |
Data Link Escape |
전송 제어용 확장 코드 |
NACK |
15 |
Negative Acknowledge |
잘못 인식했음을 알림 |
ETB |
17 |
End Of Transmission Black |
전송 블록의 끝 |
POL |
70 |
Polling |
대장보드가 보냄 |
SEL |
73 |
Selecting |
부하보드 지정 정보 전달 |
UAD |
0~F |
Unit Address |
기기 번호 |
BCC |
0~FF |
Exclusive OR Sum |
블록 검사 |

HDLC |
|
HDLC(High-level Data Link Control)는 정보 전송을 위해 국제 표준위원회 ISO에서 개발한 비트 중심의 데이터 통신 프로 토콜이다. HDLC는 OSI 모형을 사용하는 컴퓨터와 컴퓨터 사이 의 데이터 통신에서 데이터 링크 계층에 대한 비트 단위의 동기 전송 방식을 정의하고 있다. 즉 데이터 프레이밍, 흐름 제어, 에 러 검출 정정 용도로 쓰이는 비트 기반 데이터 링크 계층의 동기 식 프로토콜인 것이다. HDLC에서의 순서와 정보는 Flag(8bit), |
Address(8bit), 제어(8bit), 데이터 정보(임의), 프레임 오류 점 검용(16bit), Flag(8bit)과 같은 프레임 형식으로 데이터가 저장 된다. HDLC는 IBM의 SDLC를 기반으로 개발됐고 ISO에 의해 표준화되었다. 표준 프로토콜 서브셋으로 구현된 HDLC의 예를 보면, 이더넷에 사용되는 802.2와 X.25에 사용되는 LAP 등이 대표적이다. |
출처 : 네이버 |
|
통신 전문 형식의 예를 도식화하면 그림 4와 같다. 주기적으로 POL이 행해져서 부하보드가 송출할 정보가 없고 그냥 대답만 할 경우에는 CK(Acknowledge)만 보낸다. 보낼 전문이 있으면 RSP로 구성된 데이터 블록을 대장보드에게 보내면 된다. 한편 대장보드가 부하보드에게 정보를 보내고자 할 경우에는 부하보드의 UAD를 SEL 전문에 넣고 정보를 보낸다. 사실 POL과 SEL은 1:n의 일대 다 통신일 경우 대장보드를 포함해 RS-485 선로에 있는 부하보드 전부가 정보를 받고 해석한다. 그 후 자신의 UAD를 받았다면 해당 기기는 내부적으로 명령을 처리하고 응답한다. 응답 정보를 보낼 경우에는 RSP를 보내거나, 아니면 ACK 또는 NAK(Negative Acknowledge)를 보내면 된다. 홈 가드 보드의 통신에서 잘 받았거나 긍정 응답일 경우는 ACK, 정상적으로 통신이 수행되지 않았거나 부정 응답은 NAK를 보내어 확실한 통신이 이루어지도록 한다. 쉽게 말하자면 여러 사람들이 모여 서로 대화하는 것과 유사하다. 세 사람이 대화할 경우를 생각해보자. 서로 동시에 말하지 않기 위해 한 사람이 누군가와 대화하고 있다면 나머지 한 사람은 잠시 기다려 준다. 즉 자신의 이름이 아니면 응답하지 않고 불려진 상대의 대화가 끝날 때까지 기다리는 것이다. 하지만 기다리는 사람이 심심하지 않도록 가끔 이름을 불러 주는 에티켓을 발휘할 수 있다. 이러한 쌍방 간의 약속이 바로 프로토콜인 셈이다. 이는 기존 통신 시스템에서 사용하는 방법을 모방하여 만든 것이다. 좀더 높은 신뢰성과 암호화 기법이 필요한 독자는 스스로 개발하던지 또는 국제적으로 공인된 방법을 사용하기 바란다. 그림 4를 통해 다시 한 번 프로토콜을 설명해보겠다. 통신할 때는 3가지 모드가 있는데 POL, SEL, RSP가 그것이다. POL은 다시 정기적인 POL과 필요에 의해 사용하는 비정기적인 POL로 나눈다. 대장보드에서 부하보드에게 통신이 정상적으로 되는지, 선로에는 이상이 없는지, 그리고 부하보드가 응답할 것이 있는지 등을 POL한다. POL을 받은 부하보드는 보낼 정보가 있으면 RSP로 응답하고, 정보가 없다면 ACK를 보내 통신이 정상적으로 행해지고 있음을 대장보드에게 통보한다.

|
RS-485 통신의 Echo, Non Echo 모드 |
|
멀티 포인트 버스를 사용하는 시스템은 하나의 버스에 여러 개의 마스터가 연결되어 있다. 이 때문에 하나의 마스터가 다른 마스터와 통신할 경우 반드시 출력 개폐를 해야 한다. 이것은 RS-422의 멀티 드롭 모드와 동일한 개념이다. 하지만 동시에 여러 개의 마스터가 출력하여 데이터가 충돌하는 현상이 발생하 므로 이러한 문제는 S/W에 의해 해결되어야 한다. 그러한 방법 중 하나가 자기가 보낸 정보를 자기가 받아보면 서 충돌 여부를 확인하는 것인데 이를 RS-485 Echo 모드라 부 른다. 예를 들자면 어떤 마스터가 멀티 포인트 버스에‘ABC’라 는 데이터를 보내면 이 데이터가 자동적으로 되돌아온다 (Echo). 이를 읽어와서‘ABC’여부를 확인한 후 동일한 정보가 아니거나 들어온 데이터 수가 틀리면 충돌한 것으로 보고 적절 한 시간 지연을 거친다. 그리고 다시 출력시켜 정확한 값이 되돌 아 올 때까지 되풀이하면 된다. 이 때 마스터의 RxD 신호선은 항상 멀티 포인트 버스에 접속돼 있어 자신의 데이터뿐만 아니 |
라 다른 마스터가 보내는 데이터도 받을 수 있다. 이러한 데이터 가 자신에게 필요한 정보인지 판단하는 것은 S/W에 의해 결정 된다. 즉 RS-485 Echo 모드에서 마스터의 RxD 신호선은 항상 멀티 포인트 버스에 접속돼 있어야 하는 반면, TxD 신호선은 데 이터를 출력할 때만 접속시켜야 하고 나머지는 반드시 단락시켜 야 한다. 만약 단락시키지 않으면 RS-422의 멀티 드롭 모드와 같이, 다른 마스터가 데이터를 보내도 충돌이 발생하여 올바른 송?수신이 되지 않는다. RS-485 Non Echo 모드는 RS-485 Echo 모드에서 자기가 보낸 데이터가 자기 자신에게 되돌아오는 기능을 없앤 것이다. 이는 TxD 신호선을 멀티 포인트 버스에 접속시키면 그 즉시 RxD 신호선이 멀티 포인트 버스에서 단락된다. 또 TxD 신호선 을 멀티 포인트 버스에서 단락시키면 바로 RxD 신호선이 멀티 포인트 버스에 접속하게 된다. |
출처 : 시스템베이스 |
|
한편 대장보드가 특정 부하보드에게 직접 정보를 전달하는 SEL이 있다. SEL을 받고 부하보드가 정상적으로 명령을 처리하면 ACK를 보내고 송수신 에러가 발생하면 NACK를 보낸다. ACK는 보통 정보를 잘 받았을 경우에 사용하고 NACK는 SUM 체크나 수신 오류를 범했을 경우 사용한다. 도식화된 그림 5를 보면 3개 모드 중에서 맨 왼쪽은 정기적인 POL이다. PC에 연결되어 있는 대장보드가 부하보드에게 정기적으로 주소와 함께 정보를 보낸다. 이 때 RS-485 통신선에 연결된 기기들은 일단 분석한 후 자신의 어드레스와 받는 UAD가 동일한지 판단한다. 동일하다면 보낼 데이터 없이 대답만 할 경우 ACK를 보내고, 그림 5의 두 번째 상황처럼 응답 데이터가 있을 때는 RSP를 보내 통신한다. 전문 형식을 정상적으로 받으면 ACK를 보낸다. 반면 한번 더 송신을 요청하거나 취소할 때 또는 잘못 받았을 경우에는 NACK를 보내어 재 송신이 이루어질 수 있도록 한다. 그리고 도식화되어 있지는 않지만 정기적인 POL이나 정보를 보냈는데 일정 시간 동안 ACK 또는 NACK 응답이 없으면, 몇 번 더 재 송신한 후에 회선이 단선된 것으로 판단한다. 통신 프로토콜을 제작하는 것은 생각보다 상당히 복잡하고 여러 가지 실험을 통해 검증되어야 한다. 그러므로 LoopBack Test 프로그램에 대해 알아보면서 프로토콜을 이해하도록 하자. Loop Back Test는 통신 동작을 확인하기 위해 간단하게 이용하는 방법으로, 송신한 것을 자신이 수신하여 정확히 동작하고 있는지 파악할 때 사용한다. Loop Back Test Tool은 그림 6과 같이 제작한다. 그림 6에서 M은 Male(수컷), F는 Female(암컷)이고 10Ω은 의미 없는 보호 저항이다. 여기서 RX_H와 TX_H를 극성에 맞지 않게 잘못 연결하면 485 드라이버 칩이 내부적으로 파괴된다는 점을 기억하자. Loop Back Test Tool의 R1과 R2에 오실로스코프 프로브와 GND 단자를 놓고 파형을 측정하면 그림 7의 하드카피 RS-485 파형을 얻을 수 있다. 이 때 DB 9핀 소켓의 1번에 스코프의 측정 단자 프로브를, 6번에는 스코프의 그라운드를 연결해야 한다. 처음 통신이 없을 때는 Stop을 유지하고 있다가 통신이 시작되면 Start(Low), 그리고 대문자‘Z’의 ASCII Code인 0x5A(0101 1010) LSB부터 전송되어 MSB를 마친 후 Stop(High) 비트, 그리고 다시 한 번 Stop(문헌에서는 State라 한다) 비트를 유지한다. 프로그램에서 통신모드1, 데이터 8비트, 패리티 없고 Stop 비트 1(8N1)로 설정해 놓았기 때문이다. 통신속도는 한 비트의 시간이 52㎲이기 때문에 역수를 취하면 19230.76≒19200Bps로 데이터가 송신된다는 것을 알 수 있다. 그리고 보면 기계는 정말 거짓말을 하지 않는다. 이 때문에 필자는 엔지니어로서, 인간의 명령에 따라 충실히 동작하는 기계를 올바르게 사용해야겠다는 의무감을 느끼기도 한다. Source는 RS-485 통신의 기본 구조와 Loop Back Test 프로그램으로, 숫자‘2’를 누르면 영어 대문자‘Z’를 TXH 및 TXL로 485 통신 선로에 보내고 RXH 및 RXL로 다시 받는 내용이다. 통신 결과는 RS-232를 통해 하이퍼터미널에 프린트했다. 그러나 보통의 MPU는 UART 포트가 하나밖에 없어 232 통신과 485 통신을 프로그램에 의해서 이쪽 저쪽으로 스위칭 해야 한다. 그러므로 데이터를 잃어버리면 안 되는 통신 시스템을 요구하는 구조의 포트 전환은 굉장한 기술을 요하거나 아니면 적합하지 않다고 본다.


|
Source. 타깃 보드 커뮤니케이션 테스트 프로그램 |
/* 목적 : Target Board Communication Test File name: com_test.c Copyright Conan Kim All Rights Reserved. */ #include #include // 중간생략 #include "C:₩hardware₩work₩gu_5002.h" // DS5002FP SFR 정의 #include "C:₩hardware₩work₩gu_type.h" // #include 정의 #include "C:₩hardware₩work₩gu_hard.h" // Memory Map #define uchar unsigned char #define uint unsigned int /*******************/ /* function prototype */ /*******************/ // Interrupt initial void init_serial(void); // 19200Bps setting // Communication void init_qbuffer(void); // Ring Buffer 초기화 bit check_pop(void); // RS-232로부터 입력 검사 // Utility void title_print(void); uchar xtoa_h(uchar _byteh); // Hex to ASCII Converter 상위 Nibble uchar xtoa_l(uchar _bytel); // Hex to ASCII Converter 하위 Nibble void putstring(char* star); // 문자열 RS-232 프린터 void putbyte(char c); // 문자(文字) 하나 출력 /*******************/ /* Variables Declarations */ /*******************/ uchar xdata get_char; // Q 버퍼에서 읽어온 입력 값 struct ring xdata q; // For Communication q-buffer /******************/ /* Main Function */ /******************/ void main(void){ uchar xdata i; EA=0; // Disable Interrupt init_serial(); // 19200Bps Setting init_qbuffer(); // Ring Buffer Setup q.rp=q.wp=0 EA=1; // Enable Interrupt wdt(); // Watchdog Timer switch(485){ // 참이므로 무한 루프 형성 case(485): // Endless Loop title_print(); // 화면 프린터 putstring("₩nCMD>"); // 다음 명령 대기상태 Prompt while(7){ // True 무한 Loop, for(;;)와 동일 wdt(); // Watchdog Timer if(check_pop() && get_char==0x0D) // CR(Enter) Check putstring("₩nCMD>"); // 엔터키이면 Prompt switch(get_char){ case('h'):case('H'):case('?'): // Help Display putstring("485_Communication(1), 485_Loop_back_Test(2)₩nCMD>"); break; // 절대 빠트리지 말자........ 필자 무지 고생했음 case('1'):case('!'): // 1일 경우, 실제 통신 프로그램 위치 putstring("Now! 485_Communication ₩nCMD>"); break; case('2'):case('@'): // 2일 경우 putstring("Now! 485_Loop_Back_Test₩nCMD>"); putstring("Send ASCII Code 'Z' to RS-485₩nCMD>"); putstring("Receive(5) Char 'Z' to RS-485₩nCMD>"); ON_485(); // 485 Port on // GU_TYPE.H에 다음과 같이 정의되어 있음 // #define on_485() CON1=0;CON2=1 // #define OFF_485() CON1=1;CON2=1 // #define on_MODEM() CON1=1;CON2=0 // #define OFF_MODEM() CON1=1;CON2=1 for(i=1;i<=5;i++){ // 5회 실행 wdt(); putbyte('Z'); // send 485 Port Z=0x5A=0101 1010 if(check_pop()){ // 485를 통해 수신 데이터 확인 OFF_485(); // 485 Port off, 수신 데이터 있음 putbyte(get_char); // 하이퍼터미널에 입력값 프린터 putstring("("); // 괄호 putbyte(xtoa_l(i)); // i 값을 ASCII로 변환 putstring(")₩nCMD>"); ON_485(); // 485 Port on } // end if }// end for(i∼ OFF_485(); // 485 Port Off, RS-232로 변환 putstring("("); // 괄호 putbyte(xtoa_l(i)); // ASCII로 변환 putstring(")₩nCMD>"); putstring("END RS-485 Communication ASCII Code 'Z' Send Test₩nCMD>"); putstring("If You Read Just Number '(6)' is Fail₩nCMD>"); break; case('5'):case('%'): // this mode Output ASCII Code 'A' putstring("Now! Modem Test₩nCMD>"); break; default:break; } // end switch(get_char) } // end while(7) break; default: wdt(); break; // 필요하지 않음 } // end switch(485) } // end main // ======================================================== // ======================== Utility Routine =============== // ======================================================== bit check_pop(void){ if(q.wp!=q.rp){ get_char=(q.buffer[q.rp]); // pop get char by check flag q.rp++; // Increment Read Point if(q.rp>QSIZE) q.rp=0; // 링 구조를 가지고 있음 return (1); } get_char=NULL; // 입력이 없으면 공(空), 여기서는 Zero return (0); } void putbyte(uchar c){ // TI=1이 될 때까지 실행 SBUF = c; // 전송 인터럽트가 발생할 때 까지 대기 while(!TI); // 괄호가 참이면 계속 실행, 즉 TI=0이면 대기 TI=0; // (!TI)=0이 거짓이 되려면 TI=1 } void putstring(char *str){ // Point 문자열 출력 unsigned int xdata i; for(i=0;str[i]!='₩0';i++) { if(str[i]=='₩n') { putbyte(0x0a); // 0x0a = Line Feed(줄 바꿈) putbyte(0x0d); // 0x0d = Carriage Return(커서를 좌측 끝) } else putbyte(str[i]); } } uchar xtoa_h(uchar _byteh){ // 16진수를 ASCII로 변환 상위 Nibble uchar nibble = _byteh >> 4; return ((nibble > 9)? nibble + 'A' - 10 : nibble + '0'); } uchar xtoa_l(uchar _bytel){ // 16진수를 ASCII로 변환 하위 Nibble uchar nibble = _bytel & 0x0F; return ((nibble > 9)? nibble + 'A' - 10 : nibble + '0'); } void title_print(void){ // 사용자 타이틀 프린터 putstring("₩n******************************"); putstring("₩n* Target Board of Home Guard Communication Test *"); putstring("₩n******************************"); putstring("₩n₩n"); putstring("CMD>Push '?'or 'H' key then Commands display₩nCMD>"); } // ======================================================== // ======================== Initial Routine =============== // ======================================================== void init_qbuffer(void){ // 링 버퍼 초기화 루틴 q.rp=0; // Read Point value = 0 q.wp=0; // write Point value = 0 } void init_serial(void){ // 19200 ES =1; // Enable Serial Interrupt PS=1; // Serial Port Priority High SCON = 0x50; // Mode=1, REN=1 PCON |= 0x80; // SMOD=1 TMOD |= 0x20; // Timer Mode=2, 8bit Auto_reload Timer TH1 = 0xFC; // Time Value TR1 = 1; // Run Timer 1 TI = 0; // Initial TI & RI RI = 0; // SCON에서 이미 정의되어 있음 } // ======================================================== // ======================== Interrupt ================== // ======================================================== void timer0_isr(void) interrupt 1 using 1{ // auto reload 방식 timer.tick++; if(timer.tick==0xFFFF) timer.tick=0; } void push_q(void) interrupt 4 using 1{ // UART 인터럽트 if(RI){ // RI=1일 때 실행 RI=0; // Empty RI(다음 인터럽트 받을 준비) q.buffer[q.wp]=SBUF; // Write Point로 옮김 q.wp++; // Increment Write Point if(q.wp>QSIZE) q.wp=0; // Write Point가 넘치지 않게(Ring Buffer) } // End if(RI) } /*********************************/
|
Source를 컴파일 한 후 프로그램을 로딩, 윈도우의 하이퍼 터미널과 실험용 보드인 홈 가드 보드를 연결한다. 정상적으로 Loop Back Test가 되었다면 그림 8과 같은 결과를 얻을 수 있다. 만약 P2나 P3의 DB 9핀 소켓에 아무 것도 연결하지 않고 프로그램을 실행시키면 Z(1)~Z(5)가 출력되지 않고‘(6)’만 화면에 나타난다. 바탕화면에 하드 카피된 TTY 프로그램은 PC 회사에서 COM 포트를 테스트하기 위해 이용하는 실행 파일로 Microsoft Corp.에서 만든 것이다. 윈도우에서 제공되는 하이퍼터미널을 사용해도 된다. 자체적으로 RS-485의 TX를 통해 보낸 정보를 RX로 받는 것까지 됐다면 다시 프로토콜로 돌아오자. 앞에서 프로토콜을 필자가 직접 만들었다고 했다. 그런데‘프로토콜’의 사전적 의미를 찾아보니 외교상으로는 의전(儀典)이나 의례(儀禮)를 나타내며, 전산에서는 컴퓨터 상호간 또는 컴퓨터와 단말기 사이의 데이터를 송?수신하는데 필요한 통신 규약으로 쓰여 있다. 결국 프로토콜은 일상 생활에서도 사용되고 있는 것이다. 특히 많이 사용되는 전화망 통신의 예를 들어보자. 첫째, 음의 변조방식과 전화번호가 있다. 둘째, 통화하고자 하는 상대가 응답이 가능한지 이름이나 교환 및 내선 번호를 통해 확인한다. 셋째, 상대방과 접속이 되어서도 언어와 Yes or No의 대답 등 일정한 도덕 규약이 있다. 이렇게 프로토콜은 통신 문화이며 정해진 예절이다. 자작한 통신 프로토콜은 다음과 같은 사항을 생각하지 않고 만든 점에 유의하도록 하자. 우선 데이터 투명도를 DLE(Data Link Escape)로 생각하지 않았다. 또한 선로 상에서의 통신 속도를 자동으로 맞추지 못하며, 통신 상에서 각종 대기 시간 및 정기적 POL 시간 등을 실험을 통해 정확히 고려하지 않았다. 나머지는 차지하고라도 데이터 투명도는 꼭 짚어보고 넘어가야 하겠다. 초기 데이터 통신에는 ASCII 문자만으로 통신을 하다가 점점 정보 의미가 확대됨에 따라 2진 정보를 전송할 필요가 있게 됐다. 그러나 2진 정보는 문자 지향적 프로토콜에서 수신부에 의해 잘못 해석될 우려가 있다. 이를 막기 위한 작업을 투명(Transparent) 데이터라고 부른다. 데이터 투명도는 문자 지향적 프로토콜에서 각 통신 제어 문자 이전에 DLE(Data Link Escape)라는 문자를 삽입하므로 이루어진다. 그래서 텍스트를 보낼 때 DLE로 시작해서 DLE로 끝나는 것이다. 만약 DLE(0x10h=0001 0000)와 똑같은 2진 정보가 텍스트 안에 존재하고 있다면, DLE의 혼선을 막기 위해 다시 한번 DLE를 보내는데 수신 시에도 두 개를 받았다면 하나를 버린다. 그러나 이런 방법의 데이터 투명도는 프로그램 하기도 까다롭고 특히 효율이 떨어진다는 단점이 있다. 다른 방법으로는 텍스트 수를 세어 보내는 쪽에서 주고, 받는 쪽에서는 바이트 수를 세어 받는 방법도 있다. 보통 비트 지향적 프로토콜에서 많이 사용한다. 표 3은 홈 가드에서 사용하는 프로토콜의 정해진 명령어를 보여준다. 구현된 타깃 보드는 PC와 연결되어 있는 하나의 대장보드와 이곳에 연결되어 있는 여러 대의 부하보드로 구성돼 있어 서로 정해진 프로토콜에 의해 통신하면서 정보를 주고받는다. 장비가 여러 대의 기기와 접속했을 경우 어떤 모양새를 도플러지(Topology)라고 하는데, 기본적인 방법에는 Point to Point와 멀티 드롭 방식이 있다. |
코드 |
명칭 |
설명 |
비고 |
31 |
초기 설정 |
홈 가드 초기화 |
대장보드가 부하보드에 보낼 때 사용 UAD가 00일 경우에는 부하보드 전부 해당 |
32 |
날짜 설정 |
RTC 년, 월, 일 설정 |
33 |
시간 설정 |
RTC 시, 분, 초 설정 |
34 |
알람 설정 |
RTC 알람 설정 |
35 |
모뎀 설정 |
모뎀 초기화 설정 |
36 |
Reset |
Reset |
39 |
주소 보고 명령 |
기기의 DIP S/W값 요청 |
3A |
기기 상태 보고 |
가드 현재 상태 보고 요청 |
3B |
기기 제어 명령 |
부하보드의 기타 제어 요청 |
- |
- |
- |
- |
51 |
가드 상태 통보 |
- |
- |
59 |
기기 주소 통보 |
기기의 DIP S/W 값 |
- |
5A |
기기 상태 통보 |
가드 현재 상태 |
초음파, 온도, 방범 스위치 |
5B |
기기 제어 통보 |
기기 제어 |
- |
5F |
기기 고장 통보 |
부하보드 고장 |
보드 고장 상태 |

Fan Out |
|
디지털 집적회로(IC)의 외부에 접속되는 부하에 대하여 회로 의 출력 드라이브 능력을 나타낸다. 팬 아웃이 크면 드라이브 능 력이 크다고 할 수 있다. TTL IC에서는 보통 10∼20개 정도의 |
팬 아웃을 가져, 동일 선상에 접속되는 부하를 능력 이상으로 연 결하면 드라이브 능력이 떨어진다. 팬 아웃 수치로 칩 세기를 평 가할 수도 있다. |
|
P_to_P 방식은 초등학생들이 자연시간에 실험해보았듯이 컵에 실을 꿰어 일대 일로 통신하는 것이다. 멀티 드롭은 P_to_P를 계속 확장한 것으로, 흡사 빨랫줄에 여러 개의 세탁물이 집게로 고정된 모양을 하고 있는 방법이다. 보드의 연결도 멀티 드롭으로 구성되어 있어 통신하고자 하는 정보를 UAD(Unit Address)와 함께 선로에 놓으면 일단 전부 통신 선로에 연결되어 있는 대장 및 부하보드가 정보를 취득한 후 자신의 UAD가 아니면 버리는 구조로 되어 있다. 특히 대장보드가 UAD에 0X00을 넣어 선로에 놓으면 선로에 있는 모든 부하보드는 전부 자신의 UAD로 간주하고 제어 명령을 해석하고 실행한다. 이런 프로토콜을 이용하여 빠른 시간에 부하보드를 초기 설정이나 시간 설정할 수 있다. 다음은 프로토콜에서 미처 설명하지 못한 통상적인 부분을 요약한 것이다. 프로토콜을 작성할 때 염두해 두어야 할 부분이기도 하다. .전송에 이상이 있을 경우 4회 정도 등, 정해진 회수만큼 재 시도해본다. .부하보드가 대장보드로부터 두 번 이상 똑같은 명령을 받고 다시 한 번 정상적으로 처리했다면 ACK를 보낸다. .NACK 수신 시에는 바로 전 상태의 전문을 다시 보낸다. .EX-OR 또는 SUM 에러가 발생하면 NACK를 보내고 NACK를 받은 보드는 에러가 발생했던 전문을 다시 보낸다. .대장보드는 정기적으로(시간은 상태에 따라 변할 수 있음) POL을 행한다. .POL에서 재 시도 횟수를 넘을 때까지 부하보드가 응답하지 않는다면, 대장보드는 선로의 이상 혹은 고장으로 판단한다. .부하보드는 대장보드의 POL에 응답하는 것 외에 자체적으로 RSP 전문을 보낼 수 없다. .부하보드끼리는 POL, SEL, RSP를 서로 행할 수 없다.

그림 9는 대장보드와 부하보드를 연결하는 방법을 나타낸다. ‘MAST’는 대장보드를, ‘SLAVE’Keeper 1~Keeper n은 부하보드를 가리킨다. 부하보드는 통신모드3으로 할 경우 8비트의 UAD 때문에 0x0∼0xFF로 한계가 있다. 하지만 통신모드1로 했을 경우에는 이야기가 달라진다. 즉 프로토콜을 잘 만들고 Fan Out 한계가 없다면 무한대의 부하보드와 통신할 수 있는 것이다. RX, TX는 대장보드를 기준으로 송?수신이 결정(사실 장비의 보통 기준은 PC이다)되기 때문에 대장보드가 송신이면 부하보드는 수신으로 맞춰야 한 다 . 즉 대장보드의 TX_H(TX_L)와 부하보드의 RX_H(RX_L)가 서로 연결되어야 하는 것이다. 이를 지키지 않으면 485 드라이버가 제 기능을 할 수 없다. 대장보드의 TxD 및 RxD 신호는 드라이브 RS-232를 통해 PC와 인터페이스 된다. 그러나 대장이든 부하든 같은 모듈을 사용하고 두 개의 프로그램이 같이 적재되어 있는데, 딥 스위치의 설정에 따라 대장보드와 부하보드가 결정된다. |
|