摘要: 本文为IIoT开发者提供罗克韦尔PLC数据采集的技术指南。我们将深扒如何绕开RSLinx,在边缘网关(如鲁邦通EG系列)的Linux环境下,通过CIP协议栈直读ControlLogix标签,并利用Docker容器(Python)实现Allen-Bradley PLC数据上云(MQTT)的高效转发。
导语: 作为开发者,当业务方提出需要采集Allen-Bradley ControlLogix PLC数据时,我们的第一反应可能是OPC。但RSLinx的"重"和OPC DA的"旧"让我们望而却步。本文将从技术实现的角度出发,分享一个更Geek、更高效的RSLinx替代方案:在边缘网关上使用Docker,通过原生CIP协议实现罗克韦尔PLC数据采集,并将数据标准化为JSON,通过MQTT上云。
罗克韦尔PLC数据采集:从CIP到MQTT的边缘实现

1. 技术选型与目标架构
1.1 为什么放弃RSLinx与OPC DA?
作为开发者,我们拒绝"黑盒"。
- DCOM的"诅咒": OPC DA基于DCOM,这在跨网段、跨平台的现代IT/OT融合架构中是不可接受的。
- 资源的浪费: 必须在Windows PC上运行一个重量级的服务,只为了做数据转发。
- 灵活性的缺失: RSLinx是一个封闭的系统,我们无法在数据采集的源头进行定制化的预处理。
1.2 我们的目标架构
PLC <-> 边缘网关 (Debian + Docker + Python App) <-> MQTT Broker
- PLC: Allen-Bradley ControlLogix (1756-L73)
- 边缘网关: 鲁邦通 EG5120 (Cortex-A53, 2GB RAM, 运行RobustOS Pro - Debian 11)
- 采集程序: 运行在Docker容器内的Python脚本 (使用 pycomm3 库)
- 转发目标: EMQ X (MQTT Broker)
2. 核心协议:CIP (Common Industrial Protocol)
要直连PLC,必须理解CIP协议。
2.1 ControlLogix的标签寻址
ControlLogix是基于Tag(标签)的,而非基于Address(地址)。这意味着我们不需要关心N7:0或F8:1,我们只需要关心My_Tag。
2.2 CIP协议的通信机制
我们主要利用CIP协议的非连接(UCMM)或连接(Class 3)消息,通过以太网(EtherNet/IP)发送请求。
- 路径(Route Path): EtherNet/IP的通信需要一个"路径",通常是 1, 0 (1=背板, 0=槽位0的CPU)。
- pycomm3库: 这个优秀的Python库(pip install pycomm3)为我们封装了所有CIP协议细节。我们只需要调用高级API。
3. 边缘网关的实现逻辑
鲁邦通EG5120这样的网关,其价值在于提供了运行Linux + Docker的"沙盒"环境。
3.1 RobustOS Pro (Debian) 环境
网关的操作系统RobustOS Pro本质上是一个裁剪和加固的Debian 11,这意味着我们可以使用apt,并且拥有完整的Linux shell。
3.2 使用Docker部署自定义采集程序
这是最高效的工程实践。
- 编写Dockerfile:
Dockerfile
FROM python:3.9-slim
WORKDIR /app
RUN pip install pycomm3 paho-mqtt
COPY . .
CMD ["python", "main.py"]
- 编写Python采集逻辑 ( main.py )
3.3 (伪代码) Python采集逻辑
下面是使用pycomm3和paho-mqtt的核心伪代码:
Python
import time
from pycomm3 import LogixDriver
import paho.mqtt.client as mqtt
# --- 配置 ---
PLC_IP = '192.168.1.10'
PLC_PATH = '1, 0' # 背板, 槽0
MQTT_BROKER = 'mqtt.your-server.com'
MQTT_TOPIC = 'plc/controllogix/data'
TAGS_TO_READ = ['Tag1', 'Tag2_DINT', 'My_AOI_Instance.Output']
# --- MQTT连接回调 ---
def on_connect(client, userdata, flags, rc):
print(f"Connected to MQTT with result code {rc}")
# --- 初始化 ---
mqtt_client = mqtt.Client()
mqtt_client.on_connect = on_connect
mqtt_client.connect(MQTT_BROKER, 1883, 60)
mqtt_client.loop_start()
# --- 主循环 ---
while True:
try:
# 使用'with'语句自动管理连接
with LogixDriver(PLC_IP, path=PLC_PATH) as plc:
print(f"Connected to PLC {PLC_IP}")
while True:
data_payload = {}
# 批量读取标签,效率更高
tags_data = plc.read(*TAGS_TO_READ)
for tag in tags_data:
if tag.error:
print(f"Error reading tag {tag.tag}: {tag.error}")
data_payload[tag.tag] = None
else:
data_payload[tag.tag] = tag.value
# 发布MQTT
mqtt_client.publish(MQTT_TOPIC, payload=str(data_payload))
print(f"Data published: {data_payload}")
time.sleep(5) # 轮询周期
except Exception as e:
print(f"Connection failed: {e}. Retrying in 10s...")
time.sleep(10)
4. 数据流编排与优化
虽然Python脚本可以"All in one",但在鲁邦通Edge2Cloud Pro平台中,我们有更"优雅"的玩法:
4.1 低代码:使用内置驱动 + Node-RED
对于不那么复杂的场景,我们可以不用写Python。
- E2C Pro平台: 在Web界面配置ControlLogix的IP和标签,平台负责采集。
- Node-RED: 平台将数据推送到内置的Node-RED。
- 编排: 在Node-RED中拖拽节点,实现数据清洗、逻辑判断,最后通过MQTT节点发出。
4.2 混合模式(推荐)
使用罗克韦尔PLC数据采集 的内置驱动(E2C Pro)完成最繁琐的I/O轮询(最稳定),然后将数据推送到本地的Docker容器(如上述Python程序)中进行复杂的计算,最后再转发。
这种软硬结合、低代码与高代码(Docker)混合的模式,是边缘计算的精髓,兼顾了稳定性和灵活性。

常见问题解答 (FAQ)
问题1:pycomm3和CIP协议的安全性如何?
答: CIP协议本身(在EtherNet/IP上)默认是不加密的。这就是为什么采集设备(网关)必须与PLC同在一个受信任的、隔离的OT网络中。严禁将PLC的以太网口直接暴露在公网。安全由边缘网关的防火墙和网络隔离来保障。
问题2:这种Docker方案的资源占用如何?
答: 极低。上述的Python脚本(基于slim镜像),其RAM占用通常在几十MB。对于EG5120这样拥有2GB RAM的设备来说,九牛一毛。
总结: 鲁邦通的边缘计算平台,为开发者提供了前所未有的自由度。对于罗克韦尔PLC数据采集这类"硬骨头",我们不再受制于RSLinx的黑盒。开发者可以利用鲁邦通EG系列的Debian + Docker环境,结合 pycomm3 等开源工具,构建出100%自主可控、高性能、低成本的ControlLogix PLC数据采集与转发(CIP to MQTT)解决方案。