上位机项目笔记

C# 工业自动化开发核心知识点笔记

这份笔记整合了你提到的多套技术栈,涵盖 WinForm/WPF 工业上位机开发、PLC 通信、数据库、日志、网络通信等核心知识点,按技术场景分类整理,兼顾实用性和易理解性。

一、C# WinForm 工业扫码采集系统

1. 核心技术栈

组件 / 技术 作用与核心知识点
WinForm 工业场景下最常用的桌面 UI 框架,基于窗体 / 控件模型,适合快速开发数据采集界面
基恩士扫码枪 SDK 扫码枪官方开发包,提供比串口更稳定的扫码接口(含设备初始化、扫码触发、数据解析)
SerialPort 串口通信 备用通信方案,核心参数:波特率、数据位、停止位、校验位;关键事件:DataReceived
SQLite 数据库 轻量级嵌入式数据库,无需安装服务,适合本地存储扫码数据(如扫码码值、时间、设备信息)
Log4Net 日志组件 工业级日志框架,支持控制台 / 文件 / 数据库输出,可按日期分割日志文件,便于问题排查

2. 核心实现要点

  • 串口通信:

    复制代码
    // 串口初始化(基恩士扫码枪通用配置)
    SerialPort sp = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One)
    {
        ReadTimeout = 500,
        Encoding = Encoding.UTF8
    };
    sp.DataReceived += (s, e) => {
        string scanData = sp.ReadExisting().Trim(); // 读取扫码数据
        // 数据入库+日志记录
    };
    sp.Open();
  • SQLite 数据存储:

    复制代码
    // 初始化本地数据库(自动建表)
    string connStr = $"Data Source=ScanData.db;Version=3;";
    using (SQLiteConnection conn = new SQLiteConnection(connStr))
    {
        conn.Open();
        string createSql = "CREATE TABLE IF NOT EXISTS ScanLog(Id INTEGER PRIMARY KEY AUTOINCREMENT, Code TEXT, ScanTime DATETIME);";
        new SQLiteCommand(createSql, conn).ExecuteNonQuery();
    }
  • Log4Net 配置

    复制代码
    <!-- 按日期分割日志文件 -->
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs/ScanLog.log" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd" />
      <staticLogFileName value="false" />
    </appender>

3. 工业场景注意事项

  • 串口通信需处理断连 / 异常,添加重连机制;

  • 扫码数据需做去重 / 校验(如条码格式验证);

  • 日志需记录关键操作(扫码成功 / 失败、串口状态、数据库异常)。

二、C# WinForm PLC 数据采集与 Excel 导出

1. 核心技术栈

组件 / 技术 作用与核心知识点
西门子 S7-1200 PLC 中小型工业控制器,支持 Modbus TCP/S7 协议,需配置 IP 地址和数据块(DB 块)
Modbus TCP 通信 工业通用通信协议,基于 TCP/IP,核心操作:读线圈、读保持寄存器、写寄存器
LabVIEW 辅助调试 可快速搭建 Modbus TCP 调试工具,验证 PLC 数据读写正确性,辅助定位通信问题
Excel 导出组件 常用 NPOI/EPPlus,支持将 PLC 采集数据导出为 Excel,适合工业报表生成

2. 核心实现要点

  • Modbus TCP 通信(使用 NModbus4 库):

    复制代码
    // 连接PLC并读取保持寄存器(地址40001开始)
    using (TcpClient client = new TcpClient("192.168.0.1", 502)) // PLC IP+Modbus端口
    {
        ModbusIpMaster master = ModbusIpMaster.CreateIp(client);
        // 读取起始地址40001,长度10个寄存器
        ushort[] registers = master.ReadHoldingRegisters(1, 0, 10); 
        // 寄存器值转换为实际物理量(如温度、压力)
        float temp = registers[0] / 10.0f; 
    }
  • Excel 导出(EPPlus):

    复制代码
    // 将PLC数据导出为Excel
    using (ExcelPackage package = new ExcelPackage())
    {
        ExcelWorksheet sheet = package.Workbook.Worksheets.Add("PLC数据");
        sheet.Cells["A1"].Value = "采集时间";
        sheet.Cells["B1"].Value = "温度(℃)";
        sheet.Cells["A2"].Value = DateTime.Now;
        sheet.Cells["B2"].Value = temp;
        package.SaveAs(new FileInfo("PLCData.xlsx"));
    }
  • LabVIEW 调试:

    • 使用 LabVIEW 的 Modbus TCP 函数库,快速编写调试界面;

    • 先通过 LabVIEW 验证 PLC 寄存器读写正常,再移植到 C# 代码,降低调试难度。

3. 工业场景注意事项

  • Modbus TCP 通信需处理网络中断,添加心跳包机制;

  • PLC 数据块需与现场工程师确认地址映射关系;

  • Excel 导出需处理文件占用异常(如用户未关闭 Excel 文件)。

三、C# WPF 工业上位机(MVVM 架构)

1. 核心技术栈

组件 / 技术 作用与核心知识点
WPF 现代化桌面 UI 框架,支持数据绑定、样式模板,适合复杂工业界面开发
MVVMLight 框架 轻量级 MVVM 框架,核心:ViewModelBase、RelayCommand、Messenger(组件间通信)
Modbus TCP 同上文,WPF 中需结合 MVVM 实现数据双向绑定
Https 工业云平台通信,支持 HTTPS 加密传输,核心:HttpClient、证书验证、接口签名
S7NetPlus 西门子 PLC 专用通信库,比 Modbus 更适配 S7-1200/1500,支持直接读写 DB 块

2. 核心实现要点

  • MVVMLight 基础架构:

    复制代码
    // ViewModel(核心)
    public class MainViewModel : ViewModelBase
    {
        private float _temperature;
        // 温度属性(支持UI双向绑定)
        public float Temperature
        {
            get => _temperature;
            set => Set(ref _temperature, value); // MVVMLight核心方法
        }
        
        // 读取PLC命令(绑定到UI按钮)
        public ICommand ReadPlcCommand => new RelayCommand(ReadPlcData);
        
        private void ReadPlcData()
        {
            // 调用S7NetPlus读取PLC数据
            using (Plc plc = new Plc(CpuType.S71200, "192.168.0.1", 0, 1))
            {
                plc.Open();
                Temperature = plc.ReadFloat("DB1.DBD0"); // 直接读取DB块浮点值
                plc.Close();
            }
        }
    }
  • WPF UI 绑定:

    复制代码
    <!-- 界面绑定ViewModel属性 -->
    <TextBlock Text="{Binding Temperature, StringFormat='温度:{0:F1}℃'}" />
    <Button Content="读取PLC数据" Command="{Binding ReadPlcCommand}" />
  • HTTPS 通信:

    复制代码
    // 工业云平台数据上报(HTTPS)
    private async Task UploadDataToCloud()
    {
        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("Authorization", "Bearer token");
            var data = new { Temperature = this.Temperature, Time = DateTime.Now };
            StringContent content = new StringContent(JsonSerializer.Serialize(data), Encoding.UTF8, "application/json");
            HttpResponseMessage response = await client.PostAsync("https://cloud.api.com/data/upload", content);
            if (response.IsSuccessStatusCode)
            {
                // 上报成功日志记录
            }
        }
    }

3. 工业场景注意事项

  • MVVMLight 的 Messenger 用于 ViewModel 与 View/ViewModel 间通信,避免控件直接耦合;

  • S7NetPlus 需注意 PLC 的 DB 块权限配置(需允许外部读写);

  • HTTPS 通信需处理证书验证(工业场景可能使用自签名证书,需忽略证书错误)。

四、C# .NET Core Web API 工业数据服务

1. 核心技术栈

组件 / 技术 作用与核心知识点
.NET Core 跨平台框架,Web API 可部署在 Windows/Linux 服务器,适配工业现场服务器环境
MySQL 关系型数据库,适合存储大量工业采集数据(如 PLC / 扫码枪数据),支持高并发查询
Web API 提供 RESTful 接口,供上位机 / 移动端 / 云平台调用,核心:控制器、路由、参数验证

2. 核心实现要点

  • API 控制器(数据上报接口):

    复制代码
    [ApiController]
    [Route("api/[controller]")]
    public class IndustrialDataController : ControllerBase
    {
        private readonly MySqlConnection _conn;
        
        // 构造函数注入数据库连接
        public IndustrialDataController(IConfiguration config)
        {
            _conn = new MySqlConnection(config.GetConnectionString("MySQL"));
        }
        
        // 接收PLC数据上报(POST请求)
        [HttpPost("plc")]
        public IActionResult PostPlcData([FromBody] PlcDataModel model)
        {
            if (!ModelState.IsValid) return BadRequest(ModelState);
            
            string sql = "INSERT INTO PlcData(Temperature, Pressure, UploadTime) VALUES(@temp, @press, @time)";
            MySqlCommand cmd = new MySqlCommand(sql, _conn);
            cmd.Parameters.AddWithValue("@temp", model.Temperature);
            cmd.Parameters.AddWithValue("@press", model.Pressure);
            cmd.Parameters.AddWithValue("@time", DateTime.Now);
            
            _conn.Open();
            cmd.ExecuteNonQuery();
            _conn.Close();
            
            return Ok(new { Code = 200, Message = "数据上报成功" });
        }
        
        // 查询历史数据(GET请求)
        [HttpGet("plc/{startTime}/{endTime}")]
        public IActionResult GetPlcData(DateTime startTime, DateTime endTime)
        {
            // 实现数据查询逻辑,返回JSON格式数据
            return Ok(dataList);
        }
    }
  • 数据库连接配置(appsettings.json):

    json

    复制代码
    "ConnectionStrings": {
      "MySQL": "server=192.168.0.100;database=IndustrialDB;user=root;password=123456;charset=utf8;"
    }
相关推荐
暴躁小师兄数据学院2 小时前
【WEB3.0零基础转行笔记】go编程篇-第12讲:go-zero入门实战
开发语言·笔记·golang·web3·区块链
那山川2 小时前
ros学习笔记15~40
笔记·学习
-许平安-2 小时前
MCP项目笔记七(插件 calculator)
c++·笔记·json·plugin·mcp
暗光之痕2 小时前
Unreal5 研究笔记 蓝图自定义节点
笔记·unreal engine
210Brian3 小时前
嘉立创EDA硬件设计与实战学习笔记(二):元件符号与封装的绘制
大数据·笔记·学习
oi..3 小时前
python Get/Post请求练习
开发语言·经验分享·笔记·python·程序人生·安全·网络安全
小杍随笔3 小时前
【Rust Exercism 练习详解:Anagram + Space Age + Sublist(附完整代码与深度解读)】
开发语言·rust·c#
努力学习的小廉3 小时前
redis学习笔记(九)—— Redis 持久化
redis·笔记·学习
呆子也有梦4 小时前
redis 的延时双删、双重检查锁定在游戏服务端的使用(伪代码为C#)
redis·后端·游戏·缓存·c#