PLCのヘビ。 シヌメンスぞの答え

こんにちは。



最近、圌らは私にシンプルで同時にカルトゲヌム「Snake」をSiemens s7-300ファミリヌのコントロヌラヌに実装する䟋を瀺した蚘事ぞのリンクを送っおきたした。 そしお、私は思った誰もがシヌメンス、ABBなどのようなモンスタヌに぀いお知っおいる しかし、珟代の囜内の発展は日陰のたたです。



この蚘事では、 NIIITeplopriborで30分で開発されたロシアの自動制埡システム「Quint 7」でゲヌム「Snake」のアルゎリズムを実装する方法を瀺したす。 そしお、より倧きな関心のために、ゲヌムは技術的なプログラミング蚀語FBDで完党に実装されたす。



それでは、始めたしょう



私たちの仕事は、ゲヌム「Snake」を30分で曞くこずです。

アむデアを実装するには、次のものが必芁です。



少し説明
QUINT 7にはプロセス制埡システム党䜓の完党な仮想化があり、任意の耇雑なプロゞェクトを1台のコンピュヌタヌに実装できたすが、すべおを倧人の方法で行いたす。




ゲヌムアルゎリズム自䜓は、いく぀かの倧きなブロックに分割できたす。





発電機


最初に、ヘビの基瀎を䜜成したす。 なぜなら ヘビは垞にフィヌルドの呚りをcreepい回っおいるので、プログラム党䜓の基瀎は、ヘビの速床に察応する呚期でパルスを発するゞェネレヌタヌになりたす。 たず、この速床を1セル/秒に等しくしたす。 このようなゞェネレヌタヌを線成するのは非垞に簡単です。 必芁なのは、論理ANDアルゎリズム、パルスカりンタヌ、比范アルゎリズム、および遞択アルゎリズムだけです。 合蚈1分間で、最も単玔なゞェネレヌタヌを䜜成したす。



行動の原則は次のずおりです。 「 I1 」アルゎブロックの出力で、各サむクルは論理倀1 <-> 0を倉曎したす。

さらに、コンプレックス1でナニット数をカりントし、それを私たちが蚭定した倀ず比范したすこの䟋では、サむクル時間が10 msであるため、50は1秒でカりントを開始したす。

カりンタヌの読み取り倀が所定の倀に等しい堎合、カりンタヌに巻き付けられた倀を巻き戻し「 Calcul1 」アルゎリズム、「 Compar1 」アルゎリズムの「=」出力から10 msの期間1コントロヌラヌサむクルのクロックパルスを発行したす。 最埌の遞択アルゎリズムは、リセット信号によっおカりンタヌをリセットするために䜿甚されたす。

気配りのある読者向け
泚意深い読者は、最初にカりンタヌをオンにしたずきに、1秒ではなく980ミリ秒で50パルスをカりントするこずに気付いおいるはずです。 埌瞁ではなく前瞁で数えるからです。 しかし、同時に、圌は他のすべおのクロックパルスを1秒で正確に出力したす。 もちろん、この状況を修正するのは非垞に簡単ですが、私は意図的にこの問題専甚のゞェネレヌタヌ実装のバヌゞョンを残したした。


ゞェネレヌタヌが完成したら、それをコンパクトなマクロに折り畳み、翌の䞭で埅぀ようにしたす。





運営管理


ここではすべおが非垞に簡単です。 ゞェネレヌタはすでにありたす。 ヘビは野原を絶えずcreepい、動きの方向のみを倉えたす。 フィヌルド自䜓は2次元配列で、各セルは座暙XずYで指定されたす。右に移動するず、X座暙は各ステップで1ず぀増加し、Y座暙は倉化したせん。 巊に移動するず、X座暙は䞀定のY座暙ずずもに枛少したすが、䞊䞋に移動する堎合も同様に、Y座暙のみが倉化し、X座暙は䞀定になりたす。

したがっお、2぀のリバヌスカりンタヌ座暙ごずに1぀を蚭定したす。コマンドに応じお、新しいクロックパルスの到着ず同時に、蛇の頭の珟圚の座暙に1を加算たたは枛算したす。 その結果、次のスキヌムが埗られたす。



回線の冗長性に関する簡単な説明
繰り返したすが、泚意深い読者は質問をするかもしれたせん-なぜこのスキヌムが最適な方法で実装されおいないのに、远加の䞍必芁なアルゎリズムを䜿甚しおいるのか。 すべおが非垞に簡単です。 これらは、圹に立たないものの、事前に回路に含たれおおり、プログラムを「コヌミング」する段階で必芁になりたす。 再び戻っお元の構造を修正しないように、事前にそれらを導入するこずをお勧めしたす。 なぜ私はそれらが必芁なのか、私は以䞋のネタバレで䌝えたす


動䜜原理
アルゎリズム「 Ruchselektor1 」を䜿甚しお、蛇コマンドを入力したす。 4぀の移動方向巊右䞊䞋に察応する4぀の出力がありたす。 次は、別の遞択アルゎリズム「 RuchSelector2 」です。 なぜなら 制埡コマンドはい぀でも䜿甚できたす。制埡コマンドをクロックパルスず同期するために䜿甚したす。 ぀たり 最初のセレクタヌから、クロックパルスの到着時にのみ倀を2番目のセレクタヌに転送したす。 実際、このアルゎリズムが冗長であるこずは明らかです。なぜなら、 カりンタヌのクロックパルスず盎接同期したすこれは図から確認できたすが、このアルゎリズムはデバッグ目的でのみプログラムに残されおいたす。 次に、クロックパルスずカりンタヌを同期するための4぀の「 および 」アルゎリズムがありたす。 「 I 」アルゎリズムからの察応する信号に埓っお、必芁な座暙の増加たたは枛少が1぀遞択されたす。 なぜなら 遞択アルゎリズムは「1 of n」スキヌムに埓っお動䜜したす。したがっお、各時点で論理ナニットはセレクタヌ出力の1぀にのみ存圚したす。 そしおこれは、察応する座暙の増分を単玔に远加し、埗られた倀をこの座暙の逆カりンタヌに送信できるこずを意味したす。これは、フィヌドバック加算アルゎリズムを䜿甚するゞェネレヌタヌの堎合のように実装されたす。


これで制埡回路が完成したす。 マクロにたずめるたで、なぜなら 最終段階でもう少し修正したす。



ヘビの頭ず尟


前述のように、ヘビの頭は特定の座暙XずUを持぀配列セルです。しかし、これたでのずころ、この配列はありたせん。 さらに、少し先を芋据えお぀たり、蛇の尟の䜜成、配列内のこのセルにはメモリが必芁であるこずが明らかになりたす。 メモリを持぀最も単玔な論理芁玠はトリガヌです。 それらには倚くの皮類があり、それぞれが独自の目的に䜿甚されたす。 この䟋では、「RSトリガヌ」を䜿甚したす。 ゲヌムに矎しさを远加するにはたずえば、「蛇」ず「食べ物」を異なる色で着色したり、蛇の頭を匷調したりするなど、論理メモリセルでは十分ではありたせん。2぀ではなく、少なくずも4぀の状態を栌玍する必芁がありたす。 ぀たり いく぀かのトリガヌから、たたはセルに敎数を保存するなど、別の圢匏でメモリセルを䜜成する必芁がありたす。 しかし、これによりプログラムが倚少耇雑になり、このアクション党䜓の目暙の1぀は30分以内に維持するこずです。

ヘビ甚に20 x 20のフィヌルドを䜜りたしょう。 400個のトリガヌが必芁です。 問題は簡単に解決されたす。 1぀のトリガヌで1぀のセルを䜜成し、マクロに折りたたみたす。 20個のセルマクロを䜜成し、それらを新しい倧きなマクロに折りたたみたす。 20個の倧きなマクロを配眮し、400個のメモリセルを取埗したす。

セルマクロ自䜓には、5぀の入力ず4぀の出力がありたす。



むンプット

  1. 入力ヘビの「頭」がこのメモリセルにあるかどうかの論理蚘号
  2. クロックメむンオシレヌタヌず同期するためのクロックパルス
  3. 長さ蛇尟の長さ
  4. リセットリセットボタンを抌しお新しいゲヌムを開始する論理的な兆候
  5. 食べ物論理的な兆候、このセルにはヘビの「食べ物」がありたす


食べ物ず蛇の頭に぀いお
ヘビの「食物」は「頭」から分離する必芁がありたす このセルに䟵入するヘビの頭に぀いおは、テスト方法が異なりたす。 「食べ物」でケヌゞにヘビの頭を乗せるのは良いこずですが、ヘビの尻尟でケヌゞにヘビを乗せるず敗北し、ゲヌムが終了したす。


出力

  1. 出力論理蚘号、フィヌルド䞊のこのセルを埋めるかどうか
  2. GameOverヘビが尻尟を螏んだ堎合のゲヌム終了の論理的な兆候
  3. Yum_yamヘビが食物で现胞に足を螏み入れたので、ヘビのために新しい食物を生成する必芁があるずいう論理的な兆候
  4. Another_test食物が入ったセルが、すでにヘビが占有しおいるフィヌルドにランダムに投げ蟌たれ、新しいランダムなセルの座暙を再生する必芁があるずいう論理的な兆候


セルの入力ず出力が定矩され、額面で䜕が欲しいかが明確になった埌、セルのロゞックを説明したす。



セルアルゎリズムの原理
スネヌクがこのセルを螏んだずいう信号が入力で受信されたす。 10 msの長さのパルスがそれらに割り圓おられたす。 そしお 、「 And 」アルゎリズムに埓っお、クロックパルスず加算されたす。 䞡方の条件が満たされおいる堎合、぀たり 1サむクルでクロックパルスが発生し、このセルにヘビが珟れたずいう信号が送られ、トリガヌ「 RS1 」が䜜動したした。 これがこのメモリセルの䞻なトリガヌです。 原則ずしお、蛇の頭を凊理するには、次のクロック信号でトリガヌをリセットするだけで十分です。 他のすべおがテヌルずさたざたな状況を凊理しおいたす。



1.「ヘビが尟を螏んだ」状況を凊理したす。 少し埮劙な点を陀けば、すべおがシンプルです。 入力信号ずトリガヌ状態をANDで远加したす。 䞡方の信号が1に等しい堎合、頭は尻尟で占められおいるセルを螏みたした。 これはルヌル違反であり、ゲヌムを終了するシグナル「GameOver」を提䟛したす。 埮劙な点は、トリガヌからの信号を珟圚ではなく前のサむクルで取埗する必芁があるずいう事実にありたす。 このため、ここではフィヌドバックが䜿甚されたす砎線で衚瀺。



2.「食品」凊理。 ここのすべおも簡単です。 この现胞に食物があるはずだずいうシグナルを受け取りたす。 メむントリガヌでAndに远加したす。 䞡方の信号が䞀臎しおいる堎合、食物现胞はすでにヘビが占有しおいるフィヌルドに萜ちおいたす。 この堎合、「More_try」信号を出力したす。これは、新しいランダム座暙を生成するコマンドを提䟛したす。



3.「ヘビが食べ物を食べた」ずいう状況に察凊する。 条件2が満たされおいない堎合、぀たり 食物现胞がフリヌフィヌルドに萜ち、食物トリガヌ「 RS2 」がコックされたす。 次に、ヘビがこのケヌゞを螏んだずいう信号を埅ちたす。 そのような信号が受信されるずすぐに、食物トリガヌをリセットし食物を食べる、「ダムダム」シグナルを発行したす。これにより、蛇の長さを1぀増やし、同時に食事の新しい座暙を生成するコマンドを送信したす。



4.「テヌルトリヌトメント」。 考えは、ヘビの尟党䜓がそこからうたで现胞の状態を維持するこずです。 これを行うには、カりンタヌ「 Slic 1 」アルゎリズムを蚭定し、メむントリガヌが投入されおいる間に受信したクロックパルスの数をカりントしたす。 この倀を蛇の長さず比范し、等しくなったらすぐにトリガヌをリセットしたす。 単玔化およびデバッグのために、カりンタヌ倀は長さず比范されたせん。 そしお、それらの差はれロです。 泚意する䟡倀のあるポむントの1぀は、メヌタヌの読み取り倀の長さから枛算した埌、結果の差に1を加算するこずです。 これは、ヘビがケヌゞに乗るず同時に発生する最初の小節のカりントを補正するために行われたす。





「食べ物」




ここでの最倧の問題は、乱数を取埗するこずです。 なぜなら 「ランダム」コマンドはありたせん。 むンタヌネット䞊で擬䌌乱数を生成する方法はたくさんありたす。 この䟋では、そのうちの1぀が実装されおいたす。 特定の倧きな倉化数が取られたす-秒単䜍のコントロヌラヌのアップタむム。 そしお、それは絶えず倉化する分呚噚に分割されたす積分噚に実装されたす。 商の残りが取埗され、これは乱数であるず考えられおいたす。 実際、もちろん偶然ではありたせん。䞀芋するず、特定の領域で陀数が「歩いおいる」ために小さな数字が萜ちる確率は倧きい数字よりも倧きいこずに泚意しおください。残りから。 それらを1から20の範囲に持っおくるず、その倀がすでにランダムな倀に非垞に䌌おいる数倀が埗られたす。



すべおの郚品を接続し、プログラムをずかす


これで、プログラムのすべおの郚分が準備できたした。 私たちはそれらを債刞で぀なぎたす。 最初の近䌌では、私たちのゲヌムはすでに機胜しおいたす。 最埌の仕䞊げは残った。



1.フィヌルドから出お行くこずを確認したす。

それはすべおゲヌムの実装に䟝存したす。 「管理」の第2段階では、ヘビの頭の座暙がXずYであるカりンタヌがあったこずを思い出しおください。これらの座暙を0ず21ず比范するだけですサむズ20 x 20ず座暙1のフィヌルドがあるため -20。 いずれかの条件が満たされた堎合、「ゲヌムの終了」ずいう蚘号を蚭定したすORによっお「GameOver」ずいう蚘号を远加する必芁がありたす。 パックマンのゲヌムのように行うこずができ、ヘビがフィヌルドの倖に出たずきに反察偎に珟れたす。 これを行うには、察応する座暙をリセットするだけで十分です。



2.コマンドが正しいこずを確認したす。

私たちの蛇はすぐに180床回転するこずはできたせん。 そのため、小さなチェックを远加したす。これは、反察方向のコマンドを次々に䞎えるこずを蚱可したせん。



行動の原則は次のずおりです。 チヌムが到着したら、それが既存のチヌムの反察かどうかを確認したす。 そうでない堎合は、新しいコマンドをメモリに曞き蟌み、出力に送信したす。 その堎合、メモリぞの曞き蟌みは機胜せず、叀いコマンドが出力に残りたす。 必芁に応じお、この属性を別のマクロ出力に取り出しお、そこからオヌディオ信号を生成できたす。



3.「開始」および「リセット」チヌム。

利䟿性のために䜜られたした。 「開始」チヌムは、ゞェネレヌタヌに信号を送信するトリガヌを投入したす。 Resetコマンドはこのトリガヌをリセットし、ゞェネレヌタヌを停止したす。 同時に、リセットはすべおのメモリセルずすべおのカりンタのデヌタをリセットしたす。

最終プログラム。 図面が非垞に倧きい








むンタヌフェヌスを䜜成しおプレむしたす


ゲヌムに割り圓おられた時間から数分が残りたす。これは、ゲヌムのグラフィカルむンタヌフェむスを固定するのに十分な時間です。

正方圢から20x20のフィヌルドを描画したす。 各ボックスは、独自のメモリセルに察応しおいたす。 プロパティを蚭定するず、察応するメモリセルが0、ボックスがグレヌ、1がグリヌンたたは奜きな色になりたす。



むンタヌネットで写真を怜玢するこずで、フィヌルドの矎しいフレヌムず、意味に適した䜕らかのヘビのパタヌンを芋぀けたす。

フィヌルドの暪にコントロヌルボタンを配眮し、マりスずキヌボヌドのコントロヌルをWASDキヌで接続したす。

近くに「開始」ボタンず「リセット」ボタンを配眮したす。 そしお、負けたずきに衚瀺される倧きな碑文「GameOver」。



プログラムをコンパむルしおコントロヌラヌにロヌドしたす。 運甚管理ステヌションを起動しおプレむしたす。

これは、挔算子のニヌモニックスキヌムです。








たずめるず


この蚘事では、コントロヌラヌPTK QUINT 7の FBD蚀語でのプログラミングの原理に぀いお少し説明したした。 倚倧な劎力をかけずに、ゲヌム「Snake」を実装したした。 なぜなら FBD蚀語は䞻に技術者に焊点を合わせおいるため、基本ロゞックたずえば、AND、OR、トリガヌ、カりンタヌの操䜜のロゞックに粟通しおいる人なら誰でも、䜜業の原理を理解し、プログラムを曞き始めるこずができたす。 この堎合、プログラミングや回路の豊富な経隓は必芁ありたせん。



このアルゎリズムは、図に瀺すアルゎリズムを機胜的に同様のアルゎリズムに眮き換えるだけで、FBDプログラミング蚀語をサポヌトするシステムに実装できたす。 ここで䜿甚されるアルゎリズムは基本的なものであり、すべおのシステムにありたす。



FBD蚀語でプログラムを䜜成するずきは、アルゎリズムの実行順序に埓うこずが重芁です。 䞊蚘で曞いたように、䞊蚘のプログラムは最適ではなく、1぀の目的にのみ必芁な远加アルゎリズムが装備されおいたす-実行順序を制埡し、すべおのアルゎリズムの開発をクロック信号で同期したす。



もちろん、簡単な操䜜でプログラムを改善できたす。たずえば、時間ずずもにヘビの速床を䞊げるこずができたす。 たたは、パラメヌタ「空腹」を入力したす。これに応じお、特定の期間䞭に受け取らなかったヘビは新しい食物を受け取らないため、加速されたす。 さらに、泚意深い読者は、ヘビを新しいセルに移動するずきにヘビの長さを芚える機胜に泚意を払うこずができここでは、泚意を匕くために特別に小さな゚ラヌが配眮されおいたす、これは間違っおいるず思いたす 通垞、ヘビは尟からではなく頭から䌞びたす。 䜕でもできたす。 それは欲望ず時間の問題です。



最埌たで読んでくれたみんなに感謝したす。 面癜かったず思いたす。



All Articles