登录
首页 现场总线
回帖 发帖
正文

主题:CD485, 让 RS485 支持多主对等通讯

点击:3620 回复:7

历史
2009 年大二下学期,我和小夥伴们一起参与一个校企联合项目,开发一款煤矿用皮带机综合保护器, 我主要负责电路软硬件设计,因为矿井中皮带很长,保护器节点间相距约六百米, 各节点除了处理数据收发还要负责中继,为了更优的可靠性和实时性,中继部分采用 FPGA 硬件实现, 因此中继带来的延时远小于一个位长。 因为没有额外的主机,按照传统,只能指定其中一个节点为主机, 该节点负责持续发出查询命令同步所有节点之数据,但万一该主节点中途出故障下线,整个总线将会停止运行。 所以为了进一步提升系统鲁棒性及降低软件复杂性,于是我设计了一款带仲裁的 485 协议,做到节点间可以自由收发数据, 只有第一字节用做仲裁的字段使用低速传输,剩余数据使用传统 485 高速传输,在引入仲裁的同时保留了高速,当然也是由硬件实现。
传统 485 的局限
无论是串口还是 485 通讯,传输的数据正常都是要打包发送,常见的有类似 0xff 0xaa 两个字节做为数据包的开头,加上用户自定义的数据格式可以判断包的结尾。 0xff 0xaa 这种标记方式容易与其后数据重复,做为判断不是绝对保险(譬如一个数据包正文正好也有一个 0xff 0xaa, 当该数据包出错一次导致错位,接收者认为正文的 0xff 0xaa 是包头,那么其后的超时重传可能会导致错误一直持续下去); 绝对保险的方式是使用 ModBus RTU 也采用的空闲状态来做分隔,总线没有数据超过设定时间后为空闲状态, 空闲状态下到来的数据便是数据包的开始,但这种方式对于用户的实时性要求较高,譬如使用了带 FIFO 缓冲的串口接收芯片,如果用户未及时取出第一个数据包又收到第二个数据包, 那么两个数据包的数据连在一起无法通过时间来分隔(此时按照数据包格式通常也可以继续区分数据包,但前提是数据包不能出错)。
在普通的 485 应用场景中,CPU 直接控制 485 接口芯片接收数据,需要软件判断数据包何时开始何时结束,即使该数据包并非发给自己,CPU 也要被总线数据频繁中断,影响效率。 同时收到数据包后还要校验以确保正确性,是一件非常占用 CPU 资源的工作。 值得一提的情形是:如果 CPU 有较高优先级任务要处理,会很难指定数据接收和其它任务的优先级顺序:如果数据接收的优先级更高,那么当总线不停来数据的时候会不停打断其它任务处理; 如果接收优先级低一些,那么又会经常丢失数据。
同时,由于传统 485 只能单台主机不停查询各从机以同步数据,总线的数据一定少不了,且利用率很低,实时性和鲁棒性也差。 譬如有一个从机是一只开关,主机为了知道开关当前是否按下,要不停发送查询数据包,然后开关回覆一个包含当前状态的数据包给主机; 如果可以做到各节点均可主动发出数据包,那么当开关状态改变时,只需要发送一个数据包给主机便可,即快省又便捷。
CAN 总线的局限
为了降低 CPU 占用和自由收发数据包,所以一部分人选择了 CAN 总线,CAN 控制器由硬件处理数据包收发、校验,同时提供自由收发数据包的能力(仲裁), 但是 CAN 的数据包最多只能传输 8 个字节数据,而且高速 CAN 最高速率只有 1 Mbps, 比 485 的标准 10 Mbps 低太多(485 速率还可以更高),而且 CAN 的版权费用导致成本很高。
最新的 CAN FD (CAN with Flexible Data-Rate) 可以支持超过 1 Mbps 的速率,但由于硬件依旧不是推挽输出,所以通常也只有 2 Mbps、5 Mbps, 而且也找不到独立的控制器芯片, 由于要兼容 CAN2.0, 加上 CAN 本身硬件较为复杂,Microchip 2015 年说计划推出 CAN FD 控制器,结果到现在也没有出来。
CAN 还有一个特色是废除传统的站地址编码,代之通过区分不同消息,以实现多播 (multicast), 但我觉得它带来的缺点远超过优点:因为整个系统的命令空间会耦合在一起, 如果一开始命令空间分配的不合理,要想修改就会牵一发而动全身;而且配置过滤接收也十分繁琐;接收者也不清楚是谁发出的数据包;发送者虽然能收到 ACK 应答,也不能保证所有相关节点都收到。
在节点本来就不多的系统中(不超过 255),仅使用单播和广播就完全够用:譬如我要同时控制四个车窗升降,分别发送四个数据包给四个玻璃窗也不会很低效,而且当我想单独控制某一个玻璃窗时也不需要改变数据包定义; 又如,当刹车等紧急情况发生时,使用广播包可以最迅速通知到每一个节点,即便车窗不响应该命令,被紧急事务打断一下也是完全可以接受的。
最后修改:2017/6/10 19:02:50
17-06-03 20:49
CD485 介绍
2017 年初,我接手一个工业机械臂的项目,为了分别调试电机电流环、速度环及位置环参数,需要实时抓出电机运行中的数据,总线上还有很多传感器,即使是正常使用数据量也会很大, 同时还要兼顾成本和电路面积,市面很多总线协议均不符合需求,为此,我把 09 年的协议命名为 CD485 协议,并完善成为独立的控制器模组/芯片。
CD485 协议只定义数据包格式,不规定用户数据格式;只支持单播和广播,不支持多播;只提供硬件避让、避让后自动重传,而应答及出错处理则由上层用户负责。
当前硬件支持的特性:
CD485 总线上各节点均可主动发起传输,通过节点地址仲裁以避免冲突
总线上每个数据包可以含有 0 ~ 253 字节用户数据
共有 8 个 RX 缓存页和 2 个 TX 缓存页,每一页 256 字节
硬件为每个数据包自动完成 16 位 CRC 生成与校验
波特率: 412 bps 至 9 Mbps(更换晶振可支持 10 Mbps; 且另有模组支持到 36 Mbps)
可分别为仲裁字段和后续数据设置不同的波特率
兼容传统 RS485 总线
提供 SPI 和 I2C 接口
配置和操作便捷
CD485 协议
附件 cd485_cn_protocol.jpg
如果把两个波特率设置同等大小,便可以在保留仲裁机制的同时与传统 485 硬件进行通讯,传统硬件优先级设置高于 CD485 节点,由 CD485 节点主动避让传统节点。 当然还可以关闭仲裁功能,完全使用传统通讯模式;且模组不仅可以用于 485 通讯还可以用于串口等通讯。
值得顺便一提的是,使用 CD485 控制器,实现节点自动分配 ID 也会简单很多,譬如:各节点随机生成一个数,用此随机数设定硬件发送等待时间,同时将该随机数置于数据包发送给主机; 主机为未重复的随机数对应的节点指派地址(如果有收到错包,指派地址前需要再次发包确认是否仅一个节点生成此数),然后通知未取得地址的节点(例如 ID 统一为 254)重复刚才的步骤,直到 254 地址没有节点回覆为止。
附件 sch.jpg
附件 cd485_photo.jpg
更多实现细节可以参考:http://blog.dukelec.com/archive/cd485-cn 結尾的 pdf 文檔
最后修改:2017/6/10 19:05:45
17-06-03 20:50
楼主大牛,膜拜!!!!!!
17-06-05 16:21
谢谢楼主分享。
17-06-05 17:12
学习一下,这个有没有相关成型的产品呢,可以合作
17-06-25 11:29
此模组目前已经应用于我司的很多款机械臂及配套附件;
就此通讯模组本身来说,首先它自身已然是一件可以销售的产品,跟其它电子元器件一样,可以被各行业所采用;
我将会基于它开发的副产品有:
 将会把我在电脑端调试时使用的 USB <--> SPI <--> CD485 做成成品工具,
 同时将会推出电脑端 PCIe <--> CD485 高速多路板卡,
 以后可能还会有 AT 命令的透传模组、CD485 中继器等。
我还将于近期推出纯软件模拟 CD485 协议支持 STM32 等 MCU 的开源软件库。
欢迎合作,可以加我微信:dukelec
或电邮:duke#dukelec.com (# 替换为 @)
17-06-28 20:12
又升級了一版,帖子超過 7 日不可以更新,所以訪問我上面留的 blog 連接查看最新內容吧,這裏再貼兩個對比的表格:
附件 cd_bus1_cn.jpg
附件 cd_bus2_cn.jpg
17-08-06 15:54
资料更新:
http://m.gkong.com/bbs/452982.ashx (传输视频场景)
https://github.com/dukelec/cdbus_doc/blob/master/intro_zh.md
最后修改:2018/4/7 17:40:01
18-04-07 17:36

工控新闻

更多新闻资讯