4、自动分配方案概览:基于DHCP思想的Modbus地址池、基于设备UID的静态映射
好,咱们进入正题。自动分配地址,说白了就是让设备自己“领”一个地址,而不是靠人拿着螺丝刀去拨码开关。我做了这么多年现场调试,最怕的就是那种几百台设备、每台都要手动设地址的项目。你想想看,一个不小心拨错了,排查起来简直要命。
所以,自动分配方案就派上用场了。今天咱们聊两种主流思路:一种是模仿DHCP的地址池分配,另一种是基于设备UID的静态映射。这两种我都用过,各有各的脾气。
4.1 基于DHCP思想的Modbus地址池
这个思路,说白了就是让Modbus网络里有个“管家”。这个管家负责管理一个地址池,谁来了就给谁发一个空闲地址。
我习惯把这个管家叫做“地址分配主站”,通常是PLC或者上位机来担任。具体流程是这样的:
- 设备上电:新设备接入网络,此时它的地址是0(广播地址)或者一个默认的临时地址。
- 发送请求:设备向主站发送“我要地址”的请求。这个请求帧,我一般用功能码0x64(自定义),数据域里带上设备的UID。
- 主站分配:主站收到请求,从地址池里挑一个没用的地址,比如从1到247之间选一个。然后主站发一条写地址指令给这个设备。
- 设备确认:设备收到新地址,保存到非易失性存储器里,然后回复确认帧。之后,设备就用这个新地址通信了。
这里有个坑,我曾经踩过。就是设备掉电重启后,地址会不会丢失?
地址池的管理,我一般用一张表来维护。比如这样:
| 地址 | 状态 | 分配时间 | 设备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”的指令。
我曾经在一个化工厂的项目里用过这个方案。现场有80多台仪表,每台都有唯一的序列号。我在上位机里维护了一张Excel表,导入到PLC里。每次更换仪表,只需要更新Excel表,PLC重启一下就行。再也不用派人去现场拨码了。
映射表的结构,我建议这样设计:
| 设备UID | Modbus地址 | 设备类型 | 备注 |
|---|---|---|---|
| 0xA1B2C3D4 | 10 | 温度变送器 | 1号反应釜 |
| 0xE5F6G7H8 | 20 | 压力变送器 | 2号反应釜 |
| 0x11223344 | 30 | 液位计 | 原料罐 |
这里有个细节要注意:UID的读取方式。有些设备支持通过Modbus读取UID,有些则需要通过其他接口(比如串口助手)先写入。我建议在设备选型时,就确认好UID的读取方式,不然现场会抓狂。
4.3 两种方案的对比与选择
说了这么多,到底用哪个?我个人的经验是:
- 地址池方案:适合设备数量多、变动频繁的场合。比如智能楼宇里的传感器网络,今天加一个,明天换一个。动态分配省心。
- 静态映射方案:适合设备数量少、地址需要固定的场合。比如工业控制里的关键仪表,地址变了整个逻辑都得改。
你想想看,如果是一个污水处理厂,几十台泵和阀门,地址固定了,PLC程序里写死地址,多稳定。但如果是一个仓储物流系统,几百个RFID读卡器,今天加明天拆,用地址池就灵活多了。
好了,这一章就聊到这儿。下一章咱们深入讲讲地址池的具体实现,包括怎么处理冲突、怎么续租、怎么回收。这些都是我在项目里踩过的坑,到时候一一分享给你。