【応用】PLC(シーケンサ)によるシーケンス制御を用いた将棋ゲーム制作 ーGX Works3ー

f:id:vv_6ong_3ka_cp:20201214062841p:plain

皆様はシーケンス制御というものをご存じでしょうか?

シーケンス制御とは、あらかじめ定められた順序または手続きに従って制御の各段階を逐次進めていく制御を言い、身近なものでいうとエレベータや洗濯機などがシーケンス制御にあたります。

① あらかじめ定められた順序または手続き
エレベータ:上ボタンか下ボタンを押す
洗濯機  :洗濯する? すすぎする? 脱水する?

② 制御の各階段を逐次進めていく
エレベータ:押されたボタンの階層にエレベータが迎えに行く
      迎えに行ったらエレベータ内のボタンが押され、目標とする階層へ行く
洗濯機  :洗濯を指定時間行い、すすぎを指定回数行い、脱水を指定時間行う

このように説明するとイメージが湧くかなぁと思います。

シーケンス制御はFA(ファクトリーオートメーション:工場の自動化)機械設備で多く用いられており、シーケンス制御をプログラム実行するCPUをPLC(シーケンサ)と呼んでおります。

工場内の自動機械設備で用いられるPLC(シーケンサ)のシーケンス制御を使用して将棋ゲーム制作に応用したものを紹介します。

ゲームの製作にはC#やJava、Viusal Basicなどが用いられるかと思いますが、あえて自動機械設備で用いられるPLC(シーケンサ)のシーケンス制御で将棋ゲームを作成するのは、工場内の自動機械設備というクローズな空間で行われている制御方式を皆さんに知ってほしいのと、どのようなプログラミング言語であれ自身の創意工夫によって様々なことができるようになることを知って欲しいからです。

C#やJavaに触れたことがないのですが、C言語のような処理は基本的に上から処理し、リアルタイムLinuxで使用した場合、命令で条件が成立しないとプログラムが待ちになったか思います。 ※ならなかったらすみません。

シーケンサ制御で使われるラダー言語というものも基本的には上から処理されますが、条件が成立しなくても演算は他でも行われるようになっており、プログラムの待ちが出ないような仕組みになっています。

C言語などはシングルタスク、ラダー言語はマルチタスクと考えてもらえればわかりやすいかと思います。

当然、シングルタスクよりマルチタスクの方が多くの処理を同時に行えるため良いのですが、ゲーム製作ではラダー言語のマルチタスクが仇となり、あえてマルチタスクの利点を制限しながらプログラムしなければうまくゲームは作れません

そのようなプログラムの違いも見てもらえると面白いかと思います。

ゲーム製作をしたことが無い人が思い込みやすいのは、プログラミング言語にはすでに素晴らしい命令があり、それを使えばゲームを簡単に作れるだろう、と。

残念ながらプログラミング言語には素晴らしい命令がたくさんありますが、この命令があるからゲームが作れる訳ではありません。

料理も様々な食材を用いて美味しい一品ができるのであって、一つの食材だけで料理が完成するというわけではありません。 ※ゲームの難易度にも依りますが。

ゲーム製作は様々な処理を行うからこそ、様々な命令を使いこなし、基礎を使いこなし、応用にしていく必要があるのです。

私は普段自動機械の制御プログラム設計を行っていますが、このような製作は新たな知識習得や新しい処理の仕方などを学ぶには最適です。

私が学んだことを皆様に将棋ゲーム製作の紹介として公開していきます

広告



f:id:vv_6ong_3ka_cp:20201213143810p:plain

シーケンス制御による将棋ゲーム製作構想案

ものを作るときには、必ず何が必要となり、成果物として何ができるのか最初に考えるのが重要です。

何が必要で何ができるのか、それを考え言語化することが仕様書を作ることであり、仕様書がもの作りではとても重要となります。

デザイン設計:将棋盤

f:id:vv_6ong_3ka_cp:20201125031143p:plain

将棋盤のデザインはExcelで描きました。

見た目でわかれば良い程度なので、そんなに色合いも問題ないかと思います笑

デバイスマップ設計:将棋盤

f:id:vv_6ong_3ka_cp:20201125031156p:plain

デバイスマップは入力・出力を把握するのに重要なものとなります。

規模にも依りますが、プログラム構想を把握するにはデバイスマップを作るのが手っ取り早いでしょう。

Point1.シーケンス制御による将棋演算処理解説1
f:id:vv_6ong_3ka_cp:20201125033552p:plain

タッチパネルから盤上が押されたかという情報は16bitデータ D100に入ってきます。

1行×1列 D100 = 1
1行×2列 D100 = 2
というようにタッチパネルからPLCにフィードバックしてもらいます。

駒があるかはD5000~D5099に入っており、16進数で表現しました。

H0001は先手の金将
H0002は先手の銀将



H0020は先手の王将
H0100は後手の金将
H0200は後手の銀将



H2000は後手の玉将

16進数で表現したのは論理積で比較するときわかりやすいからです。

選択された駒の記憶を先手D110に、後手D120に格納し、移動範囲をD7100~D7399から参照し、移動可能位置の検索結果をD6000~D6099に格納します。


Point2.シーケンス制御による将棋演算処理解説2
f:id:vv_6ong_3ka_cp:20201125034727p:plain

選択駒以外の場所が盤上で押されたら、移動可能範囲と比較・照合し、一致したら移動させます。

移動処理は駒がない通常の移動と駒が取られる移動と駒が味方で動けない移動があります。



Point3.駒移動可能範囲用データベース 32ビット16進数表記

PLCの特性上、1ワードが16ビットであり、それを2つ占有することをダブルワード(32ビット)と言います。

今回は移動範囲毎に4ビットずつ使用し、
1.左横
2.左斜上
3.真上
4.右斜上
5.右横
6.右斜下
7.真下
8.左斜下

の4ビット×8箇所 = 32ビットでダブルワード使用します。

4ビットの下位ビットが1マス、全て動けるのであれば4ビット全てONの10進数15(16進数F)。

桂馬の移動は特殊なので、下位2ビットONさせて表現します。

下記画像にダブルワードの割付を表示します。

王将 H11111111
f:id:vv_6ong_3ka_cp:20201125023933p:plain

金将 H11110101
f:id:vv_6ong_3ka_cp:20201125024037p:plain

銀将 H11101010
f:id:vv_6ong_3ka_cp:20201125024215p:plain

成金(銀将) H11110101
f:id:vv_6ong_3ka_cp:20201125024232p:plain

桂馬 H20200000
f:id:vv_6ong_3ka_cp:20201125024246p:plain

成桂(桂馬) H11110100
f:id:vv_6ong_3ka_cp:20201125024300p:plain

 H0F000000
f:id:vv_6ong_3ka_cp:20201125024317p:plain

成香(香) H11110101
f:id:vv_6ong_3ka_cp:20201125024328p:plain

飛車 H0F0F0F0F
f:id:vv_6ong_3ka_cp:20201125024345p:plain

龍(飛車) H1F1F1F1F
f:id:vv_6ong_3ka_cp:20201125024402p:plain

 HF0F0F0F0
f:id:vv_6ong_3ka_cp:20201125024415p:plain

馬(角) HF1F1F1F1
f:id:vv_6ong_3ka_cp:20201125024430p:plain

 H01000000
f:id:vv_6ong_3ka_cp:20201125024440p:plain

と金(歩) H11110101
f:id:vv_6ong_3ka_cp:20201125024451p:plain

f:id:vv_6ong_3ka_cp:20201213144204p:plain



f:id:vv_6ong_3ka_cp:20201213143810p:plain


GX Works3 将棋ゲームプログラム解説

今回、将棋ゲームを作成するにあたって、
PLC:iQ-Rシリーズ
アプリケーションソフト:三菱電機 GX Works3
を使用しています。

私のラダープログラムですが、基本的な命令で構成されており、自己保持、SET、RST、FOR~NEXT、MOV、FMOVで成り立っています。

意外と基本的な命令しかつかわないため、これでゲームができるのかと思われるかもしれませんが、基本が一番大事で、基本が出来て応用ができることを忘れないで下さい。

ほとんどのプログラムに解説を入れましたので、じっくり見てもらえると嬉しいです。

駒移動範囲設定プログラム解説:駒が移動する範囲を32bitのデータレジスタDに書き込む

f:id:vv_6ong_3ka_cp:20201206211222p:plain

f:id:vv_6ong_3ka_cp:20201206211232p:plain

f:id:vv_6ong_3ka_cp:20201206211246p:plain

f:id:vv_6ong_3ka_cp:20201206211256p:plain

f:id:vv_6ong_3ka_cp:20201206211308p:plain

f:id:vv_6ong_3ka_cp:20201206211321p:plain

f:id:vv_6ong_3ka_cp:20201206211333p:plain

f:id:vv_6ong_3ka_cp:20201206211342p:plain

f:id:vv_6ong_3ka_cp:20201206211351p:plain


駒移動範囲設定プログラム実演:駒を選択するとが移動可能範囲が表示される

f:id:vv_6ong_3ka_cp:20201206214610g:plain

プログラム製作Point.必要に応じてワードレジスタをシングルワードやダブルワードを選ぶようにする!



王将 / 玉将検索プログラム解説:盤上の王将、玉将があるかを調べる

f:id:vv_6ong_3ka_cp:20201206211400p:plain

f:id:vv_6ong_3ka_cp:20201206211544p:plain


王将 / 玉将検索プログラム実演:盤上の王将、玉将があるかを調べ、なくなれば勝ちと判定する

f:id:vv_6ong_3ka_cp:20201206213714g:plain


将棋ゲーム開始プログラム解説:将棋ゲームを始める

f:id:vv_6ong_3ka_cp:20201206211558p:plain

f:id:vv_6ong_3ka_cp:20201206211613p:plain

f:id:vv_6ong_3ka_cp:20201206211627p:plain

f:id:vv_6ong_3ka_cp:20201206211708p:plain

f:id:vv_6ong_3ka_cp:20201206211721p:plain

f:id:vv_6ong_3ka_cp:20201206211746p:plain

f:id:vv_6ong_3ka_cp:20201206211757p:plain

f:id:vv_6ong_3ka_cp:20201206211812p:plain

f:id:vv_6ong_3ka_cp:20201206211825p:plain

f:id:vv_6ong_3ka_cp:20201206211838p:plain


将棋ゲーム開始プログラム実演:将棋ゲームを始め、初期位置に駒が並ぶ

f:id:vv_6ong_3ka_cp:20201206213100g:plain


先手 / 後手演算プログラム解説:先手 / 後手を切り替えるために処理する一連のフロー

f:id:vv_6ong_3ka_cp:20201206211856p:plain

f:id:vv_6ong_3ka_cp:20201206211913p:plain

f:id:vv_6ong_3ka_cp:20201206211930p:plain

f:id:vv_6ong_3ka_cp:20201206211945p:plain

f:id:vv_6ong_3ka_cp:20201206212000p:plain

f:id:vv_6ong_3ka_cp:20201206212018p:plain

f:id:vv_6ong_3ka_cp:20201206212030p:plain


先手 / 後手演算プログラム -選択駒キャンセルー 実演:選択した駒をキャンセルする

f:id:vv_6ong_3ka_cp:20201206215738g:plain


先手 / 後手演算プログラム -選択駒移動範囲検索ー 解説:選択した駒の移動範囲を演算

f:id:vv_6ong_3ka_cp:20201206212046p:plain

f:id:vv_6ong_3ka_cp:20201209034709p:plain

f:id:vv_6ong_3ka_cp:20201209034721p:plain

f:id:vv_6ong_3ka_cp:20201209034732p:plain

f:id:vv_6ong_3ka_cp:20201209034742p:plain

f:id:vv_6ong_3ka_cp:20201209034755p:plain

f:id:vv_6ong_3ka_cp:20201209034807p:plain

f:id:vv_6ong_3ka_cp:20201209034819p:plain

f:id:vv_6ong_3ka_cp:20201209034835p:plain

f:id:vv_6ong_3ka_cp:20201209034848p:plain

f:id:vv_6ong_3ka_cp:20201213060859p:plain

f:id:vv_6ong_3ka_cp:20201213060911p:plain

f:id:vv_6ong_3ka_cp:20201213060922p:plain

f:id:vv_6ong_3ka_cp:20201213060934p:plain

f:id:vv_6ong_3ka_cp:20201213060945p:plain

f:id:vv_6ong_3ka_cp:20201213060955p:plain

f:id:vv_6ong_3ka_cp:20201213061008p:plain

f:id:vv_6ong_3ka_cp:20201213061021p:plain

f:id:vv_6ong_3ka_cp:20201213061034p:plain

f:id:vv_6ong_3ka_cp:20201213061047p:plain

f:id:vv_6ong_3ka_cp:20201213061100p:plain

f:id:vv_6ong_3ka_cp:20201213061114p:plain

f:id:vv_6ong_3ka_cp:20201213061127p:plain

f:id:vv_6ong_3ka_cp:20201213061140p:plain

f:id:vv_6ong_3ka_cp:20201213061155p:plain

f:id:vv_6ong_3ka_cp:20201213061207p:plain

f:id:vv_6ong_3ka_cp:20201213061220p:plain

f:id:vv_6ong_3ka_cp:20201213061237p:plain

f:id:vv_6ong_3ka_cp:20201213061251p:plain

f:id:vv_6ong_3ka_cp:20201213061304p:plain

f:id:vv_6ong_3ka_cp:20201213061316p:plain

f:id:vv_6ong_3ka_cp:20201213061331p:plain

f:id:vv_6ong_3ka_cp:20201213061344p:plain

f:id:vv_6ong_3ka_cp:20201213061357p:plain

f:id:vv_6ong_3ka_cp:20201213061410p:plain

f:id:vv_6ong_3ka_cp:20201213061425p:plain

f:id:vv_6ong_3ka_cp:20201213061439p:plain

f:id:vv_6ong_3ka_cp:20201213061453p:plain

f:id:vv_6ong_3ka_cp:20201213061505p:plain

f:id:vv_6ong_3ka_cp:20201213141802p:plain

f:id:vv_6ong_3ka_cp:20201213141815p:plain

f:id:vv_6ong_3ka_cp:20201214053323p:plain

f:id:vv_6ong_3ka_cp:20201214053337p:plain

f:id:vv_6ong_3ka_cp:20201214053349p:plain

f:id:vv_6ong_3ka_cp:20201214053404p:plain

f:id:vv_6ong_3ka_cp:20201214053415p:plain


GOT GT Designer3 タッチパネル製作解説

メイン画面:将棋ゲームを行うためのベース画面

f:id:vv_6ong_3ka_cp:20201209040649p:plain


盤上押し場所:盤上でどこを押されたかわかるようにスイッチを配置

f:id:vv_6ong_3ka_cp:20201209041339p:plain

f:id:vv_6ong_3ka_cp:20201209042107p:plain

Point:制作者がわかりやすいように16進数や10進数を使い分けた方がデバック時に助かる!


駒表示ランプ設定:盤上で駒を表示されるためのランプを設定

f:id:vv_6ong_3ka_cp:20201209040437p:plain

f:id:vv_6ong_3ka_cp:20201209040423p:plain

Point:手間が掛かるが一つ一つ丁寧に設定する!


オーバーラップウィンドウ設定:ポップアップする画面

f:id:vv_6ong_3ka_cp:20201209043314p:plain

f:id:vv_6ong_3ka_cp:20201209043328p:plain

f:id:vv_6ong_3ka_cp:20201209043344p:plain

f:id:vv_6ong_3ka_cp:20201209043945p:plain

Point:オーバーラップウィンドウを設定できるようになるとユーザーにもわかりやすく伝えることができるようになる!

f:id:vv_6ong_3ka_cp:20201214063529p:plain

プログラム、GX Works3とGT Designer3は下記メールアドレスに連絡頂ければ無料でお送り致します。
v_6ong_3ka_cp@yahoo.co.jp

商用利用は行わないでください。GX Works3とGT Designer3のソフトはご自身で用意して下さい。

広告