plc로 하는 가위 바위 보 게임 , 난수 발생 후 수 추출 후 데이터 레지스터에 저장 추출

2024. 4. 24. 16:55충남 인력개발원/plc (GX Works)

 

교수님 조건

PLC와 가위 바위 보하기
PLC손 값은 0~2까지 매우 빠른 속도로 회전된다.
b은 주먹, 1은 가위, 2는 보로 정의하고, 사용자는 PB1은 주먹, PB2는 가위, PB3은 보로 정의한다.
사용자가 PB1~PB3중 하나를 누르면 승패, 비김을 램프1(승), 램프2(짐), 램프3(비김)으로 표시하고 PB4를 누르면 

다시 게임을 할 수 있도록 프로그램 한다.


PLC (Programmable Logic Controller)를 이용해 간단한 가위 바위 보 게임을 구현하는 방법에 대한 개요를 제공하겠습니다. 이 게임은 사용자 입력(PB1, PB2, PB3, PB4), PLC의 랜덤 손 값, 그리고 승패를 나타내는 램프(Lamp1, Lamp2, Lamp3)를 포함합니다.

1단계: 하드웨어 설정
입력 장치: PB1, PB2, PB3은 각각 주먹, 가위, 보를 선택하는 버튼으로 설정합니다. PB4는 게임 재시작 버튼입니다.
출력 장치: Lamp1, Lamp2, Lamp3은 각각 승, 짐, 비김을 나타내는 램프로 설정합니다.
2단계: PLC 프로그래밍
PLC 프로그램은 다음과 같은 로직을 따릅니다:

PLC 손 값 설정: PLC는 0에서 2까지의 값을 매우 빠르게 순환하게 설정합니다. 이는 타이머 또는 고속 카운터를 사용하여 구현할 수 있습니다.
사용자 입력 감지: 사용자가 PB1, PB2, PB3 중 하나를 누를 때까지 PLC는 계속 값을 순환합니다. 입력이 감지되면 현재 PLC의 손 값과 비교하여 결과를 결정합니다.
결과 계산 및 출력: 사용자의 선택과 PLC의 손 값을 비교하여 승패를 결정하고, 해당 결과에 따라 Lamp1, Lamp2, 또는 Lamp3을 켭니다.
예: 사용자가 주먹(PB1)을 선택하고 PLC의 손 값이 가위(1)일 경우, 사용자 승(Lamp1 켜짐)
게임 재시작: 사용자가 PB4를 누르면, 게임을 재시작합니다. 모든 램프를 초기 상태로 리셋하고, PLC 손 값 순환을 다시 시작합니다.
3단계: 래더 다이어그램 구현
래더 로직 프로그램은 다음과 같은 기본 구성 요소로 만들어집니다:

비교 블록: 사용자 입력과 PLC 손 값 비교
출력 블록: 각 결과에 따라 램프 제어
타이머/카운터 블록: PLC 손 값 순환 제어
버튼 입력 블록: 사용자 입력 감지
마무리
이 프로젝트는 기본적인 PLC 프로그래밍 기술과 디지털 입출력 제어를 활용하는 좋은 예시입니다. 게임 로직을 래더 다이어그램으로 구현하기 전에 각 구성 요소의 동작을 정확히 이해하고 계획하는 것이 중요합니다. 이를 통해 PLC 기반 시스템의 인터랙티브한 애플리케이션 개발 경험을 쌓을 수 있습니다.


(1) 모든 정점 데이터에 +1을 실행합니다.
데이터 5678 (BIN)에 +1을 하면 5679 (BIN)이 됩니다.
(2) 모든 정점 데이터의 내용이 -32768일 때 INC, INCP를 실행하면, -32768(0)으로 고정된 데이터에 정점됩니다.
두 번째 이미지에서는 "INC, DEC" 명령어와 "INCP, DECP" 명령어의 비교 그래프를 보여주며, 사용되는 데이터 타입이나 조건 등에 대한 설명을 하고 있습니다.

INC (+1), DEC (-1)는 설정된 데이터에 +1 또는 -1을 실행하는 명령어입니다.
INCP, DECP는 조건에 맞게 증가시키거나 감소시키는 명령어입니다.
상자의 오른쪽에 있는 기호는 조건이 충족될 때만 INC/DEC가 실행됨을 나타냅니다.

표에서는 명령어가 적용되는 데이터 타입을 나타냅니다:

단위 데이터는 기본적으로 정수를 나타내며,
비트는 0 또는 1의 상태를 가질 수 있는 단일 데이터 비트를 나타냅니다.
입력으로 표시된 것은 INC/DEC 명령어가 적용될 때 조건 입력을 나타냅니다.

 

 

INC (증가)와 DEC (감소) 명령어는 PLC 프로그래밍에서 다양한 상황에서 활용될 수 있습니다. 특히, 반복적인 작업, 순차적인 프로세스 제어, 카운팅, 데이터 조작과 같은 상황에서 유용합니다. 몇 가지 예시를 들어보겠습니다:

카운팅 응용:
제품이 컨베이어 벨트를 지날 때마다 카운터 값을 증가시켜 제품의 총량을 계산할 때.
특정 조건(예: 센서 입력)이 충족될 때마다 카운터 값을 증가시켜 특정 이벤트 발생 횟수를 추적할 때.
순차 제어 응용:
복잡한 기계의 단계별 작동을 제어할 때 각 단계를 나타내는 숫자를 증가시키거나 감소시키는 데 사용할 수 있습니다.
프로세스의 다음 단계로 이동하기 전에 특정 조건들이 충족되었는지 확인할 때.
데이터 관리:
데이터 레지스터의 값들을 조작하거나 배열의 인덱스를 순차적으로 증가시킬 때 사용할 수 있습니다.
반복 루프 안에서 배열의 각 요소에 접근하거나 조작할 때.
타이머와 연동:
타이머가 설정한 시간에 도달했을 때, 특정 변수의 값을 증가시켜 시간 경과에 따른 작업을 실행할 수 있습니다.
일정 시간 간격으로 데이터 로그를 기록하거나 상태를 업데이트할 때 사용할 수 있습니다.
사용자 인터페이스와 상호작용:
HMI (Human-Machine Interface)와 연결된 버튼을 통해 사용자의 입력에 따라 값을 증가시키거나 감소시킬 때.
사용자가 메뉴 항목을 선택하거나 설정 값을 조정할 때.
INC와 DEC 명령어는 단순하지만 다재다능하여, 프로그래머가 시스템의 요구사항에 따라 다양하고 복잡한 프로세스를 효율적으로 구현할 수 있게 해 줍니다.

 

전통적인 PLC 프로그래밍에서, 비트 수를 지정하려면 다른 구문이나 명령어를 사용하게 됩니다. 예를 들어:

4비트 데이터 타입에 '1' 값을 할당하고 싶다면, 레지스터의 비트 수에 맞춰 적절한 데이터 타입을 선택하고 "MOV K1" 명령어를 사용할 수 있습니다.
8비트 데이터 타입에 '2' 값을 할당하고 싶다면, 해당되는 8비트 레지스터를 지정하고 "MOV K2"를 사용할 것입니다.

 

mov명령어 사용시 k를 사용한 메모리 할당의 방법

 

 

ROL(rotate left)

MO 명령을 실행하면 D0에 1값이 저장됩니다.
SM410(0.1초 클록)은 0.1초마다 발생하는 타이머 펄스를 나타냅니다.
ROL 명령은 SM410에 의해 0.1초마다 한 번씩 실행되어 D0 내의 1비트 값을 왼쪽으로 이동시킵니다.


D0의 값은 MOV 명령을 통해 K4Y20 코일(120번지부터 Y27까지의 코일)로 전송되며, 

이는 니블 단위의 출력을 의미합니다.


위의 설명은 PLC에서 비트 이동 명령어를 사용하여 특정 데이터 레지스터 내의 비트들을 주기적으로 회전시키는 과정을 나타내며, 이를 통해 다양한 제어 및 표시 기능을 구현할 수 있습니다. 


이 방법은 특히 LED나 디지털 디스플레이 같은 단말기에서 다양한 출력 패턴을 생성할 때 사용됩니다.

 

가위 , 바위 , 보 래더

 

plc 프로그램과 인간 조작자가 함께 게임하는 기반의 프로그램

 

가위바위보 : 연속승수 (1-3까지 카운팅 되면서 3번 연속으로 인각조작자의 승리시 리셋 가능하게끔 램프(연속승램프)가 점등된다) 이후 리셋버튼을 누르면 램프가 소등되고 게임은 초기 세팅으로 돌아간다

버튼 빨리 누르기 프로그램

1초동안 누르는 버튼의 값을 저장하여 세그먼트 블록 카운터에 값을 출력하여 준다

 


로또 번호 생성기를 PLC 프로그래밍으로 구현하려면 다음과 같은 단계를 따를 수 있습니다. PLC는 통상적으로 진정한 무작위성을 생성하지 않기 때문에, 주어진 예시는 의사 랜덤 방식을 사용할 것입니다.

1단계: 하드웨어 설정
입력: PB1 (로또 번호 생성), PB2 (값 초기화)
출력: D0~D6 (로또 번호를 저장할 데이터 레지스터)
2단계: 프로그램 로직 설계
PB1 로직:
PB1이 눌러질 때, 시드 값을 기반으로 한 랜덤 함수를 실행합니다. PLC에서는 진정한 랜덤 함수가 없으므로, 타이머 값, 카운터 값 또는 날짜/시간을 이용하여 랜덤과 유사한 값을 생성할 수 있습니다.
생성된 랜덤 값을 1~45 범위로 제한하기 위해 적절한 계산을 적용합니다. 예를 들어, 랜덤 값을 45로 나눈 나머지에 1을 더할 수 있습니다.
중복 번호가 없도록 확인하면서 D0~D6에 번호를 저장합니다.
PB2 로직:
PB2가 눌러질 때, D0~D6을 0으로 초기화합니다.
3단계: 래더 다이어그램 구현
랜덤 값 생성: 특정 연산을 통해 생성된 의사 랜덤 값을 사용합니다.
중복 확인: 비교 연산자를 사용하여 D0~D6 사이에 중복된 값이 없는지 확인합니다.
번호 저장: 중복이 없을 경우, 생성된 번호를 D0~D6에 저장합니다.
초기화: PB2 입력이 활성화되면 D0~D6의 값을 0으로 리셋합니다.
4단계: 테스트 및 최적화
프로그램을 업로드하고, 실제 하드웨어에서 테스트를 수행합니다.
필요한 경우 로직을 조정하여 정확성을 높입니다.
이러한 과정을 통해 로또 번호 생성기 기능을 PLC 프로그램으로 구현할 수 있습니다. 실제 구현에서는 PLC의 프로그래밍 언어와 사용 가능한 함수, 그리고 특정 PLC 모델의 기능에 따라 구현 방법이 다를 수 있음을 참고해야 합니다.


 

33번 줄에 각 램덤수 데이터레지스트 안에 <> "같지 않음" 연산자를 사용하여 동일한값이

나오는 부분을 앞단에서 방지 시켜주었다(두 값이 서로 다를 때 참(TRUE)이 되는 비교)

 

D 레지스터(데이터 레지스터)의 값과 같지 않을 때만 다음 연산으로 넘어가도록 합니다

 

펄스상승 연산자를 활용하여 

inc연산자와 mov연산자를 결합하여 래더회로를 구성하여 fmov는 n개로(7개) 나눠준후 리셋시켜라

fmov의 k7 부분은 경우의 수에 따라 유연하게 변경될수있다(해당 난수 발생 케이스의 경우에는 총7개의 데이터 레지스터를 사용하였기 때문에 7로 세팅한다) 

 

pb2로 리셋시킨후 난수를 새롭게 세팅할수 있다

 

확인은 디바이스 버퍼에서 한다

 

<>연산자
난수는 rnd 연산자로도 발생시킬수 있다