搜索
bottom↓
回复: 104

485组网自动分配地址有没有什么好的方案

  [复制链接]

出0入0汤圆

发表于 2018-4-27 10:12:31 | 显示全部楼层 |阅读模式
本帖最后由 NIC 于 2018-4-27 10:15 编辑

每台设备都是一样的,不需要手动设置地址,要求能够自动分配地址,组网成功后只有一台主机,其他都是从机,设备最多有50台,要求在1分钟内完成组网,有没有什么好的方案,协议上怎么处理

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2018-4-27 10:17:26 | 显示全部楼层
主机存个表 哪些被用了 哪些没有用   扫描到新设备 给个没用的地址撒  

出0入4汤圆

发表于 2018-4-27 10:20:46 | 显示全部楼层
怎么竞争?

出0入4汤圆

发表于 2018-4-27 10:22:04 | 显示全部楼层
给每台主机分配独立的时间片,时间片轮训。

出0入8汤圆

发表于 2018-4-27 10:29:22 | 显示全部楼层
主机发命令,每个从机取一个随机数,在倒计时结束后再回应,如果从机收到有其他设备回应了就等待下次。

出0入0汤圆

发表于 2018-4-27 10:30:24 | 显示全部楼层
地址可以通过芯片的ID地址来确定,主要是怎么来确定主机和从机.

出0入0汤圆

发表于 2018-4-27 10:32:37 | 显示全部楼层
自动注册,我之前的产品就是这样做的,10S注册一次,最慢10S内接入网络,注册时间约400ms

出0入0汤圆

发表于 2018-4-27 10:32:52 | 显示全部楼层
那你的设备要有个MAC地址,获得主机分配的地址前,用这个地址和主机通讯.
如果你能做冲突检测,就不用这么麻烦,主机发广播包,没有地址的从机延时一个随机时间后检测有没有其他从机发数据,有则退出,等待下一个广播包,没有则发数据给主机,要求分配地址

出0入0汤圆

 楼主| 发表于 2018-4-27 10:38:35 | 显示全部楼层
浮华一生 发表于 2018-4-27 10:17
主机存个表 哪些被用了 哪些没有用   扫描到新设备 给个没用的地址撒

主机都不是固定的,设备都是一样的,任何一台都有可能成为主机的

出0入0汤圆

 楼主| 发表于 2018-4-27 10:41:11 | 显示全部楼层
xjjiang 发表于 2018-4-27 10:32
自动注册,我之前的产品就是这样做的,10S注册一次,最慢10S内接入网络,注册时间约400ms ...

怎么注册,主机都不是确定的

出0入0汤圆

发表于 2018-4-27 10:48:24 | 显示全部楼层
哦,主机不确定是麻烦了,我的智能家居中主机一台,其它都是从机,从机都不一样

出0入0汤圆

发表于 2018-4-27 10:52:25 | 显示全部楼层
有点UDP的意思

出0入13汤圆

发表于 2018-4-27 11:02:02 | 显示全部楼层
RDM是485总线的,可分配地址,不用手动设置
前提是你得把协议熟悉了才能做得来

出500入203汤圆

发表于 2018-4-27 11:11:33 | 显示全部楼层
如果器件有唯一ID的话,可以参考DS18B20的多器件并联总线寻址技术。原理比较简单。

出0入0汤圆

发表于 2018-4-27 11:11:45 来自手机 | 显示全部楼层
强势围观!!!!

出0入0汤圆

发表于 2018-4-27 11:20:44 | 显示全部楼层
谁先广播谁是主机吧,主机起来后要一直发主机广播指令出去,如果一旦停止超时,其他从机在超时后也抢占广播主机信号,谁抢到就谁的

出1325入193汤圆

发表于 2018-4-27 11:27:12 | 显示全部楼层
xjjiang 发表于 2018-4-27 10:32
自动注册,我之前的产品就是这样做的,10S注册一次,最慢10S内接入网络,注册时间约400ms ...

可以详解一下吗。这种方式新颖。

出0入0汤圆

发表于 2018-4-27 11:42:26 | 显示全部楼层
自动分配完怎么知道哪个地址对应哪个物理位置

出0入0汤圆

发表于 2018-4-27 12:04:41 | 显示全部楼层
lb0857 发表于 2018-4-27 11:27
可以详解一下吗。这种方式新颖。

这个技术公司保密的,不好意思,485结合外部中断,我只能说这么多了

出0入0汤圆

 楼主| 发表于 2018-4-27 12:06:37 | 显示全部楼层
我现在就是通过采样AD产生一个随机码,根据这个随机码数据大小进行延时上报,自认为第一个上报的就是主机,然后其他从机上报完后,主机通过收到的随机码后给所有从机分配地址。现在是如果设备多了,两个设备的随机码很接近或者相同就会同时第一个上报,那这两个都自认为自己是主机,这种情况就不好处理了,而且还要保证在1分钟组网完成

出0入0汤圆

发表于 2018-4-27 12:06:44 | 显示全部楼层
modbus 发表于 2018-4-27 11:42
自动分配完怎么知道哪个地址对应哪个物理位置

注册完后,主机记下了这个ID,你可以给这个ID语音录入一个名字,相当于IP地址你不用知道,但知道对方的计算机名。

出0入0汤圆

 楼主| 发表于 2018-4-27 12:12:22 | 显示全部楼层
weiwei4 发表于 2018-4-27 11:02
RDM是485总线的,可分配地址,不用手动设置
前提是你得把协议熟悉了才能做得来 ...

RDM是什么

出0入0汤圆

发表于 2018-4-27 13:05:20 | 显示全部楼层
本帖最后由 add00 于 2018-4-27 13:23 编辑

所有设备都是有编号的,可以按编号做个通讯时分切片,添加一个启动器,启动器启动所有设备,分时接收应答,组网成功后把启动器的功能赋予任意一台设备(反正主机是你自己指定的一台),设备的编号赋给启动器,启动器是拥有设备控制权的后门,硬件和软件代价最小的方案,还支持扩容,缺点是单线网络,设备越多,通讯周期越长。

编辑原因:主机说法混淆,更改为启动器

出0入36汤圆

发表于 2018-4-27 13:15:59 | 显示全部楼层
485搞自组网,还主机不确定,楼主你这不自己坑自己?

出0入13汤圆

发表于 2018-4-27 13:19:49 来自手机 | 显示全部楼层
NIC 发表于 2018-4-27 12:12
RDM是什么

灯光行业里的一种协议,DMX512的后续升级协议,支持主机分配地址

出0入0汤圆

 楼主| 发表于 2018-4-27 13:59:53 | 显示全部楼层
norman33 发表于 2018-4-27 13:15
485搞自组网,还主机不确定,楼主你这不自己坑自己?

不用奇怪,很多厂家都这样实现的

出0入0汤圆

发表于 2018-4-27 14:10:48 | 显示全部楼层
本帖最后由 lw32 于 2018-4-27 14:14 编辑

总线型的分配地址?可以参考DALI的地址分配
先发初始化指令,设备初始化后做标志位
    0x00:可以指定全部初始化:把之前的分配的地址清除
    0xFF:没有地址的初始化:只初始化没有地址的设备,一搬用于新加入的设备
    其他:地址相同的设备初始化
发送随机数指令:完成初始化的设备生成24位随机数
发送比较指令:小于比较值的设备回应YES,主机用二叉数遍历所有设备,并分配6位的短地址
设备保存分配好的地址,所以只有第一次安装或新设备加入时才需要分配地址,换主机设备没变的情况下需要重新分配地址

但这个流程不知道1分钟内是否能完成,DALI的这个流程是要求在15分钟内完成的,随机数改为16位可以加快遍历时间,但不知随机样机同的概率怎样
如果设备自身有唯一识别码的话也可以当随机数用

出0入0汤圆

 楼主| 发表于 2018-4-27 14:39:47 | 显示全部楼层
add00 发表于 2018-4-27 13:05
所有设备都是有编号的,可以按编号做个通讯时分切片,添加一个启动器,启动器启动所有设备,分时接收应答, ...

你说的启动器是另一个实物?

出0入0汤圆

发表于 2018-4-27 14:50:38 | 显示全部楼层
半双工没主机,大家随便发,不就冲突了吗?

出0入0汤圆

 楼主| 发表于 2018-4-27 14:52:26 | 显示全部楼层
lw32 发表于 2018-4-27 14:10
总线型的分配地址?可以参考DALI的地址分配
先发初始化指令,设备初始化后做标志位
    0x00:可以指定全部 ...

你这也是主机确定的情况吧,主机确定的情况下是很好弄的,从机产生随机码上报,主机分配地址就是

出0入0汤圆

发表于 2018-4-27 15:21:51 | 显示全部楼层
NIC 发表于 2018-4-27 14:52
你这也是主机确定的情况吧,主机确定的情况下是很好弄的,从机产生随机码上报,主机分配地址就是 ...

主机没确定,那就是没主机吧,至少有设备充当主机吧?

出0入0汤圆

 楼主| 发表于 2018-4-27 15:36:08 | 显示全部楼层
本帖最后由 NIC 于 2018-4-27 15:42 编辑
lw32 发表于 2018-4-27 15:21
主机没确定,那就是没主机吧,至少有设备充当主机吧?


设备都是一样的,要组网过程中产生一个主机,所以每次组网主机可能不是同一台设备,当然如果不是用随机码方式,每次的主机应该是固定的。但如果根据芯片的ID的某几位数来延时上报,会不会出现两台设备因这个数值太接近导致上报冲突的问题,这样就不好组了

出0入0汤圆

发表于 2018-4-27 16:04:53 | 显示全部楼层
假设50台设备的ID比较均匀的分布在1-65535之间,根据ID延时上电时间就太长了吧?

出0入0汤圆

 楼主| 发表于 2018-4-27 16:17:44 | 显示全部楼层
mydows 发表于 2018-4-27 16:04
假设50台设备的ID比较均匀的分布在1-65535之间,根据ID延时上电时间就太长了吧? ...

是的,所以要在1分钟完成所有设备的上报,各个设备之间的上报时间肯定不均匀,有可能出现同时上报,其实只要第一个上报的主机不要有冲突,确定出主机后,后面从机上报冲突问题不是很大,没分配地址再次上报就行

出0入0汤圆

发表于 2018-4-27 17:30:16 来自手机 | 显示全部楼层
可以参考bacnet mstp标准协议,里面有详细的实现方法

出0入0汤圆

发表于 2018-4-27 17:31:29 来自手机 | 显示全部楼层
应用层的不用管,就看这个协议的物理层实现章节

出0入0汤圆

发表于 2018-4-27 17:36:48 | 显示全部楼层

remote device manager
灯光控制上面用的

出0入0汤圆

发表于 2018-4-28 11:53:10 | 显示全部楼层
NIC 发表于 2018-4-27 14:39
你说的启动器是另一个实物?

恩,编号为零的设备,不过他拥有接口特权,可以修改主机的配置

出0入0汤圆

发表于 2018-4-28 12:05:32 来自手机 | 显示全部楼层
设备的485是并联的,还是串联的?串联的作自动地址分配就简单,单中间一个出问题,后面全没信号,并联的需要作信号碰撞检测

出0入0汤圆

发表于 2018-4-28 12:17:08 | 显示全部楼层
weiwei4 发表于 2018-4-27 13:19
灯光行业里的一种协议,DMX512的后续升级协议,支持主机分配地址

是不是理解错了?
RDM每台设备都有不同的设备ID,分配地址只是主机检测到设备后分配DMX512地址码;

出0入0汤圆

发表于 2018-4-28 13:16:54 | 显示全部楼层
应用场景是怎么样的?
DMX512上有一种方案,不需要分配地址和组网,只有单向数据的话可以参考。485串联使用,假设每个模块接收缓存8字节深度,收到数据超过8字节就把先前收到的发给下一台机器。主机只需要知道有多少台从机,然后按从机数*8byte发数据就行了。

出0入0汤圆

发表于 2018-4-28 14:08:33 | 显示全部楼层
本帖最后由 mydows 于 2018-4-28 14:11 编辑
liansh2002 发表于 2018-4-28 13:16
应用场景是怎么样的?
DMX512上有一种方案,不需要分配地址和组网,只有单向数据的话可以参考。485串联使用 ...


懂了!串联,相当于485转发,超过8个字节的部分全部转发给下个设备。中间只要有一个设备坏了,下面的就全部无法控制了?

出0入0汤圆

发表于 2018-4-28 17:24:54 | 显示全部楼层
参考 达拉斯 1-wire   ,首先要求每个mcu都有唯一id,然后,,,走1wire协议查询总线上所有从机,

出0入0汤圆

发表于 2018-4-28 17:58:26 来自手机 | 显示全部楼层
1wire协议公开的吗?

出0入0汤圆

发表于 2018-4-28 18:20:03 | 显示全部楼层
lw32 发表于 2018-4-27 14:10
总线型的分配地址?可以参考DALI的地址分配
先发初始化指令,设备初始化后做标志位
    0x00:可以指定全部 ...

两个疑问,一起讨论下:
1、即使是24位随机数,也有可能产生2个一样的数值吧?同样数值的两个从机将会被设置成相同的地址。
2、用二叉树找最小随机数时,可能存在多个从机的随机数都小于比较值,那些从机不就一起回复了?如果发送数据有延迟,会导致乱码吧?

出0入0汤圆

发表于 2018-5-3 19:17:40 | 显示全部楼层
NIC 发表于 2018-4-27 10:41
怎么注册,主机都不是确定的

这实际上是从2方面考虑,一个是设备的自动注册,一个是设备间的相互通信。
对于通信方式有 竞争的方式和令牌环时间分发的方式
竞争的方式实现的简单,但是接入的节点越多,通信越频繁效率越低,对于多节点推荐用主持人分发令牌环的方式,对于LZ说的总线内50个节点,所以推荐最简单的方案是有网关通过令牌环控制总线内设备的通信。
但是LZ说了,需要采用“无主机”且非竞争的方式,那实际还是需要主机的,只是实际上是无固定主机的方式,那就需要考虑合适的节点注册方案和主持人的评选方案。

先假设主机已选出,然后从机加入的方式:
推荐的方案,主机通过分发令牌环轮询各从机,是否有通信需求,并在循环末尾制造一个空闲令牌,刚加入,无地址的主机,在收到空闲令牌时,
先马上拉低总线,让“主机”知道有未加入的从机,然后从机在随机延迟一定时间后,以竞争的方式向主机发起接入申请,最终接收主机发送的地址,完成握手过程。

然后在考虑主持人的选择方式:
在对等网络中,如果无法保证设备地址的唯一,还是需要一个主持人,来进行地址的分配,这就涉及到主持人的选举。
当一个刚加入的网络的设备,或者在网络内超过一定时间,未接收到环令牌的设备(此设备会先自动降级为,未分配地址的设备),在延时等待主持人分配地址超时后,在随机等待一段时间之后,通过总线竞争的方式,自动升级为主持人。

设备的退出:
设备退出之后,主持人在发放多次令牌,接收不到设备的相应,则认为该设备已退出,并将此设备从设备列表中删除。

出0入0汤圆

发表于 2018-5-3 21:06:40 | 显示全部楼层
有点意思,这里要解决两个问题:1,谁当皇帝  2,点到
第一个问题,肯定不能采取选举的办法,不适合这块土地,因为没有民主,所以只能竞争,上电后以一个以一个随机的时间查看天下形势,如果这个时间到了没听到有人当皇帝,就自己宣布当皇帝,大部分人听到有人当皇帝了肯定就服从,但还是可能有那么一两个跟你同时宣布当皇帝的,怎么办?宣布完之后等待随机时间强调如人不服则砍头,一听到这个其它宣布当皇帝的都悄悄地缩回去了。 通过两步确认自己的皇帝地位;
第二个问题就好办了,一个一个的点名,在的答“到”,并报告自己名字,皇帝老子给你一块令牌

出0入0汤圆

 楼主| 发表于 2018-5-3 22:33:01 | 显示全部楼层
本帖最后由 NIC 于 2018-5-3 22:35 编辑
liurangzhou 发表于 2018-5-3 21:06
有点意思,这里要解决两个问题:1,谁当皇帝  2,点到
第一个问题,肯定不能采取选举的办法,不适合这块土 ...


你说的第二个问题,一个一个的点名,在的答“到”,不是很明白,一上电设备肯定都在。还是说,其它设备也是通过随机码延时,延时到的收到主机的查询就响应,即你说的在的答“到”?

出0入0汤圆

发表于 2018-5-3 23:03:12 | 显示全部楼层
大神能讲下 主机确定的方法吗 我最近做的项目是主机确定,分机要设置固定id,手动设定,但是我希望能够自动分配。

出0入0汤圆

 楼主| 发表于 2018-5-4 12:01:44 | 显示全部楼层
nds_shenzhen 发表于 2018-5-3 23:03
大神能讲下 主机确定的方法吗 我最近做的项目是主机确定,分机要设置固定id,手动设定,但是我希望能够自动 ...

从机产生随机码延时,延时到上报随机码,主机通过收到的随机码对该从机分配地址

出0入0汤圆

发表于 2018-5-4 12:21:54 | 显示全部楼层
NIC 发表于 2018-5-3 22:33
你说的第二个问题,一个一个的点名,在的答“到”,不是很明白,一上电设备肯定都在。还是说,其它设备也 ...

确定了皇帝老子之后肯定皇帝爱怎么玩就怎么玩了,按顺序点到便是

出0入0汤圆

 楼主| 发表于 2018-5-4 13:29:43 | 显示全部楼层
liurangzhou 发表于 2018-5-4 12:21
确定了皇帝老子之后肯定皇帝爱怎么玩就怎么玩了,按顺序点到便是

能否说清楚一点呢,确定的主机又不知道从机的任何信息,如何按顺序点到,相比我说的随机码上报的办法是否有更好的办法

出0入0汤圆

发表于 2018-5-4 14:01:48 | 显示全部楼层
NIC 发表于 2018-5-4 13:29
能否说清楚一点呢,确定的主机又不知道从机的任何信息,如何按顺序点到,相比我说的随机码上报的办法是否 ...

你得首先有一个名字表,然后一个一个叫名字,并给他们编号

出0入0汤圆

发表于 2018-5-4 15:02:28 | 显示全部楼层
NIC 发表于 2018-5-4 12:01
从机产生随机码延时,延时到上报随机码,主机通过收到的随机码对该从机分配地址 ...

从机主动上报随机码吗?会不会 有两个从机同时上报?
另外主机如何对其分配地址?用默认地址? 有没详细的参考

出0入0汤圆

 楼主| 发表于 2018-5-4 15:33:57 | 显示全部楼层
liurangzhou 发表于 2018-5-4 14:01
你得首先有一个名字表,然后一个一个叫名字,并给他们编号

这肯定没有的,每台设备没有任何可区分的信息。就算有所谓的不同名字,主机也不知道这些名字阿

出0入0汤圆

 楼主| 发表于 2018-5-4 15:39:04 | 显示全部楼层
nds_shenzhen 发表于 2018-5-4 15:02
从机主动上报随机码吗?会不会 有两个从机同时上报?
另外主机如何对其分配地址?用默认地址? 有没详细 ...

两个从机同时上报就要能够检测到冲突,检测到冲突就再次随机上报。主机地址为1,主机根据收到的随机码上报进行分配地址,在规定时间内从机上报完,然后主机发送个广播,随机码和地址绑定的数据包,从机收取到数据包后根据随机码确定主机分配给自己的地址

出0入0汤圆

发表于 2018-5-4 15:49:56 | 显示全部楼层
NIC 发表于 2018-5-4 15:33
这肯定没有的,每台设备没有任何可区分的信息。就算有所谓的不同名字,主机也不知道这些名字阿 ...

当这个皇帝也太没意思了,没法搞

出0入0汤圆

发表于 2018-5-4 15:50:16 | 显示全部楼层
NIC 发表于 2018-5-4 15:39
两个从机同时上报就要能够检测到冲突,检测到冲突就再次随机上报。主机地址为1,主机根据收到的随机码上 ...

已经破坏主从原则了,换成CAN吧

出0入0汤圆

发表于 2018-5-4 15:54:00 | 显示全部楼层
关注此问题,另外自动分配地址后,最后怎么知道某个地址对应的是哪台设备? 还是要有SN之类记录下来吧

出0入0汤圆

发表于 2018-5-4 16:22:33 | 显示全部楼层
NIC 发表于 2018-5-4 15:39
两个从机同时上报就要能够检测到冲突,检测到冲突就再次随机上报。主机地址为1,主机根据收到的随机码上 ...

好的 谢谢你  我回头 好好研究了解下

出0入0汤圆

发表于 2018-5-4 16:32:06 | 显示全部楼层
半双工总线同时发数据多了会烧坏硬件吧

出0入0汤圆

发表于 2018-5-4 18:38:52 来自手机 | 显示全部楼层
norman33 发表于 2018-4-27 13:15
485搞自组网,还主机不确定,楼主你这不自己坑自己?

哈哈,也是有和楼主所提的相似的需求,比如单总线多主机(网关)时候的通信网络的内规划。

出0入0汤圆

发表于 2018-5-4 20:47:35 | 显示全部楼层
主机固定还可以搞的

出715入1076汤圆

发表于 2018-6-6 01:08:53 | 显示全部楼层
nds_shenzhen 发表于 2018-5-3 23:03
大神能讲下 主机确定的方法吗 我最近做的项目是主机确定,分机要设置固定id,手动设定,但是我希望能够自动 ...

主机固定的常见情况可以使用我这篇博客写的分配方法,比其它方案简单一些,只需要借用两个正常也会用到的命令,一个查询设备信息,一个用来设置地址。
只是查询信息的命令可以额外增加参数,指定随机等待的时间范围、地址范围过滤及设备信息过滤字符串这三个参数;地址设置同样额外多一个可选的字符串过滤的参数,只有过滤器匹配才可修改地址。
搭配起来就可以实现地址自动配置。
详细内容见:blog.dukelec.com/rs485-auto-addressing-zh

出0入0汤圆

发表于 2018-6-6 01:12:09 | 显示全部楼层
跟帖里很多办法挺新颖的,学习了

出715入1076汤圆

发表于 2018-6-6 01:32:52 | 显示全部楼层
本帖最后由 dukelec 于 2018-6-6 01:57 编辑

楼主这种主机不确定的情况下的地址分配可以参照 IPv6 的地址自动分配方案,我之前有精简出一个可以用于 RS485 的协议,相对于被动地址自动分配的方案还是复杂很多,所以我现在不怎么用(现在用的比较多的是楼上楼上的被动地址自动分配的方案,不敢贴楼号,怕被和谐)。

协议大概是这么定义的:

  1. /*
  2. * Neighbor Discovery for IP version 6 (IPv6)
  3. *
  4. * Refer to:
  5. *   tools.ietf.org/html/rfc4861
  6. *
  7. * Only support NS and NA Message, and compressed in 6LoCD format
  8. *
  9. * We don't use solicited-node multicast address,
  10. * it's useless for CDBUS, so we use link-local address instead.
  11. *
  12. * The source and dest address for NA message are inverted,
  13. * because we don't want interrupt all nodes on the same net.
  14. */

  15. /*
  16. * NS type:
  17. *   MAC (IP): 255 (::) -> [XX] (fe80::[XX])
  18. *   pkt_type = LO_NH_ICMP;
  19. *   icmp_type = ND_TYPE_NS;
  20. *   6 bytes identify
  21. *
  22. * NA type: (send to self MAC, prevent filtering)
  23. *   MAC (IP): 255 (::) -> [XX] (fe80::[XX])
  24. *   pkt_type = LO_NH_ICMP;
  25. *   icmp_type = ND_TYPE_NA;
  26. *   6 bytes identify
  27. *   byte0: RSO = 'bx00
  28. *
  29. *
  30. * P.S.:
  31. *   [XX] is current MAC or target MAC, and it's not equal to 255
  32. *
  33. *   6 bytes identify: (determine whether the packet is sent by us)
  34. *   only use first 4 bytes currently
  35. */

  36. /*
  37. * Avoid send collision by lower layer (always enable if sender id = 255):
  38. *   wait for bus idle
  39. *   wait a random time, if bus busy once, go back to: "wait for bus idle"
  40. *   send packet
  41. *
  42. * Address negotiation work flow (periodic execution):
  43. *
  44. * BEGIN:
  45. *   target_addr = self_mac == 255 ? gen_random_addr() : self_mac
  46. *   identify = random uint32 number
  47. *   set_mac_filter(target_addr)
  48. *   next: SEND_NS
  49. *
  50. * SEND_NS:
  51. *   send NS packet
  52. *   next: WAIT_RX
  53. *
  54. * WAIT_RX:
  55. *   if self_mac == 255:
  56. *     if receive NS or NA from others:
  57. *       next: BEGIN
  58. *     else if self NS timeout: (bus data collision)
  59. *       next: SEND_NS
  60. *     else if wait NA timeout:
  61. *       update self_mac with target_addr
  62. *       next: IDLE
  63. *
  64. *   else self_mac != 255:
  65. *     while receive NS from others:
  66. *       send NA back
  67. *     if receive NA from others:
  68. *       set self_mac = 255
  69. *       next: BEGIN
  70. *     else if self NS timeout:
  71. *       next: SEND_NS
  72. *     else if wait NA from others timeout:
  73. *       next: IDLE (keep current address)
  74. *
  75. * IDLE:
  76. *   while receive NS from other node:
  77. *     send NA back
  78. *   // avoid received NA
  79. */
复制代码


每个设备上电的时候都可以没有地址(本机地址为 255 代表没有分配到地址,因为正常使用的时候 255 是广播地址);

没有地址的设备上电为自己自动随机分配一个 0~254 之间的地址,但不可以直接使用,要先确保地址没有其它人选用;

譬如某个节点随机选择的 id 为 44, 那么就发送一个 255 -> 44 的 NS 数据包(IPv6 协议中 NS 是询问,NA 是应答),并包含一个随机生成的 6 字节的 identify 号码,
只有自己先收到含同样 identify 号码的数据包(表示发送的时候大概没有冲突),然后也没有收到同样地址是 255 -> 44  的 NA 包,也没有收到其它人节点发送的同样地址的 NS 包,那么才可以采用此地址。
如果收到相同地址别人的 NA 回复或 NS 请求,那么则放弃重新选择 ID.

然而如果已经分配到 ID, 那么在收到别人的 NS 请求时,将回复相同 identify 号的 NA 告诉对方有人占用此地址。如果检测到的是别人的 NA, 那么就要放弃已经获得的地址从头来过。
已经分配到 ID 的节点,每隔一段时间也要发个 NS 包检查一下,防止偶发因素没有检测到冲突。

然后对于楼主的要求,一个对等的无 ID 冲突的网络,选出一个主机就很容易了,只需要一个节点(谁速度快是谁)发一个广播包告知天下自己是王,如果已经有王了,那就被夺权,或是比地址大小决定谁胜出,胜出者重新发包告知天下。这种方式,一般上电之后等待一段时间,确保大家 ID 都分好了再进行这个步骤,譬如规定大家分到 ID 后都等 10 秒钟。收到其它人宣告后自动取消自己的宣告打算。

顺便说一下,上面之所以是 255 -> 44 而不是 44 -> 255 是因为 CDBUS 可以使用硬件控制器增强,硬件会过滤掉不是发送给自己的数据包,因此为减少对其它不相干节点的打扰,所以才不使用 44 -> 255 的广播包。
顺便再说下,CDBUS 的硬件增强可以自动避免冲突,跟 CAN 的原理一样,所以可以支持多主对等通讯,而且速率至少可以达到 10Mbps, 数据包也没有 CAN 的 8 个字节限制,方便很多。

出0入0汤圆

发表于 2018-6-7 16:02:36 | 显示全部楼层
xuhai777 发表于 2018-4-28 12:05
设备的485是并联的,还是串联的?串联的作自动地址分配就简单,单中间一个出问题,后面全没信号,并联的需 ...

信号碰撞检测,能说具体点吗?

出0入0汤圆

发表于 2018-6-7 16:17:22 | 显示全部楼层
每个设备应该有一个唯一的ID, 主设备应该有 硬件开关

出0入0汤圆

发表于 2018-6-7 16:53:22 | 显示全部楼层
xjjiang 发表于 2018-4-27 12:04
这个技术公司保密的,不好意思,485结合外部中断,我只能说这么多了

先收到数据的模块,总线不会中断,后收到的都会产生中断,然后根据发具体特殊数据,例如0x7e,这样的有快速返回的模块先返回数据,其他模块如果收到中断就停止回应?

出0入0汤圆

发表于 2018-6-7 16:59:22 | 显示全部楼层
不好做,还是定死的好,设备端根据拨码或者槽位的方式定死地址的好。

出0入0汤圆

发表于 2018-6-7 17:50:53 | 显示全部楼层

不好做,还是定死的好,设备端根据拨码或者槽位的方式定死地址的好。

出0入0汤圆

发表于 2018-6-7 22:23:52 | 显示全部楼层
我发现之前公司的想法,还挺好,简单好用,无拨码,地址自动分配,没有IP那么高大,如果有做报警主机的人,可以看看OPTEX主机的总线,或者说明书,这个机子就是之前我们设计的。总线这个做法,花了近半年的时间完善。开始觉得没什么用,直到有一次面试,问及这个事情,那个老板表现出极大的兴趣,猛然一想,我还签了保密协议。

出0入14汤圆

发表于 2018-6-7 22:39:04 | 显示全部楼层
xjjiang 发表于 2018-4-27 12:04
这个技术公司保密的,不好意思,485结合外部中断,我只能说这么多了

这种方式...我猜是有个外部的仲裁电平线.....这样就简单多了

出0入0汤圆

发表于 2018-6-8 16:19:06 | 显示全部楼层
xjjiang 发表于 2018-6-7 22:23
我发现之前公司的想法,还挺好,简单好用,无拨码,地址自动分配,没有IP那么高大,如果有做报警主机的人, ...

谢谢你的提示
我猜你们是用485加中断检测实现总线仲裁。
没测试过,不知道485的信号线与是否需要外部电路支持。

出0入0汤圆

发表于 2018-6-8 17:13:01 | 显示全部楼层
一个很好的问题啊,mark

出100入0汤圆

发表于 2018-6-21 19:53:09 | 显示全部楼层
标记一下
自动分配地址,自动组网

出0入0汤圆

发表于 2018-6-25 23:05:20 来自手机 | 显示全部楼层
自动组网,分配地址方案

出0入0汤圆

发表于 2018-7-5 21:18:55 | 显示全部楼层
自动组网,很受启发

出0入12汤圆

发表于 2018-7-6 10:55:46 来自手机 | 显示全部楼层
先在硬件设计上解决同时发问题。

出0入0汤圆

发表于 2018-7-6 11:06:22 | 显示全部楼层
至少要先确定一个主机

出5入42汤圆

发表于 2018-7-6 19:49:28 来自手机 | 显示全部楼层
本帖最后由 kevin_me 于 2018-7-6 20:05 编辑

我的思路跟楼上举例当皇帝的类似,但不同,我的想法如下:
1.假设所有设备同时上电
2.所有设备根据自己产生的随机数进行延时
3.一旦随机延时时间到,则发送广播,要求升主
4.其他设备在收到第一个发送广播数据之后,立即停止延时,停止各自后续发送广播的动作
5.假设刚才有几个设备产生的随机数延时恰好相同,则他们几个会同时收到总线上发来的脏数据,也本轮竞争升主失败
6.开始进行第二轮升主竞争,到上一轮所有提前终止随机延时的设备放弃本次竞争,剩下的几个继续
7.重复步骤3和4
8.主机这时确定出来了
9.主机开始给总线上的设备以广播的形式发送地址编号,从1开始
10.所有从设备抢这个地址1的使用权,但必须在随机数延时之后向主机发送确认使用报文
11.第一个最先发出确认请求的从设备获得地址编号1的使用权
12.其余从设备收到第一个从设备的确认报文之后立即停止随机数延时,等待下一轮主机分配地址编号
13.若9步骤时恰好有几个从设备的随机数延时相同,则采用步骤5的方法进行第二轮竞争
14.只有随机数相同的那几个从设备参与地址编号1的使用权竞争,其余从设备放弃
15.直到编号增加到总线上无人回复确认报文,则地址分配结束
16.整个过程的时间取决于设备数量和随机数的长度

出0入0汤圆

 楼主| 发表于 2018-7-6 21:16:35 | 显示全部楼层
kv2004 发表于 2018-7-6 10:55
先在硬件设计上解决同时发问题。

硬件设计上怎么解决同时发问题

出0入0汤圆

 楼主| 发表于 2018-7-9 16:44:11 | 显示全部楼层
kevin_me 发表于 2018-7-6 19:49
我的思路跟楼上举例当皇帝的类似,但不同,我的想法如下:
1.假设所有设备同时上电
2.所有设备根据自己产生 ...

你这个看起来有点复杂,组网出现冲突时时间应该不会很快吧

出0入0汤圆

发表于 2018-7-9 17:35:19 | 显示全部楼层
DALI总线就是自组网的,可惜资料太少

出5入42汤圆

发表于 2018-7-10 09:34:30 | 显示全部楼层
NIC 发表于 2018-7-9 16:44
你这个看起来有点复杂,组网出现冲突时时间应该不会很快吧

我说的很长,其实并不复杂,争主和从机地址分配所用的逻辑完全一样

时间长度主要取决于随机数产生,正好相同的个数

出0入0汤圆

发表于 2018-7-10 10:28:07 | 显示全部楼层
学习了,同问硬件上怎么做冲突检测

出0入0汤圆

发表于 2018-7-10 11:35:15 | 显示全部楼层
待我想想1小时候再来

出0入0汤圆

发表于 2018-7-10 15:11:26 | 显示全部楼层
xjjiang 发表于 2018-6-7 22:23
我发现之前公司的想法,还挺好,简单好用,无拨码,地址自动分配,没有IP那么高大,如果有做报警主机的人, ...

http://www.optexchina.com  ?没有说明书上没提到啊。

出0入0汤圆

发表于 2018-7-10 15:36:07 | 显示全部楼层
刚看了彩页和说明,只提到了485,没有提到入网方法,误导你了。不好意思

出0入0汤圆

发表于 2018-7-11 00:02:23 | 显示全部楼层
自动组网,

出0入0汤圆

 楼主| 发表于 2018-7-11 08:26:21 | 显示全部楼层
kevin_me 发表于 2018-7-10 09:34
我说的很长,其实并不复杂,争主和从机地址分配所用的逻辑完全一样

时间长度主要取决于随机数产生,正好 ...

随机码相同问题可以用唯一CPUID来解决

出5入42汤圆

发表于 2018-7-11 10:28:26 | 显示全部楼层
fct8591 发表于 2018-7-10 11:35
待我想想1小时候再来

哥们想好没有

出0入71汤圆

发表于 2018-7-11 11:09:12 | 显示全部楼层
这个问题就是用CAN总线的问题

出0入0汤圆

发表于 2018-7-11 12:38:43 | 显示全部楼层
想不出太好的办法,半双工通讯2个打起架来其它全完蛋没法竞争。随机码用时间判断也不好处理流水线处理ID都是相邻的用时间延时255台1分钟肯定搞不定。

出0入17汤圆

发表于 2018-7-11 16:38:51 | 显示全部楼层
kevin_me 发表于 2018-7-6 19:49
我的思路跟楼上举例当皇帝的类似,但不同,我的想法如下:
1.假设所有设备同时上电
2.所有设备根据自己产生 ...

你的思路比较完整
不过,第9步之后确认分配从机地址可以简化一下
利用CPU 的唯一ID制造硬件地址,
在主机竞争阶段,各模块发的数据携带硬件地址,接收者记录硬件地址。确认了主机后,主机通过比较硬件地址,分配从机地址(逻辑地址)

出0入0汤圆

发表于 2018-7-11 17:55:37 | 显示全部楼层
用mcu内置的唯一id,做达拉斯1-wire协议类似的方式,也是一种。

出0入0汤圆

发表于 2018-9-7 14:43:06 | 显示全部楼层
kevin_me 发表于 2018-7-6 19:49
我的思路跟楼上举例当皇帝的类似,但不同,我的想法如下:
1.假设所有设备同时上电
2.所有设备根据自己产生 ...

所有的设备一样,配一个拨码开关,出厂的时候,手动拨一个地址不就可以了吗

出0入0汤圆

发表于 2018-9-27 14:46:39 | 显示全部楼层
xjjiang 发表于 2018-4-27 12:04
这个技术公司保密的,不好意思,485结合外部中断,我只能说这么多了

串口通信如何自动分配地址啊,485结合外部中断什么意思,能给点提示吗

出0入0汤圆

发表于 2018-9-27 15:43:04 | 显示全部楼层
marker 一下,过后再看

出110入8汤圆

发表于 2018-9-29 12:01:50 | 显示全部楼层
具体可以参考LED照明中的DALI协议
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 21:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表