このプロジェクトの前に、コントローラー エリア ネットワーク (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 を個別に検出するために個別の読み取りタイマーを作成する必要があるかどうかを知っている人はいますか?
明確にするために提供できる追加のコードがある場合は、お知らせください。