You are here

LabVIEW Tech-Tip 2호 - LabVIEW와 시리얼 통신

  시리얼 통신은 일반 컴퓨터와 주변 계측장비의 비동기식 통신수단으로 지금까지도 많이 쓰이는 인터페이스 중에 하나입니다. 이러한 이유로 대부분의 데스크탑 컴퓨터에는 RS-232C (Recommended Standard 232 Revision C)형을 시리얼 포트를 내장하고 있어 1:1 통신을 수행하며, 1:多 통신인 유사한 통신 방법인 RS-485 통신을 사용합니다.
물론 LabVIEW에서도 시리얼 통신을 지원합니다. 여기서부터는 시리얼 통신에 대한 전반적인 이해와 LabVIEW를 이용한 시리얼 통신 코딩을 소개하고자 합니다.

>> 예제 코드 다운로드                                                                                                                          LabVIEW Tech-Tip 목록 보기 

시리얼 통신의 이해

팁: 그림 2의 Control Editor에서 Control 대신 Type Def. 또는 Strict Type Def.를 선택할 경우 추후에 Control의 속성이 변경되면 자동으로 그 내용이 업데이트됩니다. 오히려 자동으로 업데이트 때문에 기존 코드에 문제가 발생할 수 있기 때문에 주의하여 사용하십시오.

본 강의에서는 사용자의 용도에 맞게 프런트 패널에 위치하는 객체(컨트롤 또는 인디케이터)의 속성 변환 작업을 연습하였습니다. 따라서 본 강의를 숙지하면 사용자의 어플리케이션의 용도에 맞는 사용자 정의 객체를 구성할 수 있습니다.

그림 1. 시리얼 통신의 데이터 특성

위 그림은 ASCII 코드 “A” 값을 시리얼 통신으로 전송할 때의 데이터 형태입니다. 시리얼 통신은 두 종류의 전압 값을 통해 데이터가 구분됩니다. Space는 논리 “0”을 나타내며 +3V ~ +15V의 전위를 갖습니다. Mark는 논리 “1”을 나타내며 -3V ~ -15V의 전위를 갖습니다.
이러한 비동기식 데이터 전송에서 가장 중요한 요소는 통신 장치간의 타이밍 입니다. 시리얼 통신에서는 장치간의 통신 속도를 Baud Rate (=BPS)라 부르며, 쌍방의 장치에 동일한 Baud Rate이 설정되어야 합니다. BPS는 Start bit + Data bits + Parity bit + Stop bits (총 11개 bit)의 묶음이 초당 몇 개가 전송되는지에 따라 1200bps, 2400bps, 9600bps로 표기되며, 사용자가 9600bps로 설정하면 각 데이터의 전송 간격은 약 1/9600 = 0.104ms 정도이며, 초당 최대 전송 데이터 개수는 9600 /11 = 872 문자를 초당 보낼 수 있습니다.

Start bit는 각 문자 데이터가 전송된다는 것을 표시합니다.
Data bit는 총 7개로 구성됩니다. 예를 들어, 전송되는 데이터가 아래와 같으면 다음과 같이 해석됩니다.

 

Start
Data bits
Parity
Stop bits
0
1
0
1
1
0
1
1
0
1
1

 

Data bit 부분만을 때어내면 1011011이지만 해석할 때는 역순으로 변형시키기 때문에 1101101이 됩니다. 2진 데이터 1101101 은 16진 데이터 6D 값과 동일하며 ASCII 테이블을 참조하게 되면 “m”의 값을 같습니다.
Parity bit는 오류 체크 기능을 위해 사용됩니다. Stop bit는 데이터 전송이 완료됐음을 나타냅니다.

1:多 통신인 RS-485 통신의 특징

RS-485 통신 장치는 각기 고유 주소를 갖습니다. 또한 RS-485 통신 장치의 종단에는 반드시 바이어스 저항(약 120옴)을 설치해야 하는 독특한 케이블링 방법이 요구됩니다.

 

그림 2. RS-485 통신을 위해서는 장비의 종단에 바이어스 저항을 설치합니다.

VISA 함수가 사용되는 시리얼 통신 프로그래밍

우선 시리얼 통신 프로그래밍에 사용되는 함수의 명칭은 VISA입니다. VISA함수는 계측기 제어가 주 목적인 GPIB 통신을 프로그래밍할 때 주로 사용합니다만 시리얼 통신에도 쉽게 적용시킬 수 있었습니다. LabVIEW 5.X 이하 버전 시리얼 통신 전용 함수인 Serial Read.vi 또는 Serial Write.vi를 지원했지만 최근 버전에는 이러한 함수를 Functions 팔레트에서 숨기고 편리한 VISA 함수를 사용하도록 권장하고 있습니다.
VISA 함수를 이용하는 시리얼 통신은 GPIB 통신과 별반 차이가 없습니다. 단지, 프로그램 초기부에 위치한 하드웨어 설정 부분에 시리얼 통신에 필요한 여러 가지 세팅을 설정하도록 합니다. 나머지의 코딩은 GPIB 통신과 같이 VISA Read함수와 VISA Write 함수를 혼합하여 구현합니다. 그리고 시리얼 통신 프로그래밍에서는 사용되는 통신 방법이 RS-232C, RS-422, 또는 RS-485이든 동일하게 구현합니다.

실습 01. 시리얼 장비 통신 – 시리얼 통신 시뮬레이터로부터 데이터 전송

시리얼 통신 기본 상식: 시리얼 통신 장비는 여러 가지 방식으로 전개될 수 있습니다.
가장 일반적인 전개 방식은 컴퓨터에서 특정한 명령을 시리얼 포트에 Write하면 시리얼 장비가 이를 인식하고 여기에 대한 응답으로 특정한 동작을 수행합니다. 예를 들면, 사용자가 스코프 장비에게 Autoscale로 화면을 변환하라는 명령을 날리면 스코프 장비를 이를 수행하게 됩니다.
두 번째 전개 방식은 컴퓨터에서 특정한 명령을 시리얼 포트에 Write하면 시리얼 장비가 이를 인식하로 여기에 대한 응답으로 특정한 데이터를 날립니다. 컴퓨터는 이를 읽어드리기 위해 Read를 수행하게 됩니다. 예를 들면, 사용자가 스코프 장비에게 장비의 일련번호를 묻는 명령을 날리면 장비는 여기에 반응하면서 시리얼 포트로 일련번호를 전송하고 컴퓨터는 다시 이를 읽어드리는 작업을 수행합니다.
세 번째 전개 방식은 시리얼 장비가 일방적으로 시리얼 포트에 데이터를 날리면 컴퓨터는 연속적으로 데이터를 읽어드립니다.

연습용 Serial Write and Read.vi를 띄웁니다.

 그림 3. VISA 함수를 이용한 기본 시리얼 통신의 LabVIEW 코드 구조

주요 프로그램 설명

시리얼 프로그래밍 흐름은 최초 시리얼 포트의 환경을 설정하는 시리얼 포트 설정부로 시작합니다. 시리얼 포트의 기본 셋팅은 LabVIEW는 바탕화면에 위치한 Measurement and Automation Explorer(이하 MAX)의 값을 참조하게 됩니다. 또한 MAX에서 설정 값을 변경한 다음 이를 반영하기 위해서는 그림 4와 같이 화면 상단에 위치한 Save 버튼을 반드시 클릭하십시오.

 

그림 4. MAX의 COM 포트 설정 화면

그림 5. ‘*IDN?’ 명령 전달 시 시뮬레이터의 응답 결과

시리얼 통신 시뮬레이터는 두 번째 전개 방식으로 동작합니다. 컴퓨터에서 특정한 명령을 전달하면 이에 대응하는 응답을 전달합니다. 시리얼 장비에 명령어를 전송 할 때는 Write 스위치를 True로 설정하여 장비 쪽에 명령어를 전송합니다. 여기서는 시리얼 통신 시뮬레이터에게 장비 명을 묻는 명령어인 “*idn?”(일반적으로 계측기의 정상 설치를 확인하는 명령으로 자주 사용됨)을 전달합니다. 시리얼 장비가 명령에 반응하는 시간을 고려해 약간의 대기 시간을 주는 것이 관례입니다. 장비의 특성마다 적절한 대기 시간이 다를 수 있겠지만 일반적으로 0.5초 내외로 설정합니다.
그 다음 단계에서는 Read 스위치를 True로 설정하여 시리얼 포트의 데이터를 읽어드려 Read String Text Indicator에 기입시킵니다. 데이터를 읽어드릴 때 중요한 부분은 얼마만큼의 데이터를 불러들이는지를 설정하는 부분입니다. 이 부분은 VISA Byte at Serial Port라는 프로퍼티 노드가 수행합니다. 이 노드는 버퍼에 입력된 데이터 양을 바이트 값으로 환산하여 출력하며 이는 VISA Read 함수의 입력으로 받아드려 집니다. VISA Byte at Serial Port 프로퍼티 노드는 Function >> Instrument I/O >> Serial 팔레트에 아래 그림과 같이 위치합니다. 프로퍼티 노드란 하드웨어 또는 윈도우 소프트웨어의 고유한 기능을 LabVIEW에서 접근하고자 할 때 사용됩니다. 그림 6과 같이 노드의 오른 마우스 클릭하여 Properties 메뉴로 이동하면 그림과 같이 어떠한 고유 기능에 접근할 수 있는지를 나타내고 있습니다. VISA Byte at Serial Port의 경우에는 Serial Setting과 관련된 고유 기능에 접근할 수 있습니다. 아래 그림에는 기타 시리얼 기능이 나타났으며 이들 중에 하나를 선택하게 되면 이에 맞춰 기능이 변환됩니다. 여러 개의 하드웨어 고유 기능에 접근하고자 하는 경우 프로퍼티 노드의 중앙 하단부를 마우스로 드래그 하면 여러 개의 프로퍼티 노드가 나타납니다. 예를 들어, 세 가지 고유 기능에 접근하고자 하면 세 개의 프로퍼티 노드가 나타나도록 확장시키고 각 노드에서 오른 마우스 클릭을 하여 원하는 선택합니다. 프로퍼티 노드는 Control 또는 Indicator의 역할을 하게 되는데 이를 선정하려면 오른 마우스 클릭하여 Change To Write 또는 Change To Read를 선택하면 됩니다. VISA Byte at Serial Port 프로퍼티 노드의 경우 시리얼 포트의 상태를 나타내는 Indicator 역할을 합니다.

 그림 6. 시리얼 통신의 하드웨어 고유 기능에 접근하기 위해는 프로퍼티 노드를 사용합니다.

마지막으로 시리얼 통신이 완료되면 하드웨어의 통신 포트를 닫는 기능을 수행하는 VISA Close 함수를 위치시킵니다.

핸드셰이킹의 이해

송신장비 쪽에서 데이터를 보내면 수신장비 쪽의 FIFO (First Input First Output) 메모리에 이들이 저장되는데 갑작스럽게 다른 일을 우선적으로 처리해야 되는 경우가 발생하게 되면 FIFO가 가득 차서 결국 데이터 손실이 발생할 수 있습니다. 이럴 때 데이터 손실을 발생하지 않게 하기 위하여 수신부에서 취할 수 있는 조치는 송신부에 일정 신호를 보내 재 요청 신호를 하기 전까지는 데이터를 보내지 말라고 알려 주어야만 할 것입니다.
이러한 흐름제어를 보통 핸드셰이킹 (Handshaking) 이라고 합니다. RS-232C시리얼 통신에서 사용되는 핸드셰이킹 방법으로는 소프트웨어, 하드웨어 핸드셰이킹, Xmodem 등이 있으며 일반적으로 사용되는 두 가지 방법을 소개토록 하겠습니다.

* 소프트웨어 핸드셰이킹 *
이 방법은 GPIB 통신을 할 때 메시지 베이스 명령어 전송을 통한 입/출력을 관리하듯이, 여기서는 제어문자코드를 데이터 바이트로 사용합니다. 앞에서 살펴본 하나의 문자 패킷을 보면 중간의 Data Bits 부분에 제어문자코드를 삽입합니다.

Start
Data bits
Parity
Stop bits
0
X
X
X
X
X
X
X
0
1
1

 

 ▶ Xon 명령

Xon은 아스키 테이블에서 제어코드로 ^Q 값을 지닙니다. HEX 값은 " x11 " 입니다. Xon 제어코드는 수신장비로부터 송신장비로 전송하여 송신장비의 데이터 보내는 것을 중지 시킬 수 있습니다.

▶ Xoff명령
Xoff은 아스키 테이블에서 제어코드로 ^S 값을 지닙니다. HEX 값은 "x13" 입니다. Xon에 의해 중지된 송신장비의 데이터 전송을 다시 동작시키는 제어코드입니다.

소프트웨어 핸드셰이킹은 사용자가 데이터형을 ASCII형이 아닌 바이너리로 데이터를 정의 했을 때 상당한 문제점이 발생합니다. 위의 ASCII 테이블을 보면 사각형으로 표시된 부분의 ASCII코드들은 사용자에게는 의미 없는 문자 영역 밖입니다. (키보드 상에 존재하는 모든 문자들은 HEX 20 ~ 126 범위 안에 전부 존재합니다) 그러므로 차후에 순수 데이터를 정리 할 때에 전혀 영향을 미치지 않지만 전송되는 데이터가 바이너리로 정의되어 있는 상태에서는 HEX 11과 13 는 하나의 데이터로 간주될 수밖에 없을 것입니다. 그러므로 이 때에는 이것은 더 이상 제어코드가 아닌 일반 데이터로 간주가 되어 시리얼 포트 FIFO 오버플로우를 발생하면서 프로그램에 오류를 발생시킬 수도 있습니다.

* 하드웨어 핸드셰이킹 *
데이터 흐름제어는 RTS/CTS, DTR/DSR 의 짝을 이루어서 사용됩니다.
RTS/CTS 는 각기 "Request To Send" 와 "Clear To Send" 의 줄임말 입니다. 수신부에서 데이터를 받을 준비가 되어 RTS(출력)라인을 활성화(True)하면 송신부에서는 이 신호를 CTS(입력) 라인을 통하여 인식을 하며 결국 두 개의 동작을 통하여 이제부터 데이터 전송 준비가 되었으므로 데이터를 보내 달라 라는 의미입니다.
DTR/DSR 은 각기 "Data Terminal Ready"와 Data Set Ready"의 줄임말 입니다. 시리얼 포트와 모뎀 사이에 양쪽의 상태를 파악하기 사용되며, 컴퓨터로부터 데이터를 보낼 준비가 되었을 때 DTR 라인(출력)을 활성화(True)로 설정하면 모뎀의 DSR(입력)라인에서 신호를 인지하고 이제부터 데이터를 컴퓨터에서 데이터를 보낼 수 있게 됩니다. 참고적으로 RTS/CTS라인은 단위별 데이터 패킷을 대상으로 사용됩니다.

일부 내용은 도서출판 LabVIEW지기의 LabVIEW7과 GPIB 통신(임용천 저)에서 발췌되었습니다.

 

실습 02. 소프트 핸드셰이킹 모드 (Xon/Xoff) 사용 시리얼 포트 설정

그림 7. 소프트 핸드셰이킹 모드를 위한 LabVIEW 코딩의 일부

그림 8. 초기 설정 및 종결 문자 사용 여부 설정 부분

End write/read with termination character? - 종결 문자 사용 여부 확인
termination char - 종결 문자는 HEX(16진수)값으로 "xA" 설정 (일반 숫자를 HEX로 보기 위해서는 아래 그림과 같이 상수(Constant)를 오른 마우스 클릭하고 Visible Items에서 Radix를 선택함)

그림 9. 일반 상수를 HEX(16 진수)로 바꾸는 방법 소개

timeout(ms) –시간 초과 설정 - 10000 ms
VISA 리소스 - COM1 (시스템 기본값으로 COM1이 설정되지만 이는 VISA에서 별칭(Aliasing)으로 만든 이름일 뿐임. 실제 VISA에서 사용되는 명칭은 시리얼 포트가 1번이므로 "ASRL1::INSTR" 임. 이는 MAX 또는 VISA Interactive Control 에서 확인 가능함)
baud rate – 9600
data bits - 8비트 (패리티 비트를 사용하지 않을 때 가능, 사용할 때는 7비트까지만 데이터 비트로 이용 가능)
parity – 없음 (패리티 비트를 사용하게 된다면 VISA 프로퍼티 노드의 Serial Parity를 설정해야 하며, 또한 데이터 비트의 크기도 7비트로 제한됨)
stop bits - 비트 크기는 1 비트로 설정
flow control - 흐름제어는 Xon/Xoff 모드로 설정(소프트웨어 핸드셰이킹)

만약에 하드웨어 핸드셰이킹인 RTS/CTS 모드 등의 흐름제어를 사용할 때에는 시리얼 포트에 하드웨어 선이 각기 연결이 되어야 합니다.

그림 10. RS-232C DB-9 형 모듈 핀 맵 (* 표시로 되어 있는 부분은 주로 모뎀에서 사용됨)

용어 설명
TXD - Transmit Data
RXD - Receive Data
RTS - Ready To Send
CTS - Clear To Send
DSR - Data Set Ready
GND - Signal Ground
DCD - Data Carrier Detect
DTR - Data Terminal Ready
RI - Ring Indicator

종결 문자 사용 여부 설정 부분

Serial End Mode for Writes노드를 통하여 종결 문자를 사용할 것을 설정하고, Send End Enable 노드를 통해 활성화시키고, Termination Character 노드에 종결 문자를 삽입하였습니다. 프로퍼티 노드는 위 노드에서부터 아래 노드로 순차적으로 실행됩니다.

그림 11. I/O 버퍼 사이즈 설정 및 제어 코드 설정 부분

시리얼 통신의 FIFO 버퍼 메모리 크기는 VISA Set I/O Buffer Size 함수를 통해 설정합니다. 그리고 프로퍼티 노드로 Xon/Xoff 제어 코드를 각기 설정합니다. 기본값으로 16진수 11과 13로 각각 설정합니다.

실습 03. 시리얼 포트 모니터링

 

그림 12. 시리얼 포트 모니터링을 위한 LabVIEW 코딩

주요 프로그램 설명

프로그램 상에 난해한 부분은 없습니다. VISA에서는 모뎀 라인 모니터링을 할 수 있도록 Attribute 메뉴를 지니고 있으므로 이것을 통하여 상태 모니터링을 할 수 있습니다.

 

그림 13. 프로퍼티 노드에서 Modem Line Setting 방법 소개

시리얼 통신 기본 상식: 데스크 탑 컴퓨터의 시리얼 포트에는 UART(Universal Asynchronous Receiver/Transmitter) 8250, UART 16550 또는 호환 IC를 사용합니다. 16550 이후에 출시된 IC에는 FIFO가 기본으로 내장이 됩니다. 고속의 데이터 전송속도를 설정 시에는 가급적 데이터 손실을 우려해 FIFO 크기를 여유 있게 설정하는 것을 권장합니다. LabVIEW 프로그램 상에서 버퍼의 설정 변경을 원한다면 VISA Configure Serial Port 함수를 사용하여 포트를 열고 VISA Set I/O Buffer Size 함수를 사용하여 크기를 재설정합니다.

* 일부 내용은 도서출판 LabVIEW지기의 LabVIEW7과 GPIB 통신(임용천 저)에서 발췌되었습니다.

추가 학습 자료

동영상 세미나: LabVIEW와 일반 계측기를 이용한 측정 자동화 시스템 구현하기
제어계측 시장에서 LabVIEW는 타사 프로그래밍 소프트웨어에 비해 월등히 높은 시장 점유율(42.9%)을 차지하고 있습니다. 그 이유는 LabVIEW가 그래픽 기반 개발 환경을 제공하므로 사용하기 쉽다는 점과 VISA 함수를 이용해 타사 계측기들과 호환성이 높다는 것입니다. VISA 함수를 사용하면 다양한 종류의 계측기들을 LabVIEW에서 제어할 수 있습니다. 그리고 수천 개가 넘는 계측기 드라이버 소프트웨어를 ni.com에서 무료도 다운로드 받을 수 있습니다. 본 비디오에서는 Tektroniks사의 Oscilloscope를 LabVIEW VISA 함수로 제어하는 방법을 데모합니다. 상영 시간은 대략 45분입니다.
추가 정보는 ni.com/serial을 방문해 주십시오.

>> LabVIEW에 대한 더 많은 정보를 확인하세요! ni.com/korea/labview
>> 아직 가입하지 않으셨나요? LabVIEW 개발자 네트워크 mylv.net