如何理解canopen通讯中的索引和子索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解canopen通讯中的索引和子索引相关的知识,希望对你有一定的参考价值。

参考技术A 1、首先设置对应的Can参数,比如波特率什么的。 2、导入对应设备的eds文件导入somachine。 3、如果用PDO的话就比较简单,打开对应设备,在CANopen I /O Mapping 中填入对应的变量,一般就启动命令,频率,转速什么的,就OK了。 4、如果是SDO的话...本回答被提问者采纳

允许在查找时忽略子索引的复合索引的 C++ 容器

【中文标题】允许在查找时忽略子索引的复合索引的 C++ 容器【英文标题】:C++ container for compound index that allows ignoring sub-index at look-up 【发布时间】:2012-02-22 12:52:05 【问题描述】:

什么是允许在查找时忽略子索引的复合索引的合适容器?它不应该比没有此功能的容器使用更多的资源。

F.e.给定索引

struct index_t

    index_t(unsigned key_, unsigned subkey_)
        :   key(key_)
        ,   subkey(subkey_)
    
    unsigned key;
    unsigned subkey;
;

插入

index_t(1,11)
index_t(2,21)
index_t(2,22)
index_t(2,23)
index_t(3,31)

所有带有 f.e. 的元素key == 2 并忽略 subkey 必须查找。

还必须可以使用给定的key subkey 进行查找。因此,使用带有key 的多重集/映射作为唯一容器的键不是解决方案。

【问题讨论】:

我找到了解决方案,将在 8 小时超时后发布。 multimap<key_t, multimap<subkey_t, data_t> > 将是一个解决方案,但会在存储和编程方面引入一些开销。 @hpc:感谢您正确地进行 Stack Overflow。在 1rep 用户中非常罕见。 不会发布我的解决方案,因为@StilesCrisis 解决方案非常完美。 【参考方案1】:

你可以这样做

std::set<index_t>  mySet;

要搜索具有给定键和任何子键的所有项目,请执行

std::pair<std::set<index_t>::iterator, std::set<index_t>::iterator> range;
range.first = mySet.lower_bound(index_t(key, 0));
range.second = mySet.upper_bound(index_t(key, UINT_MAX));

这将保持 2*log n 的性能。

【讨论】:

当然,谢谢!如果从 lower_bound 迭代,则不需要调用 upper_bound() 啊,它应该是range.second = mySet.upper_bound(index_t(key+1, 0));,因为upper_bound()(不像lower_bound())返回一个迭代器,指向一个严格来说更大的元素。 很高兴为您提供帮助!不过,不太清楚upper_bound 不起作用是什么意思。 我不是说upper_bound() 不工作。在第一条评论中,我的意思是如果迭代从下限开始直到key 发生变化,则不需要upper_bound()。在第二条评论中,我注意到上限 index_t 必须设置为下一个更大的索引,因为迭代通常会在 it == range.second 处中断。 我认为lower_bound(index_t(key+1, 0))upper_bound(index_t(key, UINT_MAX)) 都会做正确的事情。但我认为upper_bound(index_t(key+1, 0)) 将包含值为key+1, 0 的条目。试试看你是否不同意。另外,您还打算发布您的解决方案吗?还是比这更复杂?

以上是关于如何理解canopen通讯中的索引和子索引的主要内容,如果未能解决你的问题,请参考以下文章

CANopen总线协议中心主题之对象字典(OD)

conopen协议是怎么回事

允许在查找时忽略子索引的复合索引的 C++ 容器

Matlab是如何实现高效的子索引的?

如何在“结构”子索引中使用 FOR 循环? - MATLAB

如何在 Rails 中设置没有特定父 ID 的子索引路径?