본 예제 프로그램으로 대표적인 하드웨어 장치 제어기능인 SerialPort(SmartSerialPort) 를 테스트해볼 수 있습니다.
SmartX Framework와 관련된 컴포넌트의 자세한 사용법은 SmartX Framework Reference Guide (Programming Guide)의 SmartSerialPort편을 참조하시기 바랍니다.
Smart I/O-Series의 하드웨어적인 설명 및 사용법은 Smart I/O-Series 제품매뉴얼을 참조하시기 바랍니다.
본자료는
1. SmartSerialPort 기본 설명
2. SmartSerialPort 관련 메서드
3. RS232 Block 특징
4. RS232 Block과 센서 결선 안내
4-2. Smart I/O-2 또는 Smart I/O-3에 RS232 Block 장착
5. 예제 프로그램 동작 설명
6. 프로그램 전체 소스
순서로 설명합니다.
1. SmartSerialPort 기본 설명
SmartSerialPort는 시리얼 통신을 처리하기 위한 컴포넌트로 Event 또는 Polling방식의 기능을 지원 하며 Frame구조와 None-Frame 구조의 통신을 모두 지원하여 다양한 통신환경에 쉽고 편리하게 적용하여 개발할 수 있도록 만들어 진 컴포넌트 입니다.
SmartSerialPort 특징
1. Event 또는 Polling 방식의 수신 기능 지원
2. Event 수신 시 수신 Queue 지원
3. 프레임 구조의 송/수신 기능 지원
- STX(시작 식별 코드), ETX(종료 식별 코드) 코드 사용
- STX(1~2Byte), ETX(1~2Byte) 멀티 바이트 지원
4. 비 프레임 구조 송/수신 기능 지원
- 데이터의 구분 기준은 ReadTimeout 또는 FrameBufferSize를 기준으로 함
5. Error Check 기능 지원
- 프레임/비 프레임 구조 모두 적용 가능
- check-Sum8, check-Sum16, CRC16, CRC32 방식 지원
- Error Code 위치 설정 가능
- Error Code 표현 방식 지원(Binary, ASCII, UNICODE)
6. 송/수신 데이터 표현 방식
- Binary, ASCII, UNICODE
7. RS485 통신 지원
- IEC-Series중 RS485-Software방식인 제품인 경우 송/수신 전환 시 초기 Null 값 수신데이터 제거 기능 지원
2. SmartSerialPort 관련 메서드
[표] 통신 방식 및 데이터 구조에 따른 송/수신 함수 및 이벤트
Frame 구조 | None - Frame 구조 | ||
---|---|---|---|
송신 | Write Frame() |
Write NoneFrame() |
|
수신 | Polling | Read Frame() |
Read NoneFrame() |
Event | OnRead QueueEvent |
OnRead QueueEvent |
|
Read Queue() |
Read Queue() |
SmartSerialPort의 Port를 열기 void Open() (+1 overload) void Open(SmartSerialPort.BAUDRATE baudRate, SmartSerialPort.COMPORTNO portNo, int iReadTimeout) |
---|
(인자) SmartSerialPort.BAUDRATE baudRate : 통신 속도 (인자) SmartSerialPort.COMPORTNO portNo : 통신 포트 (인자) int iReadTimeout : 읽기 작업의 타임아웃 시간 설정 |
SmartSerialPort의 Port를 닫기 void Close() |
---|
Frame 형식의 데이터를 송신합니다. void WriteFrame(byte[] bytesWrite) (+1 overload) void WriteFrame(string strWrite, SmartSerialPort.CODETYPES eCode) |
---|
(인자) byte[] bytesWrite : Byte[] 형식의 송신 데이터 (인자) string strWrite : String 형식의 수신 데이터 (인자) SmartSerialPort.CODETYPES eCode : 데이터의 타입이 ASCII Code, UniCode인지 설정 |
NoneFrame 형식의 데이터를 송신합니다. void WriteNoneFrame (byte[] bytesWrite) (+1 overload) void WriteNoneFrame (string strWrite, SmartSerialPort.CODETYPES eCode) |
---|
(인자) byte[] bytesWrite : Byte[] 형식의 송신 데이터 (인자) string strWrite : String 형식의 송신 데이터 (인자) SmartSerialPort.CODETYPES eCode : 데이터의 타입이 ASCII Code, UniCode인지 설정 |
데이터가 Frame형식이고 데이터 수신이 Polling 방식인 경우 데이터를 수신합니다. SmartSerialPort.FRAMEDATAREADSTATUS ReadFrame(out byte[] bytesRead) (+3 overloads) SmartSerialPort.FRAMEDATAREADSTATUS ReadFrame(out string stringRead) SmartSerialPort.FRAMEDATAREADSTATUS ReadFrame(out byte[] bytesRead, int iReadTimeout) SmartSerialPort.FRAMEDATAREADSTATUS ReadFrame(out string stringRead, int iReadTimeout) |
---|
(인자) out byte[] bytesRead : Byte[] 형식의 수신 데이터 (인자) out string stringRead : String 형식의 수신 데이터 (인자) int iReadTimeout : 읽기 작업의 타임아웃 시간 설정 (리턴값) SmartSerialPort.FRAMEDATAREADSTATUS - EMPTY = 0 (수신 데이터없음) - VALIDDATA = 1(수신 데이터 정상) - FAILDATA = 2(수신 데이터 비정상) |
데이터가 NoneFrame형식이고 데이터 수신이 Polling 방식인 경우 데이터를 수신합니다. SmartSerialPort.FRAMEDATAREADSTATUS ReadNoneFrame(out byte[] bytesRead) (+3 overloads) SmartSerialPort.FRAMEDATAREADSTATUS ReadNoneFrame(out string stringRead) SmartSerialPort.FRAMEDATAREADSTATUS ReadNoneFrame(out byte[] bytesRead, int iReadTimeout) SmartSerialPort.FRAMEDATAREADSTATUS ReadNoneFrame(out string stringRead, int iReadTimeout) |
---|
(인자) out byte[] bytesRead : Byte[] 형식의 수신 데이터 (인자) out string stringRead : String 형식의 수신 데이터 (인자) int iReadTimeout : 읽기 작업의 타임아웃 시간 설정 (리턴값) SmartSerialPort.FRAMEDATAREADSTATUS - EMPTY = 0 (수신 데이터없음) - VALIDDATA = 1(수신 데이터 정상) - FAILDATA = 2(수신 데이터 비정상) |
데이터가 Frame 또는 NoneFrame 형식을 모두 지원하는 Event 방식의 수신 처리 함수 (ReadQueue + OnReadQueueEvent) ReceiveDetect가 EventQueue인 경우 데이터가 수신되면(Frame, None-Frame) Frame또는 가상의 FrameData가 Read-Queue에 저장되고 OnReadQueueEvent를 발생합니다. SmartSerialPort.FRAMEDATAREADSTATUS ReadQueue(out byte[] bytesRead) (+1 overload) SmartSerialPort.FRAMEDATAREADSTATUS ReadQueue(out string stringRead) |
---|
(인자) out byte[] bytesRead : Byte[] 형식의 수신 데이터 (인자) out string stringRead : String 형식의 수신 데이터 (리턴값) SmartSerialPort.FRAMEDATAREADSTATUS - EMPTY = 0 (수신 데이터없음) - VALIDDATA = 1(수신 데이터 정상) - FAILDATA = 2(수신 데이터 비정상) |
GetCheckSum16Gen, GetCheckSum8Gen / GetCRC32Gen, GetCRC16Gen 각각의 메서드는 ErrorCode의 계산된 값을 ErrorCodeType(eCode)에 따라서 ASCII, UniCode 타입 등으로 리턴합니다. |
---|
※ SmartSerialPort에서 ErrorCode를 사용할 경우 위 함수들이 내부에서 호출되어 송/수신 데이터를 자동으로 검증하게 됩니다. byte GetCheckSum8Gen(byte[] rawData) (+3 overloads) ushort GetCheckSum16Gen(byte[] rawData) (+3 overloads) ushort GetCRC16Gen(byte[] rawData) (+3 overloads) uint GetCRC32Gen(byte[] rawData) (+3 overloads) |
(인자) byte[] rawData : 바이트 배열 형식의 원본 데이터 (인자) int iStart : 데이터의 시작 지점을 설정 (인자) int iLength : 데이터의 길이를 설정 (인자) SmartSerialPort.CODETYPES eCode : 데이터의 타입이 ASCII 또는 Unicode인지 설정 GetCheckSum8Gen() 의 리턴값 (리턴값) byte : 데이터를 CheckSum 8Bit로 계산한 결과값 (리턴값) byte[]: eCode 인자값에 따른 ASCII 또는 Unicode 데이터 GetCheckSum16Gen() 의 리턴값 (리턴값) ushort : 데이터를 CheckSum 16Bit로 계산한 결과값 (리턴값) byte[] : eCode 인자값에 따른 ASCII 또는 Unicode 데이터 GetCRC16Gen() 의 리턴값 (리턴값) ushort : 데이터를 CRC 16Bit로 계산한 결과값 (리턴값) byte[]: eCode 인자값에 따른 ASCII 또는 Unicode 데이터 GetCRC32Gen() 의 리턴값 (리턴값) uint: 데이터를 CRC 32Bit로 계산한 결과값 (리턴값) byte[] : eCode 인자값에 따른 ASCII 또는 Unicode 데이터 |
ASCII Byte 배열을 문자열로 변환한다. static string ConvertASCIIByteToString(byte[] byteData) |
---|
(인자) byte[] byteData : ASCII 바이트 배열 데이터 (리턴값) string : 문자로 변환된 데이터 |
UniCode Byte 배열을 문자열로 변환한다. static string ConvertUnicodeByteToString(byte[] byteData) |
---|
(인자) byte[] byteData : UniCode 바이트 배열 데이터 (리턴값) string : 문자로 변환된 데이터 |
3. RS232 Block 특징
① RS232 Isolation Block으로 사용 가능한 포트번호가 IEC667/1000-Series는 COM4(TTL Level)입니다.
② 최대 데이터 송/수신 속도 19200 bps지원
③ Smart I/O-II, Smart I/O-III Series에서만 사용가능(Smart I/O-I에서 사용불가)
④ 전기적인 Isolation 처리지원
• 테스트 적합한 모듈 : RS232 연장 케이블과 시리얼 9핀 커넥터(암놈)
5. 예제 프로그램 동작 설명
통신 환경 설정
① Port No는 COM1~COM4, COM7까지 사용이 가능하지만 RS232블록을 사용하는 경우
IEC266-Series는 COM1(TTL Level)만 지원하며 IEC667/1000-Series는 COM4(TTL Level)만 지원합니다.
② BaudRate 는 통신 속도(BaudRate)를 설정합니다. 110bps~115200bps까지 사용이
가능하지만 RS232 Block을 사용하는 경우 최대 19200bps까지 지원됩니다.
③ FrameStyle또는 NoneFrameStyle(Frame방식이 아님)을 선택가능 FrameStyle은 STXANDETX, STX Only,
ETX Only 방식으로 구분합니다. STX와 ETX는 1Byte ~ 2Byte로 설정할 수 있습니다.
④ ReadTimeOut은 Frame형식의 경우 옵션(Option)이고 NoneFrame 형식의 경우 필수입니다.
읽기 작업의 타임아웃 시간 설정 및 None-Frame 구조에서 Data의 구분을 하기위하여 통신 환경에 적절한 값으로 설정합니다.
⑤ ErrorCode Location 은 ErrorCheckMode에 의해 설정된 Error Check Code의 프레임에서의 위치(Head 또는 Tail)를 지정합니다.
⑥ ErrorCode Mode는 데이터를 송/수신 시 Error Check를 사용할지 설정합니다.
SmartSerialPort는 내부에 Error Check를 자동으로 수행 하도록 구현되어 있습니다.
종류는 NONE, CHECKSUM8, CHECKSUM16, CRC16, CRC32가 있습니다.
⑦ ReceiveFrameDebugMode는 수신 관련 함수에서 FrameData의 전체(STX, ETX, ErrorCode)를 출력하거나 Data만 출력을 원할 때 설정합니다.
True는 FrameData 전체 출력, False는 데이터만 출력(Default) 합니다. 체크박스를 체크하는 경우 True입니다.
⑧ 시리얼 포트를 오픈 합니다. BaudRate(통신속도), PortNo(포트번호), ReadTimeOut(읽기 작업의 타임아웃 시간)이 미리 정해져야 합니다.
SerialPort 내용 송신⑨ 바이트 형식(Binary), 텍스트 형식(Ascii, UniCode) 세가지 방식 중에 하나로 송신이 가능
SerialPort 내용 수신(Event 방식, Polling 방식)
⑩ 수신 방식은 Event 또는 Polling 중에 선택이 가능
⑪ 바이트 형식(Binary), 텍스트 형식(Ascii, UniCode) 세가지 방식 중에 하나로 수신이 가능하며 동일한 코드 형식으로 송/수신을 주고받아야 합니다.
Ex) Binary로 송신하는 경우 Binary로 수신하기 바랍니다.
⑫ 수신된 데이터는 SmartListBox의 상단에 수신된 시간 순서대로 추가됩니다.
⑬ Serial Port를 Close합니다.