opcda转mqtt

一、软件概述

本软件是一款基于OPCDAAuto.dll开发的OPCDA客户端工具,核心功能是实现OPCDA服务器数据的采集,并将采集到的数据通过MQTT协议上传至指定的MQTT服务器。软件采用C#语言开发,基于Windows Forms构建图形化界面,支持参数配置持久化、自动重连、数据实时监控等特性,适用于工业自动化场景中不同系统间的数据互通需求。

二、代码框架与模块划分

(一)整体架构流程图

graph TD
    A[程序启动] --> B[加载配置文件config.json]
    B --> C{配置文件读取成功?}
    C -- 否 --> D[提示配置错误,等待用户配置]
    C -- 是 --> E[初始化图形界面,显示配置参数]
    E --> F[用户操作选择]
    F --> F1[OPCDA配置:设置IP、搜索服务、添加参数]
    F --> F2[MQTT配置:设置地址、端口、认证信息等]
    F1 --> G[连接OPCDA服务器]
    F2 --> H[连接MQTT服务器]
    G -- 连接成功 --> I[订阅OPCDA指定参数数据]
    H -- 连接成功 --> J[启动数据上传定时器]
    I --> K[监听OPCDA数据变化]
    K --> L[缓存最新数据]
    J --> M[定时器触发,读取缓存数据]
    M --> N[格式化数据为JSON格式]
    N --> O[通过MQTT上传数据]
    O --> P{连接状态正常?}
    P -- 异常 --> Q[自动重连对应服务器]
    P -- 正常 --> K
    F --> F3[保存配置]
    F3 --> R[更新config.json文件]

(二)核心模块划分

1. 配置管理模块

负责配置文件的读取、解析、保存,以及配置参数与界面控件的绑定。核心文件为jsonFormat.csForm1.cs中的cfgRead()cfgSave()方法。

  • 数据模型定义:通过实体类映射配置文件结构,确保JSON数据与对象的序列化/反序列化一致性:
// jsonFormat.cs 核心实体类
public class MainRootJson  // 配置根节点
{
    public MQTTcfg MqttCfg { get; set; }  // MQTT配置节点
    public OPCDAcfg OpcdaCfg { get; set; }  // OPCDA配置节点
}

public class MQTTcfg  // MQTT配置详情
{
    public string Addr { get; set; }  // 服务器地址
    public string Port { get; set; }  // 端口
    public string ClientId { get; set; }  // 客户端ID
    public string UserName { get; set; }  // 用户名
    public string Password { get; set; }  // 密码
    public string Topic { get; set; }  // 订阅主题
    public string Inerval { get; set; }  // 上传间隔(秒)
}

public class OPCDAcfg  // OPCDA配置详情
{
    public string Addr { get; set; }  // 服务器IP
    public string Host { get; set; }  // 服务名称
    public List<Item> Item { get; set; }  // 需采集的参数列表
}
  • 核心方法
  • cfgRead():读取程序目录下的config.json文件,解析后将参数填充到界面文本框、下拉框等控件,并初始化OPCDA参数列表opcdaItems
  • cfgSave():将界面上的配置参数序列化到MainRootJson对象,再转换为JSON字符串写入配置文件,实现配置持久化。
2. OPCDA通信模块

基于OPCAutomation组件实现与OPCDA服务器的连接、参数订阅、数据采集和断开连接功能,核心代码位于Form1.cs

  • 核心对象
  • OPCServer myOPCsvr:OPCDA服务器实例
  • OPCGroups opcGroups:服务器组集合
  • OPCGroup opcGroup:数据采集组(默认名称"OPCDAGROUP")
  • OPCItems opcItems:组内待采集的参数集合
  • 核心方法
  • CreateOpcdaServer():创建OPCDA服务器实例,失败则记录日志。
  • ConnectOpcdaServer(string strHostIP, string strHostName):根据IP和服务名称连接服务器,连接成功后配置组属性:
    csharp
    opcGroups.DefaultGroupIsActive = true; // 激活组
    opcGroups.DefaultGroupDeadband = 0; // 死区值为0,数据变化立即上报
    opcGroups.DefaultGroupUpdateRate = 500; // 默认更新频率500ms
    opcGroup.UpdateRate = 1000; // 组更新频率1000ms
    opcGroup.IsSubscribed = true; // 启用订阅模式,监听数据变化
    opcGroup.DataChange += opcGroup_DataChange; // 绑定数据变化事件
  • opcGroupDataChange():数据变化回调函数,当OPCDA参数值更新时,自动更新本地缓存数组DataArray中的值、质量戳和时间戳。
  • AddGroupItems():将配置的OPCDA参数添加到采集组,完成参数订阅。
3. MQTT通信模块

基于MQTTnet库实现MQTT客户端的连接、重连、数据发布功能,核心代码位于Form1.cs

  • 核心对象
  • MqttClient mqttClient:MQTT客户端实例
  • System.Timers.Timer timer_publish:数据上传定时器
  • 核心方法
  • ConnectMqttServerAsync():异步连接MQTT服务器,配置连接参数(地址、端口、认证信息等),支持自动重连:
    csharp
    var options = new MqttClientTcpOptions
    {
    Server = textBoxmqttaddr.Text,
    Port = 1883, // 默认端口1883
    ClientId = textBoxmqttclientid.Text,
    UserName = textBoxmqttusername.Text,
    Password = textBoxmqttpassword.Text,
    CleanSession = true // 清除会话信息
    };
    await mqttClient.ConnectAsync(options);
  • MqttClient_Send(string inputString):将格式化后的JSON数据发布到指定主题,发布失败则触发重连。
  • MqttTimer():定时器触发函数,检查OPCDA和MQTT连接状态,读取缓存数据并格式化为JSON:
    csharp
    string NetSend
    Data = "{{";
    for (int i = 0; i < opcdaItems.Count; i++)
    {
    str = string.Format("\"{0}\":{1}", opcdaItems[i].Name, DataArray[i].Value);
    NetSend
    Data = NetSendData + str + ",";
    }
    NetSend
    Data += string.Format("\"{0}\":\"{1}\"", "time", DateTime.Now.ToString());
    NetSendData = NetSendData + "}}";
4. 界面交互模块

基于Windows Forms实现图形化操作界面,核心文件为Form1.csForm1.Designer.cs,提供配置输入、操作按钮、状态显示等功能。

  • 核心控件与功能映射
    | 控件类型 | 控件名称 | 功能描述 |
    |----------------|------------------------|------------------------------|
    | 文本框 | textBoxopcdaip | 输入OPCDA服务器IP |
    | 下拉框 | comboBoxopcdaname | 显示搜索到的OPCDA服务名称 |
    | 按钮 | buttonopcdasearch | 搜索指定IP下的OPCDA服务器 |
    | 文本框 | textBoxmqttaddr | 输入MQTT服务器地址 |
    | 按钮 | buttonmqttconnect | 连接MQTT服务器 |
    | 文本框 | textBoxopcdapara | 输入要添加的OPCDA参数名 |
    | 按钮 | buttonopcdaadd | 添加OPCDA采集参数 |
    | 按钮 | button_work | 启动数据采集与上传任务 |
    | 文本框 | textBox2 | 显示运行日志、错误信息 |
5. 日志记录模块

负责程序运行过程中的日志记录(正常日志、异常日志),核心文件为Logger.csLoggerEnum.cs

  • 日志类型:通过LogType枚举定义日志级别:
public enum LogType
{
    All,
    Information,  // 信息日志
    Debug,        // 调试日志
    Success,      // 成功日志
    Failure,      // 失败日志
    Warning,      // 警告日志
    Error         // 错误日志
}
  • 日志存储:日志文件存储在C:\OpcDaLogs\Log\日期\目录下,按日期分文件夹,每个日志文件以GUID命名,支持异常详情记录(包含异常类型、消息、堆栈信息)。

三、代码优势

(一)模块化设计,职责清晰

各模块独立实现特定功能,配置管理、通信逻辑、界面交互、日志记录分离,便于维护和扩展。例如,MQTT通信模块可单独修改以支持MQTTs协议,OPCDA模块可扩展支持更多参数配置。

(二)高可靠性,支持自动重连

  • OPCDA连接:定时器定期检查服务器状态,离线时自动调用OpcdaConnect()重新连接。
  • MQTT连接:绑定Disconnected事件,断开连接时自动触发ConnectMqttServer()重连。

(三)配置持久化,开箱即用

支持配置文件(config.json)的读取和保存,程序重启后自动加载上次配置,无需重复设置,提升使用效率。

(四)实时监控与日志追溯

  • 界面日志框实时显示运行状态、错误信息,便于即时排查问题。
  • 本地日志文件记录详细操作和异常堆栈,支持问题追溯和后期分析。

(五)灵活的参数配置

支持动态添加、清除、显示OPCDA采集参数,MQTT上传间隔可自定义(单位:秒),适配不同场景下的数据采集频率需求。

四、使用说明

(一)环境准备

  1. 操作系统:Windows系统(支持.NET Framework运行环境)。
  2. 依赖组件:安装OPCDAAuto.dll组件,并在项目中引用。
  3. 网络环境:确保客户端与OPCDA服务器、MQTT服务器网络互通。

(二)操作步骤

  1. 首次运行配置
    - 打开程序,界面显示默认配置(若config.json不存在,需手动配置)。
    - OPCDA配置:
  2. 在"服务地址"文本框输入OPCDA服务器IP(如127.0.0.1)。
  3. 点击"查找"按钮,搜索服务器上的OPCDA服务,在下拉框中选择目标服务(如Kepware.KEPServerEX.V6)。
  4. 在"参数名"文本框输入需采集的OPCDA参数(如Channel1.Device1.Tag1),点击"添加",可多次添加多个参数,"个数"文本框显示当前参数数量。
    - MQTT配置:
  5. 输入MQTT服务器IP、端口(默认1883)、ClientId、用户名、密码。
  6. 输入数据上传主题(如api)和上传间隔(如10秒)。
    - 点击"参数保存"按钮,保存配置到config.json
  1. 启动服务
    - 点击OPCDA区域的"连接"按钮,日志框显示"OPCDA服务器连接成功!"表示连接正常。
    - 点击MQTT区域的"连接"按钮,日志框显示"已连接到MQTT服务器!"表示连接正常。
    - 点击"运行"按钮,启动数据采集与上传任务,日志框将显示参数值变化和上传状态。
  1. 其他操作
    - 点击"显示"按钮,查看当前已添加的OPCDA采集参数。
    - 点击"清除"按钮,清空日志框内容。
    - 点击"清除"(OPCDA参数区域),清空已添加的采集参数。

五、注意事项

  1. OPCDAAuto.dll依赖:确保系统已注册OPCDAAuto.dll组件,否则会导致OPCServer实例创建失败,需通过regsvr32 OPCDAAuto.dll命令注册。
  2. 配置文件格式config.json需符合JSON标准格式,手动修改后若格式错误,程序将提示"不是标准Json格式",需检查并修正。
  3. 网络权限:确保程序有访问网络的权限,防火墙未拦截OPCDA(默认端口)和MQTT(1883端口)的通信。
  4. 参数合法性:OPCDA参数名需与服务器端一致,否则订阅失败,日志框会显示"订阅数据失败!"。
  5. 日志目录权限:程序需有创建日志目录的权限,若C:\OpcDaLogs目录创建失败,日志将无法正常记录,需手动创建目录并赋予写入权限。
  6. 重连机制限制:自动重连无次数限制,若服务器长期离线,程序将持续尝试重连,可能占用一定资源,建议及时排查服务器状态。

六、扩展建议

  1. 支持批量导入参数:当前仅支持单个添加OPCDA参数,可扩展支持从Excel或文本文件批量导入参数列表,提升配置效率。
  2. 数据加密传输:MQTT当前使用明文传输,可扩展支持MQTTs协议,添加SSL/TLS加密配置,提升数据传输安全性。
  3. 异常告警功能:添加邮件或短信告警功能,当服务器连接失败或数据上传异常时,及时通知管理员。
  4. 历史数据存储:增加数据库(如SQLite、MySQL)存储功能,将采集的历史数据持久化,支持数据查询和分析。
  5. 跨平台支持:当前基于Windows Forms,可迁移至.NET Core,实现Windows、Linux跨平台运行。

opcda转mqtt

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐