【问题标题】:PLC Ladder logic - problematic sequence using two potentiometerPLC 梯形逻辑 - 使用两个电位器的有问题的序列
【发布时间】:2017-02-14 08:24:29
【问题描述】:

我已经花了很多时间和大量的纸素描,但我无法偶然发现任何东西来解决这个问题。

我们有两个装满水的水箱和它们之间的两个泵。如果 h>hmax(水箱 1)和 H,我们需要使用这些泵自动将水推到第二个水箱

我想不出一件事。第一个序列假设如果 H>Hmax 泵 1 或 2 将工作(它们不能同时工作)。当水被抽到第二个水箱并且第一个水箱中的水会下降时,在第一个水箱中补水后重复该顺序。我不知道如何在每个序列后仅使用电位计自动更换泵。我需要做的更多是包括其中一个泵的故障。我正在处理这个问题将近一个星期。

【问题讨论】:

  • 我不太明白。有两个泵的目的是什么?是否只有备份以防万一失败?操作员是选择泵,还是希望每次运行交替运行,或者除非出现故障,否则您是否希望始终运行同一个泵?
  • 另外,你提到的“电位器”是液位传感器吗?
  • 我想我是用其他编程语言独自想出来的。这是一个练习,你是对的,它是一个备份。两个电位器模拟每个水箱中的水位。不知何故,我不知道如何为此使用梯形图。泵一直运行,直到第二个水箱中的水 i 高于 Hmax。在第一个水箱被补充然后填充到 hmax 以上之后,之前顺序中没有工作的泵现在可以工作,第一个泵在这个步骤中不工作。对不起我的英语。
  • 1 Step 水在第一个水箱中上升 泵1(或2)在第二个水箱中的水上升到Hmax以上并且水箱1中的水是空的后,泵停止运行。 2 Step 1号水箱加水后,之前未参与的泵现在工作,其他的不工作。

标签: controls plc industrial


【解决方案1】:

希望这就是你的意思。我把它写成一个“工作”的伪代码。 在现实生活中,这个代码并不是最好的,因为从你有超过 2 个泵的那一刻起,它应该很复杂,但是这个非常详细。 还缺少一个紧急开关(因此,如果必须手动停止泵,则可以按下按钮)。 最好使用一些function_blocks和方法......

声明:

VAR
//INPUT
levelTank1          AT %I*  : INT;  //potentiometer 1
levelTank2          AT %I*  : INT;  //potentiometer 2

pump1Malfunction    AT %I*  : BOOL; //TRUE=pump has no malfunction || FALSE=malfunction
pump2Malfunction    AT %I*  : BOOL;

//OUTPUT
pump1Operation      AT %Q*  : BOOL; //TRUE=pump should run
pump2Operation      AT %Q*  : BOOL;

lastPumpInOperation : BYTE := 1;

nState  : UINT  := 0;
END_VAR

您应该在某个地方定义最小和最大级别,我将其作为常量值:

VAR CONSTANT
tank1Hmax   : INT   := 32000;
tank1Hmin   : INT   := 5000;
tank2Hmax   : INT   := 25000;
tank2Hmin   : INT   := 2000;
END_VAR

备注:模拟输入通常是 INT 值,因此最大。等级等于 32767

现在是程序:

CASE nState OF
0:  //wait till tank 1 is filled and make sure tank2 is not overcharged
    IF (levelTank1 >= tank1Hmax) AND NOT (levelTank2 >= tank2Hmax) THEN
        nState := 1;
    END_IF

1: //start one pump
    //first check worst case - both pumps are broken
    IF NOT pump1Malfunction AND NOT pump2Malfunction THEN
        nState := 100;  //emergency 
    //last time pump1 was used, and now pump 2 should start when it has no malfunction
    ELSIF lastPumpInOperation = 1 AND pump2Malfunction THEN 
        pump2Operation := TRUE;
        lastPumpInOperation := 2;
        nState := 2;
    //last time pump2 was used, and now pump 1 should start when it has no malfunction
    ELSIF lastPumpInOperation = 2 AND pump1Malfunction THEN
        pump1Operation := TRUE;
        pump2Operation := FALSE;
        lastPumpInOperation := 1;
        nState := 2;
    //now we have to define what happens when one pump is in malfunction
    ELSIF NOT pump1Malfunction THEN
        pump2Operation := TRUE;
        pump1Operation := FALSE;
        lastPumpInOperation := 2;
        nState := 2;
    ELSIF NOT pump2Malfunction THEN
        pump1Operation := TRUE;
        lastPumpInOperation := 1;
        nState := 2;
    END_IF

2: //pump operation till tank1 is "empty", tank2 is "full" or pump failure occurs
    IF (levelTank1 <= tank1Hmin) OR (levelTank2 >= tank2Hmax) THEN
        nState := 3; //stop pumps
    ELSIF (pump1Operation AND NOT pump1Malfunction) THEN //pump has gone in malfunction during operation
        nState := 1;    //go back to step2 to start another pump
    ELSIF (pump2Operation AND NOT pump2Malfunction) THEN
        nState := 1;
    END_IF

3:  //stop pumps
    pump1Operation := FALSE;
    pump2Operation := FALSE;
    nState := 0;

100:    //emergency
        //do what you can do - close the valve to tank1 or run as fast as you can
        pump1Operation := FALSE;
        pump2Operation := FALSE;

        IF (pump1Malfunction OR pump2Malfunction) THEN
            nState := 0;
        END_IF 
END_CASE

【讨论】:

  • 非常感谢!这是不同的观点。我欣赏它!
猜你喜欢
  • 2014-10-08
  • 2010-12-16
  • 2010-12-21
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多