4. 写入数据到 PLC 通过 OPC UA

任务说明

本案例实现通过 OPC UA 客户端向网关写入数据,网关将数据转发到 PLC 的相应地址。以西门子 S7-200 SMART PLC 为例,使用 Modbus TCP 作为网关下行协议,完成从 OPC UA 写入到 PLC 寄存器更新的完整链路。

环境依赖

  • 网关设备:支持 OPC UA Server 与 Modbus TCP Client 的 IIoT 网关(如 EC20 系列)
  • PLC:西门子 S7-200 SMART,启用 Modbus TCP 服务(端口 502)
  • OPC UA 客户端:UaExpert 或开源库 open62541
  • 网关配置工具:厂商提供的 Mapping 配置软件

网关地址映射配置

在网关配置软件中建立 OPC UA 节点到 PLC 寄存器的映射关系:


OPC UA 节点路径:  ns=2;s=PLC1.VW100
映射目标:         Modbus TCP 保持寄存器 40001 (地址 0)
数据类型:         UInt16

关键完整代码

以下代码使用 Python + open62541 客户端库,向网关 OPC UA 节点写入数据,网关自动转发至 PLC VW100 地址:


from opcua import Client

# 网关 OPC UA 服务器地址
url = "opc.tcp://192.168.1.10:4840"
client = Client(url)

try:
    client.connect()
    print("已连接网关 OPC UA 服务器")

    # 获取目标节点(对应 PLC VW100)
    node = client.get_node("ns=2;s=PLC1.VW100")

    # 写入值(0-65535 范围)
    write_value = 1234
    node.set_value(write_value, varianttype="UInt16")

    # 读取回验
    read_value = node.get_value()
    print(f"写入值: {write_value}, 读回值: {read_value}")

    if read_value == write_value:
        print("OPC UA 写入成功,网关已接收")
    else:
        print("写入校验失败")

except Exception as e:
    print(f"错误: {e}")
finally:
    client.disconnect()

运行方式

  1. 确保网关已配置上述地址映射并连接 PLC
  2. 安装依赖:pip install opcua
  3. 修改代码中网关 IP 地址为实际值
  4. 执行:python write_plc.py

验证方法

  • 程序输出“写入成功”且读回值与写入值一致
  • 在 PLC 编程软件(STEP 7-MicroWIN SMART)中在线监视 VW100 地址,数值应变为 1234
  • 若 PLC 端数值未变化,检查网关 Modbus TCP 连接状态及映射地址是否正确

常见问题

  • 连接失败:确认网关 IP 可达,OPC UA 端口(默认 4840)未被防火墙拦截
  • 写入无响应:检查映射中 PLC 寄存器地址是否超出 VW 区范围(S7-200 SMART V 区最大 10240 字节)
  • 数据类型不匹配:OPC UA 写入类型必须与映射配置的数据类型一致,否则网关拒绝写入