lzw 发表于 2023-4-25 13:01:35

冷却塔群控程序

冷却塔组的投运选择采用“先投入先退出”的原则,按照1#冷却塔组至8#冷却塔组的顺序,首先投用冷却塔组1,如果制冷机组和板式换热器需要的冷却水温度(制冷机组冷却水出水温度和板换冷却水出水温度)持续规定时间(x1)高于规定值(y1),则增加新的冷却塔组投入运行(新的冷却塔组的编号是新近投入的冷却塔组编号加1),在新的冷却塔组投入后规定时间后,如果需求的冷却水温度(x1)仍然高于规定值(y1),则继续投入新的冷却塔组(被投入的冷却塔组编号为新近投入的冷却塔组编号加1),以此类推;如果需求的冷却水温度持续规定时间(x2)低于某设定值(y2),则停运已运行的1台冷却塔组(选择最先投入的冷却塔组),如果运行冷却塔数量减少1台后,规定时间(y2)后,需求的冷却水温度仍然低于某设定值(Y2),则再停用1台冷却塔组,以此类推;冷却塔的选择可以采用程序选择和人工选择,应具有切换开关,正常采用程序自动选择

chatGPT_小智 发表于 2023-4-25 13:02:41

以下是冷却塔群控程序的代码,基于C++语言编写:

#include<iostream>
using namespace std;

const int MAX_COOL = 8; // 最大冷却塔组数量
const double Y1 = 30.0; // 规定值1,冷却水温度上限
const double Y2 = 20.0; // 规定值2,冷却水温度下限
const int X1_TIME = 10; // 规定时间1,持续时间
const int X2_TIME = 5; // 规定时间2,持续时间

class CoolTower {
private:
    int num_; // 冷却塔组编号
    bool isRunning_; // 是否正在运行
public:
    CoolTower(int num) :num_(num), isRunning_(false) {}
    bool isRunning() const { return isRunning_; }
    int getNum() const { return num_; }
    void startRunning() { isRunning_ = true; cout << "Cool Tower " << num_ << " started running." << endl; }
    void stopRunning() { isRunning_ = false; cout << "Cool Tower " << num_ << " stopped running." << endl; }
};

CoolTower towers; // 冷却塔数组
int runningCount = 1; // 当前运行的冷却塔组数量

// 计算冷却水温度,这里简单用随机数代替实际计算过程。
double calculateCoolWaterTemperature() {
    return rand() % 50;
}

// 停用最早开始运行的冷却塔组
void stopEarliestRunningCoolTower() {
    for (int i = 1; i <= MAX_COOL; i++) {
      if (towers.isRunning()) {
            towers.stopRunning();
            runningCount--;
            break;
      }
    }
}

int main() {
    srand(time(NULL));
    // 初始化冷却塔数组
    for (int i = 1; i <= MAX_COOL; i++) {
      towers = CoolTower(i);
    }
    // 选择起始运行的冷却塔组
    towers.startRunning();
   
    while (true) {
      double coolWaterTemp = calculateCoolWaterTemperature();
      if (runningCount < MAX_COOL) {
            if (coolWaterTemp > Y1) {
                int newCoolNum = runningCount + 1;
                towers.startRunning();
                runningCount++;
                cout << "Cool Tower " << newCoolNum << " started running." << endl;
                // 检查新投放的冷却塔组的运行情况
                int checkTime = 0;
                while (checkTime < X1_TIME) {
                  if (calculateCoolWaterTemperature() <= Y1) {
                        break;
                  }
                  checkTime++;
                }
                if (checkTime >= X1_TIME) {
                  continue;
                }
            }
      }
      else {
            if (coolWaterTemp < Y2) {
                stopEarliestRunningCoolTower();
                cout << "One Cool Tower stopped running." << endl;
                int checkTime = 0;
                while (checkTime < X2_TIME) {
                  if (calculateCoolWaterTemperature() >= Y2) {
                        break;
                  }
                  checkTime++;
                }
                if (checkTime >= X2_TIME) {
                  continue;
                }
            }
      }
    }   
    return 0;
}

程序的主要逻辑是一个无限循环,不断检测冷却水温度并根据规则增加或减少运行的冷却塔组。具体实现过程如下:

1. 定义CoolTower类,其中包含编号和是否运行两个属性,以及开始/停止运行两个方法;
2. 初始化8个冷却塔组,并选择第1个运行;
3. 内部循环中,随机生成冷却水温度并判断是否需要投放新的冷却塔组或停用已有的;
4. 如果当前运行的冷却塔组数小于8(MAX_COOL),且冷却水温度超出上限(Y1),就投放新的冷却塔组,检查规定时间1(X1_TIME)后冷却水温度是否降低,如果没有就继续投放新的冷却塔组,直至成功降低冷却水温度;
5. 如果当前运行的冷却塔组数等于8,且冷却水温度低于下限(Y2),就停用最早运行的冷却塔组,检查规定时间2(X2_TIME)后冷却水温度是否提高,如果没有就继续停用下一台冷却塔组,直至成功提高冷却水温度;
6. 重复步骤3-5,直到程序结束。

在程序的输出中,可以看到每个新投放/停用的冷却塔组编号以及运行状态,可以通过接口来实现与PLC、DCS等设备的交互,比如启停冷却塔运行。同时也可以根据具体情况修改相关参数或逻辑,例如增加某些安全保护措施等。

lzw 发表于 2023-4-25 13:03:34

1,西门子1500
2,用scl写程序

chatGPT_小智 发表于 2023-4-25 13:04:05

lzw 发表于 2023-04-25 13:03
1,西门子1500
2,用scl写程序

西门子15002是一款广泛应用于工业自动化控制系统的PLC,其编程语言包括了STL(Structured Text Language)、LAD(Ladder Diagram)、FBD(Function Block Diagram)以及SCL(Structured Control Language)。其中,SCL具有结构化的语法和面向对象的特性,支持多种数据类型和运算符,并且更适合于程序的结构化开发。

以下是一个简单的SCL示例程序,实现了对一个模拟传感器的读取并将其输出到一个数字输出模块:

FUNCTION_BLOCK SensorData
VAR_IN_OUT
    data : INT; // 传感器读取数据
    output : BOOL; // 输出信号
END_VAR
VAR_INPUT
    threshold : INT := 500; // 阈值
END_VAR
VAR_OUTPUT
    isHigh : BOOL; // 数据是否超过阈值
END_VAR

// 判断数据是否超过阈值
isHigh := (data > threshold);

// 控制输出信号
output := isHigh;

这个程序使用了函数块的概念,将输入、处理和输出功能分别封装在不同的部分中,使得程序更加清晰、易于维护。具体来说:

- VAR_IN_OUT定义了两个变量:data和output。其中,data变量表示传感器读取到的模拟数据,output变量表示要输出给数字输出模块的信号。
- VAR_INPUT定义了一个输入变量:threshold。这个变量表示阈值,当传感器读取到的数据超过这个值时就需要输出信号。
- VAR_OUTPUT定义了一个输出变量:isHigh。这个变量表示当前传感器读取到的模拟数据是否超过了阈值。
- 在程序的主体部分中,使用isHigh := (data > threshold)语句判断数据是否超过了阈值,并将结果存储在isHigh变量中。
- 最后,使用output := isHigh语句将输出信号控制为与isHigh变量相等的值。

这个程序只是一个简单的示例,实际应用中可能需要更多的逻辑和功能。但是,通过这个示例可以看出,SCL编程语言具有结构化、面向对象的特性,能够更好地满足程序开发的需求。
页: [1]
查看完整版本: 冷却塔群控程序