用ST语言写100组交通灯的控制程序,附赠示例程序

文摘   科技   2024-09-07 17:31   山东  



ST语言编程支持复杂的数学运算和控制逻辑,还能高效地批量处理数据。为编程人员带来了极大的灵活性和强大的表达能力。本文跟大家分享一个ST语言编写的控制100组交通灯的程序


1.写一个功能块,用于控制交通灯逻辑

FUNCTION_BLOCK LightVAR_INPUT  bSwitch : BOOL;   iStep:INT;END_VARVAR_OUTPUT  R_light:BOOL;  G_light:BOOL;  Y_light:BOOL;END_VARVAR    iState : INT;     R_trig_0 : Standard.R_TRIG;  F_trig_0 :Standard.F_TRIG;  ton1,ton2,ton3,ton4 : Standard.TON;  blink_0:BLINK;END_VAR
R_trig_0(CLK:=bSwitch);F_trig_0(CLK:=bSwitch);
IF R_trig_0.Q THEN iState := iStep;END_IF
IF F_trig_0.Q THEN iState:=0;END_IF
ton1(IN:=(iState=1),PT:=T#7S);ton2(IN:=(iState=2),PT:=T#3S);ton3(IN:=(iState=3),PT:=T#7S);ton4(IN:=(iState=4),pt:=T#3S);CASE iState OF0: g_light:=FALSE; Y_light:=FALSE;  r_light:=FALSE;  ……

2. 用三个结构体定义输入输出模块参数

(*使用结构体管理输入输出模块*)TYPE ST_Input :  //定义输入变量结构体STRUCT  byValue:BYTE;  siValue:SINT;  wValue:WORD;END_STRUCTEND_TYPE
TYPE ST_Output :  //定义输出变量结构体STRUCT x0:BIT; x1:BIT; x2:BIT; x3:BIT; x4:BIT; x5:BIT; x6:BIT; x7:BIT;END_STRUCTEND_TYPE
TYPE ST_IO_Module : //定义输入输出模块STRUCT stI AT %I* :ST_Input; stQ AT %Q* :ST_Output; END_STRUCTEND_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_CONFIGio.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(1101):      //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_STVAR  bMainSwitch:BOOL;  TrafficLight:ARRAY [1..100]OF Light;  iCount: INT;  Rtrig_0:R_TRIG;  Ftrig_0:F_TRIG;END_VAR
//bMainSwitch:=TO_BOOL(IO.sta100[1].stI.byValue);Rtrig_0(CLK:= bMainSwitch );Ftrig_0(CLK:= bMainSwitch );IF Rtrig_0.Q THEN FOR iCount:=1 TO 99 BY 1 DO TrafficLight[iCount](bSwitch:=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_IFIF Ftrig_0.Q THEN FOR iCount:=1 TO 99 BY 1 DO TrafficLight[iCount](bSwitch:=FALSE ); END_FOREND_IF


点赞+在看后,回复20240907获取程序源码。



工控大侠
关注我,持续分享工控技术干货、行业动态!笔者20余年的自动化从业经验相信可以帮到您,有问题可留言。