恭喜,你发布的帖子
发布于 2022-07-27 07:52:32
3楼
这个是昨天晚上监控到现在的PLC 运行时间,是按照小时为计算单位的。
附SCL 如下
VAR_INPUT
start: BOOL:=false; // 开始
stop: BOOL:=false; // 结束
set_time:BOOL:=false; // 设定时间使能
NR:BYTE; //定时器编号
PV:INT; //预设定时间
S:BOOL; // 使能
END_VAR
VAR_IN_OUT
last_status:BOOL; //上个周期状态
positive_edge,negative_edge:BOOL; //记录上升沿和下降沿
END_VAR
VAR_TEMP
SFC2_status:INT; //SFC2 执行状态
SFC3_status:INT;
SFC4_status:INT;
SFC2_CYC,SFC3_CYC,SFC4_CYC:BOOL; // SFC 执行正确
END_VAR
VAR_OUTPUT
CQ:BOOL; // 定时器运行状态
CV:INT; // 实际运行时间
run:BOOL;
END_VAR
run:=( run OR start) AND NOT stop; // 启动或停止
IF set_time THEN
SFC2_status:=SET_RTM(NR := NR // IN: BYTE
,PV :=PV // IN: INT
); // INT
IF SFC2_status = 0 THEN
SFC2_CYC:= true;
ELSE
SFC2_CYC:= false;
END_IF;
END_IF;
positive_edge := run AND (NOT last_status);
negative_edge := last_status AND (NOT run);
last_status:= run;
// 读取启动的上升沿和下降沿
IF ( positive_edge OR negative_edge) THEN
SFC3_status:=CTRL_RTM(NR := NR // IN: BYTE
,S :=S // IN: BOOL
); // INT
IF SFC3_status = 0 THEN
SFC3_CYC:= true;
ELSE
SFC3_CYC:= false;
END_IF;
END_IF;
SFC4_status:= READ_RTM(NR := NR // IN: BYTE
,CQ := CQ // OUT: BOOL
,CV := CV // OUT: INT
); // INT
IF SFC4_status = 0 THEN
SFC4_CYC:= true;
ELSE
SFC4_CYC:= false;
END_IF;
END_FUNCTION
可以不用SFC2, 直接调用SFC3/4 然后记录运行时间,SFC2是给预设时间,例如 PLC 运行24 然后叠加1 并清零SFC4,表示工作了一天,再次运行24小时,叠加1 ,并清零表示工作两天,依次类推。
SFC2 一般用于清零比较多。
但我不用这个SFC 做运行时间监控,我一般用心跳检测进行时间累加,时间精度随意可以调整。
请填写推广理由:
分享
只看
楼主