# Behälter befüllen



## Bender25 (4 April 2007)

Hallo zusammen...

Brauch wie so oft mal wieder die Hilfe von euch.

Kleine Programm beschreibung...

Über eine Pumpe muß ich 4 Behälter füllen, die in einer bestimmten Reihenfolge über ein TP (TP=Touchpanel) festgelegt werden. Im TP selber wird eine INT zu jeden Behälter (1-4) eingetragen. Wenn der 1. Behälter voll ist erfolgt eine freigabe zum befüllen des nächsten Behälters.

Jetzt habe ich mir überlegt, das ich einfach einen vergleich zwischen Priorität des  Behälters und "aktueller Priorität" mache und so jeweils die Freigabe setzte... 

Aber jetzt steck ich darin fest, wie "zähle" ich die akt.Priorität hoch (wenn z.b. der erste Behälter voll ist, das der nächste füllen kann)da die Behälter selber ja Variabel sind in der Priorität..

Wäre super wenn ihr Tips hättet... Bin auch für andere Lösungsvorschläge offen... (Nur Kunde wünscht das er Zahlen eintragen kann zu den Behältern)
Vielen dank mal


----------



## Antonio (4 April 2007)

Also ich würde eine Variable anlagen, die mir sagt wieviele behälter ich überhaupt füllen muss.(vielleicht mit bit Zählen). Ergebniss=4 Behälter mit prio 1 füllen, Ergebniss=3 Behälter mit prio 2 füllen.


----------



## Bender25 (5 April 2007)

Antonio schrieb:


> Also ich würde eine Variable anlagen, die mir sagt wieviele behälter ich überhaupt füllen muss.(vielleicht mit bit Zählen). Ergebniss=4 Behälter mit prio 1 füllen, Ergebniss=3 Behälter mit prio 2 füllen.


 
Hallo Antonio.. Das ganze läuft so ab, wenn der Niedertarif kommt, sollen alle Behälter (1-4) den Prioritäten nach gefüllt werden, egal wie "leer" sie sind.Natürlich nur bis zu einem Oberen Grenzwert.


----------



## kpeter (5 April 2007)

Hallöchen

du hast ja für jeden silo einen merker wo die nr drinnen steht

jetzt zählst du einen zähler hoch und vergleichst die merker mit denn zähler wert wenn er gleich ist dann wird dieser silobefüllung freigegeben

l mw 0  // silo 1
l mw 10 // zähler wert   
==I
= m20.0 //Silo 1 befüllen

l mw 2 // silo 2
l mw 10
== I
= m20.1 // Silo 2 befüllen

wenn der Silo voll ist Zähler hochzählen

wenn du verhindern willst das zwei gleichzeitig befüllen dann noch die verriegelungen von denn anderen silos


l mw 2 // silo 2
l mw 10
== I
un m20.0
un m20.2
un m20.3
= m20.1 // Silo 2 befüllen


ich hoffe das ist dein Problem und nicht das ich es zu einfach sehen


----------



## Bender25 (5 April 2007)

kpeter schrieb:


> Hallöchen
> 
> du hast ja für jeden silo einen merker wo die nr drinnen steht
> 
> ...


 

Hallo Kpeter

Vielen Dank für deine Antwort...
Dein Lösungsvorschlag hab ich eigentlich auch so umgesetzt.

Nur hänge ich am Hochzählen. Problem ist noch, das hinter jedem Behälter eine andere Schrittkette hängt, mit bestimmten Zuständen die erreicht werden müssen, bevor der nächste füllen darf.

Und da ich jetzt noch mit dem Kunden geredet hab :twisted: will er jetzt noch zusätzlich, das die Prio-Kette unterbrochen wird, wenn ein Behälter einen Grenzwert Min Meldet und diesen dann füllt....... Arrrrggghhh


----------



## zotos (5 April 2007)

Bender25 schrieb:


> ...
> Und da ich jetzt noch mit dem Kunden geredet hab :twisted: will er jetzt noch zusätzlich, das die Prio-Kette unterbrochen wird, wenn ein Behälter einen Grenzwert Min Meldet und diesen dann füllt....... Arrrrggghhh



Die Prio-Kette zu unterbrechen hilft ja nun auch nicht. Wenn Zweibehälter auf min stehen will er ja sicher das der mit der höchsten Prio (von den Beiden) zu erst befüllt wird.

Ich würde das so machen:
Die Behälter haben eine Manuell vergebene Prio von 1..4 (4 höchste Prio) Variablen OpPrio1..4.
Nun würde ich noch eine interne Prio 1..4 erstellen und dieser in einem resten Schritt die Werte von den OpPrio zuweisen, in einem zweiten Schritt würde ich die Min Zustände so verarbeiten das ich bei den Behältern die auf Min stehen die interne Prio + 10 verpasse. Die Max Zustände würde ich in einem dritten Schritt so verarbeiten das alle Behälter die auf Max stehen würde ich mit der Prio := 0 übershreiben.
Dann kann man den behälter mit der höchsten Prio ermitteln und diesen befüllen.
In ST könnte ich das auch recht schnell programmieren aber in AWL tu ich mir da gerade etwas schwer ;o(


----------



## zotos (5 April 2007)

Hier mal der Quik and Dirty Ansatz in ST/SCL (vielleicht hilft das ja auch). 

Ich habe bewust auf Arrays verzichtet (obwohl es angebracht wäre).
Min und Max beschreiben den Zustand (habe mir keine Gedanken über NC/NO gemacht).

Als Ergebnis kommt die Nr. des zu befüllenden Behälters raus.


```
VAR
    OpPrio1 : INT;
    OpPrio2 : INT;
    OpPrio3 : INT;
    OpPrio4 : INT;

    Prio1 : INT;
    Prio2 : INT;
    Prio3 : INT;
    Prio4 : INT;


    Min1 :BOOL;
    Min2 :BOOL;
    Min3 :BOOL;
    Min4 :BOOL;

    Max1 :BOOL;
    Max2 :BOOL;
    Max3 :BOOL;
    Max4 :BOOL;

    BehaelterNr:INT;
END_VAR
```


```
Prio1 := OpPrio1;
Prio2 := OpPrio2;
Prio3 := OpPrio3;
Prio4 := OpPrio4;

IF (Min1) THEN
    Prio1 := Prio1 + 10;
END_IF;

IF (Min2) THEN
    Prio2 := Prio2 + 10;
END_IF;

IF (Min3) THEN
    Prio3 := Prio3 + 10;
END_IF;

IF (Min4) THEN
    Prio4 := Prio4 + 10;
END_IF;

IF (Max1) THEN
    Prio1 := 0;
END_IF;

IF (Max2) THEN
    Prio2 := 0;
END_IF;

IF (Max3) THEN
    Prio3 := 0;
END_IF;

IF (Max4) THEN
    Prio4 := 0;
END_IF;


IF ((Prio1 > Prio2) AND (Prio1 > Prio3) AND (Prio1 > Prio4)) THEN
    BehaelterNr := 1;
ELSE
    IF ((Prio2 > Prio3) AND (Prio2 > Prio4)) THEN
        BehaelterNr := 2;
    ELSE
        IF (Prio3 > Prio4) THEN
            BehaelterNr := 3;
        ELSE
            BehaelterNr := 4;
        END_IF;
    END_IF;
END_IF;
```


----------



## Bender25 (5 April 2007)

zotos schrieb:


> Hier mal der Quik and Dirty Ansatz in ST/SCL (vielleicht hilft das ja auch).
> 
> Ich habe bewust auf Arrays verzichtet (obwohl es angebracht wäre).
> Min und Max beschreiben den Zustand (habe mir keine Gedanken über NC/NO gemacht).
> ...


 

Hey vielen Dank... Hört sich schon mal sehr sehr gut an.. Werd ich gleich mal umsetzten... hab aber bestimmt noch fragen an dich wenns Ok ist


----------



## zotos (5 April 2007)

Bender25 schrieb:


> Hey vielen Dank... Hört sich schon mal sehr sehr gut an.. Werd ich gleich mal umsetzten... hab aber bestimmt noch fragen an dich wenns Ok ist



Klar kannste fragen mir ist auch noch aufgefallen das man die BehaelterNr besser erst mal auf "0" setzen sollte das wenn Alle Behälter voll sind nicht doch der Behälter Nr. 4 dran kommt.


```
BehaelterNr := 0;
```

Einfach vor de Auswertung setzen ;o)


----------



## Bender25 (5 April 2007)

zotos schrieb:


> Klar kannste fragen mir ist auch noch aufgefallen das man die BehaelterNr besser erst mal auf "0" setzen sollte das wenn Alle Behälter voll sind nicht doch der Behälter Nr. 4 dran kommt.
> 
> 
> ```
> ...


 
Super. Vielen Dank. Genial

Bender << Sagt Danke


----------



## Kai (5 April 2007)

Wie wird der Befüllvorgang eigentlich gestartet? Drückt man auf einen Schalter/Taster und startet die Befüllung, und die Befüllung läuft dann so lange, bis alle Behälter voll sind? Oder startet die Befüllung automatisch, wenn z. B. ein Min-Sensor meldet, dass mindestens ein Behälter leer ist?  

Gruß Kai


----------



## Bender25 (5 April 2007)

Also das ganze sollte so laufen das die Behälter mit dem Niedertarif gefüllt werden, egal wie leer sie sind (halt nach Prioriät).

Wie gesagt sollte... Jetzt kam schon wieder eine Änderung :twisted: 
Jetzt soll die Behälterfüllung bei Niedertarif doch erst dann starten, wenn ein NT-Grenzwert erreicht ist.. Den versuch ich jetzt in den SCL Code von Zotos rein zu pfriemeln.  

Bei Hochtarif, werden die Behälter nach Wasserstand bzw Grenzwerte gefüllt..


----------



## Kai (5 April 2007)

Was ist denn jetzt Hochtarif und Niedertarif? Bezieht sich das auf den Strompreis?

Und noch mal zurück zu meiner Frage: Startet die Befüllung (je nach Tarif, Grenzwerten, Priorität) automatisch oder muss ein Bediener einen Schalter oder Taster drücken und damit den Befüllvorgang (je nach Tarif, Grenzwerten, Priorität) der Behälter starten?

Gruß Kai


----------



## Bender25 (5 April 2007)

Kai schrieb:


> Was ist denn jetzt Hochtarif und Niedertarif? Bezieht sich das auf den Strompreis?
> 
> Und noch mal zurück zu meiner Frage: Startet die Befüllung (je nach Tarif, Grenzwerten, Priorität) automatisch oder muss ein Bediener einen Schalter oder Taster drücken und damit den Befüllvorgang (je nach Tarif, Grenzwerten, Priorität) der Behälter starten?
> 
> Gruß Kai


 

Sorry... Ja HT und NT beziehen sich auf die Strompreise.... Und bei NT soll alles von alleine Starten (natürlich vorausgesetzt der Schalter am Schrank steht auf Automatik)


----------



## Kai (5 April 2007)

Bender25 schrieb:


> Und bei NT soll alles von alleine Starten (natürlich vorausgesetzt der Schalter am Schrank steht auf Automatik)


 
Und bei HT startet auch alles von alleine (wenn der Schalter am Schrank auf Automatik steht)?

Gruß Kai


----------



## Bender25 (5 April 2007)

Kai schrieb:


> Und bei HT startet auch alles von alleine (wenn der Schalter am Schrank auf Automatik steht)?
> 
> Gruß Kai


 
Bei HT werden die Behälter in Abhängigkeit der Eingestellten Grenzwerte des Wasserstands befüllt.


----------



## Kai (5 April 2007)

Irgendwie verliere ich langsam den Überblick.  

Könntest Du noch einmal in ein paar Sätzen oder in Tabellenform beschreiben, wann welcher Behälter wie befüllt werden soll (mit HT, NT, Priorität, Max, Min, Automatik, Wasserstand usw.)?

Gruß Kai


----------



## Bender25 (5 April 2007)

Kai schrieb:


> Irgendwie verliere ich langsam den Überblick.
> 
> Könntest Du noch einmal in ein paar Sätzen oder in Tabellenform beschreiben, wann welcher Behälter wie befüllt werden soll (mit HT, NT, Priorität, Max, Min, Automatik, Wasserstand usw.)?
> 
> Gruß Kai


 
Dann gehts dir wir mir  Vor allem wenn alle halbe Stunde den Leuten was anderes einfällt. Oder ich es falsch verstanden hab 

Aber mit dem SCL Code von Zotos bekomme ich das ganze hin  


Aber nochmal

Hochtarif - Automatik:

Alle 4 Behälter werden über Grenzwerte vom Wasserstand gesteuert.
Für jeden Behälter sind gewisse Grenzen in der SPS hinterlegt, über die dann die Befüllung gesteuert wird.


Niedertarif-Automatik:

Im Touch-Panel werden alle 4 Behälter mit einer Priorität vorgewählt (Prio 1-4). Diese Behälter sollen dann in abhängigkeit dieser zugeordneten Priorität gefüllt werden, wenn diese jeweiligen Behälter eine gewisse Grenze davor unterschritten haben (Ist vorher neu dazu gekommen).
Dieser Grenzwert wird aus dem Analogwert gebildet.

Ist z.B. dem 3. Behälter die Priorität 4 (höchste Priorität) zugeteilt und er hat bereits eine gewisse Grenze unterschritten, dann füllt dieser zuerst bis zu einem Grenzwert Max. Anschließen kommt der nächste Behälter zur befüllung. Ist es so das diese Grenze noch nicht erreicht wurde soll sofort der nächste Behälter (sprich der mit der Priorität 3) befüllt werden.

Kommt es jetzt aber wärend der Befüllung z.b. des 3. Behälters zu einer Warnung (In diesem Fall eine Elektrode die Wasser Min Meldet) von Behälter 1 der die niedrigste Priorität hat, soll diese obere Kette unterbrochen werden und sofort diese Behälter 1 befüllt werden, bis dieser dann voll ist... Danach gehts wieder mit dem Behälter 3 weiter...

Hab jetzt noch , wegen der letzten änderung, an dem Code von Zotos ein wenig rum gewurstelt und es sollte jetzt gehen...  

Wenn ich mir das jetzt so anschaue hab ich mich und dich jetzt völlig verrückt gemacht....>> Feierabend...

Wünsch euch mal allen frohe Ostern


----------



## zotos (5 April 2007)

Bender25 schrieb:


> Super. Vielen Dank. Genial
> 
> Bender << Sagt Danke



Ich freue mich wenns Dir geholfen hat.

Auch Dir schöne Ostern und dicke Eier ;o)


----------



## Kai (5 April 2007)

Auch von mir frohe Ostern.  

Gruß Kai


----------

