打印
[CAN-bus/DeviceNet]

有做过CAN广播协议的处理进来

[复制链接]
4313|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lin404|  楼主 | 2008-4-19 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个CAN系统中,用的是PeliCAN模式,用的是双滤波模式,一个用于过滤村机地址,一个用于过滤系统的广播地址。那么发起一个广播信息,只要一个的节点接收到信息,都会应答。那么怎样才能知道是不是每个节点都接收到了该信息?是不是要让每个节点接收到都返回一个接收标志?这样的话通信量岂不是要增加很多?

相关帖子

沙发
lnskngdc| | 2008-4-21 13:02 | 只看该作者

不用返回

这个广播命令不需要返回,如果不敢确定你可以多发几次,要不就是设置一个配置状态:这期间任何节点都不主动发送报文,这样的话可以保证主节点发的广播命令不会丢失。

使用特权

评论回复
板凳
lin404|  楼主 | 2008-4-21 14:17 | 只看该作者

还是不明白

可能是我没说明白:一个CAN系统中,假设有100个CAN节点,现在有一个节点要发起一个广播信息帧。其它99个节点都要接收这个广播信息。问题是只要有一个节点正确接收到了这一帧信息,主动发起的节点就认为通信正常,不再重发。那么我怎么才能知道99个接收节点都已经接收到这个广播信息。

使用特权

评论回复
地板
lnskngdc| | 2008-4-21 15:49 | 只看该作者

要看你用的什么协议了

如果波特率设置正确,节点ID没有重复,只要你正确发送了就可以认为其他节点都收到了。我们做的就是这样的,根本不用节点返回。
看你说的意思,是不是用的SJA1000?如果是SJA1000可以在发送函数结束后判断是否发送成功。
难道你是想让ID最低的那个节点应答来判断?如果这个节点出现故障了怎么办?你的节点地址都是固定的吧?有没有智能节点或者有竞争做主的协议,你用的是什么协议?什么方式?一主多从?多主多从?

使用特权

评论回复
5
lin404|  楼主 | 2008-4-21 16:12 | 只看该作者

谢谢lnskngdc

谢谢lnskngdc的回答。我用的是SJA1000,我用的协议是参考HiLon协议A自已定的。节点地址是固定的,地址用来作报文的滤波参数,另外整个系统还用了一个额外的系统地址(另一个滤波参数)作为广播地址。我自己作了5个节点,发广播信息时,是每个节点都可以接收到,就是担心挂了100个节点时是不是能够所有节点都接收到。CAN系统中作为发送节点只要有一个节点能够正确接收到报文就判断已经正确发送。但你又是怎么才能确保所有节点都正确接收到了?

使用特权

评论回复
6
lnskngdc| | 2008-4-21 16:53 | 只看该作者

那就是硬件的问题了

如果终端电阻没有配好,或者总线阻抗的原因,以及布线的好坏都能影响正常通讯。在软件上需要考虑的就是时间,在你发广播消息时尽量减少总线上的通讯量,比如用硬件或软件让系统进入一个静默状态,这时,由于软件造成的竞争报文丢失就不会出现了。软件能做到让一个节点能收到,那100个节点也能收到,只是有硬件的影响而已。我遇到过这种情况,是因为终端电阻的问题引起的。
另外,你有100个节点都挂在一个网络上?是不是有点太危险了?而且不可靠,很容易出问题。
个人建议采用中继器来做网络,这样即延长了通讯电缆的长度也提高了速度。我现在做的项目有300个节点,可不敢都放在一个网络里,hoho,即使一个网段出现问题不会导致整个网络瘫痪,虽然中继器增加了成本,但是值得考虑。

使用特权

评论回复
7
lin404|  楼主 | 2008-4-21 16:58 | 只看该作者

CAN中数据帧和远程帧在应用上有什么区别

CAN中数据帧和远程帧在应用上有什么区别?特别是当把数据帧的长度设为0时,2个有什么区别?
CAN系统中作为发送节点只要有一个节点能够正确接收到报文就判断已经正确发送。但你又是怎么才能确保所有节点都正确接收到了?假如在改善广播信息时,有一个节点出错了,关闭了.没有接收到信息,发送节点还是正确发送了,并不会自动重发.但出错的节点,并没有收到信息.大家一般是怎么处理的?那位兄弟出来提示一下!!

使用特权

评论回复
8
lin404|  楼主 | 2008-4-21 17:09 | 只看该作者

谢谢lnskngdc

谢谢lnskngdc的回答。中继器并没有减少网络的节点数量,反而还增加了节点的总数量.假如我一定要有100个节点,那按你的做法那只能建2级网络(即组成同几个不同的子网再往上传输)这样你的成本就会增加不少,还有时间上的成本.个人认为还是会出现我说的问题.特别是刚好有个节点自己出问题的时候,没办法再次接收到出错时的信息.除非出错节点,主动要求再发送一次.

使用特权

评论回复
9
lnskngdc| | 2008-4-21 20:07 | 只看该作者

那就应答吧

你想的很全面,但是这样就把问题复杂化了,那么除了每个节点收到广播报文后都应答一次,我想不出什么更好的办法能保证每个节点都收到报文......多做几次试验就知道了嘛。中继器是保证大范围内可靠运行,另外可以延长总线长度,虽然在时间上牺牲一些,但是传输速度上也相应提高了啊。成本也就相当于一个节点的价钱,可以买现成的嘛。

使用特权

评论回复
10
yyccaa| | 2008-4-21 22:54 | 只看该作者

.

100个节点,对于单条can总线而言负载已经够大了。DeviceNet的限制是64个,CanOpen是127个,而实际上由于硬件设计原因,实际负载能力最多为110个左右,如果其中有的收发端还包括了tvs的话,负载能力可能只有20个左右,甚至是10个左右。
数量大的话,中继器是必然的选择。
要确保广播方式下所有相关节点都收到数据,一般只有返回确认用帧。如果要求不那么高,就通过定时多次重发来减少丢失的概率。

使用特权

评论回复
11
lnskngdc| | 2008-4-22 08:59 | 只看该作者

不用中继器的话也可以

主节点用带双CAN接口的片子构成两个网络

使用特权

评论回复
12
lin404|  楼主 | 2008-5-5 17:10 | 只看该作者

谢谢lnskngdc

谢谢lnskngdc,我想知道一般:单条can总线带多少路负载合适,现在考虑带%左右即110*70%=80路左右,会不会负载还是太重。总不能一路一路的试吧。各位有没有实际应用过的数据(带载数),有的出来喊一声,谢谢各位了!!还有一点用TJA1050的收发器发现在5K的速度通信不成功,10K以上就可以,想知道为什么?

使用特权

评论回复
13
lnskngdc| | 2008-5-5 19:32 | 只看该作者

不用谢

我做过的60个节点没问题,再多就没试验了,没条件。
如果不加电容,TVS管,80个节点估计有点在边缘徘徊。还是减少点吧
你这个系统又没中继器,又没有冗余.......
Tja1050理论最多支持110个节点,你用的主节点和从节点的处理器是一样的吗?晶振有没有区别?有的时候两个不同的can节点会出现波特率误差。
比如SJA1000用16M晶振计算1M的波特率,其实际波特率可能在0.95Mbps,而C8051F040用22.1184M的晶振计算1M的波特率,实际值可能在1.05Mbps,尤其体现在最高的和最低的速度时。我做的网络用了3种can处理器,1M和5k总是有问题,后来修改传输距离、检测点、总线延迟时间后才能正常。如果没有理论计算值的话就需要一点一点的碰。你肯定用的是标准的波特率吧?速度低的时候和速度高的时候采样点不能一样的知不知道?

使用特权

评论回复
14
lnskngdc| | 2008-5-6 14:33 | 只看该作者

框架是这个样子的

网桥用51能处理过来吗?会不会丢帧?深度是多少?
一般好像都是用LPC2119吧?
普通的51是1MIPS,而ARM可以达到40~100MIPS,分频的结果就是这样产生的
ARM和51的系统时钟是不同的,ARM是2119吗?
CAN时钟有没有分频?51的估计是用系统时钟吧?因为速度够慢的了.
而ARM内嵌的CAN需要分频,就是在这里导致的波特率误差,呵呵,上回没说清楚
我的联系方式:lnskngdc@163.com
基本不上qq,就用邮件吧联系吧!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

58

帖子

0

粉丝