//该程序减少使用定时器提高编程速度
//###############################################
//该控制程序为脉冲型电机启动块
//用于自动模式,手动模式(手动模式可触摸屏或者上位机控制)
//使用该块需要设置系统时钟存储器为2或者使用M2.5做一个秒脉冲
//EBC_LW 20161225
//###############################################
FUNCTION_BLOCK FB11
TITLE = 'MOTER_P_CL'
//
// Block Comment...
//
VERSION: '1.0'
AUTHOR: EBCLW
NAME: mot_p_cl
FAMILY: EBC
KNOW_HOW_PROTECT
// Block Parameters
VAR_INPUT
REMOTE:BOOL;//原程
RUN:BOOL;//运行
FAULT:BOOL;//故障
AM:BOOL;//手自动模式(0为手动,1为自动)
AST:BOOL;//自动启动
ASTO:BOOL;//自动停止
CMP_CL:BOOL;//触摸屏选择
P_WIDE:INT:=3;//脉冲长度
START_TIMEOUT_ST:INT:=5;//启动超时
STOP_TIMEOUT_ST:INT:=5;//停止超时
END_VAR
VAR_IN_OUT
ST:BOOL;//启动
STO:BOOL;//停止
CMP_ST:BOOL;//触摸屏启动
CMP_STO:BOOL;//触摸屏停止
REST:BOOL;//复位
END_VAR
VAR_OUTPUT
START:BOOL;//启动脉冲
STOP:BOOL;//停止脉冲
START_TIMEOUT:BOOL;//启动超时
STOP_TIMEOUT:BOOL;//停止超时
END_VAR
VAR_TEMP
PN:BOOL;//秒脉冲上升沿
ST_PN:BOOL;
STO_PN:BOOL;
CMP_ST_PN:BOOL;
CMP_STO_PN:BOOL;
AST_PN:BOOL;
ASTO_PN:BOOL;
START_PN:BOOL;
STOP_PN:BOOL;
END_VAR
VAR
OLD_VAL:BOOL;//边沿检测的上一次的值
ST_OLD_VAL:BOOL;
STO_OLD_VAL:BOOL;
CMP_ST_OLD_VAL:BOOL;
CMP_STO_OLD_VAL:BOOL;
AST_OLD_VAL:BOOL;
ASTO_OLD_VAL:BOOL;
START_OLD_VAL:BOOL;
STOP_OLD_VAL:BOOL;
ST_TM:INT:=0;//启动按钮延时
STO_TM:INT:=0;//停止按钮延时
CMP_ST_TM:INT:=0;//触摸屏启动按钮延时
CMP_STO_TM:INT:=0;//触摸屏停止按钮延时
START_TEMP:BOOL;
STOP_TEMP:BOOL;
START_TM:INT;
STOP_TM:INT;
START_TIMEOUT_TM:INT;//启动超时计时
STOP_TIMEOUT_TM:INT;//停止超时计时
REST_TM:INT;
END_VAR
//秒脉冲
//上升沿
PN:=M2.5&(NOT OLD_VAL);
OLD_VAL:=M2.5;
//下降沿
//NN:=OLD_VAL&(NOT M2.5);
//OLD_VAL:=M2.5;
//#############################################################
//----------------------上位机启停按钮脉冲-----------------------------
//启动按钮脉冲
ST_PN:=ST&(NOT ST_OLD_VAL);
ST_OLD_VAL:=ST;
//停止按钮脉冲
STO_PN:=STO&(NOT STO_OLD_VAL);
STO_OLD_VAL:=STO;
//----------------------触摸屏启停按钮脉冲----------------------------
//触摸屏启动按钮脉冲
CMP_ST_PN:=CMP_ST&(NOT CMP_ST_OLD_VAL);
CMP_ST_OLD_VAL:=CMP_ST;
//触摸屏停止按钮脉冲
CMP_STO_PN:=CMP_STO&(NOT CMP_STO_OLD_VAL);
CMP_STO_OLD_VAL:=CMP_STO;
//----------------------自动启停脉冲-----------------------------
//自动启动脉冲
AST_PN:=AST&(NOT AST_OLD_VAL);
AST_OLD_VAL:=AST;
//自动停止脉冲
ASTO_PN:=ASTO&(NOT ASTO_OLD_VAL);
ASTO_OLD_VAL:=ASTO;
//----------------------启停指令脉冲-----------------------------
//自动启动脉冲
START_PN:=START&(NOT START_OLD_VAL);
START_OLD_VAL:=START;
//自动停止脉冲
STOP_PN:=STOP&(NOT STOP_OLD_VAL);
STOP_OLD_VAL:=STOP;
//按钮延时的作用:避免上位机按时间过短而未让设备动作
//------------------------上位机启停按钮延时----------------------------
//启动按钮2S延时
IF ST & PN THEN
ST_TM:=ST_TM+1;
IF ST_TM>=2 THEN
ST_TM:=0;
ST:=0;
END_IF;
END_IF;
//停止按钮2S延时
IF STO & PN THEN
STO_TM:=STO_TM+1;
IF STO_TM>=2 THEN
STO_TM:=0;
STO:=0;
END_IF;
END_IF;//-------------------触摸屏启停按钮延时--------------------------------
//触摸屏启动按钮2S延时
IF CMP_ST & PN THEN
CMP_ST_TM:=CMP_ST_TM+1;
IF CMP_ST_TM>=2 THEN
CMP_ST_TM:=0;
CMP_ST:=0;
END_IF;
END_IF;
//触摸屏停止按钮2S延时
IF CMP_STO & PN THEN
CMP_STO_TM:=CMP_STO_TM+1;
IF CMP_STO_TM>=2 THEN
CMP_STO_TM:=0;
CMP_STO:=0;
END_IF;
END_IF;
//---------------------复位按钮延时------------------
IF REST & PN THEN
REST_TM:=REST_TM +1;
IF REST_TM>=2 THEN
REST:=0;
REST_TM:=0;
END_IF;
END_IF;
//###########################################################
//判断是否是自动控制模式
//自动模式时接受自动控制引脚控制
IF AM & REMOTE & NOT(FAULT) & NOT(RUN) & AST_PN THEN
STOP:=0;
START:=1;
END_IF;
IF AM & REMOTE &( FAULT OR ASTO_PN) THEN
START:=0;
STOP:=1;
END_IF;
//手动模式时再判断是上位机还是触摸屏控制
//手动模式时触摸屏启动
IF NOT(AM) & CMP_CL & REMOTE & NOT(FAULT) & NOT(RUN) & CMP_ST_PN THEN
STOP:=0;
START:=1;
END_IF;
IF NOT(AM)& CMP_CL & REMOTE &( FAULT OR CMP_STO_PN) THEN
START:=0;
STOP:=1;
END_IF;
//手动模式时上位机启动
IF NOT(AM) & NOT(CMP_CL) & REMOTE & NOT(FAULT) & NOT(RUN) & ST_PN THEN
STOP:=0;
START:=1;
END_IF;
IF NOT(AM)& NOT(CMP_CL) & REMOTE &( FAULT OR STO_PN) THEN
START:=0;
STOP:=1;
END_IF;
//#################################################################################
//输出指令复位
//------------------启动指令复位------------------------------
//满足条件就进行计数
IF PN & START THEN
START_TM:=START_TM+1;
END_IF;
//计数达到时复位数据
IF START_TM>=P_WIDE THEN
START_TM:=0;
START:=0;
END_IF;
//-------------------停止指令复位-----------------------------
//满足条件就进行计数
//若有故障则停止信号长时间接通直到故障信号消失
IF PN & STOP & NOT(FAULT) THEN
STOP_TM:=STOP_TM+1;
END_IF;
//计数达到时复位数据
IF STOP_TM>=P_WIDE THEN
STOP_TM:=0;
STOP:=0;
END_IF;
//---------------------------启动超时-------------------------
IF START_PN THEN
START_TEMP:=1;
STOP_TEMP:=0;
END_IF;
IF RUN & START THEN
START_TEMP:=0;
END_IF;
IF START_TEMP & NOT(RUN) & PN & (START_TIMEOUT_TM < START_TIMEOUT_ST) THEN
START_TIMEOUT_TM:=START_TIMEOUT_TM+1;
END_IF;
IF START_TIMEOUT_TM >=START_TIMEOUT_ST THEN
START_TEMP:=0;
START_TIMEOUT_TM:=0;
START_TIMEOUT:=1;
END_IF;
//----------------------------停止超时------------------------
IF STOP_PN THEN
START_TEMP:=0;
STOP_TEMP:=1;
END_IF;
IF NOT(RUN) & STOP THEN
STOP_TEMP:=0;
END_IF;
IF STOP_TEMP & RUN & PN & (STOP_TIMEOUT_TM < STOP_TIMEOUT_ST) THEN
STOP_TIMEOUT_TM:=STOP_TIMEOUT_TM+1;
END_IF;
IF STOP_TIMEOUT_TM >=STOP_TIMEOUT_ST THEN
STOP_TEMP:=0;
STOP_TIMEOUT_TM:=0;
STOP_TIMEOUT:=1;
END_IF;
//-----------------------------复位-------------------------
IF REST THEN
START_TIMEOUT:=0;
STOP_TIMEOUT:=0;
END_IF;
END_FUNCTION_BLOCK
//原创程序请多交流 QQ:275578306