2

私は、さまざまなビデオ ゲーム コンソール (実際のハードウェアであり、エミュレートされていません) をプレイできるアーケード キャビネットに取り組んでいます。内部には、選択メニューを実行するための PC があります。私はそれを自分で書かなければなりません。また、PC とさまざまなコンソールの間でオーディオ/ビデオ/コントロールを切り替えるリレーを制御するなど、さまざまなことを行う PLC をプログラムする必要があります。私が今取り組んでいること。

私が出発点として取り組んでいるのは、コントローラーのエンコーディングと関係があります。基本的に、各プレーヤーのコントロールはいくつかのボタンとジョイスティックで構成されています。これらは、ボタンごとに 1 つ、ジョイスティックの基本方向ごとに 1 つずつ、通常は開いている瞬間的な接点スイッチを使用します。ボタンまたはジョイスティックの方向を押すと、スイッチが閉じます。ボタンの状態は、エンコーダーによってコンソールに伝えられます。

エンコーダには、プルアップ抵抗を介して 5 ボルト (「ハイ」) に接続されている各ボタンとジョイスティック方向の接続があります。ボタンまたは方向を押すと、モーメンタリ スイッチを介してグランドに接続されます。エンコーダーがボタン接続のグラウンド ("low") を読み取ると、ボタンが押されたことを認識し、これをコンソールに伝えます。

私はすでにこれらすべてをさまざまなコンソールで動作させていますが、追加すると便利な機能をいくつか考えました。これが私の現在のタスクの出番です。

最初の機能は、ボタンのリマッピングです。これらのゲームの一部は、コントローラーを念頭に置いて設計されているため、アーケード コントロール パネルで使用すると、一部のボタンが必要な場所にない場合があります。一部のゲームでは、ソフトウェアを介してボタンを再マッピングできますが、そうでないゲームもあります。私の考えは、ジョイスティックとボタンとエンコーダーの間に PLC を追加することです。この PLC を「プリエンコーダー」と呼びます。

プリエンコーダーは、いくつかの入力ピンのボタンの状態を読み取り、これらの状態をいくつかの出力ピンに書き戻し、エンコーダーに中継します。利点は、そのプログラミングが任意の入力ピンを任意の出力ピンに関連付けて、ボタンを効果的に再マッピングできることです。コンピュータのメニューからコンソールを選択すると、特定のゲームに関連付けられたボタン マッピング プロファイルも選択され、プリエンコーダに転送されます。

もちろん、ボタンを読み取り、その状態をエンコーダーに中継するプリエンコーダーのルーチンは、スムーズな制御のために非常に迅速に繰り返す必要があります。これらのゲームは約 50 ~ 60 Hz で実行されます。つまり、16.67 ミリ秒以下ごとに新しいビデオ フレームが生成されます。理想的には、プリエンコーダーがこのルーチンをフレームごとに何度も繰り返して、絶対的な最小入力ラグを確保できるようにします。コードとハードウェアの選択が最適化され、可能な限り高速に実行されるようにしたいと考えています。

2つ目の特徴はターボボタン。一部のゲーム、特にアーケード ゲームでは、弾薬が無制限であっても、銃や船の大砲などを発射するたびに発射ボタンを繰り返し押す必要があります。これは不要なようで、すぐに指が疲れてしまいます。ターボ ボタンは連続して押し続けることができるボタンですが、それをすばやく押したり離したりしているとゲームに伝えられます。これは、PC 上で実行されるソフトウェアや 555 タイマーなどのアナログ ソリューションで実行できますが、ターボ ボタンのタイミングをビデオのリフレッシュ レートと同期させるのが最善の方法です。PC またはビデオ ゲーム コンソールのビデオ出力から PLC に垂直同期パルスを供給することにより、ビデオのフレームがレンダリングされる頻度を正確に知ることができます。ターボボタンのタイミングは、定義することで制御できます。ボタンを押してから放すまでの時間をフレーム数で指定します。ゲーム固有のボタン プロファイルにタイミング情報を含めることもできます。

3 つ目の機能は、スロー ボタンです。実際には、これはジョイスティックにのみ適用される可能性がありますが、基本的な方向のスイッチをボタンと呼んでいます。特定のゲーム (おそらく shmups でのみ使用されます) では、非常に狭いスペースでキャラクター (船/飛行機) を移動する必要がある場合があります。最小限のジョイスティック入力でも反応が速すぎると、行き過ぎてクラッシュする可能性があります。スロー アクティベーション ボタンを押したままにしておくと、ターボ ボタンと同じ方法でジョイスティックをすばやくアクティブ化および非アクティブ化することで、ジョイスティックの反応が鈍くなるという考え方です。

プリエンコーダ自体に垂直同期パルスを監視させたいのか、それとも速度を落としすぎてしまうのかよくわかりません。私の現在の考えでは、別の PLC がキャブ自体の一般的な管理を担当することになります。「オン」ボタンの監視、リレーの切り替え、PC との直接通信、垂直同期パルスの監視など。これにより、プリエンコーダーが解放され、より高速に実行できるようになります。

プリエンコーダーの「コード」の例を次に示します。明らかに、これは私が考えていることの大まかな概要にすぎません。どの言語になるかさえわからないからです。この例では、プリエンコーダとして専用の PLC を使用することを想定しています。別の PLC は、コンピューターからゲーム プロファイルを取得し、その情報の一部をプリエンコーダーに渡すなどの他のタスクに加えて、垂直同期パルスの監視を担当します。その PLC は、ターボおよびスロー機能のフレーム タイミングを認識し、フレームをカウントし、ターボ ボタンを無効にする必要があるフレーム中に、プリエンコーダ PCB のピンにハイを出力し、ターボを無効にするように通知します。ボタン。有効にする必要があるフレームの間、そのピンにローを出力します。スローボタンと同じ考え方。

get info from other PLC (which got it from the computer, from a user-selected game profile):
array containing list of turbo buttons (buttons are identified by what input pin they are connected to)
array containing list of slow buttons (will probably only be the joystick directions, if any)
array containing list of slow activation buttons (should normally be only one button, if any)
array containing list of normal buttons (not turbo or slow)
array containing which output pin to use for each button (this determines remapping)

Begin Loop

  if turbo pin is high

     for each turbo button
        output pin = high
     next

  else

     for each turbo button
        output pin = input pin
     next

  end if

  if slow pin is high and slow activation button is pressed

     for each slow button
        output pin = high
     next

  else

     for each slow button
        output pin = input pin
     next

  end if

  for each normal button
     output pin = input pin
  next

Restart Loop unless stop pin is low

これをすべて読んだ場合は、お時間をいただきありがとうございます。それで(最後に)、ここに私の質問があります:

  1. あなたの全体的な考えは何ですか; 一般的な私のアイデア、実現可能性などについて?

  2. プリエンコーダーにはどのような PLC を使用すればよいですか? 私はもともと Arduino を試すことを考えていましたが、高レベルのプログラミング ライブラリを使用しているため、非常に遅くなることがわかりました。別の PLC を中心に独自のボードを構築することに問題はありません。

  3. PLC のプログラミングにはどの言語を使用すればよいですか? 私は新しい言語を学ぶことを気にしません。このプロジェクトに時間制限はありません。プリエンコーダーをできるだけ速く実行するために必要なものは何でも入れます。

  4. プログラムを PLC にフラッシュするには何が必要ですか?

  5. 実行時に、これらの PLC は相互に、また PC とどのように通信する必要がありますか?

  6. 私は正しい場所で尋ねていますか?適切なフォーラム、適切なセクションなど? 他にどこか尋ねるべきですか?

心よりお返事をお待ちしております、

-ロブ

4

1 に答える 1

1

あなたに役立つかもしれないいくつかの考えがあります:

あなたの全体的な考えは何ですか; 一般的な私のアイデア、実現可能性などについて?

  • このプロジェクトは、私が子供の頃に Atari ジョイスティックで 555 タイマー チップを使っていたように、Defender をごまかそうとしているように聞こえます。
  • プロジェクトは実行可能ですが、かなり高速な PLC が必要になります。
  • クエストのように、これを機能させるために多くの時間を費やす場合があります。

プリエンコーダーにはどのような PLC を使用すればよいですか? 私はもともと Arduino を試してみることを考えていましたが、高レベルのプログラミング ライブラリを使用しているため、非常に遅くなることがわかりました。別の PLC を中心に独自のボードを構築することに問題はありません。

どの PLC が十分に高速であるかを考えたとき、いくつかのことが頭に浮かびました。

  • タスク アーキテクチャを持つ PLC を使用する場合、イベントを使用して v-sync パルスでタスクをトリガーし、別のイベントをコンソール アクティビティでトリガーすることができます。タスク アーキテクチャなしで PLC を使用する場合、ユーザーは、プログラム スキャンが v-sync およびゲーム内のアクティビティと同相または同相から外れるときに発生する可変遅延を認識する場合があります。これは、PLC が 1 ミリ秒のスキャン時間など、十分に高速な場合には当てはまらない可能性があります。

  • ほとんどの安価な PLC は決して成功しません。オーバーヘッドとパフォーマンスにより、ほとんどの PLC はスキャンあたり約 5 ~ 10 ミリ秒に保たれます。ただし、PC ベースの PLC はうまく機能する可能性があります。したがって、Beckhoff コントローラーが適切に機能する可能性があります。CX2000 のようなものを使用する場合、Windows 7、USB、ユーザー インターフェイス用の DVI、およびコントローラーとコンソール接続用の物理 I/O カードを接続するための側面の Ethercat バスがあります。ソフトウェアについては、以下を参照してください。正常に動作する非 PC ベースの PLC は多数ありますが、これらはおそらく高価で統合が難しいでしょう。

  • Arduino ソリューションは、十分に高速なモデルを使用している場合に機能するはずです。ただし、空白の画面と多数のライブラリしか付属していないため、開発時間は長くなります。トラブルシューティングは、優れた PLC よりもはるかに厄介です。Arduino を機能させるには、慎重に計画する必要があります。また、マイクロコントローラーとインターフェイスするハードウェアはより難しく、コード内のスイッチのデバウンスを管理する必要があります。すべての PLC は入力にフィルタリングを備えており、さまざまな I/O によって設計が容易になります。ただし、お金が問題になる場合は、Arduinoまたはその他のマイクロコントローラーが実際に選択されます。高速 PLC は非常に高価になる可能性があります (800 ドルから 2 万ドル、約 1500 ドルと考えてください)。いくつかのシステムを構築する場合は、Arduino の方が適している可能性があります。

PLC のプログラミングにはどの言語を使用すればよいですか? 私は新しい言語を学ぶことを気にしません。このプロジェクトに時間制限はありません。プリエンコーダーをできるだけ速く実行するために必要なものは何でも入れます。

  • IEC61131 は PLC プログラミング言語の規格です。米国では、ほとんどの PLC はラダー ロジックでプログラムされています。これは、学ぶのが非常に簡単で、機械でのトラブルシューティングとメンテナンスが迅速であるためです。構造化テキストには、特にパフォーマンスにおいても利点があります。基本/C/Javaの融合のように見え、習得が容易で、疑似コードの例のように見えます。あなたのプロジェクトに関しては、どちらの言語でもプログラムできると思います。このタスクに他の IEC61131 言語を使用することはありません。

  • Beckhoff TwinCAT3 は MS Visual Studio を IDE として使用し、選択メニュー (VB/C++/C#) と PLC コード (IEC61131) の両方を同じプロジェクトに記述できます。TwinCAT (CX2000 ユニット上) のランタイム ライセンスはカーネル モードで実行され、Windows 7 がより重要なことを行っていないときはいつでも処理パフォーマンスを提供します。私はいくつかの CX1020 モデルを使用しましたが、それらは優れたパフォーマンスを発揮しました。スキャン時間は、かなりの量のコードで約 5 ミリ秒でした。より高速なユニットは 1 ミリ秒未満でスキャンします。

プログラムを PLC にフラッシュするには何が必要ですか?

PLC は、マイクロコントローラーのように「フラッシュ」しません。ソフトウェアの作成に使用するソフトウェアには、コントローラーに接続する方法があります。「オンラインになる」という言葉がつながりを作ります。「ダウンロード」および「アップロード」という用語は、開発用コンピュータと PLC の間でプログラムを転送することを意味します。「オンライン編集」という用語は、PLC がコードを実行している間にコードを変更することを指します。最新の PLC の電源がオフになると、バッテリを使用してプログラムとユーザー RAM をフラッシュにコピーします。電源を入れると、フラッシュが RAM にコピーされます。最新の PLC に接続するには、USB またはイーサネット ケーブルを使用します。

実行時に、これらの PLC は相互に、また PC とどのように通信する必要がありますか?

複数の PLC を計画していますか? PC への PLC 接続は複雑な問題です。「OPC サーバー」という用語は、カスタム Windows PC アプリケーションが PLC のメモリにアクセスできるようにする [高価な] ソフトウェアを指します。ベッコフのソリューションは、余計なものを購入することなく、これらすべてをうまく結合します。PLC 間通信がより簡単になります。この方法は通常、イーサネットによるもので、詳細はさまざまです。

私は正しい場所で尋ねていますか?適切なフォーラム、適切なセクションなど? 他にどこか尋ねるべきですか?

  • 確かに、このフォーラムには PLC の活動があり、ハードコアな PC/Web/モバイル開発に傾倒しているようです。私はここに来て、ソフトウェアに関するより深い質問に対する驚くほど知的な答えを求めています。

  • plctalk.net を試すこともできます。このフォーラムは、機械や自動化に関連する複雑な接続性や互換性に関する質問をする、基本的なエンジニアやサービス技術者向けのフォーラムです。垂直同期パルスについて、いくつかの空白の凝視を得るかもしれません。彼らのスキルセットは、信頼性がおそらく彼らの最高の使命である産業パラダイムを中心に展開しています。

  • Arduino または Microchip/Atmel/ARM フォーラムでパフォーマンスについて質問することもできます。PLC がハードウェアよりも高速であると彼らに言うと、彼らは非常に腹を立てます。彼らは、マイクロ秒のパフォーマンス数値を取得できると言うかもしれませんが、ハードウェア割り込みと多くの物理回路を使用してそれを実現し、トラブルシューティングの眠れない夜に対処することができます.

-デニス

于 2016-02-27T03:02:28.337 に答える