Bausteine aufrufen für dummies

Max-Schulz

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Moin,

habe leider ein Problem, und zwar bin ich mit meinem
begrenzten Wissen am Ende.
Zur Zeit programiere ich eine Sortieranlage in Step7.

Da ich noch ziehmlicher Neuling bin brauche ich mal eure hilfe.
Das erstellen der AWL ist kein Thema aber nun kommt das Problem
der Bausteine.

Die Anlage soll je nach erfassung der Werkstücke diese durch verschieden Prozeduren Sortieren.

Da diese ja immer gleich sind wollte ich diese Prozeduren in verschiedene Bausteine schreiben und diese dann je nach bedarf
aufrufen und ablaufen lassen und danach zur Abfrage zurück.

Leider finde ich nirgens eine aufstellung der Befehle zum aufrufen und starten der Bausteine.

Mir ist da nur der Call befehl bekannt aber wie der nun richtig eingesetzt wird is mir noch nicht klar.

1. CPU TYP 315-2DP

2. Step7 V5.3

Ich würde mich freuen wenn ihr mir da eine gute Quelle empfehlen könntet oder so weiterhelfen würdet.

Am besten anhand eines Quelltextes...


Vielen Dank

Gruß Max
 
Hallo

Wenn du dir einen Baustein baust und diesen dann in einem anderen lädst, dann hast du an diesem Baustein, den du dir gemacht hast, mindestens einen EN und einen ENO Anschluss dran, generiert Step 7 automatisch. Brauchst du also nichts in deiner Quelle schreiben.

Der Baustein wird standartmässig immer aufgerufen. Es sei den du hast am Eingang EN eine Variable stehen. Dann aktiviert sich der Baustein nur so lange wie dort das Signal "true" anliegt. Sobald das Signal "false" wird deaktiviert sich der Baustein.

Hoffe das war das was du brauchtest ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist für mich jetz fachtürkisch :)

Ich meine das so:

Ich habe jetz erstmal 3 Bausteine, OB1, FC1 und FC2.

Code:
    //--------------Schwenkarm-links---------------------

      U     M      1.1
      U     M      2.2
      U     E      4.1
      S     M      1.2
      O     M      1.3
      O     M      0.0
      R     M      1.2

      U     M      1.2
      S     A      8.3



//--------------Induktiver-Sensor--------------------

      U     M      1.2
      U     E      8.3
      U     E      4.2
      U     E      8.3
      U     E      8.4
      UN    M      1.5
      S     M      1.3
      O     M      1.4
      O     M      0.0
      R     M      1.3

      U     M      1.3
      S     A     12.2
      L     S5T#1S
      SE    T      1

Das ist jetz mal ein auszug aus meinem Programm.

Bitte dazu keine Kommentare ;)

Nachdem der Teil mit dem Schwenkarm fertig ist soll je nachdem welche
Sensoren aktiv sind, der FC2 oder ein anderer Baustein geladen werden.

Wie sage ich ihm, wenn Sensor 1 aktiv, lade FC2.
Wenn sensor 2 dann FC3, etc...
 
Bausteine lassen sich mit
call fc 1
aufrufen der call befehl ist aber nicht abhängig vom verkünpfungsergebnis des halb müsste in deinem Fall so aus sehen das noch ein bedingter sprung gemacht werden muss. Das sieht dann so aus:

ob 1
Code:
u Sensor 1     //sprungbedingung
un Sensor 2   //       "
spbn m001    //springe wenn VKE 0
call fc 1       //Bausteinaufruf
m001: nop 0 //Sprungmake und Nulloperation

u Sensor 2
un Sensor 1
spbn m002
call fc2
m002: nop 0

Hoffe das hilft dir weiter.
 
Hallo

wenn du die Bausteinaufrufe unter FUP oder KOP programierst, haben die Bausteine einen "EN" Eingang.
Wird dieser "EN" Eingang nicht angeschlossen, wird der Baustein immer aufgerufen.
Steuerst du den "EN" Eingang mit einem Signal an, so wird der Baustein in Abhängigkeit der Ansteuerung aufgerufen.

Martin
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Ma_su

so geht es natürlich auch
aber da er noch am anfang steht ist der weg über den EN einfacher finde ich als gleich mit sprungmarken zu arbeiten


@Max-Schulz

wenn du im ob1 bist und die ansicht auf FUP stellst (STRG+3)
und aus deiner linken leiste (sollte sie zumindest sein oder auch rechts) wenn sie nicht da ist dann CTRL+k
dort unter "FC Bausteine" findest du die Bausteine die du bereits geschrieben hast.
wenn du dir jetzt einen nimmst und den in ein NW in den OB ziehst dann lädt dieser den FC
wenn du jetzt am Eingang EN deinen Sensor eins legst dann wird dieser nur geladen wenn dieser auch belegt ist.
du kannst zur sicherheit auch ein und glied davor setzten und den zweiten eingang nigieren ( F9 am eingang drücken) und dort deinen sensor zwei anlegen.

ist das selbe was Ma_su beschrieben hat nur so kannst du es vll auch ein bissel besser verstehen wenn du gerade am anfang der sps welt stehst^^
 
@Ma_su

so geht es natürlich auch
aber da er noch am anfang steht ist der weg über den EN einfacher finde ich als gleich mit sprungmarken zu arbeiten

Hallo Garog

wenn du die Aufrufe in FUPoder KOP scheibst,und dann in AWL umschaltest hast du den AWL-Code mit Sprungmarken, so wie ihn Ma_su geschrieben hat.

Martin
 
Hallo Garog

wenn du die Aufrufe in FUPoder KOP scheibst,und dann in AWL umschaltest hast du den AWL-Code mit Sprungmarken, so wie ihn Ma_su geschrieben hat.

Martin




weiß ich doch ;)

deswegen sagt ich doch das er das machen soll damit es einfacher ist für ihn...
ich habe ja auch erst das selbe geschrieben wie du und das war für ihn doch schon "fachtürkisch" wie er selber sagte
daher habe ich es ihm etwas einfacher gemacht
so das er weiß was er da macht
und nicht einfach das kopiert was hier steht:ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde einen Anfänger immer zu Sprüngen raten.
SPäter geht es einfach nicht mehr ohne.

Ich habe dann schon Programmkauderwelsch von Leuten gesehen die einfach Sprünge vermeiden wollten weil sie Probleme damit hatten, das glaubt ihr nicht.
Habe auch schon einmal ein extern von einen Ingeneuer erstelltes Programm nicht bezahlen lassen. Da hat ein Knaller alles in einen FB mit 1 DB geschrieben in 2 Netzwerke.
Habe das Programm noch :) ist ein gutes Beispiel wie man es absolut nicht machen soll *fg*

Er hatte sich dazu nicht mehr geäussert, vom Programmaufbau sah es mir aus als hätte er es zuerst in Assembler erstellt und dann 1 zu 1 in S7-AWL umgewandelt.
 
Neben dem Umspringen eines CALL-Aufrufes kann man auch den Befehl CC (bedingter Bausteinaufruf einsetzen).

Siemens-Hilfe:

CC <Kennung des Codebausteins> (bedingter Bausteinaufruf) ruft bei VKE = 1 einen Codebaustein vom Typ FC oder FB ohne Parameter auf. Die Operation CC gleicht der Operation CALL, mit dem Unterschied, daß keine Parameter übergeben werden können. Die Operation speichert die Rücksprungadresse (Selektor und relative Adresse), die Selektoren der beiden aktuellen Datenbausteine sowie das MA-Bit im B-Stack, deaktiviert die MCR-Abhängigkeit, erstellt den Lokaldatenbereich des Bausteins, der aufgerufen werden soll, und beginnt, den aufgerufenen Code auszuführen. Die Kennung des Codebausteins kann absolut oder symbolisch angegeben werden.

Aufruf:

U E 2.0
CC FC2

Es können dann allerdings keine Parameter bzw. Instanz-DB angegeben werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das bedeutet so viel, dass der Befehl CC praktisch kaum zur Anwendung kommt - eben weil nur ein FC ohne Parameter damit sinnvoll bedingt aufgerufen werden kann.
 
Zuletzt bearbeitet:
wobei CC ja noch sinnvoller ist als UC.
Damit kann man Funktionen wenigstens bewusst nicht abarbeiten (hab das schon einmal gebraucht und bin dann mit SPB drüber gesprungen).
UC macht beim Aufruf zum FC keinen Unterschied, verwendet aber FB´s wie FC´s.
Hab ichs urchschaut oder gibts noch mehr zu wissen?
 
das bedeutet so viel, dass der Befehl CC praktisch kaum zur Anwendung kommt - eben weil nur ein FC ohne Parameter damit bedingt aufgerufen werden kann.

??? ich hab hier grad ein programm offen ...

codeauszug:

Code:
*
      UC    FB    12
      UC    FB    13
      UC    FB    14
      UC    FB    15
      UC    FB    16
      UC    FB    17
      UC    FB    18
      UC    FB    19
      UC    FB    20
      UC    FB    21
      UC    FB    22
      UC    FB    23
      UC    FB    24
      UC    FB    25
      UC    FB    26
      UC    FB    27
in den einzelnen FBs wird dann mit globaldaten gearbeitet ...

nicht nach dem sinn fragen, einfach nur merken: jopp, geht.

Gebs hat vor kurzem auf UC und CC hingewiesen...

Hallo heinerbollo,

es gibt eine Möglichkeit den Instanz-DB variabel zu übergeben, aber es ist ziemlich tricky!

Als Erstes muss Du natürlich die entsprechenden Instanz-DB's erstellen.
Zweitens alle zu übergebenden Parameter versorgen.
Dann mit AUF DI [#DI_NR] den entsprechenden Instanz-DB öffnen.
Mit
L P#Byte.Bit
LAR2
das Adressregister 2 auf den Anfang Deiner Parameterliste setzen.
Jetzt kannst Du mit
UC FB 58 bzw.
CC FB 58
den FB aufrufen.

Ich hoffe ich konnte Dir helfen.

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das bedeutet so viel, dass der Befehl CC praktisch kaum zur Anwendung kommt - eben weil nur ein FC ohne Parameter damit bedingt aufgerufen werden kann.

Das stimmt so nicht ganz. Man kann auch FB's mit CC bzw UC aufrufen.
Hier steht wie und warum:
http://www.sps-forum.de/showthread.php?t=23936

Grüße
Gebs

[EDIT]
Warum ist der VL immer schneller?
[/EDIT]
 
...
nicht nach dem sinn fragen...
ich habs geändert:
das bedeutet so viel, dass der Befehl CC praktisch kaum zur Anwendung kommt - eben weil nur ein FC ohne Parameter damit sinnvoll bedingt aufgerufen werden kann.
wobei ich dann auch noch dazu sagen muss, dass ich so wenig wie möglich Globaldaten und daher fast nie FC benutze. Na gut, CC und UC mögen ihre Existenzberechtigung haben - bei dem, was Gebs da beschreibt, unterstreiche ich aber das tricky mal doppelt ;)

und ... OK, dann gibt der UC einen SINN ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und mit UC und CC lässt sich gegenüber dem CALL noch eine wunderbare indirekte Adressierung realisieren:

Code:
 UC  FC [MW 2]
Klappt prima, kann aber so richtig unwartbarer Code draus entstehen ;)
 
jetzt muß ich das UC dingens hier nochmal hochschieben.

man nehme einen FB und lege eine datenstruktur darin fest. diese struktur merkt man sich und baut sie genauso in einen anderen FB (namen sind schall und rauch, die steuerung interessiert hier nur die richtige datenstruktur, obwohl ... also der nutzer sollte wert darauf legen, sonst kommt grütze raus) in den zweiten FB programmiert man jetzt etwas, dass mit den daten, die in der struktur angelegt sind, etwas machen. diesen FB ruft man im ersten per UC auf und den ersten mit einem CALL (übergabe instanz) ... was man jetzt gemacht hat: man kann im zweiten FB auf die instanz des ersten zugreifen, da dieser IDB ja immer noch offen ist

wichtig: auf die datenkonsistenz achten!
 
jetzt muß ich das UC dingens hier nochmal hochschieben.

man nehme einen FB und lege eine datenstruktur darin fest. diese struktur merkt man sich und baut sie genauso in einen anderen FB (namen sind schall und rauch, die steuerung interessiert hier nur die richtige datenstruktur, obwohl ... also der nutzer sollte wert darauf legen, sonst kommt grütze raus) in den zweiten FB programmiert man jetzt etwas, dass mit den daten, die in der struktur angelegt sind, etwas machen. diesen FB ruft man im ersten per UC auf und den ersten mit einem CALL (übergabe instanz) ... was man jetzt gemacht hat: man kann im zweiten FB auf die instanz des ersten zugreifen, da dieser IDB ja immer noch offen ist

wichtig: auf die datenkonsistenz achten!

He 4L, geiler Satzbau, aber kannst du das bitte nochmal eindeutschen! :ROFLMAO:
 
Zurück
Oben