OPC DA转MQTT
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.cs和Form1.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 NetSendData = "{{";
for (int i = 0; i < opcdaItems.Count; i++)
{
str = string.Format("\"{0}\":{1}", opcdaItems[i].Name, DataArray[i].Value);
NetSendData = NetSendData + str + ",";
}
NetSendData += string.Format("\"{0}\":\"{1}\"", "time", DateTime.Now.ToString());
NetSendData = NetSendData + "}}";
4. 界面交互模块
基于Windows Forms实现图形化操作界面,核心文件为Form1.cs和Form1.Designer.cs,提供配置输入、操作按钮、状态显示等功能。
- 核心控件与功能映射:
| 控件类型 | 控件名称 | 功能描述 |
|----------------|------------------------|------------------------------|
| 文本框 | textBoxopcdaip | 输入OPCDA服务器IP |
| 下拉框 | comboBoxopcdaname | 显示搜索到的OPCDA服务名称 |
| 按钮 | buttonopcdasearch | 搜索指定IP下的OPCDA服务器 |
| 文本框 | textBoxmqttaddr | 输入MQTT服务器地址 |
| 按钮 | buttonmqttconnect | 连接MQTT服务器 |
| 文本框 | textBoxopcdapara | 输入要添加的OPCDA参数名 |
| 按钮 | buttonopcdaadd | 添加OPCDA采集参数 |
| 按钮 | button_work | 启动数据采集与上传任务 |
| 文本框 | textBox2 | 显示运行日志、错误信息 |
5. 日志记录模块
负责程序运行过程中的日志记录(正常日志、异常日志),核心文件为Logger.cs和LoggerEnum.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上传间隔可自定义(单位:秒),适配不同场景下的数据采集频率需求。
四、使用说明
(一)环境准备
- 操作系统:Windows系统(支持.NET Framework运行环境)。
- 依赖组件:安装OPCDAAuto.dll组件,并在项目中引用。
- 网络环境:确保客户端与OPCDA服务器、MQTT服务器网络互通。
(二)操作步骤
- 首次运行配置:
- 打开程序,界面显示默认配置(若config.json不存在,需手动配置)。
- OPCDA配置: - 在"服务地址"文本框输入OPCDA服务器IP(如127.0.0.1)。
- 点击"查找"按钮,搜索服务器上的OPCDA服务,在下拉框中选择目标服务(如Kepware.KEPServerEX.V6)。
- 在"参数名"文本框输入需采集的OPCDA参数(如Channel1.Device1.Tag1),点击"添加",可多次添加多个参数,"个数"文本框显示当前参数数量。
- MQTT配置: - 输入MQTT服务器IP、端口(默认1883)、ClientId、用户名、密码。
- 输入数据上传主题(如api)和上传间隔(如10秒)。
- 点击"参数保存"按钮,保存配置到config.json。
- 启动服务:
- 点击OPCDA区域的"连接"按钮,日志框显示"OPCDA服务器连接成功!"表示连接正常。
- 点击MQTT区域的"连接"按钮,日志框显示"已连接到MQTT服务器!"表示连接正常。
- 点击"运行"按钮,启动数据采集与上传任务,日志框将显示参数值变化和上传状态。
- 其他操作:
- 点击"显示"按钮,查看当前已添加的OPCDA采集参数。
- 点击"清除"按钮,清空日志框内容。
- 点击"清除"(OPCDA参数区域),清空已添加的采集参数。
五、注意事项
- OPCDAAuto.dll依赖:确保系统已注册OPCDAAuto.dll组件,否则会导致OPCServer实例创建失败,需通过
regsvr32 OPCDAAuto.dll命令注册。 - 配置文件格式:
config.json需符合JSON标准格式,手动修改后若格式错误,程序将提示"不是标准Json格式",需检查并修正。 - 网络权限:确保程序有访问网络的权限,防火墙未拦截OPCDA(默认端口)和MQTT(1883端口)的通信。
- 参数合法性:OPCDA参数名需与服务器端一致,否则订阅失败,日志框会显示"订阅数据失败!"。
- 日志目录权限:程序需有创建日志目录的权限,若
C:\OpcDaLogs目录创建失败,日志将无法正常记录,需手动创建目录并赋予写入权限。 - 重连机制限制:自动重连无次数限制,若服务器长期离线,程序将持续尝试重连,可能占用一定资源,建议及时排查服务器状态。
六、扩展建议
- 支持批量导入参数:当前仅支持单个添加OPCDA参数,可扩展支持从Excel或文本文件批量导入参数列表,提升配置效率。
- 数据加密传输:MQTT当前使用明文传输,可扩展支持MQTTs协议,添加SSL/TLS加密配置,提升数据传输安全性。
- 异常告警功能:添加邮件或短信告警功能,当服务器连接失败或数据上传异常时,及时通知管理员。
- 历史数据存储:增加数据库(如SQLite、MySQL)存储功能,将采集的历史数据持久化,支持数据查询和分析。
- 跨平台支持:当前基于Windows Forms,可迁移至.NET Core,实现Windows、Linux跨平台运行。
opcda转mqtt

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

所有评论(0)