打印
[485通信]

我设计的 485 地址自动分配方案,大家给点意见?

[复制链接]
楼主: dukedz
手机看帖
扫描二维码
随时随地手机跟帖
21
oufuqiang| | 2018-6-5 23:04 | 只看该作者 回帖奖励 |倒序浏览
先标记,再慢慢细读吸收思想

使用特权

评论回复
22
dukedz|  楼主 | 2018-6-5 23:10 | 只看该作者
本帖最后由 dukedz 于 2018-6-5 23:15 编辑
icecut 发表于 2018-6-5 22:50
用广播包修改设备地址这种设计是个坑.lz 不去把坑堵上....反而搞了一个比较繁琐的 id 自动分配.
我想说 lz  ...

有试过去堵,譬如只有非广播命令才可以修改 ID, 但实际使用也会不小心把两个设备改成相同 ID, 后果差不多。
而且当单独配置的时候,我不知道目标 ID 是多少,只用发一个广播就可以把目标改为我所指派的地址,如果不支持广播,操作起来就会多一些步骤。
而且自动分配 ID 很多产品都有需求,商用的也很多,我的实现相对比较简洁(只借用两个现有命令,就算用不到自动分配,放那里也不占地方,求个心里安稳),如果有更加简单的方案,欢迎分享。

使用特权

评论回复
23
xuplastic| | 2018-6-6 08:20 | 只看该作者
机械臂还有用485的?

还是EtherCAT之类靠谱一点

使用特权

评论回复
24
yklstudent| | 2018-6-6 08:45 | 只看该作者
我们就一直使用自定义协议+自动分配地址的方案,虽然繁琐些,实际是肯定能稳定工作的

使用特权

评论回复
25
dukedz|  楼主 | 2018-6-6 10:10 | 只看该作者
本帖最后由 dukedz 于 2018-6-6 10:14 编辑
xuplastic 发表于 2018-6-6 08:20
机械臂还有用485的?

还是EtherCAT之类靠谱一点

内部关节,直径 50mm 左右的圆板,中间还有挖空,EtherCAT 放都放不下。

EtherCAT 用起来没那么简单吧,研发周期、成本这些都要考虑。。。
最重要的是,带不来任何提升。
能见到用 EtherCAT 的臂大多也只是留的对外接口,为了方便集成到现有 EtherCAT 环境,同时也会留出 RS485 这些传统通讯口。
我倒是见了一些臂对外只留了一个普通以太网接口。。。

使用特权

评论回复
26
henangongda123| | 2018-6-6 18:02 | 只看该作者
楼主,可以参考我们LED照明行业的DMX512协议

使用特权

评论回复
27
dukedz|  楼主 | 2018-6-6 19:42 | 只看该作者
本帖最后由 dukedz 于 2018-6-6 22:28 编辑
henangongda123 发表于 2018-6-6 18:02
楼主,可以参考我们LED照明行业的DMX512协议

10 年的时候,我也在照明行业,现在也没有完全脱离这个行业,但我真的不知道 DM512 有什么好的地址分配的方案,协议没有包含的吧,都是各做各的,大多也是播码开关啊,要不就是一台一台去写地址啊,要不就一个转发一个啊,没别的招数了吧?

使用特权

评论回复
28
henangongda123| | 2018-6-6 20:27 | 只看该作者
dukedz 发表于 2018-6-6 19:42
10 年的时候,我也在照明行业,现在也没有完全脱落这个行业,但我真的不知道 DM512 有什么好的地址分配的 ...

是的 没有自动分配的功能

使用特权

评论回复
29
chunyang| | 2018-6-6 20:32 | 只看该作者
正确做法:主机先发未分配地址节点查询指令,终端用唯一ID加算法延时的办法回报,回报发起前一定要先进行总线监听,一旦侦听发现总线被占用即放弃本次回报。遇到冲突,同样放弃本次回报。主机收到正确的回报信息后,针对唯一ID号进行地址分配。主机连续多次发出未分配地址节点查询指令无回报后则可以认为地址自动分配完毕,然后再运行一次节点报名轮询,与分配数比较无误后结束整个地址分配流程。注意,每次分配必须用会话式协议,只要出错,一律放弃本次分配。节点地址分配成功后,即不对主机发出的未分配地址节点查询指令。如果要再次进行自动分配,可以用专门的清除指令后进行。
注意,协议编制中,广播指令顶多只能有清除类指令,绝对不能有地址写入指令,这是起码的常识,协议编制必须考虑各种容错。

使用特权

评论回复
评论
chunyang 2018-6-6 21:43 回复TA
@guojin0273 :不要使用“评论”,这非常不便看全所说的。 
guojin0273 2018-6-6 21:38 回复TA
大侠这说了一个重点,总线侦听,这个问题解决了,其它都不是事,问题是如何侦测总线是空闲的呢? 
30
airwill| | 2018-6-6 20:35 | 只看该作者
嗯, 幸亏有个唯一码. 如果没有唯一码的情况, 不知道用什么方法实现这个功能?

使用特权

评论回复
31
chunyang| | 2018-6-6 20:39 | 只看该作者
唉,回个帖子,结果黑米八宝粥给煲糊了……

使用特权

评论回复
32
chunyang| | 2018-6-6 21:45 | 只看该作者
总线侦听就是判断总线是否有节点处于发送态,如果有,串口一定会收到数据,不管数据是什么,只要有数据,就说明总线被占用。

使用特权

评论回复
33
chunyang| | 2018-6-6 21:51 | 只看该作者
终极侦听法就是监测总线上是否出现逻辑0,出现则说明占用。监测逻辑0可用查询甚至可以用沿中断。

使用特权

评论回复
34
dukedz|  楼主 | 2018-6-6 22:15 | 只看该作者
本帖最后由 dukedz 于 2018-6-6 23:14 编辑
chunyang 发表于 2018-6-6 20:32
正确做法:主机先发未分配地址节点查询指令,终端用唯一ID加算法延时的办法回报,回报发起前一定要先进行总 ...

真的是抱歉,害你煲糊了。。。

仔细看了下,实际我们的做法都差不多,有两个小区别:

1. 你的方式主机查询一次,只有一台返回;我的方案是查询一次全部都返回(可以额外限定范围),实际操作的话可能会更加方便,譬如不需要专门去编程,用串口助手发送一个查询,就可以扫描到所有设备信息,方便调试。如果主机是 MCU 的话,且内存比较小,不愿意一下收很多数据的话,也可以忽略第一个回复之后的数据包。我的方案也不需要去监听是否有其它人回复,甚至不用在发送前监听总线空闲(毕竟有些人的场景是单主轮询的方式,没必要专门为地址分配引入空闲监听),逻辑简单些,代码也少很多。

2. 我的方案没有特别去区分有没有分配到地址(CDBUS 中本机地址为 255 可以用来表示没有分配到地址,用来隐藏设备,很少需要用),譬如出厂地址是在 0~254 之间的一个数,譬如 254, 同样 0~254 之间的任意一个数也是合法的地址。这样做可能会更方便一点,譬如用户不需要去设置地址就可以与之通讯,特别是在单台设备的情况下。

广播清除地址和广播修改地址原则上没太大区别吧,主机在干活之前肯定会检查各节点是否就位,就算不检查,遇到通讯不上的情况也会停机,反正都是重新分配地址就可以解决。

使用特权

评论回复
35
chunyang| | 2018-6-7 00:03 | 只看该作者
dukedz 发表于 2018-6-6 22:15
真的是抱歉,害你煲糊了。。。

仔细看了下,实际我们的做法都差不多,有两个小区别:

自动化设计,最重要的是容错机制。

使用特权

评论回复
36
dukedz|  楼主 | 2018-6-7 00:27 | 只看该作者
chunyang 发表于 2018-6-7 00:03
自动化设计,最重要的是容错机制。

同意。

容错和木桶堵漏一样,关注点也很重要。

同时,越简单越不容易出错这点也很重要,所谓的 K.I.S.S. 原则。

使用特权

评论回复
37
皈依| | 2018-6-7 08:38 | 只看该作者
请教一下 每个关节是一个节点。。为啥不同节点的地址不写死嘞。。。

使用特权

评论回复
38
A9A1314| | 2018-6-7 10:51 | 只看该作者
dukedz 发表于 2018-6-5 13:06
譬如一个 STM32F105 的产品,它正常工作情况下返回的产品信息为:
'M: cdbus bridge; S: 43ff8d50d47553531 ...

很不错的想法,实现上应该比较好。

使用特权

评论回复
39
dukedz|  楼主 | 2018-6-7 11:02 | 只看该作者
本帖最后由 dukedz 于 2018-6-7 15:22 编辑
皈依 发表于 2018-6-7 08:38
请教一下 每个关节是一个节点。。为啥不同节点的地址不写死嘞。。。

刚审核导致重复了,要用单独,不能用另一个词。。。

使用特权

评论回复
40
dukedz|  楼主 | 2018-6-7 14:47 | 只看该作者
皈依 发表于 2018-6-7 08:38
请教一下 每个关节是一个节点。。为啥不同节点的地址不写死嘞。。。

Servo 电机还是单独的产品,可以单独销售,写死不现实。

写死的话,固件管理很麻烦,升级代码也可能改错 ID.

而且写死,会增加装配难度,经常装错。

使用特权

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

本版积分规则