NIC 发表于 2018-4-27 10:12:31

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

本帖最后由 NIC 于 2018-4-27 10:15 编辑

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

浮华一生 发表于 2018-4-27 10:17:26

主机存个表 哪些被用了 哪些没有用   扫描到新设备 给个没用的地址撒

Xujuango 发表于 2018-4-27 10:20:46

怎么竞争?

cumt_123456 发表于 2018-4-27 10:22:04

给每台主机分配独立的时间片,时间片轮训。

mnhi124 发表于 2018-4-27 10:29:22

主机发命令,每个从机取一个随机数,在倒计时结束后再回应,如果从机收到有其他设备回应了就等待下次。

596142041 发表于 2018-4-27 10:30:24

地址可以通过芯片的ID地址来确定,主要是怎么来确定主机和从机.

xjjiang 发表于 2018-4-27 10:32:37

自动注册,我之前的产品就是这样做的,10S注册一次,最慢10S内接入网络,注册时间约400ms

chess01 发表于 2018-4-27 10:32:52

那你的设备要有个MAC地址,获得主机分配的地址前,用这个地址和主机通讯.
如果你能做冲突检测,就不用这么麻烦,主机发广播包,没有地址的从机延时一个随机时间后检测有没有其他从机发数据,有则退出,等待下一个广播包,没有则发数据给主机,要求分配地址

NIC 发表于 2018-4-27 10:38:35

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

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

NIC 发表于 2018-4-27 10:41:11

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

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

xjjiang 发表于 2018-4-27 10:48:24

哦,主机不确定是麻烦了,我的智能家居中主机一台,其它都是从机,从机都不一样

xiaohe669 发表于 2018-4-27 10:52:25

有点UDP的意思

weiwei4 发表于 2018-4-27 11:02:02

RDM是485总线的,可分配地址,不用手动设置
前提是你得把协议熟悉了才能做得来

momo_li 发表于 2018-4-27 11:11:33

如果器件有唯一ID的话,可以参考DS18B20的多器件并联总线寻址技术。原理比较简单。

LearningASM 发表于 2018-4-27 11:11:45

强势围观!!!!

一心2013 发表于 2018-4-27 11:20:44

谁先广播谁是主机吧,主机起来后要一直发主机广播指令出去,如果一旦停止超时,其他从机在超时后也抢占广播主机信号,谁抢到就谁的

lb0857 发表于 2018-4-27 11:27:12

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

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

modbus 发表于 2018-4-27 11:42:26

自动分配完怎么知道哪个地址对应哪个物理位置

xjjiang 发表于 2018-4-27 12:04:41

lb0857 发表于 2018-4-27 11:27
可以详解一下吗。这种方式新颖。

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

NIC 发表于 2018-4-27 12:06:37

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

xjjiang 发表于 2018-4-27 12:06:44

modbus 发表于 2018-4-27 11:42
自动分配完怎么知道哪个地址对应哪个物理位置

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

NIC 发表于 2018-4-27 12:12:22

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

RDM是什么

add00 发表于 2018-4-27 13:05:20

本帖最后由 add00 于 2018-4-27 13:23 编辑

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

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

norman33 发表于 2018-4-27 13:15:59

485搞自组网,还主机不确定,楼主你这不自己坑自己?

weiwei4 发表于 2018-4-27 13:19:49

NIC 发表于 2018-4-27 12:12
RDM是什么

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

NIC 发表于 2018-4-27 13:59:53

norman33 发表于 2018-4-27 13:15
485搞自组网,还主机不确定,楼主你这不自己坑自己?

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

lw32 发表于 2018-4-27 14:10:48

本帖最后由 lw32 于 2018-4-27 14:14 编辑

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

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

NIC 发表于 2018-4-27 14:39:47

add00 发表于 2018-4-27 13:05
所有设备都是有编号的,可以按编号做个通讯时分切片,添加一个启动器,启动器启动所有设备,分时接收应答, ...

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

shiva_shiva 发表于 2018-4-27 14:50:38

半双工没主机,大家随便发,不就冲突了吗?

NIC 发表于 2018-4-27 14:52:26

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

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

lw32 发表于 2018-4-27 15:21:51

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

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

NIC 发表于 2018-4-27 15:36:08

本帖最后由 NIC 于 2018-4-27 15:42 编辑

lw32 发表于 2018-4-27 15:21
主机没确定,那就是没主机吧,至少有设备充当主机吧?

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

mydows 发表于 2018-4-27 16:04:53

假设50台设备的ID比较均匀的分布在1-65535之间,根据ID延时上电时间就太长了吧?

NIC 发表于 2018-4-27 16:17:44

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

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

xhcyfc 发表于 2018-4-27 17:30:16

可以参考bacnet mstp标准协议,里面有详细的实现方法

xhcyfc 发表于 2018-4-27 17:31:29

应用层的不用管,就看这个协议的物理层实现章节

durgy 发表于 2018-4-27 17:36:48

NIC 发表于 2018-4-27 12:12
RDM是什么

remote device manager
灯光控制上面用的

add00 发表于 2018-4-28 11:53:10

NIC 发表于 2018-4-27 14:39
你说的启动器是另一个实物?

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

xuhai777 发表于 2018-4-28 12:05:32

设备的485是并联的,还是串联的?串联的作自动地址分配就简单,单中间一个出问题,后面全没信号,并联的需要作信号碰撞检测

xiaowu191 发表于 2018-4-28 12:17:08

weiwei4 发表于 2018-4-27 13:19
灯光行业里的一种协议,DMX512的后续升级协议,支持主机分配地址

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

liansh2002 发表于 2018-4-28 13:16:54

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

mydows 发表于 2018-4-28 14:08:33

本帖最后由 mydows 于 2018-4-28 14:11 编辑

liansh2002 发表于 2018-4-28 13:16
应用场景是怎么样的?
DMX512上有一种方案,不需要分配地址和组网,只有单向数据的话可以参考。485串联使用 ...

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

wkman 发表于 2018-4-28 17:24:54

参考 达拉斯 1-wire   ,首先要求每个mcu都有唯一id,然后,,,走1wire协议查询总线上所有从机,{:titter:}{:victory:}

soos 发表于 2018-4-28 17:58:26

1wire协议公开的吗?

Chuda 发表于 2018-4-28 18:20:03

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

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

chxaitz 发表于 2018-5-3 19:17:40

NIC 发表于 2018-4-27 10:41
怎么注册,主机都不是确定的

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

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

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

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

liurangzhou 发表于 2018-5-3 21:06:40

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

NIC 发表于 2018-5-3 22:33:01

本帖最后由 NIC 于 2018-5-3 22:35 编辑

liurangzhou 发表于 2018-5-3 21:06
有点意思,这里要解决两个问题:1,谁当皇帝2,点到
第一个问题,肯定不能采取选举的办法,不适合这块土 ...

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

nds_shenzhen 发表于 2018-5-3 23:03:12

大神能讲下 主机确定的方法吗 我最近做的项目是主机确定,分机要设置固定id,手动设定,但是我希望能够自动分配。

NIC 发表于 2018-5-4 12:01:44

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

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

liurangzhou 发表于 2018-5-4 12:21:54

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

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

NIC 发表于 2018-5-4 13:29:43

liurangzhou 发表于 2018-5-4 12:21
确定了皇帝老子之后肯定皇帝爱怎么玩就怎么玩了,按顺序点到便是

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

liurangzhou 发表于 2018-5-4 14:01:48

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

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

nds_shenzhen 发表于 2018-5-4 15:02:28

NIC 发表于 2018-5-4 12:01
从机产生随机码延时,延时到上报随机码,主机通过收到的随机码对该从机分配地址 ...

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

NIC 发表于 2018-5-4 15:33:57

liurangzhou 发表于 2018-5-4 14:01
你得首先有一个名字表,然后一个一个叫名字,并给他们编号

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

NIC 发表于 2018-5-4 15:39:04

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

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

liurangzhou 发表于 2018-5-4 15:49:56

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

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

liurangzhou 发表于 2018-5-4 15:50:16

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

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

一夕nandy 发表于 2018-5-4 15:54:00

关注此问题,另外自动分配地址后,最后怎么知道某个地址对应的是哪台设备? 还是要有SN之类记录下来吧

nds_shenzhen 发表于 2018-5-4 16:22:33

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

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

shiva_shiva 发表于 2018-5-4 16:32:06

半双工总线同时发数据多了会烧坏硬件吧

chxaitz 发表于 2018-5-4 18:38:52

norman33 发表于 2018-4-27 13:15
485搞自组网,还主机不确定,楼主你这不自己坑自己?

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

ericdai 发表于 2018-5-4 20:47:35

主机固定还可以搞的

dukelec 发表于 2018-6-6 01:08:53

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

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

go2deathward 发表于 2018-6-6 01:12:09

跟帖里很多办法挺新颖的,学习了

dukelec 发表于 2018-6-6 01:32:52

本帖最后由 dukelec 于 2018-6-6 01:57 编辑

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

协议大概是这么定义的:

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

/*
* NS type:
*   MAC (IP): 255 (::) -> (fe80::)
*   pkt_type = LO_NH_ICMP;
*   icmp_type = ND_TYPE_NS;
*   6 bytes identify
*
* NA type: (send to self MAC, prevent filtering)
*   MAC (IP): 255 (::) -> (fe80::)
*   pkt_type = LO_NH_ICMP;
*   icmp_type = ND_TYPE_NA;
*   6 bytes identify
*   byte0: RSO = 'bx00
*
*
* P.S.:
*    is current MAC or target MAC, and it's not equal to 255
*
*   6 bytes identify: (determine whether the packet is sent by us)
*   only use first 4 bytes currently
*/

/*
* Avoid send collision by lower layer (always enable if sender id = 255):
*   wait for bus idle
*   wait a random time, if bus busy once, go back to: "wait for bus idle"
*   send packet
*
* Address negotiation work flow (periodic execution):
*
* BEGIN:
*   target_addr = self_mac == 255 ? gen_random_addr() : self_mac
*   identify = random uint32 number
*   set_mac_filter(target_addr)
*   next: SEND_NS
*
* SEND_NS:
*   send NS packet
*   next: WAIT_RX
*
* WAIT_RX:
*   if self_mac == 255:
*   if receive NS or NA from others:
*       next: BEGIN
*   else if self NS timeout: (bus data collision)
*       next: SEND_NS
*   else if wait NA timeout:
*       update self_mac with target_addr
*       next: IDLE
*
*   else self_mac != 255:
*   while receive NS from others:
*       send NA back
*   if receive NA from others:
*       set self_mac = 255
*       next: BEGIN
*   else if self NS timeout:
*       next: SEND_NS
*   else if wait NA from others timeout:
*       next: IDLE (keep current address)
*
* IDLE:
*   while receive NS from other node:
*   send NA back
*   // avoid received NA
*/


每个设备上电的时候都可以没有地址(本机地址为 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 个字节限制,方便很多。

sanwa 发表于 2018-6-7 16:02:36

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

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

timer_z 发表于 2018-6-7 16:17:22

每个设备应该有一个唯一的ID, 主设备应该有 硬件开关

sanwa 发表于 2018-6-7 16:53:22

xjjiang 发表于 2018-4-27 12:04
这个技术公司保密的,不好意思,485结合外部中断,我只能说这么多了

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

sblpp 发表于 2018-6-7 16:59:22

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

gy54321 发表于 2018-6-7 17:50:53


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

xjjiang 发表于 2018-6-7 22:23:52

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

isakura 发表于 2018-6-7 22:39:04

xjjiang 发表于 2018-4-27 12:04
这个技术公司保密的,不好意思,485结合外部中断,我只能说这么多了

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

7nian 发表于 2018-6-8 16:19:06

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

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

younew 发表于 2018-6-8 17:13:01

一个很好的问题啊,mark

wochai 发表于 2018-6-21 19:53:09

标记一下
自动分配地址,自动组网

lovecxm 发表于 2018-6-25 23:05:20

自动组网,分配地址方案

am_shui9jing 发表于 2018-7-5 21:18:55

自动组网,很受启发

kv2004 发表于 2018-7-6 10:55:46

先在硬件设计上解决同时发问题。

zhongsandaoren 发表于 2018-7-6 11:06:22

至少要先确定一个主机

kevin_me 发表于 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.整个过程的时间取决于设备数量和随机数的长度

NIC 发表于 2018-7-6 21:16:35

kv2004 发表于 2018-7-6 10:55
先在硬件设计上解决同时发问题。

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

NIC 发表于 2018-7-9 16:44:11

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

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

QZDZ 发表于 2018-7-9 17:35:19

DALI总线就是自组网的,可惜资料太少

kevin_me 发表于 2018-7-10 09:34:30

NIC 发表于 2018-7-9 16:44
你这个看起来有点复杂,组网出现冲突时时间应该不会很快吧

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

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

livekoko 发表于 2018-7-10 10:28:07

学习了,同问硬件上怎么做冲突检测

fct8591 发表于 2018-7-10 11:35:15

待我想想1小时候再来

mydows 发表于 2018-7-10 15:11:26

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

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

xjjiang 发表于 2018-7-10 15:36:07

刚看了彩页和说明,只提到了485,没有提到入网方法,误导你了。不好意思

ccao 发表于 2018-7-11 00:02:23

自动组网,

NIC 发表于 2018-7-11 08:26:21

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

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

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

kevin_me 发表于 2018-7-11 10:28:26

fct8591 发表于 2018-7-10 11:35
待我想想1小时候再来

哥们想好没有

dellric 发表于 2018-7-11 11:09:12

这个问题就是用CAN总线的问题

fct8591 发表于 2018-7-11 12:38:43

想不出太好的办法,半双工通讯2个打起架来其它全完蛋没法竞争。随机码用时间判断也不好处理流水线处理ID都是相邻的用时间延时255台1分钟肯定搞不定。

think_a_second 发表于 2018-7-11 16:38:51

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

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

wkman 发表于 2018-7-11 17:55:37

用mcu内置的唯一id,做达拉斯1-wire协议类似的方式,也是一种。{:sweat:}

leicai05 发表于 2018-9-7 14:43:06

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

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

liangshanguang 发表于 2018-9-27 14:46:39

xjjiang 发表于 2018-4-27 12:04
这个技术公司保密的,不好意思,485结合外部中断,我只能说这么多了

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

liangshanguang 发表于 2018-9-27 15:43:04

marker 一下,过后再看

angler12 发表于 2018-9-29 12:01:50

具体可以参考LED照明中的DALI协议
页: [1] 2
查看完整版本: 485组网自动分配地址有没有什么好的方案