4、自动分配方案概览:基于DHCP思想的Modbus地址池、基于设备UID的静态映射

好,咱们进入正题。自动分配地址,说白了就是让设备自己“领”一个地址,而不是靠人拿着螺丝刀去拨码开关。我做了这么多年现场调试,最怕的就是那种几百台设备、每台都要手动设地址的项目。你想想看,一个不小心拨错了,排查起来简直要命。

所以,自动分配方案就派上用场了。今天咱们聊两种主流思路:一种是模仿DHCP的地址池分配,另一种是基于设备UID的静态映射。这两种我都用过,各有各的脾气。

4.1 基于DHCP思想的Modbus地址池

这个思路,说白了就是让Modbus网络里有个“管家”。这个管家负责管理一个地址池,谁来了就给谁发一个空闲地址。

我习惯把这个管家叫做“地址分配主站”,通常是PLC或者上位机来担任。具体流程是这样的:

  1. 设备上电:新设备接入网络,此时它的地址是0(广播地址)或者一个默认的临时地址。
  2. 发送请求:设备向主站发送“我要地址”的请求。这个请求帧,我一般用功能码0x64(自定义),数据域里带上设备的UID。
  3. 主站分配:主站收到请求,从地址池里挑一个没用的地址,比如从1到247之间选一个。然后主站发一条写地址指令给这个设备。
  4. 设备确认:设备收到新地址,保存到非易失性存储器里,然后回复确认帧。之后,设备就用这个新地址通信了。

这里有个坑,我曾经踩过。就是设备掉电重启后,地址会不会丢失?

注意:如果设备每次重启都重新申请地址,那整个网络的地址就会乱套。我建议的做法是:设备第一次上电时申请地址,之后重启直接使用上次保存的地址。除非主站主动发“地址重置”指令,否则不要重新申请。

地址池的管理,我一般用一张表来维护。比如这样:

地址 状态 分配时间 设备UID
1 已分配 2024-01-15 10:30:00 0xA1B2C3D4
2 已分配 2024-01-15 10:31:15 0xE5F6G7H8
3 空闲 - -
... ... ... ...
247 空闲 - -

嗯,这张表要定期维护。比如设备离线超过一定时间,地址就要回收。我个人习惯设置一个“租期”,比如24小时。设备需要定期续租,否则地址就被释放了。

4.2 基于设备UID的静态映射

这个方法更“硬核”一些。它不依赖动态分配,而是靠设备唯一的UID来绑定地址。

每个Modbus设备出厂时都有一个唯一的ID,比如芯片的序列号、MAC地址或者自定义的编号。我们在主站里预先建好一张映射表:哪个UID对应哪个Modbus地址。

设备上电后,主站会扫描网络。怎么扫?我一般用广播帧发一个“你是谁”的指令,所有设备回复自己的UID。主站收到后,查表,然后给每个设备发“请使用地址X”的指令。

核心优势:地址是固定的。哪怕设备换到另一个网络,只要映射表不变,地址就不变。这对于需要固定地址的场合(比如DCS系统)特别友好。

我曾经在一个化工厂的项目里用过这个方案。现场有80多台仪表,每台都有唯一的序列号。我在上位机里维护了一张Excel表,导入到PLC里。每次更换仪表,只需要更新Excel表,PLC重启一下就行。再也不用派人去现场拨码了。

映射表的结构,我建议这样设计:

设备UID Modbus地址 设备类型 备注
0xA1B2C3D4 10 温度变送器 1号反应釜
0xE5F6G7H8 20 压力变送器 2号反应釜
0x11223344 30 液位计 原料罐

这里有个细节要注意:UID的读取方式。有些设备支持通过Modbus读取UID,有些则需要通过其他接口(比如串口助手)先写入。我建议在设备选型时,就确认好UID的读取方式,不然现场会抓狂。

4.3 两种方案的对比与选择

说了这么多,到底用哪个?我个人的经验是:

  • 地址池方案:适合设备数量多、变动频繁的场合。比如智能楼宇里的传感器网络,今天加一个,明天换一个。动态分配省心。
  • 静态映射方案:适合设备数量少、地址需要固定的场合。比如工业控制里的关键仪表,地址变了整个逻辑都得改。

你想想看,如果是一个污水处理厂,几十台泵和阀门,地址固定了,PLC程序里写死地址,多稳定。但如果是一个仓储物流系统,几百个RFID读卡器,今天加明天拆,用地址池就灵活多了。

我的建议:如果条件允许,两种方案可以结合。比如用静态映射作为基础,地址池作为补充。主站先查静态表,如果设备不在表里,再用地址池分配。这样既保证了关键设备的固定地址,又兼顾了灵活性。

好了,这一章就聊到这儿。下一章咱们深入讲讲地址池的具体实现,包括怎么处理冲突、怎么续租、怎么回收。这些都是我在项目里踩过的坑,到时候一一分享给你。