C# OPC客户端与数据采集系统详解
·
C#连接OPC C#上位机链接PLC程序源码 1.该程序是通讯方式是CSharp通过OPC方式连接PLC,用这种方式连PLC不用考虑什么种类PLC,只要OPC服务器里有的PLC都可以连。 2.该资料包含程序,还有一些学习资料。
概述
本文详细分析了一个基于C#开发的OPC客户端应用程序和工业数据采集系统。该系统主要用于与OPC服务器进行通信,实现工业设备数据的实时采集、监控和存储,并提供了完善的数据查询和管理功能。
系统架构与功能模块
1. OPC客户端测试程序
核心功能
- 服务器连接管理:支持枚举本地或远程OPC服务器,建立稳定连接
- 数据监控:实时订阅和显示OPC项的数据变化
- 数据写入:支持向选定的OPC项写入新值
- 节点浏览:递归浏览服务器所有分支和叶子节点
关键技术实现
OPC连接初始化
private bool CreateGroup()
{
try
{
this.opcGroups = opcServer.OPCGroups;
this.opcGroup = opcGroups.Add("MyGroup");
this.SetGroupProperty();
opcGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGroup_DataChange);
opcItems = opcGroup.OPCItems;
return true;
}
catch(Exception e)
{
MessageBox.Show(e.Message);
return false;
}
}
数据变化事件处理

系统通过异步方式处理数据更新,确保实时性:
private void opcGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles,
ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
// 实时更新数据网格显示
for (int i = 1; i <= NumItems; i++)
{
int m = (int)ClientHandles.GetValue(i) - 1;
dataGridView1.Rows[m].Cells[2].Value = ItemValues.GetValue(i).ToString();
// 更新其他相关字段...
}
}
2. 工业数据采集系统
系统架构特点
- MDI多文档界面:主界面采用多文档架构,支持多个子窗口同时工作
- 实时数据展示:分设备显示测试数据,包括温度、转速、电压等关键参数
- 报警管理:实时记录和显示系统报警信息
- 数据持久化:将采集数据存储到SQL Server数据库
数据采集核心逻辑
心跳监测机制

系统通过心跳信号确保与PLC的稳定通信:
private void TimerHeartBeat_Tick(object sender, EventArgs e)
{
// 心跳信号处理
if ((Beat == true) && (StartTimer1 == false))
{
LabShow(labComm, "通讯正常");
labComm.BackColor = Color.Lime;
TimerHeartBeatOP20.Enabled = true;
}
}
数据存储流程

当测试完成时,系统自动保存测试结果:
string sql1 = "insert into TestData(TestTime,TestDevice,ProgramCode,KZCode,Sonser," +
"McuTemperatureMax,MoterTemperatureMax,SpeedMax,Voltage,Electricity,Power,resut) " +
"values('" + testTime1 + "'," + TestDevice1 + "," + programCode1 + "," +
KZCode1 + ",'" + labMotor1Sensor.Text.Trim() + "'," +
McuTemperatureMax1 + "," + MoterTemperatureMax1 + "," +
SpeedMax1 + "," + Voltage1 + "," + Electricity1 + "," +
Power1 + ",'" + labResult1.Text.Trim() + "')";
DataDB.DataSQL(sql1);
3. 数据库管理模块
数据访问层设计
系统封装了完整的数据库操作类,支持:
- 连接管理:自动管理数据库连接生命周期
- 事务处理:确保数据操作的原子性
- 批量操作:支持DataTable到数据库的批量写入
- 错误处理:完善的异常处理机制
核心数据库操作
public static DataSet GetDataFromDB(string Sqlstr)
{
SqlConnection conn = new SqlConnection(connStr);
try
{
conn.Open();
SqlDataAdapter myAdapter = new SqlDataAdapter(Sqlstr, conn);
DataSet myDataSet = new DataSet();
myAdapter.Fill(myDataSet);
return myDataSet;
}
finally
{
conn.Close();
conn.Dispose();
}
}
4. 数据查询与导出功能
高级查询特性
- 时间范围查询:支持按时间段筛选测试数据
- 多条件过滤:可根据设备号、测试结果等条件组合查询
- 数据导出:将查询结果导出为Excel格式,保持数据格式完整性
Excel导出实现
private bool ExportDataToExcel(object dtt)
{
// 创建Excel应用实例
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(true);
// 数据格式处理
excel.Range[excel.Cells[2, 2], excel.Cells[rowNumber + 1, 2]].NumberFormat = "yyyy/MM/dd HH:mm:ss";
excel.Range[excel.Cells[2, 9], excel.Cells[rowNumber + 1, 12]].NumberFormat = "0.00";
// 显示结果
excel.Visible = true;
return true;
}
系统特色与优势
1. 多线程安全
系统充分考虑了多线程环境下的控件访问安全:
private void LabShow(Label label, string text)
{
if (label.InvokeRequired)
{
delegateLabel opcdelateTimer = new delegateLabel(InvokeLabel);
this.Invoke(opcdelateTimer, label, text);
}
else
{
label.Text = text;
}
}
2. 实时性保障
- 使用OPC异步订阅模式确保数据实时更新
- 心跳监测机制及时发现通信故障
- 事件驱动架构减少不必要的轮询
3. 可扩展性设计
- 模块化设计便于功能扩展
- 配置化的OPC项管理
- 支持多设备并行监控
4. 用户友好性
- 直观的数据可视化界面
- 完善的报警提示系统
- 灵活的数据查询和导出功能
技术要点总结
该系统的成功实现依赖于以下几个关键技术点:
- OPC Automation接口的正确使用:合理管理OPC服务器连接和组项生命周期
- 数据库事务处理:确保数据的一致性和完整性
- 跨线程UI更新:保证在多线程环境下的界面响应性和稳定性
- 内存管理:及时释放COM对象和数据库连接资源
- 错误恢复机制:具备从通信中断等异常中恢复的能力
这套系统为工业环境下的数据采集和监控提供了一个稳定、高效的解决方案,具有良好的实用价值和可扩展性。


DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)