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

在 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 数据。

### 集成 node-opcuaElectron 应用 为了在 Electron 中集成使用 `node-opcua` 进行 OPC UA 通信,需遵循特定的方法来确保兼容性和稳定性。以下是具体方法: #### 安装依赖项 首先安装必要的 npm 包,包括 `electron` 和 `node-opcua`。 ```bash npm install electron --save-dev npm install node-opcua --save ``` 这一步骤确保了开发环境中具备所需的基础库[^1]。 #### 创建主进程脚本 创建或编辑项目的主进程文件 (`main.js`) 来初始化 Electron 设置基本配置。 ```javascript const { app, BrowserWindow } = require('electron'); const opcua = require("node-opcua"); function createWindow () { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, 'preload.js'), contextIsolation: true, enableRemoteModule: false } }); win.loadFile('index.html'); } app.whenReady().then(() => { createWindow(); app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } }); }); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); ``` 此部分代码负责启动 Electron 的窗口管理逻辑,未涉及具体的 OPC UA 功能实现[^2]。 #### 实现 OPC UA 客户端连接 接下来,在合适的地方编写用于建立与 OPC UA 服务器连接的客户端代码。可以考虑将其放置在一个单独的服务模块内以便维护和测试。 ```javascript // service/opcuaClientService.js const opcua = require("node-opcua"); async function connectToServer(endpointUrl) { try { const clientOptions = { endpointMustExist: false }; let session; const client = new opcua.OPCUAClient(clientOptions); await client.connect(endpointUrl); console.log(`Connected to ${endpointUrl}`); session = await client.createSession(null); // 使用匿名身份验证 return session; } catch (error) { throw error; } } module.exports = {connectToServer}; ``` 这段 JavaScript 代码展示了如何利用 `node-opcua` API 构建一个简单的 OPC UA 客户端实例,尝试连接至指定 URL 地址的远程 OPC UA 服务端点[^3]。 #### 跨平台构建注意事项 考虑到不同操作系统间的差异性以及可能存在的二进制编译需求,建议采用合适的工具链支持跨平台打包工作。对于某些原生扩展来说,可能还需要额外处理预编译好的 `.node` 文件以适应目标环境的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涔溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值