0

在这个项目之前,我没有使用控制器区域网络 (CAN) 或 ValueCAN3 的经验,我使用 Intrepid 的一个示例来阅读消息。但是,我在显示我正在读取的模拟和数字信号的 GUI 的更新效率和频率方面存在问题。

我的 GUI 由 16 个用于模拟通道的数字上/下框和 36 个按钮组成,这些按钮会根据数字信号是打开 (1) 还是关闭 (0) 而变为绿色。在阅读我的 CAN 消息时,我会更新 GUI 控件以显示适当的反馈。然而,当我按下插入的 CAN 操纵杆上的按钮时,数字通道几乎会立即响应,而模拟信号不会随着我用来改变信号的弦壶而快速更新。有时模拟信号需要 1 - 2 秒才能响应。

目前我设置了 GUI 控件,然后我从 GUI 控件中读取值并通过套接字连接通过 UDP 将值发送到另一个应用程序。我可能应该将其更改为从我直接接收的信号中发送数据,而不是从我正在设置的 GUI 控件中读取数据,但我认为这不是问题所在。

我正在使用 System::Timers::Timer 对象来更新、读取消息和发送数据包。我需要 50hz - 100hz 的速率,最好接近 100hz。使用另一端的套接字,我可以看到我的数据包被发送得足够频繁,但是模拟通道的数据变化并不平滑或频繁。如果有人对我可能做错了什么有任何想法,或者如何以更有效的方式处理数据,请说明。

这是 Intrepid 读取 CAN 消息的代码段:

// 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 与 Form 是分开的所以我必须传递一系列我认为否则的消息。我确实怀疑这可能会跳过消息,因为它只读取最后一个抓取的消息,而不是导致它的消息,如果读取这些消息,应该会使 GUI 输出在过渡时显得更平滑。

另一件要注意的是,我正在从 6 个不同的 PGN 中读取数据,模拟信号对应于 4 个 PGN,2 个对应于数字信号。

更新

在玩过我的应用程序并在不同的模拟通道上使用弦乐壶之后,我注意到一些通道比其他通道更新得更多。通过检查正在访问的 PGN,我发现我访问的 PGN 比其他 PGN 更频繁。

CAN 设备不是以相对相同的速率为不同的 PGN 广播数据吗?如果是,那么我的 GetLatestMsg() 方法一定不能有效地读取不同的 PGN。它每 5 毫秒读取一个新的 msg。

此外,有谁知道我是否应该制作单独的阅读计时器来分别检测不同的 PGN?

如果有其他代码我可以提供清晰的说明,请告诉我。

4

1 回答 1

0

经过大量的测试和调试,我找到了一个稳定的解决方案。我发布这个答案是希望其他人可以从这个解释中受益。

在 CANbus 上读取消息时,消息在总线上广播,您必须根据参数组名称 (PGN) 选择所需的消息。每个 PGN 都应该针对不同的数据块进行定义。

例如,引擎 rpm 将对应于特定的 PGN,当您检查缓冲区中的消息时,您将寻找 PGN 对应于引擎 rpm 的消息。

就我而言,我正在从我正在使用的 valueCAN3 设备中读取/想要 6 个不同的 PGN。这些消息中的每一个都包含对应于模拟和数字信号的不同数据。效率错误与我如何从缓冲区中检索最新消息有关。

当您只是在每个数据包中传输所有相同的数据时,从缓冲区中获取最新或最近的消息是有意义的。但是,在我的情况下,因为我需要 6 个不同的 PGN,这意味着当我从缓冲区中抓取最后一条消息时,它只对应于 6 个 PGN 中的 1 个,并且由于我的 CANbus 上的消息以恒定速率发送并且以同样的顺序,我一直在阅读大约一半的数据包,而错过了另一半。通过抓取 2 个最近的数据包,我发现我所有的频道现在都在以我的应用程序所需的速度进行更新。我所有的信号都在没有明显延迟的情况下发生变化,并且很容易满足我需要的 50hz - 100hz 范围。

但是,我认为最佳解决方案是在我从缓冲区中提取时读取每个 PGN 的最新消息,而不是仅读取最新的两条消息,这可能对应于我的 6 个 PGN 中的任何一个,因为我阅读的频率高于我收到的数据包。

于 2013-01-16T15:42:41.027 回答