PLC 래더를 소재로 퍼즐 게임을 하나 만들었습니다.
설비 사양을 읽고 래더를 짜서 그대로 동작시키면 통과하는 방식입니다.
아래 주소로 들어가면 바로 시작됩니다.
설치도 가입도 없고 돈도 안 듭니다.

왜 만들었나
PLC를 배우려고 보면 선택지가 늘 두 갈래였습니다.
문제집은 객관식이라 회로를 직접 짜 볼 일이 없고, 실기 장비나 상용 소프트웨어는 시작하는 비용이 만만치 않습니다.
그 중간이 없더군요.
틀려도 아무 일 안 생기는 가상 현장에서 회로를 짜 보고, 움직이는 걸 눈으로 확인하고, 사양대로 됐는지 자동으로 판정받는 자리 말입니다.
그래서 만들었습니다.
실기와 같은 것
만들면서 하나는 양보하지 않기로 했습니다.
여기서 짠 회로가 실기에서도 그대로 돌아야 한다는 것입니다.
게임이니까 이 정도는 간단히 하자는 유혹이 꽤 있었는데, 거기서 한 번 타협하면 배운 게 오히려 잘못된 습관으로 남습니다.
스캔 순서
1스캔은 입력 리프레시, 프로그램 연산, 출력 리프레시 순서로 돕니다.
연산은 위에서 아래로, 렁 안에서는 왼쪽에서 오른쪽으로 갑니다.
이 순서 때문에 생기는 일 세 가지를 그대로 뒀습니다.
- 스캔 도중에 센서가 바뀌어도 그 스캔 연산에는 안 들어갑니다.
- 위 렁이 쓴 값은 아래 렁이 같은 스캔에서 봅니다.
- 반대로 아래 렁이 쓴 값을 위 렁이 보려면 한 스캔을 더 기다려야 합니다.
세 번째가 특히 많이들 걸리는 자리입니다.
현장에서도 "분명 맞게 짰는데 한 박자 늦게 동작한다"는 게 대개 여기서 나옵니다.
그래서 없애지 않고 오히려 문제로 냈습니다.
디바이스 주소
X, Y, M, SM, T, C, D를 씁니다.
입력, 출력, 내부 릴레이, 특수 릴레이, 타이머, 카운터, 데이터 레지스터입니다.
특수 릴레이는 미쓰비시 계열 PLC인 멜섹(MELSEC)의 실제 번호를 그대로 가져왔습니다.
상시 ON이 SM400, 1초 클럭이 SM412입니다.
여기서 외운 번호가 실기 가서 안 통하면 곤란하니까요.
클럭은 시계가 아니라 스캔 수로 셉니다.
1스캔이 10밀리초라 주기가 스캔 수로 딱 떨어지고, 정지를 누르면 클럭 위상까지 처음으로 돌아갑니다.
같은 회로를 몇 번을 돌려도 결과가 똑같습니다.
타이머와 카운터
타이머는 따로 배우는 소자가 아닙니다.
코일 대상을 T0으로 잡고 설정값을 30으로 주면 그게 타이머입니다.
실기에서 OUT T0 K30이라고 쓰는 그 형태 그대로입니다.
카운터도 마찬가지입니다.
소자 팔레트에 새 그림이 생기지도 않고, 접점으로 받아 쓰는 방식도 그대로입니다.
조건 없는 렁
가로 연결만으로 좌모선과 코일을 이으면 코일이 항상 켜질 것 같지만 안 켜집니다.
실기 래더에서 조건 없는 렁은 프로그램으로 성립하지 않아서 변환 자체가 안 되기 때문입니다.
항상 ON인 조건이 필요하면 상시 ON 특수 릴레이의 A접점을 씁니다.
실기에서 쓰는 방법 그대로입니다.
어떻게 푸나
라운드에 들어가면 현장 설명과 요구 동작, I/O 할당표, 검사 항목이 먼저 나옵니다.
검사 항목은 이름과 목적을 미리 다 보여줍니다.
숨겨 둔 조건으로 갑자기 떨어뜨리는 일은 없습니다.

편집은 정지 상태에서만 됩니다.
팔레트에서 소자를 골라 격자에 놓으면 됩니다.
재생을 누르면 설비가 움직이고, 전기가 흐르는 길이 래더 위에 초록색으로 표시됩니다.
어디까지 흐르다 멈추는지가 보이니까 어느 칸이 문제인지 금방 잡힙니다.
일시정지하고 스텝을 누르면 딱 1스캔만 갑니다.
값이 스캔마다 어떻게 바뀌는지 한 칸씩 따라갈 수 있어서, 앞에서 말한 한 스캔 지연 같은 것도 눈으로 확인됩니다.
검증을 누르면 그 라운드 검사 항목이 전부 돌고 합격 여부가 나옵니다.
떨어지면 어느 시점에서 어긋났는지 신호 타임라인으로 짚어 줍니다.
판정은 겉으로 보이는 신호만 봅니다.
자기유지로 풀든 SET과 RST로 풀든 출력 타임라인만 맞으면 통과입니다.
정답 회로를 하나로 정해 두지 않았습니다.
실무에서도 답이 하나는 아니니까요.
통과한 다음
클리어하면 숫자 세 개가 남습니다.
쓴 소자 수, 쓴 렁 수, 검사를 통과하는 데 걸린 스캔 수입니다.
이 셋은 일부러 같이 줄지 않게 짰습니다.
스캔을 줄이려고 병렬로 돌리면 소자와 렁이 늘고, 소자를 아끼려고 순차로 가면 스캔이 늡니다.
어느 쪽을 깎을지 정하고 다시 푸는 게 두 번째 재미입니다.
저도 만들어 놓고 제가 세운 기록을 못 깨는 라운드가 몇 개 있습니다.
지금 들어 있는 내용
기초 모드가 7챕터 24라운드입니다.
- 단일 실린더 셀 - 코일, 자기유지, SET과 RST, 센서 되먹임
- 엣지와 원샷 - 상승 엣지, 하강 엣지, 토글, 사이클 완결
- 안전과 인터락 - 비상정지 우선순위, 상호 배타, 재기동 금지
- 시간과 신호 - 클럭 특수 릴레이, 주기 신호
- 기다림과 셈 - 타이머, 카운터
- 수와 견줌 - 데이터 레지스터, 비교 명령
- 쌓임과 나눔 - 사칙연산

앞 라운드를 통과해야 다음이 열립니다.
챕터 1에만 라운드를 여섯 개 넣었는데, 자기유지가 처음 넘는 벽이라 그렇습니다.
그 앞에는 전기가 흐르는 것만 구경하는 라운드도 하나 뒀습니다.
기초 말고 미로 모드도 10라운드 있습니다.
래더로 드론을 조종해서 목적지까지 길을 찾는 내용입니다.
튜토리얼 빼고는 전부 서로 다른 미로를 두 개 이상 검사하기 때문에, 방향 순서를 외워 넣는 식으로는 통과가 안 됩니다.
미로 모드에는 라운드 말고 샌드박스도 있습니다.
숫자를 하나 넣으면 그 숫자로 미로가 만들어지고, 같은 숫자를 다시 넣으면 언제든 같은 미로가 다시 나옵니다.
크기는 5x5와 7x7 두 가지입니다.
목표가 도착 하나뿐이라 정답을 맞히는 자리가 아니라 짜 둔 회로를 시험해 보는 자리입니다.
신호등 모드는 4라운드입니다.
교차로 신호기를 짜서 차와 사람을 지나가게 하는 내용입니다.
빨강과 초록을 서로 배타로 내는 것부터 시작해서, 노란 불을 사이에 두는 것, 보행 신호와 겹치지 않게 나누는 것, 두 축을 번갈아 여는 것까지 갑니다.
상충하는 방향을 동시에 열거나 사람이 건너는 자리에 차를 들이면 그 자리에서 재생이 멈추고 그 검사는 떨어집니다.
세 모드 다 처음부터 열려 있습니다.
플레이 환경
브라우저만 있으면 됩니다.
서버에 뭘 저장하지 않아서 계정도 로그인도 없습니다.
기록은 사용하는 기기의 브라우저에만 남습니다.
한 번 열어 두면 인터넷이 끊겨도 그대로 오프라인으로 플레이가 됩니다.
가로화면, 세로화면 모두 지원하며 스마트폰에서도 플레이 할 수 있습니다.
실제 PLC와 통신하지는 않습니다.
산업용 통신 규약을 사용하지 않고 장비에 실제로 붙지도 않습니다.
전부 브라우저 안에서만 실행되는 모의 실행입니다.
아직 개발중입니다
계속 기능을 개발하며 다듬고 있습니다.
어느 라운드가 지나치게 어려운지, 설명이 부족한 데가 어딘지 댓글로 알려 주시면 반영하겠습니다.
어딘가에서 막히셨다면 어디까지는 이해가 됐고 어디서 걸렸는지 적어 주시면 다음 수정에 크게 도움이 됩니다.