PLC Ladder logic - проблемная последовательность с использованием двух потенциометров

Я потратил много часов и кучу бумажных зарисовок, и мне не удавалось наткнуться на что-нибудь, чтобы избавить меня от этой проблемы.

У нас есть два бака, наполненные водой, и два насоса между ними. Нам нужно автоматически подать воду во второй бак, используя эти насосы, если h>hmax (бак 1) и H

Я не могу понять одну вещь. Первая последовательность предполагает, что если H>Hmax, насос 1 или 2 будет работать (они не могут работать одновременно). Когда вода перекачивается во второй резервуар и в первом резервуаре упадет, последовательность повторяется после пополнения воды в первом резервуаре. Я не могу понять, как сделать автоматическую замену насосов, используя только потенциометр после каждой последовательности. Что мне нужно сделать больше, так это включить отказ одного из насосов. Я занимаюсь этой проблемой почти неделю.

схема системы

1 ответ

Решение

Надеюсь, это то, что вы имеете в виду. Я написал это как "рабочий" псевдокод. В реальной жизни этот код не самый лучший, потому что с того момента, как у вас есть более двух насосов, он должен быть сложным, но этот очень подробный. Также отсутствует аварийный выключатель (таким образом, кнопку, которую кто-то может нажать, если он должен остановить насосы вручную). Лучше было бы использовать некоторые 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
Другие вопросы по тегам