TIA SCL Schieberegister

Zuviel Werbung?
-> Hier kostenlos registrieren
Genau deshalb war eigentlich meine Variable "start" gedacht aber daran muss noch was geändert werden.
ich muss die Variable "start" speichernd setzen.
z.B so

Code:
If Eingang then start :=true
End_IF 
Else if then start :=false 
End if

das bedeutet dass die Schleife nur ausgeführt wird wenn eingang gesetzt ist .
würde das so gehen??
 
Warum nur False Inhalte ?
Weil Dein Schieberegister noch leer ist (bzw. alle Elemente mit False initialisiert sind) weil Du nie was in das Schieberegister 'reinspeicherst.

Vielleicht weil ich nach jedem Takt die IF Anweisung "takte" und somit die For Schleife abgebrochen wird und wieder gestartet?
Dies klingt schon wieder so, als ob Du überhaupt keine Vorstellung hättest, wie eine SPS das Programm zyklisch abarbeitet. Die Schleife wird nicht abgebrochen, sie wird entweder komplett oder gar nicht abgearbeitet. Wenn start=False ist, dann wird der Code der Schleife nicht ausgeführt. Wenn start=True ist, dann wird die Schleife hintereinander weg 3 mal durchlaufen (index durchläuft die Werte 1 - 2 - 3 ), danach wird der Code für den Ausgang ausgeführt, und wenn start im nächsten Zyklus immer noch True ist, dann wird die Schleife wieder mit 3 Durchläufen abgearbeitet.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja da habe ich mich eventuell einbisschen falsch ausgedruckt. Damit meinte ich eher dass die IF anweisung pulsierend verläuft. Also während des zykluses die IF Anweisung von true dann false wird.

Ich müsste die Variable "start" auf true setzen bis die Zyklus abgearbeitet ist.

und wie bekomme ich es hin, dass die For -Schleife gesetzt wird und diese erst mit einem takt impuls runter bzw hochzählt.
Also so soll es aussehen:

Start := true

1. takt
2. Schiebereg [1]
3. takt
4. Schiebereg [2]
5. takt
6. Schiebereg [3]
7. Ausgang := true
8. Ausgang := false
9. start := false
10. start := true
11. takt
12. Schiebereg [1]
13. takt
14. Schiebereg [2]
15. takt
16.Schiebereg[3]
17. Ausgang := true
18. Ausgang := false
 
Also mal prinzipiell :
Dein Schieberegister ist leer (soll heißen : keines der Bits darin ist gesetzt) - wenn du also nach 3 mal takten den Speicher 3 abfragst dann wird der Inhalt "leer" (also FALSE) an deinen Ausgang ausgegeben.
Vielleicht liest du dir doch noch so 2 bis 20 mal meinen Beitrag mit der Beschreibung, wie es eigentlich sein sollte, durch. Ich stelle fest, dass du sehr beratungsresistent bist.

Darüber hinaus benötigst du für die von dir beschriebene Funktion aber eigentlich auch kein Schieberegister sondern eher einen Zähler.
Nun zum Thema Takt :
Dein SPS-Programm läuft zyklisch ab - also immer von oben nach unten und danach sofort wieder von oben nach unten. Wenn du TAKT also permanent anstehen hast so wird das 3 mal takten nach 3 Programm-Zyklen (also nach ein paar Millisekunden) erfüllt sein - ist es das, was du willst ? Im anderen Fall müßtest du das Ganze so gestalten, dass du, nachdem Takt einmal = TRUE war erstmal wartest bist Tast wieder = FALSE ist bevor du erneut darauf reagierst.
Jeder, der hier im Thema Beteiligten könnte dir in ein paar Minuten (ich will mal nicht sagen "Sekunden") das Gewünschte hinprogrammieren - ich würde das auch tun, wenn ich nicht befürchten würde, dass dir das in keine Weise helfen würde. Deshalb der Weg jedes hier Beteiligten, dich dahin zu bringen, es selber hinzubekommen UND zu verstehen ...

Gruß
Larry
 
Wie wäre es denn wenn du endlich mal beschreibst was du mit dem Schieberegister machen willst?
Wenn du beschreibst was du willst können wir dir sagen ob du auf dem richtigen Weg bist oder einen anderen Ansatz verfolgen solltest.


Gruß

Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ne das habe ich verstanden. Das ich mit meinem Programmcode nur false durchschicke. Da ich nicht weiss wie es zu dem false kommt würde ich wie ich geschrieben habe die if bedienung vor der For schleife speichernd abarbeiten.
Ne ich möchte start permanent anstehen habe und mit takt quasi "zählen"
ich möchte nur dass ich bis drei hochzähle und das hochzählen soll mit dem takt erfolgen also so wie bei einem zähler jedesmal wenn takt true wird soll die forschleife einmal hochzählen (takt soll tastend sein)
Ne wie gesagt ich möchte hier kein fertiges Porgrammcode da lerne ich nichts. Ich möchte ein Code erstellen mit fehlern und dann mit euch diese Fehler ausdiskutieren bis ich es verstehe.
Ich möchte kein zähler, weil ich explizit einen Schieberegister programmieren will da ich dieses Programm immer weiter ausbauen will.
Immer wieder neue Funktionen Übungen einbauen. Ein einfacher Zähler hätte für mich keinen Lerneffekt.
Das kann ich nämlich auch in FUP ganz easy hinprpgrammieren.
Ich will aber SCL beherrschen
 

Ich möchte mit jedem Takt (impuls) mein bit im Schieberegister um 1 erhöhen bis drei erreicht ist. Dann möchte ich das Ausgang kurz (impuls) ein und wieder ausgeht
schieberegister wähle ich wegen lerneffekt und da während des ersten "hochzählvorgang" von 1-3 ein zweiter Bit auch geschoben werden soll. Stellt das euch einfach vor wie ein schlechte teil sortierer . Ein Band mit Teilen und sporadisch kommen schlechte teile. Diese sollen z.B nach drei takten (z.B wegmessung sensor über Getriebezahnrad) aussortiert werden wie auch immer ( hier mit ausgang)
Die Funktionsweise soll in etwa so sein. Ich hoffe ihr wisst was ich will
 
Dann solltest Du aber keine For-Schleife nehmen, denn die läuft bei jedem Aufruf komplett durch, sondern einen Zähler dem Du das Taktsignal als Eingang übergibst.

Von irgendwas mit Internetzugang gesendet.
 
Nein mit einem Zähler wird das nicht gehen, da wenn während des Zählvorganges ein weiteres "schlechteil" kommt, dieses nicht erkannt wird !
Und wie gesagt mir geht es nicht darum eine Funktion hinzuprogrammieren "hauptsache es läuft"
sondern ich MÖCHTE EXPLIZIT EINEN SCHIEBEREGISTER
Grade das soll nicht passieren.
Ich möchte dass die Schleife nicht durchläuft, sondern mit jedem taktimpuls läuft bzw sich um die Schrittweite erhöht
 
Zuletzt bearbeitet:
Aber eine For Schleife erhöht sich nicht bei jedem Signal sondern läuft komplett durch.

Bei dir hört es sich so an als willst du eher mit einem Taktsignal weiter schalten.

Beschreib doch mal ausführlich was deine Maschine machen soll und wie dein "Schlechtteil" damit zusammen hängt dann bekommst du gewiss Hilfe.


Gruß

Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ICH HABE KEINE MASCHINE. ES DIENT NUR FÜR MICH ZUR ÜBUNG
Ich brauche einen Schieberegister weil, während (in der Zeit) des ersten Zählvorgangs also wenn grade der Zähler von 1 bis 3 hochzählt ein weiterer Zählvorgang gestartet werden könnte.
Ich möchte mit einem TAKTSIGNAL hochzählen, wenn aber während des hochzählens ein weiterer Freigabesignal kommt dann soll dieser ebenfalls bis 3 hochzählen und das könnten auch 100000 während des Zählvorganges kommen, da ich keine 10000 Zähler programmieren möchte, brauche ich ein Schiebregister, der mir von 1-3 hochzählt und mir kurz einen Ausgang für 1 Zyklus ein (true) und wieder (false) schaltet.
Wie gesagt LARRY sein Beitrag war genau das was ich haben möchte :


@TE:
Wenn ich etwas programmiere (ganz egal was) dann überlege ich mir als allererstes den Ablauf davon und versuche das dann in Code umzusetzen.
Deinen Ablauf (so entnehme ich es jedenfalls dem bisherigen Verlauf und darüber hinaus meiner Glaskugel) hast du dir möglicherweise so gedacht :
- du hast ein Schieberegister (ich bleibe mal bei dem Ausdruck) mit 10 Plätzen.
- mit dem IN "Set" deines FB (ich weiß, den gibt es in deiner Überlegung noch nicht) setzt du den Index 0 des "Schieberegisters"
- mit dem IN "Takt" deines FB (den gibt es so richtig auch noch nicht) willst du den Speicher deines "Schieberegisters" um eins weiterschieben - und zwar jedes Mal dann wenn "Takt" kommt
- mit dem OUT "Platz_3" deines FB (auch den gibt es so noch nicht) möchtest du dir anzeigen lassen, ob der Index 3 deines "Schieberegisters" gesetzt ist.

Falls meine Beschreibung so in etwa mit deinen Vorstellungen übereinstimmt so lönntest du jetzt vielleicht mal überlegen, wie man das Code-technisch umsetzen könnte.
Mit deinem bisherigen Code hat das allerdings nicht besonders viel gemeinsam ...

Gruß
Larry
 
vielleicht solltest Du nicht mit einem Schieberegister beginnen sondern erstmal die einfachen Grundlagen der SPS-Programmierung in SCL erlernen ;)

vielleicht programmierst Du mal folgenden Code und beobachtest ihn dann:

Code:
B:=0;
FOR A:=0 TO 10000 BY 1 DO
       B:=B+1;
END_FOR;
C:=B;
D:=D+1;

aber trotzdem ein amüsanter Thread ;)

Gruß.
 
Ich versuchs auch nochmal zu erklären.

Du hast deinen OB1, der wird zyklisch abgearbeitet, d.h. ist die SPS am Ende angekommen startet sie wieder oben. In diesem OB1 rufst du deinen Baustein auf.
Zu jedem gegebenen Zeitpunkt kann nur ein einziger Baustein abgearbeitet werden. D.h. eine SPS bearbeitet niemals 2 Bausteine gleichzeitig.
Man kann Bausteine logischerweise in einem anderen Baustein aufrufen, dann pausiert sie aber die abarbeitung des ersten Bausteins in dem der zweite Baustein aufgerufen wurde, bis der zweite Baustein beendet wurde.

Das ist so wie wenn du ein Buch liest. In einem ersten Buch wird auf Seite 22 gesagt, "Weiterführende Informationen finden sie in Buch 2". Dann schließt du Buch 1 und gehst zu Buch 2 über. Du liest nicht Buch 1 und 2 absolut gleichzeitig. Eine SPS arbeitet auch nicht so.

Also geht die SPS geht in deinen Baustein rein und wenn der Start sitzt, wird die For Schleife abgearbeitet.
Eine For Schleife in SCL wird folgendermaßen abgearbeitet:
SIe prüft, ob die Abschaltbedingung erfüllt ist. Ist er es nicht, bearbeitet sie die Anweisung in der Forschleife einmalig, bis sie zu dem befehl End_For kommt.
Dann zählt die SPS den Index um 1 hoch, und springt wieder an den Beginn der For Schleife.
Dann prüft sie, ob ihre Abschaltbedingung erfüllt ist ( das ist der TO- Wert). Ist er nicht erfüllt, wird die Schleife nochmals durchlaufen, bis die SPS am End_For ankommt, dann wird der Index erneut um 1 hochgezählt.
Das tut sie solange wie die Abschaltbedingung nicht erfüllt ist.

Während eine For Schleife abläuft, läuft in der SPS keine andere Bearbeitung ab. D.h. während du die For- Schleife abarbeitest und zählst 1-2-3 wird nichts anderes als die For Schleife abgearbeitet. Selbst Änderungen an den Eingängen der SPS werden zur Laufzeit der Schleife ignoriert. Du durchsuchst also ein Schieberegister das sich während der Bearbeitung der For Schleife niemals Ändern wird, in der Hoffnung dass sich in dem Register etwas ändern wird. Dem ganzen Code ist es, so wie du ihn geschrieben hast von vorne herein unmöglich, das von dir erwartete Ergebnis zu erreichen.

Änderungen in dem Schieberegister können nur woanderst in deinem Code passieren. Unter Umständen ja durch einen SPS Eingang. D.h. dein Code muss über seine Laufzeit also auch diesen Code ablaufen lassen. Das geht aber nicht mit einer For- Schleife, denn wie bereits beschrieben, die SPS macht sobald die For Schleife abgearbeitet wird, nichts anderes als die For- Schleife abzuarbeiten. Es wird parallel kein weiterer Code aufgerufen, durch den eine Änderung im Schieberegister möglich wäre und es werden keine Eingeänge abgefragt, durch die eine Änderung im Schieberegister möglich wäre.

Ich hoffe das war verständlich.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
vielleicht solltest Du nicht mit einem Schieberegister beginnen sondern erstmal die einfachen Grundlagen der SPS-Programmierung in SCL erlernen ;)
:ROFLMAO:

Déjà-vu:
Was ist die Aufgabe?
Selbstfindung! :ROFLMAO:

Eigene, möglichst komplizierte Aufgabenstellungen, um die SPS-Programmierung ja nicht auf die einfache, sich steigernde Arbeitsweise "sich selbst" beizubringen.
:lol:
Wie auch schon mehrfach gesagt, das steht in den alten Threads alles schon drin!
Lesen bildet.
:cool:
 
... LARRY sein Beitrag war genau das was ich haben möchte :

Wenn dem so ist dann versuch doch mal - Step by Step - das umzusetzen.
Ich würde jetzt damit anfangen, die IN's, die deinem FB ja noch fehlen, erstmal nachzurüsten.
Dann könntest du als Nächstes mal versuchen, das umzusetzen, was der IN "Set" machen würde/sollte.
Nun könntest du dich an "Takt" heranwagen. Hier gibt es zu bedenken, dass das Beschriebene nur dann so funktioniert, wenn du das Ganze mit einer Flanke(nauswertung) koppelst - dazu kannst du hier im Forum tonnenweise (auch in Verbindung mit SCL) nachlesen (sogar möglicherweise in Verbindung mit "Schieberegister" oder "Schiebespeicher".
Letzlich dann die Geschichte mit dem OUT - das sollte dann aber nicht mehr so das Problem sein.

Beachte bitte bei all dem die schon gegebenen Stichworte wie "zyklische Abarbeitung" und "Flankenbildung".
Darüber hinaus kann PLCSim (also debuggen) auch schon mal ganz hilfreich sein ...

Gruß
Larry
 
Also Ich habe jetzt mithilfe eines Buches, eine Flankenauswertung in FUP versucht eigenständig in SCL umzuwandeln.
Wenn ich einen Taktsignal setze dann steht "start" auf true, INDEX [1] usw.
wenn ich dann den takt wieder wegschalte dann stegt "start" auf false, somit kann die FOR-Schleife nicht arbeiten. Das habe ich mir auch zwei posts davor gedacht nur bisschen dumm beschrieben.
Frage ist, warum passiert dass und wie bekomme ich es sohin dass sich bei jedem takt mein Index um eins erhöht.

für die Flankenerkennung habe ich eine pos_flanke und einen SR-Baustein genommen. ich hoffe das ist soweit in Ordnung.

SCL_Schiebereg_Flanke.jpg
Gruß
EMZ

PS: Die Rede von FUNKTION ist bei mir noch sehr weit :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es entspricht hier nicht meiner Vorgehensweise - ich kürze das nun also ein bißchen ab und zeige dir den Code, wie er sein könnte :

Code:
    [B]IN
[/B]      Takt : bool
      Set : bool

   [B] OUT
  [/B]     Platz3 : bool              
                            
    [B]Static   [/B]                     
    Flanke          Bool   
    Schiebereg    Array[0..100] of Bool  
    

#Schiebereg[1] := Set ;

IF #Takt and not #Flanke then
    FOR #Index := 99 TO 1 BY -1 DO
        #Schiebereg[#Index+1] := #Schiebereg[#Index] ;
    END_FOR;
 end_if ;
#Flanke := Takt ;

Platz3 := #Schiebereg[3] ;
Selbstverständlich kann man das noch verbessern - sollte aber erstmal funktionieren ...

Gruß
Larry
 
Also wenn du schrebist du willst bei jedem Takt um eins erhöhen frage ich mich immer noch was du mit einer FOR schleife wilsst.

Code:
if init or index > max then
  index := 0;
end_if;



if Takt then
  index := index + 1;
end_if;

Das sollte doch eher deiner Beschreibung entsprechen.

Jetzt könntest du mit CASE entscheiden was du machst wenn index einen bestimmten Wert hat.


Gruß

Jens
 
Also wenn du schrebist du willst bei jedem Takt um eins erhöhen frage ich mich immer noch was du mit einer FOR schleife wilsst.
Er stellt sich für seine Übungsaufgabe vor, er hat z.B. ein Förderband auf das x Teile passen.
Auf das Band wird vorne ein neues Teil aus der Produktion gelegt und gleichzeitig im Schieberegister hinterlegt, ob das Teil gut oder schlecht ist.
Wenn das Teil hinten am Förderband ankommt, muss ein Roboter entscheiden, ob dieses Teil auszusortieren ist oder nicht.

Der TE hat vor allem Probleme zu unterscheiden, welche Information wofür benötigt wird und dass dies auch verschiedene Daten sind:

1. neues Teil auf's Band = Schiebetakt
2. neues Teil gut/schlecht = Eingangsinformation an 1. Stelle Schieberegister
3. letztes Teil gut/schlecht = Ausgangsinformation an letzter Stelle Schieberegister
 
Zurück
Oben