『7x24小时有问必答』
点击蓝字

PLC自动化汇
关注我们
从节拍到产能,从实时到历史,打造真正的生产大数据平台

引言

在上集中,我们构建了精准的节拍计算引擎。但真正的价值在于:如何将海量的节拍数据转化为生产决策依据
今天,我们将挑战更复杂的任务:构建一个全自动的产能统计系统,实现白班/夜班自动切换、30天历史数据存储、多维度统计分析,让数据真正为生产服务!

一、系统架构:三层数据模型

1.1 设计理念:分层存储,高效管理

我们的系统采用三层金字塔结构
           ┌─────────────────┐           │    实时监控层      │ ← 上集已实现           │   (毫秒级响应)    │           └─────────────────┘                       ↓           ┌─────────────────┐           │    班次统计层      │ ← 本集核心           │   (分钟级聚合)    │           └─────────────────┘                       ↓           ┌─────────────────┐           │    历史分析层      │ ← 本集重点           │    (30天存储)      │           └─────────────────┘

1.2 核心数据结构

// 1. 班次数据结构TYPE  "st_班次数据"  :STRUCT      b_白班激活 :  BOOL;                 // 白班状态      b_夜班激活 :  BOOL;                 // 夜班状态      t_班次开始时间 : TIME;           // 当前班次开始时间      dw_班次产量 : DWORD;              // 当前班次产量      w_班次运行时间 : WORD;           // 运行时间(分钟)      w_班次待机时间 : WORD;           // 待机时间(分钟)      w_班次故障时间 : WORD;           // 故障时间(分钟)      r_班次平均节拍 : REAL;           // 班次平均节拍      b_班次结束标志 :  BOOL;           // 班次自动结束END_STRUCTEND_TYPE

// 2. 小时数据增强版TYPE  "st_小时数据增强"  :STRUCT      w_产量 : WORD;                       // 小时产量      w_运行时间 : WORD;                 // 运行时间(分钟)      w_待机时间 : WORD;                 // 待机时间(分钟)      w_故障时间 : WORD;                 // 故障时间(分钟)      r_平均节拍 : REAL;                 // 小时平均节拍      w_OEE : WORD;                        // 设备综合效率(0-100%)      w_完成率 : WORD;                    // 计划完成率      b_数据锁定 :  BOOL;                 // 小时结束时锁定END_STRUCTEND_TYPE

// 3. 30天历史存储结构TYPE  "st_历史日数据"  :STRUCT      dt_日期 : DATE;                     // 记录日期      dw_日总产量 : DWORD;              // 当日总产量      dw_白班产量 : DWORD;              // 白班产量      dw_夜班产量 : DWORD;              // 夜班产量      w_日运行时间 : WORD;              // 总运行时间      w_日待机时间 : WORD;              // 总待机时间      w_日故障时间 : WORD;              // 总故障时间      r_日平均节拍 : REAL;              // 日平均节拍      w_日OEE : WORD;                     // 日综合效率      a_小时明细 : ARRAY[0..23] OF st_小时数据增强;   // 24小时明细      b_数据有效 :  BOOL;                 // 数据有效性标志END_STRUCTEND_TYPE

二、智能班次管理系统

2.1 功能块设计:自动识别班次

FUNCTION_BLOCK  "FB_智能班次管理"VAR_INPUT      ib_系统使能 :  BOOL;                           // 系统总开关      ib_手动模式 :  BOOL;                           // 手动切换班次      iby_手动班次选择 : BYTE;                    // 0=自动,1=白班,2=夜班      ib_强制切换 :  BOOL;                           // 强制切换班次      it_白班开始 : TIME := T#8h;               // 白班开始时间      it_夜班开始 : TIME := T#20h;              // 夜班开始时间      idw_班次目标产量 : DWORD;                  // 班次生产目标END_VAR

VAR_OUTPUT      ost_当前班次 : st_班次数据;               // 当前班次数据      ob_班次切换事件 :  BOOL;                     // 班次切换脉冲      ob_白班激活 :  BOOL;                           // 白班状态      ob_夜班激活 :  BOOL;                           // 夜班状态      odw_班次剩余目标 : DWORD;                  // 距离目标产量差      or_班次完成率 : REAL;                        // 目标完成百分比      ob_班次预警 :  BOOL;                           // 目标完成预警END_VAR

VAR       // 时间管理      mt_当前时间 : TIME;      mt_上次检查时间 : TIME;      mdw_当前小时 : DWORD;

       // 班次状态      mb_当前班次 : BYTE;               // 0=无班次,1=白班,2=夜班      mb_上次班次 : BYTE;      mt_班次开始时间 : TIME;

       // 产量统计      mdw_班次开始产量 : DWORD;      // 班次开始时的累计产量      mdw_班次当前产量 : DWORD;      // 班次当前产量

       // 时间统计      mw_班次运行累计 : WORD;         // 运行时间累计(秒)      mw_班次待机累计 : WORD;         // 待机时间累计(秒)      mw_班次故障累计 : WORD;         // 故障时间累计(秒)

       // 扫描控制      mb_首次扫描 :  BOOL;      mt_上次运行时间 : TIME;END_VAR

VAR_TEMP      tt_时间差 : TIME;      tw_当前小时 : WORD;      tb_在白班时段 :  BOOL;      tb_在夜班时段 :  BOOL;END_VAR

2.2 核心算法:自动班次切换

// 主程序 - 智能班次识别IF ib_系统使能 THEN       // 获取当前时间      mt_当前时间 := TIME();      tw_当前小时 := TIME_TO_HOUR(mt_当前时间);

       // 判断时间段(处理跨天)      IF tw_当前小时 >=  8  AND tw_当前小时 <  20  THEN            tb_在白班时段 := TRUE;            tb_在夜班时段 := FALSE;      ELSE            tb_在白班时段 := FALSE;            tb_在夜班时段 := TRUE;      END_IF;

       // 班次自动切换逻辑      IF ib_手动模式 THEN             // 手动模式            CASE iby_手动班次选择 OF                   1: mb_当前班次 :=  1;   // 强制白班                   2: mb_当前班次 :=  2;   // 强制夜班                  ELSE                        mb_当前班次 :=  0;   // 无班次            END_CASE;      ELSE             // 自动模式 - 智能切换            IF tb_在白班时段 AND mb_当前班次 <>  1  THEN                   // 切换到白班                  mb_当前班次 :=  1;                  ob_班次切换事件 := TRUE;                  mt_班次开始时间 := mt_当前时间;                  mdw_班次开始产量 := 当前累计产量;   // 从外部获取

            ELSIF tb_在夜班时段 AND mb_当前班次 <>  2  THEN                   // 切换到夜班                  mb_当前班次 :=  2;                  ob_班次切换事件 := TRUE;                  mt_班次开始时间 := mt_当前时间;                  mdw_班次开始产量 := 当前累计产量;

            ELSE                  ob_班次切换事件 := FALSE;            END_IF;      END_IF;
       // 处理班次切换事件      IF ob_班次切换事件 THEN             // 保存上一班次数据(调用数据保存方法)            SaveShiftData(mb_上次班次);

             // 重置当前班次统计            mdw_班次当前产量 :=  0;            mw_班次运行累计 :=  0;            mw_班次待机累计 :=  0;            mw_班次故障累计 :=  0;

             // 更新输出            mb_上次班次 := mb_当前班次;

             // 记录班次切换日志            LogShiftChange(mb_当前班次, mt_当前时间);      END_IF;

       // 实时统计当前班次产量      IF mb_当前班次 >  0  THEN            mdw_班次当前产量 := 当前累计产量 - mdw_班次开始产量;            ost_当前班次.dw_班次产量 := mdw_班次当前产量;

             // 计算目标完成情况            IF idw_班次目标产量 >  0  THEN                  odw_班次剩余目标 := idw_班次目标产量 - mdw_班次当前产量;                  or_班次完成率 := (REAL(mdw_班次当前产量) / REAL(idw_班次目标产量)) *  100.0;

                   // 预警逻辑(最后2小时且完成率<80%)                  IF CalculateRemainingShiftTime() <  120.0  AND or_班次完成率 <  80.0  THEN                        ob_班次预警 := TRUE;                  ELSE                        ob_班次预警 := FALSE;                  END_IF;            END_IF;      END_IF;

       // 更新班次状态输出      ost_当前班次.b_白班激活 := (mb_当前班次 =  1);      ost_当前班次.b_夜班激活 := (mb_当前班次 =  2);      ob_白班激活 := ost_当前班次.b_白班激活;      ob_夜班激活 := ost_当前班次.b_夜班激活;END_IF;

2.3 时间统计:运行、待机、故障

// 时间统计方法METHOD UpdateTimeStatisticsVAR_INPUT      ib_设备运行 : BOOL;         // 设备运行信号      ib_设备故障 : BOOL;         // 设备故障信号END_VARVAR      tt_扫描间隔 : TIME;      tr_间隔秒数 : REAL;END_VAR

// 计算扫描间隔tt_扫描间隔 := mt_当前时间 - mt_上次运行时间;tr_间隔秒数 := TIME_TO_REAL(tt_扫描间隔) /  1000.0;mt_上次运行时间 := mt_当前时间;

// 时间累计(仅在有班次时统计)IF mb_当前班次 >  0  THEN      IF ib_设备故障 THEN             // 故障时间            mw_班次故障累计 := mw_班次故障累计 + WORD(tr_间隔秒数);      ELSIF ib_设备运行 THEN             // 运行时间            mw_班次运行累计 := mw_班次运行累计 + WORD(tr_间隔秒数);      ELSE             // 待机时间            mw_班次待机累计 := mw_班次待机累计 + WORD(tr_间隔秒数);      END_IF;

       // 更新输出结构      ost_当前班次.w_班次运行时间 := mw_班次运行累计 DIV  60;   // 转换为分钟      ost_当前班次.w_班次待机时间 := mw_班次待机累计 DIV  60;      ost_当前班次.w_班次故障时间 := mw_班次故障累计 DIV  60;END_IF;END_METHOD

三、30天历史数据存储系统

3.1 循环缓冲区设计

FUNCTION_BLOCK  "FB_历史数据存储"VAR_INPUT      ib_存储使能 :  BOOL;                           // 存储系统使能      ib_保存当前数据 :  BOOL;                     // 手动触发保存      idt_查询日期 : DATE;                          // HMI查询日期      iby_查询类型 : BYTE;                          // 0=日数据,1=班次,2=小时      iw_查询小时 : WORD;                           // 查询具体小时(0-23)END_VAR

VAR_OUTPUT      oa_30天历史 : ARRAY[0..29] OF st_历史日数据;   // 历史数据数组      ost_查询结果 : st_历史日数据;            // 查询结果      ow_查询小时产量 : WORD;                     // 查询的小时产量      ob_数据就绪 :  BOOL;                           // 查询完成标志      odw_30天总产量 : DWORD;                     // 30天累计产量      or_30天平均日产量 : REAL;                  // 日平均产量      ob_存储完成 :  BOOL;                           // 存储操作完成END_VAR

VAR       // 循环缓冲区      ma_历史数据 : ARRAY[0..29] OF st_历史日数据;   // 实际存储      mby_当前索引 : BYTE;                          // 当前写入位置      mby_数据数量 : BYTE;                          // 有效数据数量

       // 日期管理      mdt_当前日期 : DATE;                          // 当前系统日期      mdt_最后保存日期 : DATE;                    // 最后保存日期

       // 临时存储      mst_今日数据 : st_历史日数据;            // 今日累计数据      mb_今日初始化 :  BOOL;                        // 今日数据初始化标志

       // 查询相关      mb_查询进行中 :  BOOL;      mby_查询索引 : BYTE;END_VAR

3.2 智能存储算法

// 主程序 - 自动日期检测与存储IF ib_存储使能 THEN       // 获取当前日期      mdt_当前日期 := DATE_AND_TIME_TO_DATE(DATE_AND_TIME());

       // 检测日期变化(新的一天)      IF mdt_当前日期 <> mdt_最后保存日期 THEN             // 保存昨日数据            IF mdt_最后保存日期 <> D#1970-01-01  THEN                  SaveDayData(mdt_最后保存日期, mst_今日数据);            END_IF;

             // 初始化今日数据            InitializeTodayData();

             // 更新最后保存日期            mdt_最后保存日期 := mdt_当前日期;

            ob_存储完成 := TRUE;   // 脉冲信号      ELSE            ob_存储完成 := FALSE;      END_IF;

       // 实时更新今日数据      UpdateTodayData();

       // 处理手动保存请求      IF ib_保存当前数据 THEN            SaveDayData(mdt_当前日期, mst_今日数据);      END_IF;

       // 处理数据查询      ProcessDataQuery();END_IF;

// 初始化今日数据METHOD InitializeTodayData : BOOLmst_今日数据.dt_日期 := mdt_当前日期;mst_今日数据.dw_日总产量 :=  0;mst_今日数据.dw_白班产量 :=  0;mst_今日数据.dw_夜班产量 :=  0;mst_今日数据.w_日运行时间 :=  0;mst_今日数据.w_日待机时间 :=  0;mst_今日数据.w_日故障时间 :=  0;mst_今日数据.r_日平均节拍 :=  0.0;mst_今日数据.w_日OEE :=  0;mst_今日数据.b_数据有效 := TRUE;

// 初始化24小时数组FOR mby_索引 :=  0  TO  23  DO      mst_今日数据.a_小时明细[mby_索引].w_产量 :=  0;      mst_今日数据.a_小时明细[mby_索引].w_运行时间 :=  0;      mst_今日数据.a_小时明细[mby_索引].w_待机时间 :=  0;      mst_今日数据.a_小时明细[mby_索引].w_故障时间 :=  0;      mst_今日数据.a_小时明细[mby_索引].r_平均节拍 :=  0.0;      mst_今日数据.a_小时明细[mby_索引].w_OEE :=  0;      mst_今日数据.a_小时明细[mby_日期].w_完成率 :=  0;      mst_今日数据.a_小时明细[mby_索引].b_数据锁定 := FALSE;END_FOR;InitializeTodayData := TRUE;END_METHOD

3.3 数据查询与统计

// 处理HMI查询请求METHOD ProcessDataQuery : BOOLVAR_INPUTEND_VAR// 根据查询类型处理CASE iby_查询类型 OF       0:   // 查询日数据            FOR mby_查询索引 :=  0  TO  29  DO                  IF ma_历史数据[mby_查询索引].dt_日期 = idt_查询日期 THEN                        ost_查询结果 := ma_历史数据[mby_查询索引];                        ob_数据就绪 := TRUE;                        EXIT;                  END_IF;            END_FOR;

       1:   // 查询班次数据(从日数据中提取)             // 实现班次数据提取逻辑            ExtractShiftData(idt_查询日期);

       2:   // 查询小时数据            IF iw_查询小时 <=  23  THEN                  FOR mby_查询索引 :=  0  TO  29  DO                        IF ma_历史数据[mby_查询索引].dt_日期 = idt_查询日期 THEN                              ow_查询小时产量 := ma_历史数据[mby_查询索引].a_小时明细[iw_查询小时].w_产量;                              ob_数据就绪 := TRUE;                              EXIT;                        END_IF;                  END_FOR;            END_IF;

      ELSE            ob_数据就绪 := FALSE;END_CASE;

// 计算30天统计Calculate30DaysStatistics();END_METHOD

// 计算30天统计信息METHOD Calculate30DaysStatistics : BOOLVAR      mdw_累计产量 : DWORD;      mdw_有效天数 : DWORD;      mr_累计节拍 : REAL;      mby_有效索引 : BYTE;END_VARmdw_累计产量 :=  0;mdw_有效天数 :=  0;mr_累计节拍 :=  0.0;FOR mby_有效索引 :=  0  TO  29  DO      IF ma_历史数据[mby_有效索引].b_数据有效 THEN            mdw_累计产量 := mdw_累计产量 + ma_历史数据[mby_有效索引].dw_日总产量;            mr_累计节拍 := mr_累计节拍 + ma_历史数据[mby_有效索引].r_日平均节拍;            mdw_有效天数 := mdw_有效天数 +  1;      END_IF;END_FOR;

// 输出统计结果odw_30天总产量 := mdw_累计产量;IF mdw_有效天数 >  0  THEN      or_30天平均日产量 := REAL(mdw_累计产量) / REAL(mdw_有效天数);ELSE      or_30天平均日产量 :=  0.0;END_IF;Calculate30DaysStatistics := TRUE;END_METHOD

四、OEE(设备综合效率)计算

4.1 OEE核心算法

// OEE计算功能块FUNCTION_BLOCK  "FB_OEE计算"VAR_INPUT      ib_计算使能 :  BOOL;                           // OEE计算使能      iw_计划运行时间 : WORD;                     // 计划运行时间(分钟)      iw_理论节拍 : WORD;                           // 理论节拍(秒/件)      idw_理论产量 : DWORD;                        // 理论产量END_VARVAR_OUTPUT      ow_时间开动率 : WORD;                        // 时间开动率(0-100%)      ow_性能开动率 : WORD;                        // 性能开动率(0-100%)      ow_合格品率 : WORD;                           // 合格品率(0-100%)      ow_综合OEE : WORD;                             // 综合OEE(0-100%)      ob_OEE计算完成 :  BOOL;                       // 计算完成标志      or_损失时间 : REAL;                           // 总损失时间(小时)END_VARVAR       // 输入数据(从其他功能块获取)      mw_实际运行时间 : WORD;                     // 实际运行时间(分钟)      mw_故障时间 : WORD;                           // 故障时间(分钟)      mw_待机时间 : WORD;                           // 待机时间(分钟)      mdw_实际产量 : DWORD;                        // 实际产量      mdw_合格产量 : DWORD;                        // 合格产量      mr_实际平均节拍 : REAL;                     // 实际平均节拍

       // 中间计算结果      mr_时间开动率 : REAL;      mr_性能开动率 : REAL;      mr_合格品率 : REAL;      mr_综合OEE : REAL;

       // 时间管理      mt_上次计算时间 : TIME;END_VAR

4.2 OEE三要素计算

// OEE计算方法METHOD CalculateOEE : BOOLVAR_INPUT      iw_计算周期 : WORD :=  60;   // 计算周期(分钟),默认1小时END_VAR

// 1. 时间开动率 = 实际运行时间 / 计划运行时间IF iw_计划运行时间 >  0  THEN      mr_时间开动率 := (REAL(mw_实际运行时间) / REAL(iw_计划运行时间)) *  100.0;ELSE      mr_时间开动率 :=  0.0;END_IF;

// 2. 性能开动率 = (理论节拍×实际产量) / 实际运行时间//      或 = 理论产量 / 实际产量IF mw_实际运行时间 >  0  AND iw_理论节拍 >  0  THEN      mr_性能开动率 := (REAL(iw_理论节拍) * REAL(mdw_实际产量)) /                                  (REAL(mw_实际运行时间) *  60.0) *  100.0;

       // 限制在0-100%范围内      IF mr_性能开动率 >  100.0  THEN            mr_性能开动率 :=  100.0;      ELSIF mr_性能开动率 <  0.0  THEN            mr_性能开动率 :=  0.0;      END_IF;ELSE      mr_性能开动率 :=  0.0;END_IF;

// 3. 合格品率 = 合格产量 / 实际产量IF mdw_实际产量 >  0  THEN      mr_合格品率 := (REAL(mdw_合格产量) / REAL(mdw_实际产量)) *  100.0;ELSE      mr_合格品率 :=  0.0;END_IF;

// 4. 综合OEE = 时间开动率 × 性能开动率 × 合格品率 / 10000mr_综合OEE := (mr_时间开动率 * mr_性能开动率 * mr_合格品率) /  10000.0;// 转换为整型输出ow_时间开动率 := WORD(mr_时间开动率);ow_性能开动率 := WORD(mr_性能开动率);ow_合格品率 := WORD(mr_合格品率);ow_综合OEE := WORD(mr_综合OEE);

// 计算损失时间or_损失时间 := REAL(iw_计划运行时间 - mw_实际运行时间 +                               (mw_实际运行时间 - (REAL(mdw_实际产量) * REAL(iw_理论节拍) /  60.0))) /  60.0;ob_OEE计算完成 := TRUE;CalculateOEE := TRUE;END_METHOD

五、完整系统集成示例

5.1 OB1主程序架构

PROGRAM  MainVAR      // 实例化各功能块      fb_节拍计算 : FB_节拍计算;               // 上集内容      fb_班次管理 : FB_智能班次管理;         // 本集新增      fb_历史存储 : FB_历史数据存储;         // 本集新增      fb_OEE计算 : FB_OEE计算;                  // 本集新增

      // 设备信号      ib_产品到位 : BOOL;                           // 光电传感器      ib_设备运行 : BOOL;                           // 设备运行信号      ib_设备故障 : BOOL;                           // 故障信号      ib_合格信号 : BOOL;                           // 质量检测OK

      // HMI控制信号      ib_HMI使能 : BOOL;      ib_HMI复位 : BOOL;      iby_HMI查询类型 : BYTE;      idt_HMI查询日期 : DATE;

      // HMI显示变量      hmi_当前节拍 : REAL;      hmi_当前班次 : STRING[10];      hmi_班次产量 : DWORD;      hmi_当日产量 : DWORD;      hmi_OEE显示 : WORD;      hmi_历史产量 : ARRAY[0..29] OF DWORD;

      // 中间变量      mdw_累计产量 : DWORD;      mdw_合格产量 : DWORD;      mw_运行时间 : WORD;      mw_故障时间 : WORD;END_VAR

5.2 系统集成调用

// 1. 节拍计算(数据源)fb_节拍计算(      ib_完成信号 := ib_产品到位,      ib_使能 := ib_HMI使能,      ib_复位 := ib_HMI复位,      ir_最大节拍 :=  120.0,      ir_最小节拍 :=  0.5);

// 2. 班次管理(逻辑控制)fb_班次管理(      ib_系统使能 := ib_HMI使能,      ib_手动模式 := FALSE,   // 自动模式      it_白班开始 := T#8h,      it_夜班开始 := T#20h,      idw_班次目标产量 :=  1000    // 每班目标1000件);

// 3. 时间统计更新fb_班次管理.UpdateTimeStatistics(      ib_设备运行 := ib_设备运行,      ib_设备故障 := ib_设备故障);

// 4. 历史数据存储fb_历史存储(      ib_存储使能 := ib_HMI使能,      ib_保存当前数据 := fb_班次管理.ob_班次切换事件,   // 班次切换时自动保存      idt_查询日期 := idt_HMI查询日期,      iby_查询类型 := iby_HMI查询类型);

// 5. OEE计算fb_OEE计算(      ib_计算使能 := ib_HMI使能,      iw_计划运行时间 :=  480,         // 8小时计划      iw_理论节拍 :=  3,                  // 理论3秒/件      idw_理论产量 :=  9600              // 理论产量);

// 传递数据给OEE计算fb_OEE计算.mw_实际运行时间 := fb_班次管理.ost_当前班次.w_班次运行时间;fb_OEE计算.mw_故障时间 := fb_班次管理.ost_当前班次.w_班次故障时间;fb_OEE计算.mdw_实际产量 := fb_节拍计算.odw_累计产量;fb_OEE计算.mdw_合格产量 := mdw_合格产量;   // 需要质量统计功能块

// 触发OEE计算(每小时计算一次)IF TIME_TO_MINUTE(TIME()) <> mby_上次分钟 THEN      fb_OEE计算.CalculateOEE(iw_计算周期 :=  60);      mby_上次分钟 := TIME_TO_MINUTE(TIME());END_IF;

// 6. HMI数据映射hmi_当前节拍 := fb_节拍计算.or_当前节拍;hmi_当前班次 := GetShiftName(fb_班次管理.mb_当前班次);hmi_班次产量 := fb_班次管理.ost_当前班次.dw_班次产量;hmi_当日产量 := fb_历史存储.mst_今日数据.dw_日总产量;hmi_OEE显示 := fb_OEE计算.ow_综合OEE;

// 历史数据映射到HMI数组FOR mby_索引 :=  0  TO  29  DO      hmi_历史产量[mby_索引] := fb_历史存储.oa_30天历史[mby_索引].dw_日总产量;END_FOR;

5.3 HMI界面设计参考

┌─────────────────────────────────────────────────────┐│                      生产监控看板 - 设备A                            │├─────────────────────────────────────────────────────┤│ 当前状态:运行中                班次:白班 (08:00-20:00)│├─────────────┬─────────────┬─────────────┬──────────┤│   实时节拍    │    班次产量   │    当日产量   │    OEE      ││      3.45s      │      845件      │     1,245件    │     85.2%   │├─────────────┴─────────────┴─────────────┴──────────┤│  今日产量趋势(24小时)                                        ││      ┌──────────────────────────────────────┐          ││  20  │▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│          ││  15  │▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│          ││  10  │▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│          ││   5  │▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│          ││   0  └──────────────────────────────────────┘          ││        0    2    4    6    8  10  12  14  16  18  20  22  24              │├────────────────────────────────────────────────────┤│   30天产量统计                                                       ││      ┌──────────────────────────────────────┐          ││      │░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│          ││      │░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│          ││      │░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│          ││      └──────────────────────────────────────┘          ││        1           10             20             30  (天)                │├────────────────────────────────────────────────────┤│ ⏱ 时间统计:运行  6.5h  | 待机  1.0h  | 故障  0.5h        ││  目标完成:84.5% | 剩余  155件 | 预计完成  18:30     │└────────────────────────────────────────────────────┘

六、高级功能扩展

6.1 产能预测算法

// 基于历史数据的产能预测METHOD PredictProduction : REALVAR_INPUT      idw_预测天数 : DWORD;         // 预测未来几天END_VARVAR_OUTPUT      or_预测总产量 : REAL;         // 预测产量      or_置信度 : REAL;               // 预测可信度(0-100%)END_VARVAR      mr_日均产量 : REAL;      mr_趋势系数 : REAL;      mby_有效数据 : BYTE;      mr_标准差 : REAL;END_VAR

//  1. 计算历史平均值mr_日均产量 := fb_历史存储.or_30天平均日产量;

//  2. 计算趋势(最近7天 vs 前7天)mr_趋势系数 :=  CalculateTrendCoefficient();

//  3. 考虑工作日模式(周一到周五高产,周末低产)mr_工作日系数 :=  GetWeekdayCoefficient();

//  4. 综合预测or_预测总产量 := mr_日均产量 *  REAL(idw_预测天数) * mr_趋势系数 * mr_工作日系数;

//  5. 计算置信度(基于数据完整性和波动性)or_置信度 :=  CalculateConfidenceLevel();

PredictProduction := or_预测总产量;END_METHOD

6.2 异常预警系统

// 智能异常预警METHOD CheckAnomalies : BOOLVAR_OUTPUT      ob_产量异常 : BOOL;            // 产量异常      ob_节拍异常 : BOOL;            // 节拍异常      ob_OEE异常 : BOOL;              // OEE异常      oby_异常等级 : BYTE;           // 异常等级 1-3      os_异常描述 : STRING[100];  // 异常描述END_VAR

// 1. 产量异常检测(与历史同期对比)IF fb_节拍计算.ow_当前产量 < GetHistoricalAverage() *  0.7  THEN      ob_产量异常 := TRUE;      os_异常描述 := CONCAT('产量异常:当前',                                         DWORD_TO_STRING(fb_节拍计算.ow_当前产量),                                        ',低于历史平均值70%');END_IF;

// 2. 节拍异常检测(稳定性分析)IF fb_节拍计算.or_标准差 > GetNormalStdDev() *  2.0  THEN      ob_节拍异常 := TRUE;      os_异常描述 := CONCAT('节拍波动异常:标准差',                                         REAL_TO_STRING(fb_节拍计算.or_标准差),                                        ',超过正常值2倍');END_IF;

// 3. OEE异常检测IF fb_OEE计算.ow_综合OEE < GetTargetOEE() -  10  THEN      ob_OEE异常 := TRUE;      os_异常描述 := CONCAT('OEE异常:当前',                                         WORD_TO_STRING(fb_OEE计算.ow_综合OEE),                                        '%,低于目标值10%以上');END_IF;

// 综合异常等级IF ob_产量异常 AND ob_节拍异常 THEN      oby_异常等级 :=  3;   // 严重异常ELSIF ob_产量异常 OR ob_节拍异常 THEN      oby_异常等级 :=  2;   // 中等异常ELSIF ob_OEE异常 THEN      oby_异常等级 :=  1;   // 轻微异常ELSE      oby_异常等级 :=  0;   // 正常END_IF;

CheckAnomalies := (oby_异常等级 >  0);END_METHOD

七、实施建议与最佳实践

7.1 部署 Checklist

硬件准备
PLC内存检查:确保有足够的数据存储空间
实时时钟电池:保证断电后时间准确
存储卡:建议使用SD卡扩展数据存储
软件配置
设置正确的时区和夏令时
配置数据保持区域
设置合理的扫描周期(建议50-100ms)
数据验证
模拟测试所有异常场景
验证30天数据循环覆盖
测试断电恢复功能

7.2 性能优化技巧

分时处理将不同的统计任务分散到不同的扫描周期
数据压缩对于历史数据,可以存储增量而非全量
缓存机制频繁查询的数据使用缓存
异步存储大数据存储使用异步操作

7.3 维护建议

定期备份每月导出历史数据到上位机
日志监控建立操作日志系统
版本管理功能块版本号管理
文档更新保持注释和文档同步更新

八、结语

通过这两集的内容,我们从单个节拍的计算,到完整的产能统计系统,构建了一个真正意义上的生产数据平台。

核心收获:

分层架构思维实时层、统计层、历史层的清晰划分
自动化设计班次自动切换、数据自动存储
数据完整性30天循环存储,确保数据不丢失
分析智能化OEE计算、异常预警、产能预测

未来展望:

这套系统可以进一步扩展为:
多设备集群管理一个PLC监控多条产线
云端数据同步通过OPC UA上传到MES/ERP
AI预测维护基于历史数据的故障预测
移动端监控通过Web API提供手机端访问

最后的建议:

"不要追求完美,而要追求可演进"
从最小可用的版本开始,在实际使用中不断迭代优化。每个工厂、每条产线都有自己的特点,最优雅的解决方案往往是最简单实用的那个
系列完结,但学习永不止步!  
下一系列预告《西门子SCL高级应用:从PLC到工业互联网的跨越》

---

标签产能统计  班次管理  OEE计算  历史数据  SCL编程

版权声明原创内容,转载需授权
【 看完别滑走!需要你的支持!】
这篇干货文章花了大量时间整理,如果对你有帮助或启发,请一定:
  「评论区」  留下你的想法

  遇到了类似问题?有更好的方法?期待你分享见解!
  「转发」  给更多需要的人

  也许你身边的朋友,正被同样的问题困扰!
  「收藏」  随时回看复习

  知识点需要反复消化,码住不迷路!
每一次互动都是我们继续创作优质内容的动力!

感谢有你,一起进步!

---

---

推荐阅读:
分享让更多人看看
点赞
收藏
分享

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码