方案目标: 开发一个高性能、灵活、可扩展的数据统计程序,用于实时采集、处理、存储和展示半导体设备工艺过程中的关键状态数据(如气体流量、温度、压力),并确保符合SEMI相关标准(如SEMI E10, E84, E87等对数据记录的要求)。
技术架构:
-
整体架构: 采用分层架构,明确划分实时控制层和非实时数据处理/展示层,利用TwinCAT强大的实时能力和灵活的通信接口。
- 实时层 (PLC Runtime): 运行在TwinCAT Runtime上。负责:
- 高速、确定性地从设备I/O(如EtherCAT从站)采集原始传感器数据。
- 进行必要的实时预处理(如滤波、单位转换、报警限值实时判断)。
- 根据SEMI标准要求,以固定周期(如1ms, 10ms)记录过程数据到缓冲区或直接触发事件记录。
- 实现核心的数据统计计算逻辑(如移动平均、标准偏差、CPK计算 - 若实时性允许)。
- 非实时层 (.NET/C# Application): 运行在Windows用户空间。负责:
- 通过TwinCAT ADS接口与实时层通信,获取批量历史数据、统计结果、报警事件。
- 实现更复杂的数据分析(如长期趋势分析、SPC控制图、报告生成)。
- 持久化存储数据到数据库(如SQL Server, InfluxDB)。
- 提供用户界面(UI),展示实时数据、历史趋势、统计报表、配置界面。
- 处理用户配置(如统计参数、报警限值、报告周期)。
- 实时层 (PLC Runtime): 运行在TwinCAT Runtime上。负责:
-
软件分层:
- 设备驱动层: TwinCAT I/O驱动,直接与物理传感器和执行器交互,读取模拟量/数字量。
- 数据采集与预处理层 (PLC):
- 功能块:封装特定类型信号(流量计、热电偶、压力变送器)的采集逻辑,处理信号缩放、滤波、工程单位转换。
- 事件检测:基于实时数据变化或报警状态变化触发记录(符合SEMI E10事件记录要求)。
- 周期记录:以固定时间间隔记录过程快照。
- 核心统计计算层 (PLC):
- 实现基础统计功能块,如:
FUNCTION_BLOCK FB_RunningAverage(计算移动平均),FUNCTION_BLOCK FB_StdDev(计算标准差),FB_MinMax(记录周期内最大最小值)。这些块需设计为可配置(窗口大小)。 - 复杂统计(如CPK)通常放在非实时层,除非设备计算能力极强且对实时性有苛刻要求。
- 实现基础统计功能块,如:
- 数据接口层 (ADS):
- 在PLC端:定义结构体
TYPE ST_ProcessData包含实时值、统计值(平均值、当前值等)、状态字、时间戳。使用FB_ADS_Server或FB_ADS_Server_Event发布数据。 - 在.NET端:使用TwinCAT.Ads.dll库创建
AdsClient实例,通过Read()或Subscribe方法高效获取PLC数据。
- 在PLC端:定义结构体
- 数据持久化层 (.NET):
- 使用ADO.NET或Entity Framework连接数据库。
- 设计数据表结构,存储原始数据点、统计结果、报警事件(带时间戳、设备ID、Recipe步骤ID等上下文信息)。
- 业务逻辑层 (.NET):
- 实现复杂的统计分析和报表生成算法。
- 处理用户配置管理。
- 协调UI与数据层的交互。
- 用户界面层 (.NET):
- 使用WPF或WinForms构建。
- 包含:实时数据监控面板、历史数据趋势图(可叠加统计线如均值线、控制限)、统计报表(表格、图表)、配置页面。
-
通信驱动:
- 核心通信: TwinCAT ADS (Automation Device Specification)。这是Beckhoff设备间及与上位应用通信的标准协议,基于TCP/IP。
- 优势: 高效、可靠、支持同步/异步读写、事件通知、跨网络。是连接实时PLC层与非实时.NET层的最佳桥梁。
- PLC端配置: 在TwinCAT System Manager中配置ADS路由,声明需要发布的变量或结构体。
- .NET端使用:
TwinCAT.Ads.AdsClient类提供所有访问接口。推荐使用订阅(AddDeviceNotification)机制获取实时变化,减少轮询开销。
- 数据库访问: .NET应用程序使用标准数据库连接驱动(如SQLClient for SQL Server)进行数据读写。
- 设备I/O: EtherCAT (首选) 或其他现场总线协议,由TwinCAT I/O驱动处理,提供高速、确定性的底层数据采集。
- 核心通信: TwinCAT ADS (Automation Device Specification)。这是Beckhoff设备间及与上位应用通信的标准协议,基于TCP/IP。
-
UI界面设计:
- 主监控视图: 仪表盘风格,显示关键参数的实时数值(数字、仪表盘)、实时曲线、当前统计值(如 \\mu \\pm 3\\sigma 范围)、报警状态。支持多参数同屏显示。
- 历史趋势视图: 允许用户选择时间段、特定参数,绘制趋势曲线。支持叠加统计信息(如平均值线 \\bar{x} 、上控制限UCL、下控制限LCL)。支持缩放、平移。
- 统计报表视图: 表格形式展示特定时间段(如一个Lot,一个Recipe Run)的统计结果(如平均值 \\bar{x} 、标准差 \\sigma 、最大值 max 、最小值 min 、CP/CPK)。支持图表(直方图、X-bar R图)。
- 配置视图: 允许工程师配置:
- 哪些参数需要统计。
- 统计参数(如移动平均窗口大小、标准差计算样本数)。
- 报警限值(设定值 Setpoint , 上限 USL , 下限 LSL )。
- 数据记录策略(周期、事件触发条件)。
- 报告格式和周期。
- 报警/事件日志: 显示历史报警和事件记录,符合SEMI E10格式要求(时间、设备、模块、参数、描述、严重等级)。
依赖框架:
- Beckhoff TwinCAT 3 Platform: 核心运行环境,提供PLC Runtime、I/O配置、ADS服务。
- TwinCAT Engineering (XAE): 开发环境,用于PLC编程(IEC 61131-3 ST语言)、系统配置、HMI开发(可选)。
- Microsoft Visual Studio: 开发.NET应用程序(数据服务、UI)。推荐使用C#。
- .NET Framework (推荐4.7.2或更高)/ .NET Core 3.1+ / .NET 5+: .NET应用程序的运行和开发框架。
- TwinCAT.Ads.dll: Beckhoff提供的ADS客户端库,集成到.NET应用中。
- 数据库系统: 如Microsoft SQL Server, MySQL, PostgreSQL, 或时序数据库InfluxDB/TimeScaleDB。
- UI框架: WPF (推荐,功能强大,MVVM友好) 或 WinForms (简单直接)。
- 图表库 (可选但推荐): 如LiveCharts (WPF/WinForms), OxyPlot, SciChart (功能强大但商业) 用于绘制趋势图和统计图表。
- ORM框架 (可选): 如Entity Framework Core 简化数据库操作。
示例代码片段:
-
PLC端 (ST语言) - 流量计数据采集与简单移动平均计算:
TYPE ST_FlowMeter :
STRUCT
fRawValue : REAL; // 原始AD值或通讯值
fFlowRate : REAL; // 工程单位流量值 (L/min)
fRunningAvg : REAL; // 移动平均值
bActive : BOOL;
tLastUpdate : TIME;
END_STRUCT
END_TYPEFUNCTION_BLOCK FB_FlowMeter
VAR_INPUT
fRawInput : REAL; // 来自IO或通讯
rScaleFactor : REAL := 1.0; // 缩放系数 (e.g., AD Counts to L/min)
rOffset : REAL := 0.0; // 偏移量
nWindowSize : UINT := 10; // 移动平均窗口大小
END_VAR
VAR_OUTPUT
stData : ST_FlowMeter;
END_VAR
VAR
aBuffer : ARRAY[0..9] OF REAL; // 假设最大窗口10
nIndex : UINT := 0;
fSum : REAL := 0.0;
END_VAR// 1. 单位转换
stData.fRawValue := fRawInput;
stData.fFlowRate := (fRawInput * rScaleFactor) + rOffset;// 2. 更新移动平均缓冲区 (FIFO)
fSum := fSum - aBuffer[nIndex]; // 减去最旧值
aBuffer[nIndex] := stData.fFlowRate; // 存储新值
fSum := fSum + stData.fFlowRate; // 加上新值// 3. 计算移动平均 (注意避免除以0)
IF nWindowSize > 0 THEN
stData.fRunningAvg := fSum / nWindowSize;
ELSE
stData.fRunningAvg := 0.0;
END_IF// 4. 更新索引
nIndex := (nIndex + 1) MOD nWindowSize; // 循环缓冲区// 5. 更新时间戳
stData.tLastUpdate := TIME();
stData.bActive := TRUE; -
.NET端 (C#) - 通过ADS读取流量计数据:
using TwinCAT.Ads;
// ... 假设已经创建了 AdsClient 对象 client,并连接到PLC (Port 851)
try
{
// 声明在PLC中定义的结构体变量句柄 (例如 stFlowMeterInstance : ST_FlowMeter)
int handle = client.CreateVariableHandle("MAIN.stFlowMeterInstance");// 读取整个结构体 ST_FlowMeter flowData; // 需要定义对应的C#结构体或类映射ST_FlowMeter byte[] data = client.Read(handle, Marshal.SizeOf(typeof(ST_FlowMeter))); flowData = (ST_FlowMeter)BytesToStruct(data, typeof(ST_FlowMeter)); // 使用数据 (e.g., 更新UI,存入数据库) Console.WriteLine($"Flow Rate: {flowData.fFlowRate}, Avg: {flowData.fRunningAvg} at {flowData.tLastUpdate}");}
catch (AdsException ex)
{
Console.WriteLine($"ADS Error: {ex.Message}");
}
finally
{
if (handle != 0)
client.DeleteVariableHandle(handle);
}
// 注意:BytesToStruct 是一个辅助方法,需要实现将字节数组转换为结构体 -
.NET端 (C#) - 订阅ADS通知 (更高效):
using TwinCAT.Ads;
// ...
int handle = client.CreateVariableHandle("MAIN.stFlowMeterInstance");
AdsNotificationStream stream = new AdsNotificationStream(client);
AdsNotification notification = stream.AddDeviceNotification(handle,
new NotificationSettings(AdsTransMode.Cyclic, 1000, 0), // 1s cycle
typeof(ST_FlowMeter),
null);notification.AdsNotification += (sender, e) =>
{
ST_FlowMeter flowData = (ST_FlowMeter)e.Value;
// 更新UI或处理数据
Dispatcher.Invoke(() => UpdateFlowDisplay(flowData)); // WPF UI线程更新
};
学习曲线:
- TwinCAT/IEC 61131-3基础: 掌握TwinCAT XAE环境、PLC项目结构、IEC 61131-3编程语言(特别是ST)。这是核心,需要理解实时系统概念、任务周期、I/O映射。难度:中高,尤其对没有PLC背景者。预计学习时间:1-2个月(基础应用)。
- TwinCAT ADS通信: 理解ADS协议原理,掌握在PLC端发布数据和在.NET端使用
TwinCAT.Ads.dll进行通信(同步读、写、订阅通知)。难度:中。预计学习时间:1-2周。 - .NET应用开发 (C#): 熟悉C#语言、.NET Framework/Core、Visual Studio。难度:低-中(取决于现有经验)。
- 数据库交互: 掌握ADO.NET或EF Core进行数据库操作,设计合理的数据库模式存储过程数据和统计结果。难度:中。预计学习时间:1-2周(基础)。
- WPF/WinForms UI开发: 掌握所选UI框架,特别是数据绑定、MVVM模式(WPF推荐)、图表控件集成。难度:中-高(WPF MVVM学习曲线较陡)。预计学习时间:2-4周(基础到中级)。
- SEMI标准理解: 研读相关SEMI标准文档(如E10, E84, E87),理解其对设备数据记录、事件、报告的具体要求,并将其映射到软件设计中。难度:高(涉及特定领域知识)。预计学习时间:持续学习。
- 性能优化: 学习如何在PLC端优化代码执行时间(避免复杂计算、优化缓冲区管理),在.NET端优化数据库写入、UI刷新效率。难度:高(需要经验)。预计学习时间:持续实践。
总结:
本方案利用TwinCAT的实时能力和分层架构,设计了一个高性能、灵活且符合SEMI标准的数据统计系统。实时层负责高速采集和基础统计,非实时层负责复杂分析、存储和用户交互,两者通过高效的ADS协议连接。采用模块化设计和清晰的软件分层确保了系统的可维护性和可扩展性。实现此方案需要跨领域的知识(实时PLC编程、.NET应用开发、数据库、UI、SEMI标准),学习曲线相对陡峭,但最终能构建出一个强大且符合行业规范的解决方案。