ST语言编程支持复杂的数学运算和控制逻辑,还能高效地批量处理数据。为编程人员带来了极大的灵活性和强大的表达能力。本文跟大家分享一个ST语言编写的控制100组交通灯的程序
1.写一个功能块,用于控制交通灯逻辑
FUNCTION_BLOCK Light
VAR_INPUT
bSwitch : BOOL;
iStep:INT;
END_VAR
VAR_OUTPUT
R_light:BOOL;
G_light:BOOL;
Y_light:BOOL;
END_VAR
VAR
iState : INT;
R_trig_0 : Standard.R_TRIG;
F_trig_0 :Standard.F_TRIG;
Standard.TON; :
blink_0:BLINK;
END_VAR
=bSwitch); :
=bSwitch); :
IF R_trig_0.Q THEN
iState := iStep;
END_IF
IF F_trig_0.Q THEN
iState:=0;
END_IF
=(iState=1),PT:=T#7S); :
=(iState=2),PT:=T#3S); :
=(iState=3),PT:=T#7S); :
=(iState=4),pt:=T#3S); :
CASE iState OF
0:
g_light:=FALSE;
Y_light:=FALSE;
=FALSE; :
……
2. 用三个结构体定义输入输出模块参数
(*使用结构体管理输入输出模块*)
//定义输入变量结构体 :
STRUCT
byValue:BYTE;
siValue:SINT;
wValue:WORD;
END_STRUCT
END_TYPE
//定义输出变量结构体 :
STRUCT
x0:BIT;
x1:BIT;
x2:BIT;
x3:BIT;
x4:BIT;
x5:BIT;
x6:BIT;
x7:BIT;
END_STRUCT
END_TYPE
//定义输入输出模块 :
STRUCT
stI AT %I* :ST_Input;
stQ AT %Q* :ST_Output;
END_STRUCT
END_TYPE
3. 定义IO配置模块及全局变量
//IO_Config配置列表
(*//for i in range(1, 101):
//print(f"io.sta100[{i}].stI AT %{{IB{i-1}}} : ST_Input;")
//print(f"io.sta100[{i}].stQ AT %{{QB{i-1}}} : ST_Output;")*)
{attribute 'qualified_only'}
VAR_CONFIG
io.sta100[1].stI AT %IB0 : ST_Input;
io.sta100[1].stQ AT %QB0 : ST_Output;
……
io.sta100[100].stI AT %IB99 : ST_Input;
io.sta100[100].stQ AT %QB99 : ST_Output;
END_VAR
//注意这里可以用python生成程序
//for i in range(1, 101):
//print(f"io.sta100[{i}].stI AT %{{IB{i-1}}} : ST_Input;")
//print(f"io.sta100[{i}].stQ AT %{{QB{i-1}}} : ST_Output;")
//全局变量列表
VAR_GLOBAL
sta100 :ARRAY[1..100] OF ST_IO_Module;
END_VAR
4.主程序
PROGRAM Light_ST
VAR
bMainSwitch:BOOL;
TrafficLight:ARRAY [1..100]OF Light;
iCount: INT;
Rtrig_0:R_TRIG;
Ftrig_0:F_TRIG;
END_VAR
=TO_BOOL(IO.sta100[1].stI.byValue); :
= bMainSwitch ); :
= bMainSwitch ); :
IF Rtrig_0.Q THEN
FOR iCount:=1 TO 99 BY 1 DO
=TRUE, :
R_light=>IO.sta100[iCount].stQ.x0,
Y_light=>IO.sta100[iCount].stQ.x1,
G_light=>IO.sta100[iCount].stQ.x2,);
END_FOR
END_IF
IF Ftrig_0.Q THEN
FOR iCount:=1 TO 99 BY 1 DO
=FALSE ); :
END_FOR
END_IF
点赞+在看后,回复20240907获取程序源码。