[code]FUNCTION COOLING_TOWER_CONTROL : VOID
TITLE = 'COOLING TOWER CONTROL'
VAR
IN_COOLING_WATER_TEMP : REAL; // 输入冷却水温度
OUT_COOLING_WATER_TEMP : REAL; // 输出冷却水温度
CUR_TIME : INT; // 当前时间
START_TIME : INT := 0; // 开始时间
ADD_TIME : INT := 10; // 增加时间
STOP_TIME : INT := 20; // 停止时间
NEED_COOLING_TOWER_NUM : INT := 1; // 需要投入运行的冷却塔数量
RUN_COOLING_TOWER_NUM : INT := 0; // 运行的冷却塔数量
START_COOLING_TOWER_NUM : INT := 1; // 开始投用的冷却塔编号
STOP_COOLING_TOWER_NUM : INT := 1; // 需要停用的冷却塔编号
COOLING_TOWER_SELECTED : BOOL := TRUE; // 冷却塔选择是否采用程序自动选择,默认为自动选择
// 冷却塔运行状态,1表示运行,0表示停止
COOLING_TOWER_STATUS : ARRAY[1...8] OF BOOL := [TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE];
BEGIN
// 如果冷却塔选择采用人工选择,则手动控制冷却塔运行状态
IF NOT COOLING_TOWER_SELECTED THEN
// 控制按钮S1-S8控制对应编号的冷却塔状态
COOLING_TOWER_STATUS[1] := S1;
COOLING_TOWER_STATUS[2] := S2;
COOLING_TOWER_STATUS[3] := S3;
COOLING_TOWER_STATUS[4] := S4;
COOLING_TOWER_STATUS[5] := S5;
COOLING_TOWER_STATUS[6] := S6;
COOLING_TOWER_STATUS[7] := S7;
COOLING_TOWER_STATUS[8] := S8;
END_IF;
// 计算输入冷却水温度和输出冷却水温度的平均值
OUT_COOLING_WATER_TEMP := 0;
FOR i:=1 TO 8 DO
IF COOLING_TOWER_STATUS[i] THEN
OUT_COOLING_WATER_TEMP := OUT_COOLING_WATER_TEMP + COOLING_TOWER_WATER_TEMP[i];
END_IF;
END_FOR;
OUT_COOLING_WATER_TEMP := OUT_COOLING_WATER_TEMP / RUN_COOLING_TOWER_NUM;
IN_COOLING_WATER_TEMP := (OUT_COOLING_WATER_TEMP + PRE_COOLING_WATER_TEMP) / 2;
// 如果需要投入运行的冷却塔数量大于当前运行的冷却塔数量,则增加新的冷却塔投入运行
IF NEED_COOLING_TOWER_NUM > RUN_COOLING_TOWER_NUM THEN
// 增加新的冷却塔投入运行
FOR i:=START_COOLING_TOWER_NUM TO 8 DO
IF NOT COOLING_TOWER_STATUS[i] THEN
COOLING_TOWER_STATUS[i] := TRUE;
START_COOLING_TOWER_NUM := i + 1;
EXIT; // 退出循环
END_IF;
END_FOR;
// 统计当前运行的冷却塔数量
RUN_COOLING_TOWER_NUM := 0;
FOR i:=1 TO 8 DO
IF COOLING_TOWER_STATUS[i] THEN
RUN_COOLING_TOWER_NUM := RUN_COOLING_TOWER_NUM + 1;
END_IF;
END_FOR;
// 如果需要投入运行的冷却塔数量仍然大于当前运行的冷却塔数量,则递归调用函数自动增加新的冷却塔投入运行
IF NEED_COOLING_TOWER_NUM > RUN_COOLING_TOWER_NUM THEN
CALL COOLING_TOWER_CONTROL;
END_IF;
// 更新开始时间
START_TIME := CUR_TIME;
END_IF;
// 如果需要停止运行的冷却塔数量大于0,且当前运行的冷却塔数量大于1,则停止最先投入运行的冷却塔
IF STOP_COOLING_TOWER_NUM > 0 AND RUN_COOLING_TOWER_NUM > 1 THEN
COOLING_TOWER_STATUS[STOP_COOLING_TOWER_NUM] := FALSE;
RUN_COOLING_TOWER_NUM := RUN_COOLING_TOWER_NUM - 1;
// 更新停止时间和需要停用的冷却塔编号
STOP_TIME := CUR_TIME;
STOP_COOLING_TOWER_NUM := STOP_COOLING_TOWER_NUM + 1;
END_IF;
// 如果需求的冷却水温度持续规定时间高于规定值,且当前运行的冷却塔数量小于8,则需要增加新的冷却塔投入运行
IF CUR_TIME - START_TIME >= ADD_TIME AND IN_COOLING_WATER_TEMP > Y1 AND RUN_COOLING_TOWER_NUM < 8 THEN
NEED_COOLING_TOWER_NUM := RUN_COOLING_TOWER_NUM + 1;
CALL COOLING_TOWER_CONTROL; // 递归调用函数自动增加新的冷却塔投入运行
END_IF;
// 如果需求的冷却水温度持续规定时间低于设定值,且当前运行的冷却塔数量大于1,则需要停止最先投入运行的冷却塔
IF CUR_TIME - STOP_TIME >= STOP_TIME AND IN_COOLING_WATER_TEMP < Y2 AND RUN_COOLING_TOWER_NUM > 1 THEN
STOP_COOLING_TOWER_NUM := 1;
CALL COOLING_TOWER_CONTROL; // 递归调用函数自动停止最先投入运行的冷却塔
END_IF;
// 更新上一次输出的冷却水温度
PRE_COOLING_WATER_TEMP := OUT_COOLING_WATER_TEMP;
END_FUNCTION[/code]
说明:
1. 冷却塔的控制采用函数方式实现,输入参数包括当前的冷却水温度,已投运的冷却塔数量,已停止运行的冷却塔数量等;输出参数包括需要投入运行的冷却塔数量,需要停止运行的冷却塔数量等。
2. 控制程序中使用了循环和条件分支结构,通过遍历数组和判断变量值来实现对冷却塔的控制。
3. 冷却塔的选择可以采用程序选择和人工选择,在控制程序中增加了冷却塔选择的切换开关。
4. 根据要求,如果需要投入运行的冷却塔数量大于当前运行的冷却塔数量,程序会递归调用自身函数以增加新的冷却塔投入运行,直到满足要求为止;同样地,如果需要停止运行的冷却塔数量大于0且当前运行的冷却塔数量大于1,则程序会递归调用自身函数以停止最先投入运行的冷却塔,直到满足要求为止。 |