# PLC Simulator 웹 이식

원본: [ironhero1544/PLC_Simulator](https://github.com/ironhero1544/PLC_Simulator)  
고정 버전: `4aba081cc3ec8152f64698ade1c666d47a314c5a`  
라이선스: **GNU General Public License version 3.0**, [전문](LICENSE)  
원본 저작자: PLC_Simulator 저작자 및 기여자. 원본 파일의 저작권 고지를 보존합니다.

이 디렉터리의 PLC 실행 코어와 파생 이식 코드는 GPL-3.0으로 제공합니다.
프로젝트의 일반적인 무단 배포 금지 문구는 이 구성 요소에 대한 GPL 권리를
제한하지 않습니다. GPL은 이 구성 요소의 복제·수정·재배포 조건을 정합니다.
보증은 제공하지 않으며 자세한 조건은 라이선스 전문을 따릅니다.
프로젝트 전체와 결합한 배포의 라이선스 범위는 별도로 확인해야 합니다.

## 실제로 가져온 코드

`native/upstream/`에 원본 C++ 실행 코어 27개 구현 파일, 구조화 래더 컴파일러,
명령 코덱, GX CSV 코덱과 필요한 헤더를 포함했습니다. 원본 명령 실행을
JavaScript로 흉내 낸 구현이 아니라 **원본 코어를 Emscripten으로 컴파일한
WebAssembly**를 사용합니다.

원본의 `ExecuteScanCycle`에 시뮬레이션 경과시간을 전달하는 인자를 추가했습니다.
수정 파일·원본 커밋·파일 해시는 [소스 목록](native/upstream-manifest.json)에,
빌드된 파일 해시는 [빌드 목록](native/build-manifest.json)에 있습니다.
재빌드 방법은 [native/README.md](native/README.md)에 있습니다.

`editor.html`, `editor.css`, `editor.js`는 원본 GX 스타일 편집 흐름에 맞추어
새로 작성한 반응형 웹 UI입니다. `engine.js`, `native/bridge.cpp`,
`project-codec.js`, `board-bridge.js`는 웹·실습 기기 연결 코드입니다.
원본 ImGui 데스크톱 화면을 픽셀 단위로 복제한 것은 아닙니다.

## 제공되는 기능

- NO/NC, 상승·하강 접점, OUT/SET/RST, TON/CTU, 가로선·세로 분기, 응용 명령 입력.
- 원본 컴파일러의 명령·피연산자 검사, 회로 오류 위치, 원본 실행 코어와 현재값 모니터.
- 편집 실행 취소·다시 실행, 영역 복사·붙여넣기, 행 추가·삭제·이동, 회로 메모.
- 가상 입력을 사용하는 단독 테스트 및 100ms 단위 1 스캔 실행.
- 작업형 실습 PLC 선택, 쓰기·읽기·RUN·STOP, 실습 배선 모니터.
- 기기별 독립 프로그램·메모리, 쓰기 후 STOP, 초안과 설치 프로그램 분리.
- JSON 저장과 GX CSV 읽기·내보내기(UTF-16LE 포함).
- PC 및 모바일용 래더 확장 화면, 300ms 홀드 삽입·수정, 드래그 이동.
- 사용한 P00~P0F 입력과 P20~P2F 출력만 표시하는 간이 테스트 모달.
- 77~80회 과년도 문제 25장 뷰어와 직접 작성한 검증용 래더 예제.
  이미지 원본은 `problems/plc/README.md`에 설명한 사용자 제공 학습 자료이며,
  GPL 실행 코어의 원본 자료가 아닙니다.

## 웹 이식의 범위

- 프로그램은 최대 256행, 2~32열입니다. 기본 화면은 12열입니다.
- X/Y는 원본의 8진수 주소를 사용합니다. 모듈의 P00~P0F / P20~P2F
  표기는 X0~X17 / Y0~Y17 별칭입니다. 응용 명령 내부의 P는 원본 분기
  포인터이므로 응용 명령의 입출력에는 X/Y를 사용합니다.
- 원본 전체 명령 디스패치는 포함하지만, 웹에서 실제 장비의 통신·모션·확장
  모듈 설정 API를 제공하지 않습니다. 작업형 실습의 가상 PLC 16입력·16출력과 연결합니다.
- `.plcproj` ZIP 프로젝트 전체(배선·HMI·RTL)와 레거시 XML은 가져오지 않습니다.
  원본에서 래더를 GX CSV로 내보내면 지원 범위에서 가져올 수 있습니다.
- CSV는 실행 명령을 보존하고 화면 배치를 다시 구성합니다. 래핑 표식,
  비연속 수직 버스, 웹 그리드로 의미를 보존할 수 없는 분기는 오류로 거절합니다.
  회로 메모를 보존하려면 JSON을 사용합니다.
- 세로 분기에 연결된 행의 순서 이동은 회로 의미가 바뀌지 않도록 거절합니다.
- RUN 상태와 실행 중 메모리는 저장하지 않습니다. 저장본을 열면 STOP에서 시작합니다.
- RTC 명령은 원본의 실제 시계를 사용하고, 스캔·타이머 시간은 웹 시뮬레이션
  경과시간을 사용합니다. 실제 제어기와 같은 실시간 동작 보장은 없습니다.

## 포함된 라이선스

- PLC_Simulator / 웹 이식: GPL-3.0, `LICENSE` 및 `native/upstream/LICENSE`.
- Emscripten 런타임: MIT 및 University of Illinois/NCSA 계열 조건.
  [포함된 라이선스](EMSCRIPTEN-LICENSE.txt)와 [저작자 목록](EMSCRIPTEN-AUTHORS.txt).
  컴파일러 SDK는 앱에 포함하지 않습니다.
