应客户要求,按月、天、时做生产产量统计,使用的汇川中大型PLC,大部分用ST开发,少量使用梯形图,实际效果::
ST编程如下:
1、新建结构体st_Capacity、POU程序Capacity、FB功能块CapacityControlFB:
st_Capacity结构体:
TYPE st_Capacity :
STRUCT
i_xCountTrigger :BOOL; //计数触发
o_iSameMonthCapacityByDay :ARRAY[1..31] OF DINT; //月日产量
o_iLastMonthCapacityByDay :ARRAY[1..31] OF DINT; //上月日产量
o_iSameMonthCapacity :ARRAY[1..31, 0..23] OF DINT; // 当前月产能明细
o_iLastMonthCapacity :ARRAY[1..31, 0..23] OF DINT; // 上个月产能明细
END_STRUCT
END_TYPE
Capacity方法:
PROGRAM Capacity
VAR
CapacityFB: CapacityControlFB ;
END_VAR
在Capacity方法中实例化CapacityControlFB功能块:
CapacityFB(stCapacity:= gCapacity);
CapacityControlFB功能块:
FUNCTION_BLOCK CapacityControlFB
VAR_IN_OUT
stCapacity:st_Capacity;
END_VAR
VAR
END_VAR
VAR RETAIN PERSISTENT
v_SameMonth: UINT; //月更新
END_VAR
// 小时产能统计
IF stCapacity.i_xCountTrigger THEN
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, CurrentDT_s.uiHour] := stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, CurrentDT_s.uiHour] +1;
stCapacity.i_xCountTrigger:=FALSE;
END_IF
// 日产能统计
stCapacity.o_iSameMonthCapacityByDay[CurrentDT_s.uiDay] := stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 0]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 1]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 2]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 3]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 4]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 5]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 6]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 7]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 8]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 9]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 10]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 11]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 12]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 13]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 14]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 15]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 16]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 17]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 18]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 19]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 20]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 21]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 22]+
stCapacity.o_iSameMonthCapacity[CurrentDT_s.uiDay, 23];
//保存上月产能
IF CurrentDT_s.uiMonth<>v_SameMonth THEN
stCapacity.o_iLastMonthCapacityByDay := stCapacity.o_iSameMonthCapacityByDay;
stCapacity.o_iLastMonthCapacity := stCapacity.o_iSameMonthCapacity;
Clear(IN:=stCapacity.o_iSameMonthCapacityByDay);
Clear(IN:=stCapacity.o_iSameMonthCapacity);
v_SameMonth:=CurrentDT_s.uiMonth;
END_IF
新建GLOBAL全局变量
VAR_GLOBAL
// 日产量统计
SelectMonthByDay: BOOL; // 月选择 TRUE-当前月 FALSE-上一个月
DayAdd: BOOL;
DaySub: BOOL;
HMI_MonthByDay: UINT;
HMI_Day: UINT := CurrentDT_s.uiDay;
HMI_DayCapacity: ARRAY[0..23] OF DINT;
// 月产量统计
SelectMonthByMonth: BOOL; // 月选择 TRUE-当前月 FALSE-上一个月
HMI_MonthByMonth: UINT;
HMI_MonthCapacityByMonth: ARRAY[1..31] OF DINT;
END_VAR
PLC_PRG主程序中调用:
Capacity();
在需要做统计的地方使用gCapacity.i_xCountTrigger 即可自动统计月、天、时的生产产量:
IF VacuoControl.直线电机动子3真空=-88 AND TON3.Q THEN
HMI_Data.总生产量计数 := HMI_Data.总生产量计数 + 1;
gCapacity.i_xCountTrigger := TRUE; // 统计生产产量
HMI_Data.下料皮带计数 := 0;
CylinderControl.直线动子3_Z向气缸:=-1;
VacuoControl.直线电机动子3真空:=0;
有不懂的可私信编者,都是菜鸟,互相学习,互相请教,知无不言言无不尽。