볼 부상 높이 제어 시뮬레이션 및 PLC 프로젝트
- Python 86%
- Smalltalk 10.1%
- Dockerfile 3.9%
50ms 주기 로그로 인한 디스크 점유 방지 (10MB x 3파일, 최대 30MB) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| openplc | ||
| simulator | ||
| CONTROL-LOOP.md | ||
| docker-compose.yml | ||
| DOCKER-FLOW.md | ||
| PLANNING.md | ||
| README.md | ||
볼 부상 높이 제어 시뮬레이션
볼 부상 높이 제어 실습의 물리 하드웨어(IR 센서, DC 팬, 튜브)를 소프트웨어 시뮬레이터로 대체하고, OpenPLC Runtime과 연동하여 PID 제어가 동작하는 환경을 Docker Compose로 제공한다.
프로젝트 목적
- PLC로부터 산업용 프로토콜을 통해 데이터를 수집하고 제어하는 실습 환경 제공
docker compose up한 줄로 PID 제어가 동작하는 가상 PLC 환경을 즉시 구동- 3개 산업용 프로토콜(Modbus TCP, DNP3, EtherNet/IP) 포트를 외부에 노출하여, 데이터 수집 및 제어 실습에 활용
실행 방법
docker compose up --build -d
시뮬레이터가 자동으로 OpenPLC REST API를 통해 PID 프로그램을 업로드/컴파일/실행한다. 수동 작업 불필요.
시뮬레이터 로그 확인:
docker logs -f ball-simulator
PLC 접속 정보
OpenPLC가 노출하는 프로토콜 포트 정보이다. 외부 클라이언트에서 이 포트에 접속하여 PLC 데이터를 읽거나 제어값을 쓸 수 있다.
| 프로토콜 | 포트 | 용도 |
|---|---|---|
| Modbus TCP | localhost:502 |
레지스터 읽기/쓰기 |
| DNP3 | localhost:20000 |
데이터 포인트 읽기/쓰기 |
| EtherNet/IP | localhost:44818 |
태그 읽기/쓰기 |
| OpenPLC REST API | https://localhost:8443 |
PLC 관리 (헤드리스, 웹 UI 없음) |
Modbus 레지스터 맵 (외부 클라이언트용)
외부 데이터 수집/제어 프로그램은 아래 Holding Register 영역(%QW10~15)을 사용한다. 시뮬레이터가 사용하는 내부 영역(%QW0~1)과 분리되어 있으며, PLC가 매 스캔 사이클마다 자동 복제한다.
| Holding Register 주소 | PLC 변수 | 항목 | 읽기/쓰기 | 설명 |
|---|---|---|---|---|
| 10 | %QW10 |
센서값 (PV) | 읽기 | 공의 현재 높이 (0~1000) |
| 11 | %QW11 |
팬 출력 (MV) | 읽기 | PID 제어 출력 (0~1000) |
| 12 | %QW12 |
목표 높이 (SP) | 읽기/쓰기 | PID 제어 목표값 변경 |
| 13 | %QW13 |
KP (x10) | 읽기/쓰기 | 비례 게인 (예: 20 = 2.0) |
| 14 | %QW14 |
KI (x10) | 읽기/쓰기 | 적분 게인 (예: 5 = 0.5) |
| 15 | %QW15 |
KD (x10) | 읽기/쓰기 | 미분 게인 (예: 10 = 1.0) |
프로젝트 구조
ball-levitation-sim/
├── docker-compose.yml # 컨테이너 오케스트레이션
├── README.md
├── PLANNING.md # 상세 기획 문서
├── openplc/
│ └── pid_control.st # PID 제어 ST 프로그램
└── simulator/
├── Dockerfile
├── requirements.txt # pymodbus
└── simulator.py # 물리 모델 + Modbus 통신
관련 문서
- PLANNING.md - 시스템 아키텍처, 구현 범위, 핵심 이슈 등 상세 기획
- DOCKER-FLOW.md - Docker Compose 실행 흐름 시퀀스 다이어그램
- CONTROL-LOOP.md - 제어 루프 시퀀스 다이어그램 (초기화 + 50ms 주기)