4

この質問はマイクロコントローラープログラミングに関連していますが、この状況を処理するための優れたアルゴリズムを提案する人は誰でもいるかもしれません。

私は1つの中央コンソールとリモートセンサーのセットを持っています。中央コンソールには受信機があり、各センサーには同じ周波数で動作する送信機があります。したがって、シンプレックス通信のみを実装できます。

送信機は同じ周波数で動作するため、2つのセンサーが同時に中央コンソールにデータを送信することはできません。

次に、センサーをプログラムして「ポーリング」を実行したいと思います。中央コンソールは、センサーの存在について何らかのアイデアを得る必要があります(各センサーが応答しているかどうか)

私はいくつかの方法を想像することができます。

  1. 各センサーのポーリングメッセージ間に同じ間隔を使用して、センサーをランダムに開始します。したがって、それらは同時に送信されません。

  2. いくつかの丸いメカニズムの使用。センサー1は、5秒から10秒などでポーリングを開始します。メソッド1のより正式なバージョン。

最大データ転送速度は約4800bpsであるため、これも考慮する必要があります。

通信リンクの使用を減らしてこれを解決する良い方法を想像できる人はいますか。必要に応じて、センサーごとに異なるポーリング間隔を使用できることに注意してください。

4

5 に答える 5

1

センサーとセントラルユニットは、一度に1つのメッセージしか配信できないバスに接続されているとおっしゃっていると思います。

これを処理する通常の方法は、衝突検出を行うことです。これは、たとえば、私が知る限り、イーサネットがどのように動作するかです。あなたはメッセージを送ろうとします。次に、衝突の検出を試みます。衝突を検出した場合は、ランダムな量(タイを解除するため)を待ってから再送信します。もちろん、衝突チェックを再度行います。

衝突を検出できない場合は、さまざまなセンサーのポーリング間隔がすべて異なる素数である可能性があります。これにより、すべてのセンサーにポーリングを成功させるための専用スロットが確保されます。もちろん、衝突はまだありますが、検出する必要はありません。素数5、7、11の例:

 ----|----|----|----|----|----|----|----| (5)
 ------|------|------|------|------|----- (7)
 ----------|----------|----------|-:----- (11)
                                   * COLLISION

センサーが「同相」で開始するか「逆相」で開始するかは問題ではありません。

于 2010-01-04T06:52:10.417 に答える
0

プロトコルの設計自体が目的でない限り、既存のプロトコルの全部または一部を使用することを検討してください。時間を節約することは別として、プロトコルが競合状態になり、まれな再現不可能なバグが発生する可能性を減らします。

この状況の多くのプロトコルでは、マスターが具体的に現在の値を要求するまで、センサーは静かに保たれます。これにより、衝突を回避しやすくなります。また、マスターがパケットを見逃したと思った場合、または1つのセンサーを他のセンサーよりも最新の状態に保つことに関心がある場合に、マスターが再送信を要求しやすくなります。これにより、特にマスターからのコマンドがセンサーの応答よりもはるかに短い場合は、衝突検出に基づくシステムよりも優れたパフォーマンスが得られる可能性があります。Alohanet(http://en.wikipedia.org/wiki/ALOHAnet#The_ALOHA_protocolを参照)のようなものになってしまった場合、あまり頻繁に送信しないことと衝突が多すぎることの間のトレードオフにより、50%未満を使用する必要があることがわかります。利用可能な帯域幅の。

于 2010-01-04T19:31:58.707 に答える
0

私は数年前にいくつかのZigbeeシステムで作業しました。センサーは2つしかないため、待ち時間を変えてハードコーディングし、常にリクエストに応答するようにしました。しかし、Zigbeeにはシステムがあるので、私たちはこれに沿って何かを検討しました。

コンソールからのアナウンスから始めましょう。「みなさん、ネットワークを作りましょう!」すべてのノードは、「私はハードウェアアドレスxです、参加できますか?」のような応答を試みます。最初はおかしいですが、ランダムな再試行時間で、最終的にコンソールはすべてのノードに応答します。'はいハードウェアアドレスx、参加できます。あなたはノード#yであり、データのリクエストを受け取ってからzミリ秒の待機時間があります。

それなら簡単なはずです。コンソールがデータを要求するたびに、ノードは順番に応答します。すべてのデータの送信にかかる時間は、設定したポーリング期間よりも短いと想定しています。メッセージを確認しないことをお勧めします。コンソールが応答しない場合、別のノードがデータを送信しようとしているときにノードが再送信を試み、両方を台無しにする可能性があります。それからそれは完全な失敗に雪だるま式になります...

于 2010-01-05T15:22:53.657 に答える
0

衝突検出システム(イーサネット)を調べる必要があると思います。時間ベースの同期がある場合は、コンソールのクロックに依存し、センサーが同期から外れることはありません。これは、外部の信頼できる時間基準に接続されている場合、またはそれぞれにバッテリーでバックアップされたRTCを使用する費用がかかる場合(高価)に問題がない可能性があります。

于 2010-01-04T06:52:36.327 に答える
0

各センサーに一意のアドレスを割り当てることは可能ですか?

その場合、すべてのデバイスが同じ通信リンクを共有するように、マスター/スレーブプロトコル( Modbusなど)を実装できます。

  1. マスターは、通信を開始できる唯一のデバイスです。アドレスをすべてのスレーブにブロードキャストすることにより、各センサーを個別に(1つずつ)ポーリングできます。
  2. アドレス指定されたスレーブデバイスのみが応答します。
  3. 一定時間(タイムアウト)経過しても応答がない場合、デバイスは使用できず、マスターは次のデバイスをポーリングできます。

参照:自動化プロトコルのリスト

于 2010-01-05T13:35:48.343 に答える