3. 数据链路层与介质访问控制:谁先说话?
大家好,我是老张。今天咱们聊聊数据链路层里一个特别核心的问题——介质访问控制。说白了,就是总线上那么多设备,到底谁先说话?谁后说话?
这个问题,我在现场调试时遇到过太多次了。有一次在钢铁厂,一条Profibus DP总线挂了几十个变频器,结果时不时就丢一包数据。查了半天,发现是某个从站的响应时间超了,把整个总线的时序给打乱了。嗯,这就是介质访问控制没设计好带来的麻烦。
3.1 主从模式:简单粗暴,但有效
主从模式,我个人觉得是最容易理解的一种方式。总线上只有一个主站,其他全是小弟。主站问谁,谁才能回答。
举个例子,Modbus RTU就是典型的主从模式。主站发一个请求帧,从站收到后回复响应帧。其他从站?老老实实听着,别插嘴。
核心特点:
- 只有一个主站,多个从站
- 从站不能主动发数据
- 主站轮询所有从站
- 实现简单,成本低
我在一个水处理项目中用过Modbus RTU,挂了几十个仪表。主站是一个PLC,轮询一圈大概200毫秒。说实话,对于过程控制来说,这个速度完全够用。但你要是用在运动控制上,那就等着哭吧。
避坑指南:我曾经在一个项目中,从站数量太多,轮询周期拉到了1秒以上。结果操作员按了按钮,阀门要等1秒才动。这谁受得了?所以,主从模式适合从站数量不多、实时性要求不高的场景。
3.2 令牌传递:轮流坐庄
令牌传递,说白了就是大家轮流当老大。总线上有一个特殊的帧叫「令牌」,谁拿到令牌,谁就有发言权。
Profibus FMS和早期的工业以太网都用过这种方式。我记得有一次调试Profibus,发现某个站老是拿不到令牌,后来发现是它的令牌超时时间设得太短了。
个人经验:令牌传递的好处是每个站都有机会发数据,不会出现某个站被饿死的情况。但坏处是,如果某个站挂了,令牌就传不下去了。所以一般都有个「令牌超时」机制,超时了就重新选举。
3.3 CSMA/CD:先听后说,撞了重来
CSMA/CD,全称是载波监听多路访问/冲突检测。你想想看,就像一群人开会,谁想说话就先听听有没有人在说。没人说,你就说。如果两个人同时说了,那就都停下来,等一会儿再试。
这就是经典的以太网用的方式。早期的10BASE5、10BASE2同轴电缆网络,用的就是CSMA/CD。
但这里有个问题——冲突。我在一个工厂里见过,网络流量一大,冲突就多,重传就多,效率直线下降。说白了,CSMA/CD适合轻负载的网络,重负载下性能会急剧恶化。
关键点:
- 先监听,再发送
- 检测到冲突就停止
- 随机等待后重试
- 负载越高,效率越低
3.4 CSMA/CA:先打招呼,再说正事
CSMA/CA,载波监听多路访问/冲突避免。和CSMA/CD的区别在于,它不等到冲突发生,而是提前避免冲突。
怎么避免?发送前先发一个短帧,告诉所有人「我要说话了,你们别抢」。这就是RTS/CTS机制。
无线网络(比如WiFi)用的就是CSMA/CA。为什么?因为无线环境下,检测冲突太难了。你发送的信号和你接收的信号混在一起,根本分不清谁是谁。
我建议:如果你在做无线现场总线项目,一定要考虑CSMA/CA的隐藏节点问题。两个设备都能和AP通信,但互相听不见对方,这就容易出问题。
3.5 确定性调度机制:EtherCAT的集总帧
前面说的几种方式,说白了都是「随机」的。谁抢到谁说话,或者轮到谁谁说话。但对于运动控制、机器人这些场景,需要的是「确定性」——我知道下一毫秒谁会发数据,发什么数据。
EtherCAT就是这方面的代表。它用了一种叫「集总帧」的技术。
什么意思?主站发一个帧,这个帧里包含了所有从站的数据。帧从第一个从站开始传,每个从站读取自己的数据,同时把自己的数据写进去。帧走到最后一个从站,再原路返回。
你想想看,这就像一列火车,每个站上货卸货,火车不停,效率极高。
EtherCAT集总帧的特点:
- 一个帧包含所有从站数据
- 从站处理数据时帧不停
- 极低的延迟(微秒级)
- 完美的确定性
我记得第一次用EtherCAT调试伺服驱动器时,看到100微秒的周期时间,真的被震撼到了。相比之下,传统的现场总线动不动就是几毫秒甚至几十毫秒。
注意:EtherCAT虽然快,但对从站芯片有要求。必须用专用的ESC(EtherCAT从站控制器)芯片,或者用FPGA实现。普通的MCU跑不起来。
3.6 知识体系总览
下面这张图,是我自己总结的介质访问控制知识体系。你可以看到,不同的方式适用于不同的场景。
从这张图可以看出来,不同的介质访问控制方式,其实是在「简单性」和「实时性」之间做权衡。主从模式最简单,但实时性最差。EtherCAT的集总帧最复杂,但实时性最好。
我个人建议,选型时先问自己三个问题:
- 我的系统需要多快的响应?毫秒级?微秒级?
- 总线上有多少个设备?
- 成本敏感吗?
想清楚这三点,你就能选出合适的介质访问控制方式了。
最后说一句:没有最好的协议,只有最合适的协议。我在现场见过用Modbus跑运动控制的,也见过用EtherCAT做温度采集的。嗯,前者基本跑不动,后者纯属浪费。选对工具,事半功倍。
公众号:蓝海资料掘金营,微信deep3321