Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Page 2 of 2 FirstFirst 12
Results 11 to 12 of 12

Thread: SCL Nummern-Buffer

  1. #11
    Join Date
    25.06.2017
    Location
    Oerlinghausen
    Posts
    2,525
    Danke
    262
    Erhielt 477 Danke für 392 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Quote Originally Posted by Florian0511 View Post
    Ist immer schwierig so etwas auf zu schreiben
    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:
    Quote Originally Posted by Florian0511 View Post
    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
    Last edited by Heinileini; 17.11.2019 at 16:58. Reason: case in code eingefügt

  2. #12
    Join Date
    05.06.2018
    Location
    Landkreis Osnabrück
    Posts
    325
    Danke
    30
    Erhielt 57 Danke für 44 Beiträge

    Default


    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

Similar Threads

  1. sysfileread - Daten Zeilenweise in Buffer schreiben
    By SY50 in forum CODESYS und IEC61131
    Replies: 7
    Last Post: 03.10.2015, 11:55
  2. Step 7 OSCAT LIB Buffer to String
    By silverfreaky in forum Simatic
    Replies: 0
    Last Post: 11.09.2015, 19:29
  3. RCV_PTP Buffer Probleme
    By carki in forum Simatic
    Replies: 2
    Last Post: 15.03.2012, 16:10
  4. Replies: 5
    Last Post: 19.01.2011, 15:01
  5. Timer-Nummern
    By charlie in forum Simatic
    Replies: 6
    Last Post: 13.06.2006, 19:53

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •