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();
}

这段代码使用 ScottPlotformsPlot1 控件,先清空图表,然后将获取到的历史数据以散点图的形式绘制出来。

历史曲线导出图片及历史数据导出到 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# 数据采集系统的核心功能实现,希望对大家在工控上位机开发中有帮助。

Logo

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

更多推荐