在 Electron 框架中连接 OPC UA 服务器并读取 PLC 信息

news/2026/1/25 22:01:05/文章来源:https://www.cnblogs.com/gccbuaa/p/19530582

在 Electron 框架中连接 OPC UA 服务器并读取 PLC 数据,通常可以借助 Node.js 的 OPC UA 客户端库(如 node-opcua)实现。以下是具体实现步骤和示例代码:

一、环境准备

  1. 创建 Electron 项目(若已有项目可跳过):

    mkdir electron-opcua-demo
    cd electron-opcua-demo
    npm init -y
    npm install electron --save-dev
  2. 安装 OPC UA 客户端库:使用 node-opcua(成熟的 OPC UA 客户端 / 服务器实现):

    npm install node-opcua-client --save

二、核心实现思路

Electron 分为主进程渲染进程,建议在主进程中处理 OPC UA 连接(因为涉及底层网络操作),通过 IPC 通信将数据传递给渲染进程显示。

三、示例代码

1. 主进程(main.js

负责连接 OPC UA 服务器、读取 PLC 数据,并通过 IPC 发送给渲染进程:

const { app, BrowserWindow, ipcMain } = require('electron');
const { OPCUAClient, AttributeIds } = require('node-opcua-client');
const path = require('path');
// OPC UA 服务器配置(替换为你的 PLC OPC UA 服务器信息)
const OPCUA_CONFIG = {
endpointUrl: 'opc.tcp://192.168.1.100:4840', // PLC 的 OPC UA 地址
nodeId: 'ns=2;s=PLC_Tag1' // 要读取的 PLC 变量节点 ID(需根据实际 PLC 配置修改)
};
let mainWindow;
let opcuaClient;
// 创建窗口
function createWindow() {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js'), // 用于 IPC 通信
contextIsolated: true // 启用上下文隔离(安全最佳实践)
}
});
mainWindow.loadFile('index.html');
}
// 连接 OPC UA 服务器并读取数据
async function connectAndReadOPCUA() {
opcuaClient = OPCUAClient.create({
applicationName: "Electron OPCUA Client",
securityMode: "None", // 若服务器启用安全验证,需配置对应模式
securityPolicy: "None"
});
try {
// 连接服务器
await opcuaClient.connect(OPCUA_CONFIG.endpointUrl);
console.log('已连接到 OPC UA 服务器');
// 创建会话
const session = await opcuaClient.createSession();
console.log('会话创建成功');
// 循环读取数据(实际场景可根据需求调整频率)
setInterval(async () => {
try {
// 读取节点值(AttributeIds.Value 表示读取变量值)
const dataValue = await session.read({
nodeId: OPCUA_CONFIG.nodeId,
attributeId: AttributeIds.Value
});
const value = dataValue.value.value; // 提取实际值
console.log(`读取到 PLC 数据: ${value}`);
// 通过 IPC 发送数据到渲染进程
mainWindow.webContents.send('plc-data', value);
} catch (err) {
console.error('读取数据失败:', err);
}
}, 1000); // 每秒读取一次
} catch (err) {
console.error('OPC UA 连接失败:', err);
}
}
// 关闭连接
function disconnectOPCUA() {
if (opcuaClient) {
opcuaClient.disconnect().then(() => {
console.log('已断开 OPC UA 连接');
});
}
}
// 应用生命周期
app.whenReady().then(() => {
createWindow();
connectAndReadOPCUA(); // 启动时连接 OPC UA
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
disconnectOPCUA(); // 关闭窗口时断开连接
app.quit();
}
});
2. 预加载脚本(preload.js

用于渲染进程与主进程的 IPC 通信桥接:

const { contextBridge, ipcRenderer } = require('electron');
// 暴露安全的 IPC 接口给渲染进程
contextBridge.exposeInMainWorld('electronAPI', {
onPLCData: (callback) => ipcRenderer.on('plc-data', (event, value) => callback(value))
});
3. 渲染进程(index.html

显示从主进程接收的 PLC 数据:

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Electron OPC UA PLC 读取示例</title></head><body><h1>PLC 数据监控</h1><p>当前值: <span id="plcValue">-</span></p><script>// 监听主进程发送的 PLC 数据window.electronAPI.onPLCData((value) => {document.getElementById('plcValue').textContent = value;});</script></body></html>

四、关键配置说明

  1. OPC UA 服务器地址endpointUrl 需替换为你的 PLC 或 OPC UA 网关的实际地址(格式:opc.tcp://ip:端口)。

  2. 节点 ID(NodeId)nodeId 是 PLC 中变量的唯一标识(如 ns=2;s=Temperature),需通过 PLC 配置工具或 OPC UA 客户端(如 UaExpert)查询确认。

  3. 安全配置:若 PLC 服务器启用了安全验证(如用户名密码、证书),需在 OPCUAClient.create 中配置 securityModesecurityPolicy 及认证信息:

    OPCUAClient.create({
    securityMode: "SignAndEncrypt",
    securityPolicy: "Basic256Sha256",
    userName: "your-username",
    password: "your-password"
    });

五、调试与测试

  1. 确认 PLC 服务器可达:使用 OPC UA 客户端工具(如 UaExpert)先测试连接,确保能正常读取节点值。

  2. 运行 Electron 应用:在 package.json 中添加启动脚本:

    "scripts": {
    "start": "electron ."
    }

    执行 npm start 启动应用,查看控制台输出和页面数据显示。

六、常见问题

  • 连接超时:检查 PLC 网络是否可达、端口是否开放、防火墙设置。
  • 节点不存在:确认 nodeId 格式正确(命名空间索引 ns 和标识符 s 需匹配)。
  • 权限问题:若服务器要求认证,需配置正确的用户名密码或证书。

通过以上步骤,即可在 Electron 中实现 OPC UA 连接并读取 PLC 数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1215910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

得物月付额度回收变现秒到方法

得物月付额度的核心优势,在于让用户在享受消费便利的同时,最大程度降低支付压力,还能解锁多重专属福利。在额度使用上,得物月付设有专属免息期,免息期内还款无需支付任何利息,真正实现“先买后付”无压力;平台还…

Hyperf3.1使用phpunit测试时,代理类无法有效生成覆盖率问题。

Hyperf3.1使用phpunit测试时,代理类无法有效生成覆盖率问题。覆盖率驱动(如PCOV)在收集数据时,有一个关键配置 pcov.directory(Xdebug也有类似机制)。当这个参数未明确设置时,驱动会自动尝试在项目根目录下寻找…

Django 模板 {% if %} 标签空格被自动删除?VS Code 环境解决方案

在开发 Django 项目时&#xff0c;我遇到一个常见问题&#xff1a;本地 IDE&#xff08;VS Code&#xff09;在保存 HTML 模板时&#xff0c;会自动删除 {% if %} 标签两边的空格&#xff0c;导致模板逻辑失效。例如&#xff0c;原始代码&#xff1a;<option value"5&q…

YOLO26改进-上采样 | EUCB高效上卷积块,实现特征图尺度匹配和高效上采样

前言 本文介绍了一种在YOLO26目标检测模型中引入高效解码器模块EMCAD的创新方法&#xff0c;以提升模型在资源受限场景下的性能与效率。EMCAD由多个模块构成&#xff0c;其中核心的EUCB&#xff08;高效上卷积块&#xff09;通过上采样、深度可分离卷积、激活归一化和通道调整…

YOLO26改进 - 下采样 | 轻量化突破:ADown 下采样让 YOLO26 参量减、精度升

前言 本文介绍了一种轻量级的特征下采样模块 ADown&#xff0c;它结合平均池化与最大池化策略&#xff0c;实现更有效的信息保留与压缩。在传统卷积网络中&#xff0c;特征下采样常造成信息损失&#xff0c;而 ADown 通过双通道并行结构优化了下采样效果&#xff0c;提升了模型…

得物月付分期购怎么购物变现

得物月付额度仅限在得物 APP 内用于消费支付,不支持提现、转账或线下消费,其核心使用范围和限制如下: 核心使用范围 平台全品类商品:覆盖球鞋潮鞋、潮牌服饰、运动装备、美妆护肤、数码 3C、奢品箱包、配饰等得物平…

Flutter for OpenHarmony核心组件学习: MaterialApp、Scaffold 两大基础组件以及有无状态组件

Flutter for OpenHarmony核心组件学习: MaterialApp、Scaffold 两大基础组件以及有无状态组件 作者&#xff1a;爱吃大芒果 个人主页 爱吃大芒果 本文所属专栏Flutter 更多专栏 Ascend C 算子开发教程&#xff08;进阶&#xff09; 鸿蒙集成 OpenAgents openJiuwen 从0到1自…

机械革命 AMD H255 CPU 无法从AMD官网下载显卡驱动的解决办法

很奇怪 我手里俩机械革命 H255 都这毛病&#xff0c;WIN10 WIN11都一样 下载最新的驱动12&#xff0c;1月的都这样 安装了随机驱动&#xff0c;然后从 https://www.amd.com/zh-cn.html 下驱动就报182错误 提示没有可支持的硬件 难道我买的是假AMD&#xff1f; 我又继续实验&…

被裁后半月面试8家公司无果,凭借这份Java面试指南成功入职阿里

前言上个月班上的好好的突然被通知"毕业了"&#xff0c;现在工作也确实不好找。之前近一个月面了很多大大小小的公司降薪太严重都没考虑去&#xff0c;最后没办法本来都打算随便去一家了却偶然得到一个阿里的面试机会&#xff0c;足足面了七面&#xff08;我太难了&a…

猎杀时刻,阿里高工总结spring全栈笔记,疯狂狩猎大厂offer!

前言 我们做这行的对于Spring的学习&#xff0c;可以说是一直未停止。前段时间Spring5.0发布&#xff0c;多了很多新功能&#xff0c;这些新功能改变了我们使用该框架的方式。但是很多铁汁对于Spring 5.0的新增功能并不是很了解&#xff0c;更别说利用这些新功能使用Spring MV…

第一天!

今天开始了第一天,学校期间听了javaweb但实际上根本写不出来,准备直接重听了

关于得物月付额度怎么提现,看完秒懂

在潮流消费成为日常的当下,想要入手心仪的球鞋、潮牌、数码好物,却不想被一次性支付的压力打乱消费计划?得物平台推出的得物月付,以专属信用额度为核心,打造“先享后付”的便捷消费体验,适配年轻人的消费节奏,让…

[Linux]Kubuntu下mpv播放器安装与最佳配置(无mpv4补帧)

下载 sudo add-apt-repository ppa:mpv-team/mpv sudo apt update sudo apt install mpv配置 下载神经网络模型FSRCNNX和用户着色器 mkdir -p ~/.config/mpv/shaders cd ~/.config/mpv/shaders wget https://github.co…

SQL数据类型转换:CAST详解及实践

前言 在 SQL 数据处理中&#xff0c;数据类型转换是常见需求&#xff0c;尤其在跨系统数据交互时。在SQL的世界里&#xff0c;数据类型转换是一个基础且关键的操作&#xff0c;它贯穿于数据库开发、管理与数据分析的各个环节&#xff0c;深刻理解它们对于编写高效、稳定的SQL代…

KingbaseES 解锁时序数据:国产数据库在物联网时代的突围之路

引言 刚接触时序数据领域时&#xff0c;我深感困惑。作为技术人员都明白&#xff0c;数据库选型不当会导致巨大的修正代价。近年来&#xff0c;随着工业互联网和物联网的蓬勃发展&#xff0c;各类传感器和监测设备不断产生海量数据&#xff0c;传统数据库已明显捉襟见肘。破局 …

破局时序数据困局:KingbaseES从医疗到交通的国产化实践启示录

引言 本文将深度剖析KingbaseES在时序数据处理中的技术突破与实战。通过时序引擎架构解析、百万级设备接入的实战细节、索引优化踩坑实录、性能调优的量化方法论的实战应用及国产化替代的深层思考。 一、为什么是KingbaseES&#xff1f; 初次接触金仓时序数据库时&#xff0c…

智能农业决策优化:提示工程架构师的AI技术分享

智能农业决策优化&#xff1a;提示工程架构师的AI技术分享 关键词&#xff1a;智能农业、决策优化、提示工程、AI技术、农业大数据、机器学习模型、农业自动化 摘要&#xff1a;本文深入探讨智能农业决策优化中提示工程架构师所运用的AI技术。首先阐述智能农业的领域背景与发展…

得物月付消费购物额度怎么变现

得物月付额度:解锁潮流消费新方式,先享后付更轻松 在潮流消费成为日常的当下,想要入手心仪的球鞋、潮牌、数码好物,却不想被一次性支付的压力打乱消费计划?得物平台推出的得物月付,以专属信用额度为核心,打造“…

LoRA 微调参数调优流程

目录一、准备阶段:评估任务 & 数据二、训练观察阶段:小规模试验三、超参调优阶段四、迭代优化策略五、生产级经验总结 明白了,你问的是 LoRA 微调在生产落地时的参数调优流程,不仅仅是 rank 和 target modules…

串口屏丨串口屏厂家丨液晶屏厂家丨继电保护仪显示屏选型避坑指南:如何解决强电磁干扰、数据跳变与户外严苛工况适配难题?

继电保护仪作为电力系统安全稳定运行的“哨兵”,是变电站、电力运维、电力设备生产等领域不可或缺的核心检测设备,主要用于模拟电力系统故障、校验继电保护装置的动作特性、定值精度与响应速度,其检测结果直接决定电…