PLC(三菱MELSEC-Fシリーズ)を触る機会があり作ってみたので、記念に残してみるテスト。
直す余地は大量にありそうな気はするものの、もう触る機会は今後ないので修正はされない模様。
仕様
- 開始時Y0〜Y3(ランプを想定)をすべてONにする
- 開始1秒以降にX0(ボタンを想定)をONにするとY0〜Y3をすべてOFFにしてスタート
- スタートしたら0.5秒後にランダムに決定したY0〜Y3のうちどれか1つYaをONにする
- Yaに対応するX0〜X3をON(Y0がONならX0をON、Y1がONならX1をON...)にすると得点を+1してYaをOFFに
- 対応しないX0〜X3をONにした場合は誤答数を+1する(引き続きYaはONのまま)
- 指定時間(レベルにより異なる)内に対応するX0〜X3がONにならなかった場合誤答数を+1してYaをOFFに
- YaがOFFになれば0.5秒後にランダムに決定したYaをONにする(4行目へ戻って下記ゲームオーバーまで繰り返し)
- 指定した得点に達した場合はレベルを+1し、YaがOFFになるまでの指定時間を短縮する
- 指定した誤答数に達した場合はゲームオーバーとしてY0〜Y3をすべてONにする
- ゲームオーバーから3秒後にX0をONにすると、Y0〜Y3をすべてOFFにし、得点・レベル・誤答数等を初期化して再スタート(3行目へ)
ラダー図
PLCモグラたたき(モニタモードにすると得点表示するよ)
|
| M8001
0|----| |----------------------------------------------[MOV K0 D20 ]
| 表示用 | 得点
| |
| |-------------------------------------------[MOV K0 D30 ]
| | レベル
| |
| --------------------------------------------[MOV K0 D10 ]
| 誤答数
|
|
乱数を取得s(M1はRND命令M90は線形合同法)
|
| M0 M60
16|----| |--------|/|----------------------------------[PLF M1 ]
| 乱数開始 GAMEOVER 乱数取得
|
|
RND命令で乱数の取得
|
| M1
20|----| |----------------------------------------------[RND D0 ]
| 乱数取得 | 乱数
| |
| --------------------------------------------[SET M2 ]
| 剰余計算
|
|
答えを4通りにするために乱数を基に剰余を求める
|
| M2
25|----| |------------------------------------------[DIV D0 K4 D1 ]
| 剰余計算 | 乱数 商
| |
| |-------------------------------------------[SET M3 ]
| | 回答表示
| |
| --------------------------------------------[RST M2 ]
| 剰余計算
|
|
乱数の剰余から表示するランプの設定
|
| M3
35|----| |----[= D2 K0 ]--------------------------[SET M20 ]
| 回答表示 | 剰余 PL1
| |
| |-[= D2 K1 ]--------------------------[SET M21 ]
| | 剰余 PL2
| |
| |-[= D2 K2 ]--------------------------[SET M22 ]
| | 剰余 PL3
| |
| |-[= D2 K3 ]--------------------------[SET M23 ]
| | 剰余 PL4
| |
| |-------------------------------------------[SET M30 ]
| | タイマ設定
| |
| --------------------------------------------[RST M3 ]
| 回答表示
|
|
時間切れのタイマーを設定
|
| M60 M30 D40
67|----|/|--------| |----------------------------------------------(T0 )
| GAMEOVER タイマ設定 時間切れ
|
|
ボタン入力の処理と正答誤答のカウント
|
| M60 M10 M20
72|----|/|--------| |-------| |-----------------------[SET M40 ]
| GAMEOVER | PB1 | PL1 | 回答処理
| | | |
| | | ----------------------[INCP D20 ]
| | | 得点
| | | M20
| | -----|/|------------------------[INCP D10 ]
| | PL1 誤答数
| |
| | M11 M21
| |----| |-------| |------------------------[SET M40 ]
| | PB2 | PL2 | 回答処理
| | | |
| | | ----------------------[INCP D20 ]
| | | 得点
| | | M21
| | -----|/|------------------------[INCP D10 ]
| | PL2 誤答数
| |
| | M12 M22
| |----| |-------| |------------------------[SET M40 ]
| | PB3 | PL3 | 回答処理
| | | |
| | | ----------------------[INCP D20 ]
| | | 得点
| | | M22
| | -----|/|------------------------[INCP D10 ]
| | PL3 誤答数
| |
| | M13 M23
| -----| |-------| |------------------------[SET M40 ]
| PB4 | PL4 | 回答処理
| | |
| | ---------------------[INCP D20 ]
| | 得点
| | M23
| -----|/|-----------------------[INCP D10 ]
| PL4 誤答数
|
|
時間内にボタンが押されなかった処理、誤答としてカウント
|
| T0 M40
125|----| |--------|/|----------------------------------[INCP D10 ]
| 時間切れ 回答処理 | 誤答数
| |
| ---------------------------------[SET M40 ]
| 回答処理
|
|
正解または時間切れなのでいったん消灯して0.5秒待ち
|
| M60 M40
131|----|/|--------| |----------------------------------[RST M20 ]
| GAMEOVER 回答処理 | PL1
| |
| |--------------------------------[RST M21 ]
| | PL2
| |
| |--------------------------------[RST M22 ]
| | PL3
| |
| |--------------------------------[RST M23 ]
| | PL4
| | K5
| ---------------------------------------------(T1 )
| 次問題待
|
|
0.5秒経ったので初期化して次の問題へ
|
| T1
140|----| |----------------------------------------------[SET M50 ]
| 次問題待 初期化
|
|
問題の初期化処理
|
| M50
142|----| |----------------------------------------------[RST M30 ]
| 初期化 | タイマ設定
| |
| |-------------------------------------------[RST M40 ]
| | 回答処理
| |
| |-------------------------------------------[RST M50 ]
| | 初期化
| |
| --------------------------------------------[PLF M0 ]
| 乱数開始
|
|
一定数正解した場合のレベルアップの処理
|
148|-[>= D20 D50 ]--[< D20 D51 ]------------------------[MOV K1 D30 ]
| 得点 LV1点 得点 LV2点 | レベル
| |
| ------------------------[MOV D6 D40 ]
| LV1時 TO時間
|
168|-[>= D20 D51 ]--[< D20 D52 ]------------------------[MOV K2 D30 ]
| 得点 LV2点 得点 LV3点 | レベル
| |
| ------------------------[MOV D62 D40 ]
| LV2時 TO時間
|
188|-[>= D20 D52 ]--[< D20 D53 ]------------------------[MOV K3 D30 ]
| 得点 LV3点 得点 LV4点 | レベル
| |
| ------------------------[MOV D63 D40 ]
| LV3時 TO時間
|
208|-[>= D20 D53 ]---------------------------------------[MOV K4 D30 ]
| 得点 LV4点| レベル
| |
| ----------------------------------------[MOV D64 D40 ]
| LV4時 TO時間
|
|
一定数誤答した場合のゲームオーバーの処理、全部ランプ点灯して待ち
|
223|-[>= D10 D70 ]-------------------[SET M60 ]
| 誤答数 誤答終了 GAMEOVER
| M60
229|----| |----------------------------------------------[SET M20 ]
| GAMEOVER | PL1
| |
| |-------------------------------------------[SET M21 ]
| | PL2
| |
| |-------------------------------------------[SET M22 ]
| | PL3
| |
| |-------------------------------------------[SET M23 ]
| | PL4
| | D80
| --------------------------------------------------------(T2 )
| GO待ち
|
|
ゲームオーバー後のボタン入力待ち
|
| M10 M60 T2
237|----| |--------| |--------| |----------------------[RST M20 ]
| PB1 GAMEOVER GO待ち | PL1
| |
| |-------------------[RST M21 ]
| | PL2
| |
| |-------------------[RST M22 ]
| | PL3
| |
| |-------------------[RST M23 ]
| | PL4
| |
| |-------------------[MOV K0 D10 ]
| | 誤答数
| |
| |-------------------[MOV K0 D20 ]
| | 得点
| |
| |-------------------[MOV K0 D30 ]
| | レベル
| |
| |-------------------[MOV D60 D40 ]
| | LV0時 TO時間
| |
| |-------------------[MOV K30 D80 ]
| | GO待ち
| |
| |-------------------[SET M50 ]
| | 初期化
| |
| --------------------[RST M60 ]
| GAMEOVER
|
|
ゲームの初期化
|
| M70
271|----| |----------------------------------------------[MOV K10 D50 ]
| 初期設定 | LV1点
| |
| |-------------------------------------------[MOV K50 D51 ]
| | LV2点
| |
| |-------------------------------------------[MOV K80 D52 ]
| | LV3点
| |
| |-------------------------------------------[MOV K100 D53 ]
| | LV4点
| |
| |-------------------------------------------[MOV K30 D60 ]
| | LV0時
| |
| |-------------------------------------------[MOV K20 D61 ]
| | LV1時
| |
| |-------------------------------------------[MOV K15 D62 ]
| | LV2時
| |
| |-------------------------------------------[MOV K10 D63 ]
| | LV3時
| |
| |-------------------------------------------[MOV K5 D64 ]
| | LV4時
| |
| |-------------------------------------------[MOV K10 D70 ]
| | 誤答終了
| |
| |-------------------------------------------[MOV K10 D80 ]
| | GO待ち
| |
| |-------------------------------------------[MOV K1 D0 ]
| | 乱数
| |
| |-------------------------------------------[SET M60 ]
| | GAMEOVER
| |
| --------------------------------------------[RST M70 ]
| 初期設定
|
|
PLC電源投入時の初期処理
|
| M80
334|----| |----------------------------------------------[SET M70 ]
| スタート 初期設定
| M8000
336|----| |----------------------------------------------[PLS M80 ]
| スタート スタート
|
|
ボタンを補助リレーに紐づけ、あと適当にインターロック
|
| X0000 X0001 X0002 X0003
339|----| |--------|/|--------|/|--------|/|-----------[PLF M10 ]
| PB1 PB2 PB3 PB4 PB1
| X0001 X0000 X0002 X0003
345|----| |--------|/|--------|/|--------|/|-----------[PLF M11 ]
| PB2 PB1 PB3 PB4 PB2
| X0002 X0000 X0001 X0003
351|----| |--------|/|--------|/|--------|/|-----------[PLF M12 ]
| PB3 PB1 PB2 PB4 PB3
| X0003 X0000 X0001 X0002
357|----| |--------|/|--------|/|--------|/|-----------[PLF M13 ]
| PB4 PB1 PB2 PB3 PB4
|
|
ランプを補助リレーに紐づけ
|
| M20
363|----| |----------------------------------------------------------(Y0000 )
| PL1 PL1
| M21
365|----| |----------------------------------------------------------(Y0001 )
| PL2 PL2
| M22
367|----| |----------------------------------------------------------(Y0002 )
| PL3 PL3
| M23
369|----| |----------------------------------------------------------(Y0003 )
| PL4 PL4
|
|
RND命令がない場合は線形合同法を使おう
|
| M90
371|----| |----------------------------------------[DMUL K717 D0 D90 ]
| 線形合同 | 乱数 A*X
| |
| |-------------------------------------[DADD D90 K17 D92 ]
| | A*X A*X+B
| |
| |-------------------------------------[DDIV D92 K8191 D100 ]
| | A*X+B 商
| |
| |-[< D102 K0 ]----------------[DMUL D102 K-1 D102 ]
| | 剰余 剰余 剰余
| |
| |-------------------------------------[MOV D102 D0 ]
| | 剰余 乱数
| |
| --------------------------------------------[SET M2 ]
| 剰余計算
|
437|------------------------------------------------------------------[END ]