# Verständnisproblem: Zyklische Arbeitsweise <=> SCL Programmierung



## hoinabauer (23 März 2017)

Guten Morgen, 

ich programmiere derzeit erstmalig in SCL, da ich ein Array von einer Robotersteuerung über Profibus an meine S7 1200 übergeben möchte. 

Der Roboter meldet :“Möchte Daten senden“ über ein Bit dann soll auf SPS-Seite über eine IF-Bedingung der SCL Code ablaufen. 
Im SCL Programm soll dann Feld für Feld vom Roboter in die SPS geschrieben werden. 
Ich habe ein IntegerWord, welches den Wert des jeweiligen Feldes abbildet und einige Bits zur Kommunikation (zB. SPS: „habe verstanden, bitte nächsten Wert senden“…Roboter“nächster Wert ist bereitgestellt“..) 

Im Prinzip also jeweils eine Schleife auf jeder Seite die Zeilen und Spalten des Arrays durchläuft. 

Nun zur eigentliche Frage: Eine SPS arbeitet ja zyklisch und soweit ich das verstanden habe werden pro Zyklus in FUP/AWL erstmal alle Ausganswerte ermittelt und am Ende des Zyklus tatsächlich auch beschrieben oder? Innerhalb meiner oben beschriebenen Schleife befinde ich mich ja in einem Zyklus der SPS (der quasi kurz etwas verzögert wird, da erstmal die SCL schleife (Daten empfangen) abgearbeitet wird.) Wie ist das nun wenn ich innerhalb meiner SCL-Schleife Ausgänge erst High und dann Low setzte? Passiert das tatsächlich dann auch oder wird am Ende der letzte Wert übernommen (hier LOW) und dann auf den Ausgang geschrieben? 

Gleiche Frage für die Eingänge, wenn sich während meiner SCL-Schleife die Eingänge ändern, kann ich das im Programm überhaupt sehen oder stehen die neuen Eingangswerte erst im nächsten SPS Zyklus bereit? 

Vielen Dank für eine kleine Erklärung wie das so läuft J

Gruß
Tom


----------



## M-Ott (23 März 2017)

Mir ist der Ablauf nicht ganz klar. Ich glaube, dass Du Dich da in eine falschen Ansatz verrennst.
Zu Deiner Frage: Wenn Du die Eingänge ganz "normal" aus dem Prozessabbild verwendest, dann bekommst Du tatsächlich Änderung innerhaöb des Zyklus nicht mit. Ebenso, wenn Du einen Ausgang während eines Zyklus mehrfach setzt, zurücksetzt, kommt nur der Zustand am Ende des Zyklus an der Peripherie an. Um mehrfache Änderungen während eines Zyklus zu erfassen /  durchzuführen, musst Du mit, ich bin mir nicht sicher,  direkt auf die Peripherie zugreifen.
Ich glaube nicht, dass das nötig ist. Eine Kommunikation mit anderen Geräten, ist auch ohne solche Programmiersauereien zu bewerkstelligen.


----------



## centipede (23 März 2017)

Es kommt darauf an wie du die Peripherie liest und schreibst. Wenn du normal über Prozessabbilder arbeitest, ist es wirklich so, dass nur die letzte Zuweisung des Ausgangs an die Baugruppe gegeben wird.
Ansonsten musst du deine Werte als direkten Peripheriezugriff programmieren.
Vielleicht hier mal den Code zeigen, ob es überhaupt Sinn macht innerhalb einer Schleife den Zustand zu ändern.

Edit: Michael war schneller


----------



## Morymmus (23 März 2017)

Vielleicht verstehe ich gerade das Problem nicht, aber die Zykluszeit der SPS ist doch i.d. Regel viel schneller als die Abarbeitung Deines Handshakes. Ist doch bei FUP nicht anders - die SPS läuft über das Programm und führt jedes Netzwerk aus, dessen Bedingungen erfüllt sind. Und das normalerweise im ms-Bereich. 
Wenn Du nun auf die Antwort des Roboters wartest läuft die SPS eben zig mal über die Zeile, führt sie aber erst aus wenn die Bedingungen erfüllt sind - damit stoppt Dein Programmablauf aber nicht der SPS-Zyklus.


----------



## hoinabauer (23 März 2017)

Das ist ja genau der Punkt. Ich dachte immer eine SPS arbeitet alle Bausteine ab, schreibt danach Ausgänge, liest Eingänge und fängt von vorne an. Wenn ich mich nun innerhalb eines SCL Bausteins befinde und dort eine Schleife abarbeite werden doch währenddessen keine Eingänge aus dem Perepheriebereich neu eingelesen oder?


----------



## PN/DP (23 März 2017)

Moin

Einen Ausgang mehrmals im Zyklus schalten (dafür muß man direkt auf die Peripherie zugreifen) macht man eigentlich nur, wenn es "extrem" schnell gehen muß - schneller als die Zykluszeit, z.B. schneller als 10 ms. Für alle langsameren Vorgänge macht man keine Schleife sondern nutzt die normale zyklische Bearbeitung und ggf. einen Zähler oder Merkvariable bis zu welchem Schritt man im Zyklus vorher gekommen ist. Auf (Eingangs-)Ereignisse wartet man auch nicht in Schleifen, sondern indem man zyklisch nachschaut, ob das Ereignis stattgefunden hat, ob ein erwarteter Zustand nun vorliegt.

Diese zyklische Arbeitsweise hat nichts damit zu tun, ob man mit FUP/KOP oder SCL programmiert. Das Problem bei SCL ist allerdings, daß es wie normale Hochsprache aussieht und daher SPS-unerfahrene Programmierer meinen, genauso wie auf völlig anders funktionierenden (PC-)Plattformen programmieren zu können - was dann in der Regel schief geht. Um eine SPS programmieren zu können muß man deren zyklische Arbeitsweise verstehen und beachten.

Harald


----------



## PN/DP (23 März 2017)

hoinabauer schrieb:


> Wenn ich mich nun innerhalb eines SCL Bausteins befinde und dort eine Schleife abarbeite werden doch währenddessen keine Eingänge aus dem Perepheriebereich neu eingelesen oder?


Richtig, die Eingänge werden erst wieder gelesen, wenn Dein Programm zu Ende gekommen ist und die Bearbeitung ans Betriebssystem abgegeben hat. Dann werden die zuletzt zugewiesenen Ausgangszustände auf die Peripherieausgänge geschrieben und die Peripherieeingänge ins Prozessabbild der Eingänge gelesen und danach wird wieder Dein Programm aufgerufen, was nun mit den neuen Eingangszuständen erneut durchlaufen wird.

Falls Dein Programm in einer Schleife länger als die eingestellte maximale Zykluszeit 'rumhängt, dann wird durch einen Watchdog Dein Programm gewaltsam beendet und die SPS geht vorsichtshalber in STOP.

Harald


----------



## Larry Laffer (23 März 2017)

@TE:
Vielleicht nur noch einmal zum Verständnis :
Eine Schleife ist etwas, dass du z.B. nutzt wenn du in einem Zyklus ein Array durchsuchen oder beschreiben möchtest.
Das, was du da vorhast (soweit es bei mir angekommen ist) ist etwas, dass sich vom System her sowieso schon auf mehrere Zyklen verteilt. Das ist das, was dir alle Beteiligten nahe bringen wollten.

Um das aber mal besser aufzuziehen :
Beschreib doch einfach mal schrittweise deinen gedachten Ablauf - dann ist es möglicherweise auch für uns leichter, da konkreter zu werden ...

Gruß
Larry


----------



## hoinabauer (23 März 2017)

Ok, alles klar. Hab ich verstanden. Dann mach ich das auf SPS seite so:

Spalte=IW100
Zeile=IW102
Wert=IW104

Wenn "Daten schreiben"=TRUE 
dann
Array [Zeile,Spalte]=Wert

Sorry ist kein richtiges SCL  Bin Maschinenbauer und muss immer spicken 


Handshake würde ich mir dann sparen, sondern einfach auf der Roboterseite zwischen den Werten und "Daten schreiben" TRUE/FALSE eine kurze Delay, in der die SPS auf jeden Fall einmal durch ist.


----------



## PN/DP (23 März 2017)

Das Handshake kannst Du nicht sparen, weil die Kommunikation/Datenübertragung von/zu Deinem Roboter und die Datenverarbeitung im Roboter eine "Weile" dauert, deren Dauer schwanken kann oder auch ganz ausfallen kann und irgendwann später wiederkommt. Bei einer Programmierung mit Handshake macht man sich unabhängig von der tatsächlichen Dauer des Signalaustauschs und kann automatisch mit der höchstmöglichen Geschwindigkeit kommunizieren.

Harald


----------



## hoinabauer (28 März 2017)

Guten Morgen, 

also das Übergeben der Daten funktioniert soweit, auch mit Handshake. 
Ein kleineres Problem ist noch, dass es ca. 3 Sek. dauert. Ich übergebe ein Array 4x43 also 172 Werte. Wären also 17ms pro Feld. Ich denke das ist normal?? Die Robotersteuerung (KRC1 wird halt auch nicht die schnellste sein)

Mein größeres Problem ist aber, dass ich die Daten gerne per Webserver darstellen möchte, es wird aber nichts angezeigt auf meiner benutzderdefinierten Webseite. Index.html

Die Daten werden vom Roboter mittels SCL astrein ins Array Lager[43,4] geschrieben. Kann Sie dort mittels „Beobachten“ kontrollieren. 
Dass Array Lager vom Typ INT ist im Datenbaustein Lagerdaten angelegt worden. 

Wenn ich in meiner Website nun :   :=“Lagerdaten“.Lager[41,2]: eingebe, wird einfach nichts anzeigt und ich komm nicht drauf woran es liegen könnte. 
Im Feld [41,2] steht definitiv ein Wert (zB.  5) drin. 

Habt Ihr vielleicht einen Tipp woran das liegen könnte? 

Vielen Dank 
Tom




HAB DIE FRAGE INS HAUPTFORUM gepostet.


----------

