TIA SCL Nummern-Buffer

Florian0511

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
habe aktuell ein Problem mit meiner Programmierung.
Zum Fall:
Habe 4 Datensätze (String) am Eingang
Wenn alle 4 Datensätze vorhanden sind, kein Problem. Alles läuft wunderbar.
Wenn jetzt aber kein Datensatz da ist und am ersten Datensatz kommen wieder Daten, dann wird mir dies am Ausgang "nächste" nicht raus gegeben. Erst wenn die vierte Stelle wieder belegt ist.
Vielleicht kann mir ja ein SCL Profi oder Laie :-D hier weiter helfen.
Hier mal der Code:
PIN 1-4 sind die Eingänge
Nächste Pin ist der Ausgang

#PIN_an_Band[0] := #PIN_1;
#PIN_an_Band[1] := #PIN_2;
#PIN_an_Band[2] := #PIN_3;
#PIN_an_Band[3] := #PIN_4;






REGION Circular_buffer
(******* Flankenbildung ******************************************************)
#R_TRIG_Ink_Puffer(CLK := #Benutzt_Naechste_PIN);
IF #R_TRIG_Ink_Puffer.Q THEN
FOR #i := 1 TO 3 BY 1 DO
#PIN_FM[4 - #i] := #PIN_FM[3 - #i];
END_FOR;

#PIN_FM[0] := #Naechste_PIN;

END_IF;


END_REGION






REGION Nechste_PIN


// PIN
IF #Naechste_PIN = '' THEN

FOR #j := 1 TO 4 BY 1 DO
#Kein_Arbeit := FALSE;
#Tmp_String := '';

FOR #i := 1 TO 4 BY 1 DO
#Tmp_String := LEFT(IN:=#PIN_an_Band[4 - #j],L:=1);
IF #PIN_an_Band[4 - #j] = #PIN_FM[#i - 1] AND #Kein_Arbeit = FALSE AND #Naechste_PIN = ''
AND #PIN_an_Band[4 - #j] <> '' AND #Tmp_String <>' ' THEN
#Kein_Arbeit := true;
END_IF;
END_FOR;
IF #Kein_Arbeit = FALSE AND #Naechste_PIN = '' THEN
#Naechste_PIN := #PIN_an_Band[4 - #j];
END_IF;
END_FOR;

END_IF;

// Reset PIN van gehet raus von arbeit platz
IF #Naechste_PIN <> '' THEN

#Reset_N_PIN := false;
FOR #i := 1 TO 4 BY 1 DO
IF #PIN_an_Band[4 - #i] = #Naechste_PIN THEN
#Reset_N_PIN := true;
END_IF;
END_FOR;

IF #Reset_N_PIN = false OR #Benutzt_Naechste_PIN THEN
#Naechste_PIN := '';
END_IF;
END_IF;

END_REGION


#Naechste_PIN_Num := #Naechste_PIN;
 
Hallo Florian,

ich gehe davon aus das Du das TIA-Portal benutzt. Würdest Du dafür bitte einen Rechtsklick auf Deinen Baustein ausführen, dann Quelle aus Bausteinen generieren - nur selektierte Bausteine und den Inhalt der Datei dann anschließend innerhalb von code-Tags preisgeben? Das ist sehr viel übersichtlicher.

Evtl. ein bisschen mehr Kommentar was Du an welcher Stelle versuchen willst wäre hilfreich. Glaub nicht das heute noch so viele Lust haben das gerade auseinanderzunehmen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal der Code:
PIN 1-4 sind die Eingänge
Nächste Pin ist der Ausgang
Du meinst #Naechste_PIN_Num ist ein OUTPUT? #Naechste_PIN wird mehrmals etwas zugewiesen und auch gelesen - das wäre sehr schlechter Programmierstil, wenn das ein OUTPUT ist.

Service: der Programmcode in [CODE]-Tags und ein bisschen farbig:
Code:
#PIN_an_Band[0] := #PIN_1;
#PIN_an_Band[1] := #PIN_2;
#PIN_an_Band[2] := #PIN_3;
#PIN_an_Band[3] := #PIN_4;


[COLOR="#008000"]REGION Circular_buffer
    (******* Flankenbildung ******************************************************)[/COLOR]
    #R_TRIG_Ink_Puffer(CLK := #Benutzt_Naechste_PIN);
    IF #R_TRIG_Ink_Puffer.Q THEN
        FOR #i := 1 TO 3 BY 1 DO
            #PIN_FM[4 - #i] := #PIN_FM[3 - #i];
        END_FOR;
        
        #PIN_FM[0] := #Naechste_PIN;
        
    END_IF;

[COLOR="#008000"]END_REGION

REGION Nechste_PIN

    // PIN[/COLOR]
    IF #Naechste_PIN = '' THEN
        
        FOR #j := 1 TO 4 BY 1 DO
            #Kein_Arbeit := FALSE;
            #Tmp_String := '';
            
            FOR #i := 1 TO 4 BY 1 DO
                #Tmp_String := LEFT(IN:=#PIN_an_Band[4 - #j],L:=1);
                IF #PIN_an_Band[4 - #j] = #PIN_FM[#i - 1] AND #Kein_Arbeit = FALSE AND #Naechste_PIN = ''
                    AND #PIN_an_Band[4 - #j] <> '' AND #Tmp_String <>' ' THEN
                    #Kein_Arbeit := true;
                END_IF;
            END_FOR;
            IF #Kein_Arbeit = FALSE AND #Naechste_PIN = '' THEN
                #Naechste_PIN := #PIN_an_Band[4 - #j];
            END_IF;
        END_FOR;
        
    END_IF;
    
[COLOR="#008000"]    // Reset PIN van gehet raus von arbeit platz[/COLOR]
    IF #Naechste_PIN <> '' THEN
        
        #Reset_N_PIN := false;
        FOR #i := 1 TO 4 BY 1 DO
            IF #PIN_an_Band[4 - #i] = #Naechste_PIN THEN
                #Reset_N_PIN := true;
            END_IF;
        END_FOR;
        
        IF #Reset_N_PIN = false  OR #Benutzt_Naechste_PIN THEN
            #Naechste_PIN := '';
        END_IF;
    END_IF;
    
[COLOR="#008000"]END_REGION[/COLOR]

#Naechste_PIN_Num := #Naechste_PIN;

Harald
 
In Deinem Programmstück spielen so viele unbekannte Variablen mit und er ist relativ umständlich formuliert, da ist es ziemlich schwer, denn Sinn zu erfassen (was der Code tun soll) und zu sehen, wo der Fehler ist.

Übrigens: FOR-Schleifen kann man auch "rückwärts" laufen lassen und muß dann in der Schleife nicht so verwirrend rechnen, z.B. anstatt
Code:
FOR #i := 1 TO 3 BY 1 DO
    #PIN_FM[4 - #i] := #PIN_FM[3 - #i];
END_FOR;
kann man verständlicher und effizienter programmieren:
Code:
FOR #i := [COLOR="#0000FF"]3 TO 1 BY -1[/COLOR] DO
    #PIN_FM[#i] := #PIN_FM[#i - 1];
END_FOR;

Harald
 
Alles läuft wunderbar. ... aber ...
... selbst nach Haralds Mühen, das Programm augenfreundlicher zu gestalten, ... bleibt es schwer, zu ergründen, was es tut ... und noch viel schwerer, zu erahnen, was es tun soll.
Vielleicht meinst Du mit "circular buffer" tatsächlich RingPuffer, aber den finde ich im Code nirgends.
Die 4 ArrayElemente werden in jedem Zyklus aus denselben 4 Variablen vorbesetzt. Ist das Absicht oder Versehen?
Der Abschnitt "FlankenBildung" schiebt 3 der 4 ArrayElemente in das jeweils vorhergehende Element. Das Element 3 bleibt dabei unverändert, aber das Element 0 wird sofort wieder zunichte gemacht und mit dem Inhalt von "#Naechste_PIN" überschrieben. Ist das Absicht oder Versehen?
U.s.w., ein Rätsel jagt das nächste.
Bitte erklär uns, was das Programm tun soll!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,
sorry für die recht umständliche oder wenige Beschreibung.
Also folgender Zustand.

Vorne kommen immer von einer Station am laufenden Band immer neue PIN Nummern rein. Jeder Eingang ist für eine Station.
Hinten soll immer die nächste raus kommen. Zu meinem Problem: Wenn alle 4 Stationen Belegt sind kommt auch hinten immer die nächste raus. Habe ich aber eine Lücke oder das Band ist Leer, dann soll, sobald an Station 1 wieder eine PIN ankommt, die auch direkt wieder hinten raus kommen. In PIN FM speicher ich mir immer die letzten, die schon abgearbeitet wurden.
Ist immer schwierig so etwas auf zu schreiben :D
Code:
FUNCTION_BLOCK "FB_naechste_Wagen"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      PIN_1 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : String;
      PIN_2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : String;
      PIN_3 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : String;
      PIN_4 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : String;
      Benutzt_Naechste_PIN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
   END_VAR

   VAR_OUTPUT 
      Naechste_PIN_Num : String;
   END_VAR

   VAR_IN_OUT 
      PIN_FM : Array[0..3] of String;
   END_VAR

   VAR 
      Kein_Arbeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;   //  Wagen nicht fuer Arbeit
      Reset_N_PIN : Bool;
      i { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
      j { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
      PIN_an_Band { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[0..3] of String;
      R_TRIG_Ink_Puffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "R_Trig";   //  Positive Flanke fuer inkrementirungspuffer
      Naechste_PIN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : String;
      Tmp_String { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : String;
   END_VAR


BEGIN
    
    #PIN_an_Band[0] := #PIN_1;
    #PIN_an_Band[1] := #PIN_2;
    #PIN_an_Band[2] := #PIN_3;
    #PIN_an_Band[3] := #PIN_4;
    
    
    
    REGION Circular_buffer
        (******* Flankenbildung ******************************************************)
        #R_TRIG_Ink_Puffer(CLK := #Benutzt_Naechste_PIN);
        IF #R_TRIG_Ink_Puffer.Q THEN
            FOR #i := 1 TO 3 BY 1 DO
                #PIN_FM[4 - #i] := #PIN_FM[3 - #i];
            END_FOR;
            
            #PIN_FM[0] := #Naechste_PIN;
            
        END_IF;
    
    END_REGION
    
    
    
    REGION Nechste_PIN
    
        // PIN
        IF #Naechste_PIN = '' THEN
            
            FOR #j := 1 TO 4 BY 1 DO
                #Kein_Arbeit := FALSE;
                #Tmp_String := '';
                
                FOR #i := 1 TO 4 BY 1 DO
                    #Tmp_String := LEFT(IN:=#PIN_an_Band[4 - #j],L:=1);
                    IF #PIN_an_Band[4 - #j] = #PIN_FM[#i - 1] AND #Kein_Arbeit = FALSE AND #Naechste_PIN = ''
                        AND #PIN_an_Band[4 - #j] <> '' AND #Tmp_String <>' ' THEN
                        #Kein_Arbeit := true;
                    END_IF;
                END_FOR;
                IF #Kein_Arbeit = FALSE AND #Naechste_PIN = '' THEN
                    #Naechste_PIN := #PIN_an_Band[4 - #j];
                END_IF;
            END_FOR;
            
        END_IF;
        
        // Reset PIN van gehet raus von arbeit platz
        IF #Naechste_PIN <> '' THEN
            
            #Reset_N_PIN := false;
            FOR #i := 1 TO 4 BY 1 DO
                IF #PIN_an_Band[4 - #i] = #Naechste_PIN THEN
                    #Reset_N_PIN := true;
                END_IF;
            END_FOR;
            
            IF #Reset_N_PIN = false  OR #Benutzt_Naechste_PIN THEN
                #Naechste_PIN := '';
            END_IF;
        END_IF;
        
    END_REGION
    
    #Naechste_PIN_Num := #Naechste_PIN;
END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
Hi,

Deine Beschreibung kommt mir bekannt vor ^^, habe daher mal etwas rausgesucht. Du meinst nicht zufällig sowas oder?

Code:
FUNCTION_BLOCK "Arbeitsplatzüberwachung"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      EAN_IN : Array[1..8] of String[13];
      Max_Places : Int;
      used : Bool;
   END_VAR


   VAR_OUTPUT 
      EAN_OUT_Go : String[13];
      Station_to_delete : Int;
   END_VAR


   VAR 
      Index : Int;
      Trig_P : Bool;
      done : Bool;
   END_VAR




BEGIN
	// Abfrage der EAN, Ausgabe des Bearbeitungsp0latzes, von vorne neu aufrollbar, Übersprung bei leerer EAN, 
	// Eingangs-EAN sind selbstständig zu löschenwenn Station_to_delete angelegt wird.
	
	IF NOT #done THEN
	    #Index := #Index + 1;
	    IF #Index > #Max_Places THEN
	        #Index := 1;
	    END_IF;
	        IF #EAN_IN[#Index] <> '' THEN
	            #EAN_OUT_Go := #EAN_IN[#Index];
	            #done := true;
	            #Station_to_delete := #Index;
	        END_IF;
	    END_IF;
	IF #used AND NOT #Trig_P THEN
	    #done := false;
	END_IF;
	#Trig_P := #used;
	        
	
END_FUNCTION_BLOCK

Funktion: Wenn aktiv werden bis zu Anzalh Maxstations=8 Stationen abgefragt und der Zähler bleibt dann bei dem ersten gefundenen EAN in diesem Fall stehen. Es erfolgt eine Ausgabe welcher EAN nun zu nutzen ist und welche Stationsnummer nun zu löschen ist. Dann sollte used triggern und die nächste wird genommen.

Ist ein Konzept bei der mehrere Arbeitsplätze, belegt oder nicht, bei Ausgabe dann an einen anderen Arbeitsplatz mitteilen von wo das nächste Teil kommen soll um immer reihum zu arbeiten. Bei nicht vorhandenen Stationen (EAN='') würde diese nicht ausgewertet.

Irgendwie verstehe ich sonst Deinen Code nicht so ganz.
 
Folgendes:
Ich habe ein Band, aufgeteilt in 4 Stationen.
Vorne kommt immer ein Neuer Datensatz rein, und hinten geht ein alter weg.
Ich habe 2 Schrauber. Schrauber 1 soll Pin 1 bekommen, Schrauber 2 soll Pin 2 bekommen. Wenn Schrauber 1 fertig, dann soll Schrauber 1 Pin 3 bekommen und Schrauber 2 PIN4
Und so soll es immer weiter laufen, dieses funktioniert auch soweit, wenn das Band voll ist. Habe ich aber eine Lücke oder das Band ist Leer, dann kommt vorne an Pin 1 eine Pin an, wird dann weiter geschoben (durch das Band) an Pin 2 usw... und in meinem Baustein bekomme ich dann hinten immer erst einen Ausgang wenn die PIN an Platz 4 angekommen ist
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
je mehr hier erklärt wird , je schlimmer wird es
Band mit 4 Stationen , es werden 4 PINs an die 4 Stationen verteilt , dann tauchen auch noch 2 Schrauber auf , die mit den PINs irgendwas machen, wenn der Schrauber1 fertig ist werden neue PINs verteilt (ob Schrauber 2 fertig ist spielt scheinbar keine Rolle ) .

ich verstehe das nicht

eins der größten Probleme ist , wenn man nicht beschreiben kann was man will
 
Also vorne am Baustein kann man sich ein Band vorstellen, an dem von oben nach unten die PINs fortlaufend durchlaufen. Eingang 1- Station 1; Eingang 2- Station 2; Eingang 3- Station 3 usw
Das heißt die Pin wandert immer von Station eins nach Station 4 und fährt raus.
Schrauber 1 bekommt PIN (wenn Band voll dann von Station 4) (wenn Band Leer und vorne kommt eine neue rein dann von Station 1)
Ich brauche also am Ausgang immer die "nächste" PIN aus 4 Plätzen.
Vorne am Eingang sind leer strings wenn keine Daten vorhanden sind. Sobald aber eine Pin nach kommt weil das Band sich wieder füllt, will ich diese auch am Ausgang haben
 
Ist immer schwierig so etwas auf zu schreiben :D
Ist nicht immer einfach, so etwas aufzuschreiben. Schliesslich hängt das von der Komplexität der Aufgabe ab.
Vielleicht ist genau das Dein KernProblem, dass Du gedanklich die TeilAufgaben und die Zusammenhänge noch nicht so recht "sortiert" und durchdacht hast. Deine Vorstellung, was werden soll, scheint evtl. noch zu vage zu sein, um die Aufgabe formulieren zu können?
Du schreibst z.B. "Vorne kommen immer von einer Station am laufenden Band immer neue PIN Nummern rein."
Woher weisst Du, ob die Nummer tatsächlich neu ist oder ob immer noch die vorherige Nummer angeliefert wird?
Meldet Dir die Station "Achtung, hier kommt die neue Nummer" oder musst Du selbst nachforschen und feststellen, ob sich die Nummer gegenüber vorher geändert hat?
Wenn letzteres, dann nützt Dir eine gemeinsame FlankenErkennung für die 4 Stationen nichts. Du brauchst je Station eine FlankenErkennung.
Ich weiss nicht, wie ich Dir helfen soll. Leg Dein Programm an die Seite, mal Dir ein paar Kästchen für die Stationen und Deine Arrays auf ein Blatt Papier, nimm Dir einige Klötzchen oder Zettelchen als PIN-Nummern und dann versuch mal auszutüfteln, wann Du nach welchen Kriterien welche Information von wo nach wo verschieben musst, um die Aufgabe zu erfüllen.
Das klingt wahrscheinlich ziemlich blöd, hilft aber (hoffentlich) die Gedanken zu konkretisieren, zu "sortieren" und - ganz wichtig - die kleinen Details und erforderlichen ZwischenSchritte nicht zu vergessen/übersehen.
Wir Menschen denken i.A. in viel zu groben Schritten, alles "selbstverständliche" übergehen wir dabei ganz schnell. Das Programm ist aber darauf angewiesen, dass es keine GedankenSprünge enthält.
Wenn Du beim Formulieren der Aufgabe auf Probleme stösst, ist das höchst wahrscheinlich ein Zeichen dafür, dass noch irgendwelche Unklarheiten bestehen, die es auszuräumen gilt.

Edit:
Also vorne am Baustein kann man sich ein Band vorstellen, an dem von oben nach unten die PINs fortlaufend durchlaufen. Eingang 1- Station 1; Eingang 2- Station 2; Eingang 3- Station 3 usw
Das heißt die Pin wandert immer von Station eins nach Station 4 und fährt raus.
Schrauber 1 bekommt PIN (wenn Band voll dann von Station 4) (wenn Band Leer und vorne kommt eine neue rein dann von Station 1)
Ich brauche also am Ausgang immer die "nächste" PIN aus 4 Plätzen.
Vorne am Eingang sind leer strings wenn keine Daten vorhanden sind. Sobald aber eine Pin nach kommt weil das Band sich wieder füllt, will ich diese auch am Ausgang haben
Was Du anscheinend suchst bzw. brauchst, ist ein "FIFO": First in, first out mit einer Kapazität von maximal 4 verschiedenen Informationen.

Hab's mal in Excel VBA angedacht:
Code:
If aFifo$(0) = "" Then ' wenn aFifo$(0) leer, dann Fifo-Inhalt aufrücken
    For ix& = 1 To 3
        aFifo$(ix& - 1) = aFifo$(ix&)
    Next ix&
    aFifo$(3) = ""
End If
If aFifo$(3) = "" Then ' wenn FIFO aufnahmefähig, dann
    xTmp$ = ""
    ix& = 0
    Do While xTmp$ = "" And ix& <= 3 ' erste geänderte Stations-PIN suchen
        select case ix&
        case 0:
            xTmp$ = #PIN_1
        case 1:
            xTmp$ = #PIN_2
        case 2:
            xTmp$ = #PIN_3
        case 3:
            xTmp$ = #PIN_4
        end select
        If aStation$(ix&) <> xTmp$ Then
            aStation$(ix&) = xTmp$
        Else
            xTmp$ = ""
            ix& = ix& + 1
        End If
    Loop
    For ix& = 0 To 3 ' und in ersten freien FIFO-Platz eintragen
        If aFifo$(ix&) = "" Then
            aFifo$(ix&) = xTmp$
            Exit For ' oder xTmp$ = ""
        End If
    Next ix&
End If
' Ergebnis = aFifo$(0)
' aFifo$(0) = "" ' wenn Ergebnis ausgewertet, dann Fifo-Platz 0 freigeben
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hehe, alles ist möglich.
OK, noch ein Baustein - wer weiss ob es hilft. Mal ein einfaches Register, sollte recht übersichtlich sein:

Code:
FUNCTION_BLOCK "Wagenpufferung"{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Eingang : String;   // Einförderungs-ID
      wurde_entnommen : Bool;   // Teil wurde entnommen (z.B. Taster vom Abnehmer)
      Anzahl_Pufferplätze : Int := 4;   // Wieviele Pufferplätze existieren
   END_VAR


   VAR_OUTPUT 
      Ausgang : String;   // Für Abnehmer anzuzeigende ID
      vorhanden : Bool;   // Teil vorhanden (z.B. LED) für Abnehmer
      Pufferueberlauf : Bool;   // Puffer ist voll, Eingabe stoppen (z.B. Einförderung anhalten)
   END_VAR


   VAR RETAIN
      Puffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..10] of String;
   END_VAR
   VAR 
      Loop1 : Int;
   END_VAR
   VAR RETAIN
      TRIG_entn : Bool;
      Merker : String;
   END_VAR




BEGIN
	// Fördertechnik Wagenpufferung - freilaufend
	
	
	// Wenn Puffer voll, dann Ausgabe anhalten
	IF #Puffer[1] <> '' THEN
	    #Pufferueberlauf := TRUE;
	ELSE
	    #Pufferueberlauf := FALSE;
	END_IF;
	// Wenn neues Teil, dann an erste Stelle verschieben
	IF #Eingang <> '' AND #Puffer[1] = '' AND #Merker<>#Eingang THEN
	    #Puffer[1] := #Eingang;
	    #Merker := #Eingang;
	END_IF;
	// Wenn nächster Pufferplatz frei, dann weiterschieben
	FOR #Loop1 := 2 TO #Anzahl_Pufferplätze DO
	    IF #Puffer[#Loop1] = '' THEN
	        #Puffer[#Loop1] := #Puffer[#Loop1 - 1];
	        #Puffer[#Loop1 - 1] := '';
	    END_IF;
	END_FOR;
	// wenn letzter Pufferplatz belegt, dann ausgeben
	IF #Puffer[#Anzahl_Pufferplätze] <> '' THEN
	    #vorhanden := true;
	    #Ausgang := #Puffer[#Anzahl_Pufferplätze];
	ELSE
	    #vorhanden := false;
	    #Ausgang := '';
	END_IF;
	// wenn entnommen wurde, dann letzten Platz löschen, pos. Flanke
	IF #wurde_entnommen AND NOT #TRIG_entn THEN
	    #Puffer[#Anzahl_Pufferplätze] := '';
	END_IF;
	#TRIG_entn := #wurde_entnommen;
END_FUNCTION_BLOCK
 
Zurück
Oben