本期擂台为征集题:
程序内容是这样的,
①.当I0.0为自复位按钮输入变量,按一下I0.0,q0.0输出为1,再按一下I0.0,q0.0输出0
②.当I0.1为自复位按钮输入变量,按一下I0.1,q0.1输出为1,再按一下I0.1,q0.1输出0
3③.当双击(1S以内连续按两下按钮算双击)I0.0或I0.1任何一个按钮时,Q0.0,Q0.1都为0,当再次单击I0.0或者I0.1时,Q0.0或者Q0.1仍会延续①与②的逻辑。
PLC类型任意选择,回答的最好最完全的,原创最多,阐述最详细者获一等奖!
工控PLC擂台每周一期,本期待88期结束一周后结贴。奖项设置:一等奖1名:30~50MP,二等奖3名:10MP,三等奖10名:100积分。
MP介绍:gongkongMP即工控币,是中国工控网的用户积分与回馈系统的一个网络虚拟计价单位,类似于大家熟悉的QB,1个MP=1元人民币。
MP有什么用?兑换服务:以1个MP=1元来置换中国工控网的相关服务。 兑换现金:非积分获得的MP可兑换等值现金(满100MP后、用户可通过用户管理后台申请兑换)。
这个在单片机里会有用到,可以用状态机的编程方法编写。
这里用施耐德M241PLC,somachine软件,用ST编写程序如下:
(*变量申明*)
PROGRAM PLC_PRG
VAR
et_iPressStatus:ET_press;(*按键状态*)
iStorePressStatus:INT;(*上次按键状态存储*)
xBtn1:BOOL;(*定义第1个按键*)
xBtn2: BOOL;(*定义第2个按键*)
xLight1:BOOL;(*定义第1个灯*)
xLight2:BOOL;(*定义第2个灯*)
tDoubleClickTime:TIME := T#1S;(*定义两次连续按下时间*)
fbDelay:ton;
fbBtn1Trig:r_trig;
fbBtn2Trig:r_trig;
xTimerTrig:r_trig;
END_VAR
(*主体程序*)
(*按键上升沿捕捉*)
fbBtn1Trig(CLK:= xBtn1, Q=> );
fbBtn2Trig(CLK:= xBtn2, Q=> );
(*淸定时器*)
IF et_iPressStatus <> iStorePressStatus THEN
fbDelay(IN:= FALSE, PT:= tDoubleClickTime, Q=> , ET=> );
END_IF
iStorePressStatus:= et_iPressStatus;
(*动作流程*)
CASE et_iPressStatus OF
ET_Press.xInit:(*初始状态*)
IF fbBtn1Trig.Q THEN
et_iPressStatus := ET_Press.xBtn1Wait;
ELSIF fbBtn2Trig.Q THEN
et_iPressStatus := ET_Press.xBtn2Wait;
END_IF
ET_Press.xBtn1Wait:(*按键1被按下一次状态*)
fbDelay(IN:= TRUE, PT:= tDoubleClickTime, Q=> , ET=> );
IF fbDelay.Q THEN
et_iPressStatus := ET_Press.xBtn1SingleClick;
ELSE
IF fbBtn1Trig.Q THEN
et_iPressStatus := ET_Press.xDoubleClick;
END_IF
END_IF
ET_Press.xBtn2Wait:(*按键2被按下一次状态*)
fbDelay(IN:= TRUE, PT:= tDoubleClickTime, Q=> , ET=> );
IF fbDelay.Q THEN
et_iPressStatus := ET_Press.xBtn2SingleClick;
ELSE
IF fbBtn2Trig.Q THEN
et_iPressStatus := ET_Press.xDoubleClick;
END_IF
END_IF
ET_Press.xBtn1SingleClick:(*按键1单击次状态*)
xLight1:= NOT xLight1;
et_iPressStatus := ET_Press.xInit;
ET_Press.xBtn2SingleClick:(*按键2单击次状态*)
xLight2:= NOT xLight2;
et_iPressStatus := ET_Press.xInit;
ET_Press.xDoubleClick:(*按键双击状态*)
xLight1:= FALSE;
xLight2:= FALSE;
et_iPressStatus := ET_Press.xInit;
END_CASE