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;" }