使用博途V16编写红绿灯控制程序
使用博途V16编写红绿灯控制程序1,使用博途V16软件,SCL语言,符合西门子PLC编程规则;
2,程序写在FB块里;
3,输入信号有:启动;停止;延时参数,输出信号有:红灯;绿灯;
4,输入启动信号后,红灯点亮,经过延时参数设定时间后,红灯关闭,绿灯点亮,经过延时参数设定时间后,绿灯关闭,红灯点亮,以此循环;
5,输入停止信号后,红灯和绿灯都关闭。
请参考如下程序:
FUNCTION_BLOCK FB_Traffic_Light_Control
TITLE = 'Traffic Light Control'
VAR_INPUT
Start : BOOL; (* 启动信号 *)
Stop : BOOL; (* 停止信号 *)
Delay : TIME; (* 延时参数,单位为毫秒 *)
END_VAR
VAR_OUTPUT
Red : BOOL; (* 红灯输出信号 *)
Green : BOOL; (* 绿灯输出信号 *)
END_VAR
VAR
timeCount : TIME; (* 延时计数器 *)
END_VAR
(* 状态定义 *)
TYPE STATE :
(
RED,
GREEN
);
END_TYPE
VAR CONSTANT
stateRed : STATE := STATE.RED; (* 定义红灯状态 *)
stateGreen: STATE := STATE.GREEN; (* 定义绿灯状态 *)
END_VAR
VAR
currentState : STATE := STATE.RED; (* 当前状态 *)
END_VAR
(* 执行函数 *)
METHOD Execute : VOID
CASE currentState OF
(* 如果当前状态为红灯 *)
STATE.RED:
(* 置红灯输出信号为真,绿灯输出信号为假 *)
Red := TRUE;
Green := FALSE;
(* 如果启动信号为真,则开始计时,并切换至绿灯状态 *)
IF Start THEN
timeCount := T#Delay;
currentState := STATE.GREEN;
END_IF
(* 如果当前状态为绿灯 *)
STATE.GREEN:
(* 置绿灯输出信号为真,红灯输出信号为假 *)
Green := TRUE;
Red := FALSE;
(* 如果启动信号为真,则开始计时,并切换至红灯状态 *)
IF Start THEN
timeCount := T#Delay;
currentState := STATE.RED;
END_IF
END_CASE
(* 如果停止信号为真,则关闭红绿灯 *)
IF Stop THEN
Red := FALSE;
Green := FALSE;
currentState := STATE.RED;
END_IF
(* 计时器递减 *)
IF timeCount > T#0s THEN
timeCount := timeCount - T#1s;
END_IF
(* 如果计时器归零,则切换状态 *)
IF timeCount <= T#0s THEN
currentState := NOT currentState;
timeCount := T#Delay;
END_IF
END_METHOD
END_FUNCTION_BLOCK
程序中使用了一个状态机,变量 currentState 表示当前状态,常量 stateRed 和 stateGreen 定义了红灯和绿灯两个状态。程序的核心是 Execute 方法,根据当前状态分别控制输出信号和计时器,并在计时器归零时切换状态。
在主程序中调用该 FB 块即可实现红绿灯的控制。
页:
[1]