0

このプロジェクトの前に、コントローラー エリア ネットワーク (CAN) や ValueCAN3 の経験がなかったので、メッセージの読み取りに Intrepid の例を使用しました。ただし、読み取っているアナログ信号とデジタル信号を表示する GUI の更新の効率と頻度に問題があります。

私の GUI は、アナログ チャネル用の 16 個の数値アップ/ダウン ボックスと、デジタル信号がオン (1) またはオフ (0) になると緑色に変化する 36 個のボタンで構成されています。CAN メッセージを読みながら、適切なフィードバックを表示するように GUI コントロールを更新します。ただし、プラグインされたCANジョイスティックのボタンを押すと、デジタルチャンネルはほぼ瞬時に応答しますが、アナログ信号は、信号を変化させるために使用しているストリングポットでそれほど速く更新されません. アナログ信号が応答するのに 1 ~ 2 秒かかることがあります。

現在、GUI コントロールを設定してから、GUI コントロールから値を読み取り、UDP 経由でソケット接続を介して値を別のアプリケーションに送信しています。おそらくこれを変更して、設定している GUI コントロールから読み取るのではなく、受信した信号からデータを直接送信する必要がありますが、それは問題ではないと思います。

System::Timers::Timer オブジェクトを使用して、メッセージの更新、読み取り、およびデータ パケットの送信を行っています。50hz ~ 100hz、できれば 100hz に近いレートが必要です。反対側のソケットを使用すると、パケットが頻繁に送信されていることがわかりますが、アナログ チャネルのデータはスムーズに、または頻繁に変更されません。私が間違っているかもしれないこと、またはより効率的な方法でデータを処理する方法について誰かが考えている場合は、それを述べてください.

以下は、CAN メッセージを読み取る Intrepid のコード セグメントです。

// Read the messages every timer event (1000 ms)
        if (m_bPortOpen) // only if the port is open
        {
            // call icsneoGetMessages to read out the messages
            lResult = icsneoGetMessages(hObject,stMessages,&lNumberOfMessages,&lNumberOfErrors);
            if (lResult != 0)
            {
                // a successful read
                mNumberOfErrorsRead = lNumberOfErrors;
                mNumberOfMessagesRead = lNumberOfMessages;  // store the number of messages in the current buffer
            }
        }

私のフォームは、次を使用して CanReader オブジェクトからのメッセージを要求します。

msg = can->GetLatestMsg();

そのメソッドは、最後に受信したメッセージを取得します。

public: icsSpyMessage* GetLatestMsg()
{
return &stMessages[mNumberOfMessagesRead - 1];
};

この GetLatestMsg() は、最新のメッセージの取得を実装する悪い方法のように思えますが、CanReader がフォームから分離されているため、これが私のプログラムにどの程度影響しているか、またはこれを行う方法が完全にはわかりません。そうでなければ、メッセージの配列を渡す必要があります。これは、最後に取得されたメッセージのみを読み取り、それまでのメッセージは読み取らないため、メッセージをスキップしているのではないかと思います。

注意すべきもう 1 つのことは、6 つの異なる PGN から読み取っていることです。アナログ信号は 4 つの PGN に対応し、2 つはデジタル信号に対応します。

アップデート

アプリケーションで遊んで、さまざまなアナログ チャンネルでストリング ポットを使用した後、一部のチャンネルが他のチャンネルよりも頻繁に更新されていることに気付きました。また、アクセスされている PGN を確認すると、いくつかのページに他のページより頻繁にアクセスしていることがわかります。

CAN デバイスは、異なる PGN に対して比較的同じレートでデータをブロードキャストしませんか? はいの場合、私の GetLatestMsg() メソッドは異なる PGN を効果的に読み取っていてはなりません。5 ミリ秒ごとに新しいメッセージを読み取ります。

さらに、異なる PGN を個別に検出するために個別の読み取りタイマーを作成する必要があるかどうかを知っている人はいますか?

明確にするために提供できる追加のコードがある場合は、お知らせください。

4

1 に答える 1

0

多くのテストとデバッグの後、安定した解決策を見つけました。他の誰かがこの説明から恩恵を受けることを期待して、この回答を投稿しています。

CANbus でメッセージを読み取る場合、メッセージはバス全体にブロードキャストされ、パラメーター グループ名 (PGN) に基づいて必要なメッセージを選択する必要があります。各 PGN は、異なるデータに対して定義する必要があります。

たとえば、エンジン rpm は特定の PGN に対応し、バッファ内のメッセージをチェックすると、エンジン rpm に対応する PGN を持つメッセージを探します。

私の場合、使用している valueCAN3 デバイスから 6 つの異なる PGN を読み込んでいます。これらの各メッセージには、アナログ信号とデジタル信号に対応するさまざまなデータが含まれています。効率のエラーは、バッファから最新のメッセージを取得する方法に関連していました。

各パケットですべて同じデータをストリーミングしているだけの場合は、バッファから最新または最新のメッセージを取得するだけで十分です。ただし、私の場合、6 つの異なる PGN が必要なため、バッファから最後のメッセージを取得すると、6 つの PGN のうちの 1 つだけに対応し、CANbus 上のメッセージは一定のレートで送信され、同じ順序で、私は常にパケットの約半分を読んでいて、残りの半分を見逃していました。最新の 2 つのパケットを取得すると、すべてのチャネルがアプリケーションに必要な速度で更新されていることがわかりました。私のすべての信号は目立った遅延なしに変化し、必要な 50hz ~ 100hz の範囲を簡単に満たしています。

ただし、最適な解決策は、6 つの PGN のいずれかに対応する最新の 2 つのメッセージだけではなく、バッファーからプルするときに各 PGN の最新のメッセージを読み取ることだと思います。パケット。

于 2013-01-16T15:42:41.027 に答える