CodeSYS PLC编程产量统计

应客户要求,按月、天、时做生产产量统计,使用的汇川中大型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;

有不懂的可私信编者,都是菜鸟,互相学习,互相请教,知无不言言无不尽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值