PLCでもぐらたたき

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      ]



```