ST 语言支持多类标准数据类型,合理选型是优化程序性能的基础。常用类型及规范定义如下:
VAR
bRun : BOOL := FALSE; // 布尔型:用于状态标识(b前缀)
nCount : INT := 0; // 整型:用于计数统计(n前缀)
fSpeed : REAL := 0.0; // 浮点型:用于速度等连续量(f前缀)
aTemp : ARRAY[1..8] OF REAL; // 数组:存储多通道数据
END_VAR
条件判断:适配多场景分支逻辑
IF bStart AND NOT bFault THEN // 启动信号有效且无故障
bRun := TRUE;
ELSIF bStop THEN // 停止信号触发
bRun := FALSE;
END_IF;
循环控制:高效处理批量数据
FOR i := 1 TO 8 DO // 数组批量赋值
aTemp[i] := 25.0;
END_FOR;
函数(FUNCTION):无状态运算单元,仅返回结果
FUNCTION Add : INT
VAR_INPUT a,b : INT; END_VAR
Add := a + b; // 简单加法运算,无内部状态存储
END_FUNCTION
函数块(FUNCTION_BLOCK):带状态存储,适配设备控制
FUNCTION_BLOCK FB_Motor
VAR_INPUT bEnable : BOOL; END_VAR // 使能输入
VAR_OUTPUT bRunning : BOOL; END_VAR // 运行状态输出
VAR eState : (STOP,RUN); END_VAR // 内部状态机
CASE eState OF
STOP: IF bEnable THEN eState := RUN; END_IF; // 状态切换逻辑
RUN: bRunning := TRUE; // 运行状态保持
END_CASE;
END_FUNCTION_BLOCK
双模式控制:支持手动 / 自动切换启停
物料管理:精准检测并统计输送物料数量
安全保障:集成过载、堵转等故障保护
灵活调节:支持输送带速度连续调整
PROGRAM MAIN
VAR
fbConv : FB_Conveyor; // 输送带控制功能块
fbCnt : FB_Counter; // 计数功能块
bAuto : BOOL := TRUE; // 自动模式默认开启
END_VAR
// 功能块调用:实现数据交互与逻辑联动
fbConv(bAutoMode:=bAuto, bSensor:=DI_Sensor, bMotor=>DO_Motor);
fbCnt(bTrigger:=fbConv.bPassed, nTotal=>HMI.nCount);
输送带控制功能块(FB_Conveyor)
FUNCTION_BLOCK FB_Conveyor
VAR_INPUT bAutoMode,bSensor : BOOL; END_VAR // 模式选择+物料检测
VAR_OUTPUT bMotor : BOOL; END_VAR // 电机控制输出
VAR eState : (IDLE,RUN); END_VAR // 状态机:待机/运行
CASE eState OF
IDLE: // 待机状态
bMotor := FALSE;
// 启动条件:自动模式+物料检测 或 手动模式+启动信号
IF (bAutoMode AND bSensor) OR (NOT bAutoMode AND bStart) THEN
eState := RUN;
END_IF;
RUN: // 运行状态
bMotor := TRUE;
// 停止条件:自动模式+无物料 或 停止信号
IF (bAutoMode AND NOT bSensor) OR bStop THEN
eState := IDLE;
END_IF;
END_CASE;
END_FUNCTION_BLOCK
物料计数功能块(FB_Counter)
FUNCTION_BLOCK FB_Counter
VAR_INPUT bTrigger,bReset : BOOL; END_VAR // 触发信号+复位信号
VAR_OUTPUT nTotal : DINT; END_VAR // 累计计数输出
VAR bLast : BOOL := FALSE; END_VAR // 上一周期状态缓存
// 上升沿触发计数,避免重复统计
IF bTrigger AND NOT bLast THEN
nTotal := nTotal + 1;
nTotal := nTotal < 0 ? 0 : nTotal; // 溢出保护
END_IF;
bLast := bTrigger; // 更新缓存状态
IF bReset THEN nTotal := 0; END_IF; // 手动复位
END_FUNCTION_BLOCK
状态机测试:逐一验证 IDLE→RUN→IDLE 等所有状态转换路径
边界条件验证:测试计数器溢出、传感器信号丢失等异常场景
性能监控:重点关注扫描时间,确保无超时风险
安全验证:确认急停、过载保护等安全逻辑优先执行
可读性优化
命名规范:布尔型前缀 "b"、整型前缀 "n"、浮点型前缀 "f"
注释精简:仅在复杂逻辑(如状态切换条件)处添加说明
单一职责:每个功能块仅实现一项核心功能(如计数与控制分离)
效率优化
循环优化:避免在循环内执行浮点运算等耗时操作
数据类型:优先使用 INT 替代 REAL,减少运算开销
寻址谨慎:非必要不使用指针和间接寻址,降低出错概率
健壮性优化
输入校验:验证所有外部信号的取值范围
错误检测:关键操作(如电机启动)增加故障预判
心跳监控:重要设备添加状态反馈监控,及时发现异常