콘텐츠로 이동
무료 평가 시작

Modbus RTU·ASCII와 SECS-I에 가상 포트 쓰기

Modbus와 SECS/GEM 튜토리얼의 직렬 실습은 실제 장비와 케이블 대신 가상 시리얼 포트로 할 수 있습니다. 응용 프로그램은 포트 이름만 바꿉니다. 이 페이지는 프로토콜마다 맞춰야 할 회선 설정과 연결 방법을 정리합니다.

  • 랩의 회선 설정을 프로토콜과 같게 둡니다. 랩은 노드의 line으로 포트를 시작합니다. Linux 의사 터미널은 응용 프로그램이 요청한 데이터 비트와 패리티를 전달하지 못하므로 랩의 설정이 그대로 쓰입니다.
  • realistic 진행 방식을 씁니다. 문자 사이 간격과 응답 시간이 실제 회선과 같아야 타임아웃과 프레임 경계를 제대로 시험합니다.
  • 포트 이름을 바꿉니다. 의사 터미널은 랩의 link 경로(예: /tmp/pdcomm-plc)나 path를, Windows는 COM201 같은 드라이버 포트 이름을, Linux 드라이버 모드는 /dev/ttyPDV0 같은 이름을 씁니다.

Modbus 직렬 규격(Modbus over Serial Line Specification and Implementation Guide V1.02, §2.5.1)은 RTU 문자를 시작 1, 데이터 8, 패리티 1, 정지 1비트로 정의하고 기본 패리티로 짝수를 요구합니다. 패리티를 쓰지 않으면 정지 비트가 2개여야 합니다. PDComm Modbus SDK도 패리티 없음과 정지 비트 1의 조합을 설정 단계에서 거부합니다.

항목 랩 노드 Modbus 설정
형식 {"baud": 19200, "data_bits": 8, "parity": "even", "stop_bits": "1"} "transport": "rtu", "baud": 19200, "parity": "even", "stop_bits": 1
포트 의사 터미널 link 또는 드라이버 포트 "port": "/tmp/pdcomm-drive1" 또는 "COM201"

RTU 프레임은 문자 시간 3.5개의 침묵으로 끝납니다(같은 규격 §2.5.1.1). 여러 장치가 한 버스를 쓰면 instant 진행 방식에서는 응답과 다음 요청 사이에 침묵이 없습니다. RS-485 버스에서 RTU를 시험할 때는 반드시 realistic을 씁니다.

단계별 실습은 가상 RS-485 버스에서 Modbus RTU 시험하기에 있습니다. Modbus 프로토콜 자체는 Modbus 튜토리얼에서 설명합니다.

ASCII 모드는 문자당 데이터 7비트를 씁니다. 짝수 패리티와 정지 1비트(7E1)를 많이 씁니다. 랩 노드도 같은 형식으로 둡니다.

{"name": "plc", "port": {"line": {"baud": 9600, "data_bits": 7, "parity": "even", "stop_bits": "1"}}}

Modbus 설정은 "transport": "ascii", "baud": 9600, "parity": "even", "stop_bits": 1입니다. ASCII 프레임은 콜론(:)으로 시작하고 CR LF로 끝나므로 문자 간격에 덜 민감합니다. 그래서 instant 진행 방식으로 논리만 빠르게 시험할 수도 있습니다.

SECS-I(SEMI E4)는 RS-232 점대점 회선에서 ENQ/EOT 회선 제어, 블록, 체크섬, 재시도로 SECS-II 메시지를 보냅니다. 문자 형식은 데이터 8비트, 패리티 없음, 정지 1비트입니다. 속도는 9600bps를 많이 씁니다. 장비와 호스트를 잇는 널 모뎀 랩은 다음과 같습니다.

{
"engine": {
"pacing": "realistic",
"nodes": [
{"name": "host", "port": {"line": {"baud": 9600}}},
{"name": "equipment", "port": {"line": {"baud": 9600}}}
],
"media": [{"kind": "null_modem", "a": "host", "b": "equipment"}]
},
"ports": [
{"node": "host", "backend": {"type": "pty", "link": "/tmp/pdcomm-host"}},
{"node": "equipment", "backend": {"type": "pty", "link": "/tmp/pdcomm-equipment"}}
]
}

PDComm SECS-I 엔드포인트(pdcomm_secs1_create)는 시리얼 포트를 직접 열지 않습니다. 응용 프로그램이 포트를 열고, 바이트를 읽고 쓰는 비차단(nonblocking) 콜백을 PdcommSecs1Io로 넘깁니다. 그러므로 가상 포트를 쓸 때도 바꿀 것은 응용 프로그램이 여는 포트 이름뿐입니다.

  • macOS·Linux: 링크 경로(/tmp/pdcomm-host)를 open()으로 열고 termios로 9600bps 8N1, 원시(raw) 모드, 비차단을 설정합니다.
  • Windows: \\.\COM201을 CreateFile로 열고 SetCommState, SetCommTimeouts로 같은 형식과 즉시 반환 읽기를 설정합니다.

결함 주입으로 SECS-I의 오류 처리를 시험합니다. 예를 들어 블록을 받는 쪽 노드에 {"command":"inject","node":"equipment","fault":{"xor":1}}을 넣으면 체크섬이 맞지 않아 NAK와 재전송이 일어납니다. 케이블 분리(attach)로는 ENQ 응답이 없을 때의 시간 초과와 재시도 한도를 시험합니다.

SECS-I의 블록 구조와 타이머는 SECS-I 배경 지식에서 설명합니다. 직렬 포트 없이 시뮬레이터 안에서 블록 전송부터 익히려면 SECS-I 가상 쌍을 씁니다. 가상 시리얼 포트는 응용 프로그램이 실제 직렬 포트 이름으로 여는 코드까지 시험할 때 씁니다. API 사용법은 SECS/GEM 튜토리얼에 있습니다.