PLC、Mod、MQTT工厂数据采集,协议转opc ua

工厂里的数据采集就像给设备装上了听诊器,但不同设备说着不同的方言——Modbus、MQTT、OPC UA这些协议就是典型的"方言现场"。今天咱们用Python来当翻译官,把车间里PLC的Modbus数据通过MQTT传上网,最后转成OPC UA的标准格式。

先看PLC侧的Modbus数据抓取。车间里的三菱FX5U用Modbus TCP暴露数据,咱们用pymodbus库来撩它:

from pymodbus.client import ModbusTcpClient

def read_plc_data():
    client = ModbusTcpClient('192.168.1.10', port=502)
    try:
        if not client.connect():
            raise Exception("PLC拒接")
        
        result = client.read_holding_registers(0, 2, slave=1)
        temperature = result.registers[0] / 10.0  # 温度值有小数点
        pressure = result.registers[1]
        return {'temp': temperature, 'press': pressure}
    finally:
        client.close()

这里有个坑要注意——Modbus寄存器地址需要减1,比如40001对应地址0。读出来的数据可能需要做量程转换,比如温度值可能放大了10倍存储。抓数据时最好用try包裹,车间网络说断就断。

抓到的数据得往云端甩,这时候MQTT就派上用场了。用paho-mqtt包发数据:

import paho.mqtt.client as mqtt

mqtt_client = mqtt.Client()
mqtt_client.connect("iot.eclipse.org", 1883, 60)

def publish_data(data):
    payload = f"temp/{data['temp']}/press/{data['press']}"
    # QoS设为1确保至少送达一次
    mqtt_client.publish("factory/plc1", payload, qos=1)
    mqtt_client.loop()  # 处理网络流量

注意MQTT的遗嘱消息(Last Will)设置能让服务器在断线时通知其他客户端。生产环境建议用带TLS的加密连接,别让车间数据裸奔在公网上。

PLC、Mod、MQTT工厂数据采集,协议转opc ua

最后的重头戏是转OPC UA。用opcua库架个服务器:

from opcua import Server

server = Server()
server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

# 命名空间相当于数据目录
uri = "http://factory.io"
idx = server.register_namespace(uri)

# 创建对象节点
objects = server.get_objects_node()
plc_node = objects.add_object(idx, "PLC1")

# 添加变量节点
temp_var = plc_node.add_variable(idx, "Temperature", 0.0)
press_var = plc_node.add_variable(idx, "Pressure", 0)
temp_var.set_writable(False)  # 只读变量

# 启动服务
server.start()

# 数据更新函数
def update_opcua(data):
    temp_var.set_value(data['temp'])
    press_var.set_value(data['press'])

OPC UA的节点树结构特别适合表达设备层级关系。注意变量访问权限设置,别让不该写的客户端乱改数据。实际部署时要配证书,匿名访问就像车间大门不锁。

整个数据流的拼装就像车间流水线:

while True:
    plc_data = read_plc_data()
    publish_data(plc_data)  # 推MQTT
    update_opcua(plc_data)  # 更OPC UA
    time.sleep(1)  # 别把PLC读死了

这里要平衡采集频率和系统负载,有些老PLC处理不了高频请求。遇到通讯中断时要有重试机制,别让整个链路轻易崩溃。

协议转换最难的不是代码,是理解不同协议的设计哲学——Modbus简单直接但功能简陋,MQTT轻巧适合物联网传输,OPC UA则带着工业4.0的野心而来。把这些协议打通,相当于在车间设备、云端系统和IT系统之间架起三座桥,让数据能跨过协议鸿沟自由流动。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐