PLC - C# 数据采集系统实战分享
PLC-C# 数据采集系统关键词:C#、西门子PLC、S7通信、实时曲线、历史曲线、数据库SQLite、导出Excel工控C#上位机 实战学习源码+精美炫酷UI1-上位机源码框架,可适用于大部分项目,轻松实现数据采集、数据展示等信息化需求2、基于C# Winform的精美炫酷画面;3、西门子PLC实战项目,采用S7通信实时读取PLC数据;4、PLC数据以实时曲线的方式进行展示;5、实时数据同步写入
PLC-C# 数据采集系统 关键词:C#、西门子PLC、S7通信、实时曲线、历史曲线、数据库SQLite、导出Excel 工控C#上位机 实战学习源码+精美炫酷UI 1-上位机源码框架,可适用于大部分项目,轻松实现数据采集、数据展示等信息化需求 2、基于C# Winform的精美炫酷画面; 3、西门子PLC实战项目,采用S7通信实时读取PLC数据; 4、PLC数据以实时曲线的方式进行展示; 5、实时数据同步写入到SQLite数据库; 6、可查询历史数据,历史曲线;历史曲线 可同时多曲线或单一曲线展示; 7、历史曲线采用ScottPlot控件,同时可将历史曲线导出图片等; 8、历史数据可导出到Excel;

在工控领域,上位机与 PLC 的数据交互至关重要。今天就来聊聊我在打造 PLC - C# 数据采集系统过程中的一些心得,这里面涵盖了西门子 PLC、S7 通信、实时与历史曲线展示,以及数据库存储和数据导出等一系列实用功能。
上位机源码框架
先来说说这个上位机源码框架,它简直是个神器,就像搭建积木的万能底座,能适配大部分项目。无论是简单的数据采集,还是复杂的数据展示等信息化需求,它都能轻松应对。

PLC-C# 数据采集系统 关键词:C#、西门子PLC、S7通信、实时曲线、历史曲线、数据库SQLite、导出Excel 工控C#上位机 实战学习源码+精美炫酷UI 1-上位机源码框架,可适用于大部分项目,轻松实现数据采集、数据展示等信息化需求 2、基于C# Winform的精美炫酷画面; 3、西门子PLC实战项目,采用S7通信实时读取PLC数据; 4、PLC数据以实时曲线的方式进行展示; 5、实时数据同步写入到SQLite数据库; 6、可查询历史数据,历史曲线;历史曲线 可同时多曲线或单一曲线展示; 7、历史曲线采用ScottPlot控件,同时可将历史曲线导出图片等; 8、历史数据可导出到Excel;

以数据采集为例,我们在 C# 中可以定义一个类来处理采集逻辑。
public class DataCollector
{
// 假设这里有连接 PLC 的相关配置属性
private string plcIp;
private int rack;
private int slot;
public DataCollector(string ip, int r, int s)
{
plcIp = ip;
rack = r;
slot = s;
}
// 采集数据的方法
public List<short> CollectData()
{
// 这里省略实际的 S7 通信连接代码,仅作示例
List<short> dataList = new List<short>();
// 模拟从 PLC 获取到的数据
dataList.Add(10);
dataList.Add(20);
return dataList;
}
}
在这个类中,我们定义了 DataCollector 类,构造函数接收 PLC 的 IP 地址、机架号和插槽号。CollectData 方法模拟从 PLC 采集数据,实际应用中这里会涉及到 S7 通信库来真正连接 PLC 并读取数据。
基于 C# Winform 的精美炫酷画面
Winform 为我们提供了丰富的 UI 开发工具,通过精心设计,可以打造出非常炫酷的操作界面。在设计数据展示界面时,我们可以利用各种控件布局,将实时数据、曲线等元素合理安排。比如,用 Label 控件显示实时采集到的数值,用 Panel 来承载曲线展示区域。
西门子 PLC 实战项目与 S7 通信
采用 S7 通信来实时读取 PLC 数据,这里要用到专门的 S7 通信库,比如 S7.Net。以下是简单的连接和读取示例代码:
using S7.Net;
class PlcConnection
{
private Plc plc;
public PlcConnection(string ip, int rack, int slot)
{
plc = new Plc(CpuType.S71200, ip, rack, slot);
}
public bool Connect()
{
try
{
return plc.Connect();
}
catch (Exception ex)
{
Console.WriteLine($"连接失败: {ex.Message}");
return false;
}
}
public short ReadData(int dbNumber, int startByte, int length)
{
try
{
var result = plc.Read(DataType.DataBlock, dbNumber, startByte, length);
return BitConverter.ToInt16(result, 0);
}
catch (Exception ex)
{
Console.WriteLine($"读取数据失败: {ex.Message}");
return 0;
}
}
public void Disconnect()
{
plc.Disconnect();
}
}
在这段代码中,PlcConnection 类封装了与 PLC 的连接、读取数据和断开连接的操作。通过 Connect 方法尝试连接 PLC,ReadData 方法从指定的数据块读取数据,Disconnect 方法断开连接。
PLC 数据以实时曲线的方式进行展示
实时曲线展示能让我们直观地看到数据的变化趋势。在 C# 中,可以借助一些绘图库,比如 System.Windows.Forms.DataVisualization.Charting。
// 假设已经获取到实时数据 dataValue
private void UpdateRealTimeChart(short dataValue)
{
chart1.Series["RealTimeSeries"].Points.AddY(dataValue);
if (chart1.Series["RealTimeSeries"].Points.Count > 100)
{
chart1.Series["RealTimeSeries"].Points.RemoveAt(0);
}
}
这里的 UpdateRealTimeChart 方法将实时数据添加到图表的 RealTimeSeries 系列中,并控制图表只显示最近 100 个数据点,这样可以保持图表的实时性和简洁性。
实时数据同步写入到 SQLite 数据库
SQLite 是一款轻量级数据库,非常适合在这种场景下存储数据。使用 System.Data.SQLite 库来操作 SQLite 数据库。
class DatabaseHelper
{
private string connectionString;
public DatabaseHelper(string dbPath)
{
connectionString = $"Data Source={dbPath};Version=3;";
}
public void InsertData(short value)
{
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
string sql = "INSERT INTO RealTimeData (Value, RecordTime) VALUES (@Value, @RecordTime)";
using (SQLiteCommand cmd = new SQLiteCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@Value", value);
cmd.Parameters.AddWithValue("@RecordTime", DateTime.Now);
cmd.ExecuteNonQuery();
}
}
}
}
在 DatabaseHelper 类中,构造函数接收数据库路径来生成连接字符串。InsertData 方法将实时采集到的数据插入到名为 RealTimeData 的表中,同时记录时间。
可查询历史数据,历史曲线展示
查询历史数据和展示历史曲线是很重要的功能。对于历史曲线展示,我们采用了 ScottPlot 控件,它简单易用且功能强大。
// 假设已经从数据库获取到历史数据列表 historicalDataList
private void ShowHistoricalChart(List<short> historicalDataList)
{
formsPlot1.Plot.Clear();
formsPlot1.Plot.AddScatter(Enumerable.Range(0, historicalDataList.Count), historicalDataList);
formsPlot1.Refresh();
}
这段代码使用 ScottPlot 的 formsPlot1 控件,先清空图表,然后将获取到的历史数据以散点图的形式绘制出来。
历史曲线导出图片及历史数据导出到 Excel
使用 ScottPlot 控件导出历史曲线图片非常方便。
private void ExportChartToImage()
{
var bmp = formsPlot1.Plot.Render();
bmp.Save("HistoricalChart.png", System.Drawing.Imaging.ImageFormat.Png);
}
对于历史数据导出到 Excel,可以使用 EPPlus 库。
using OfficeOpenXml;
class ExcelExporter
{
public void ExportDataToExcel(List<short> dataList, string filePath)
{
using (ExcelPackage package = new ExcelPackage(new FileInfo(filePath)))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("HistoricalData");
worksheet.Cells[1, 1].Value = "DataValue";
for (int i = 0; i < dataList.Count; i++)
{
worksheet.Cells[i + 2, 1].Value = dataList[i];
}
package.Save();
}
}
}
在 ExcelExporter 类中,ExportDataToExcel 方法将历史数据列表导出到 Excel 文件中,并在第一列写入数据值。

以上就是整个 PLC - C# 数据采集系统的核心功能实现,希望对大家在工控上位机开发中有帮助。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)