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()
运行方式
- 确保网关已配置上述地址映射并连接 PLC
- 安装依赖:
pip install opcua - 修改代码中网关 IP 地址为实际值
- 执行:
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 写入类型必须与映射配置的数据类型一致,否则网关拒绝写入