Anfänger- Codefrage LD *close*

excite

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Ihr!

Ich hab ein paar Zeilen Code, wo ich nicht sicher bin, ob ich die richtig verstehe.


Code:
LD SM 0.1
Call SBR 0
srb0:
Code:
LD SM 0.0
MOVW +1, MW 0

Ich dachte LD bedeutet, dass in diesem Falle SM 0.1 und SM 0.0 in den AKKU geladen werden.
Und MOVW +1, MW 0, dass in das Merkerword 0 (Merkerbits M0.0 - 1.7 ??) eine +1 geschrieben wird.

Vom aufbau aber würde ich eher denken, dass LD als Abfrage dient, ob die nächste Zeile ausgeführt werden soll.

Sorry, wenn ich Euch mit so einem Anfängerkram langweile
- ist aber vielleicht auch ganz nett, wenn es mal einfache Fragen gibt ^^

lg
excite
 
Hab mir den Text angesehen und hab viel wiedererkannt, was ich mal gelernt hab :)

Ich hoffe ich hab dich und den Text nun richtig verstanden:

SM 0.0 -> immer 1
SM0.1 -> im ersten Zyklus 1, sonst 0.

=>

LD SM 0.0
Call sbr1
->ruft sbr immer auf


LD SM 0.1
Call sbr1
->ruft sbr1 nur im ersten zyklus auf.


Kann ich LD Xm.n so verstehen, dass es Wahr sein muss, damit die nächste Anweisung auszuführen?

dann würde
LD M 0.1
LD M 0.2
CALL SBR1

den SBR1 nur aufrufen, wenn M 0.1 und M 0.2 auf 1 'stehen'.


EDIT:
Dann wäre
LD SM 0.0
CALL SBR1

äquivalent zu

CALL SBR1

???
 
Hallo,
fast, ab der 2.Zeile muß eine Verknüpfungsoperation vorangestellt werden, sowie U, O, UN usw. LD übergibt nur ein VKE (hoffentlich habe ich das jetzt richtig erklärt :roll: ), den Rest hast soweit richtig verstanden.
Randbemerkung:sm0.1 setzt man z.B. bei schnellen Zählern ein um den Zähler mit allen Parametern zu setzen.

mfg

dietmar
 
Hallo!

Dieser Befehl: CALL, ist das so wie das = Zeichen wenn z.B. ein Ausgang gesetzt wird oder für was anderes?

mfg andi
 
Ich kenne die 200er überhaupt nicht, aber normalerweise ist CALL der Befehl zum Aufruf eines Unterprograms - Subroutine auf English, also in diesem Fall SBR1.
 
Der Befehl CALL bewirkt, wenn er ausgeführt wird, daß als nächstes das Unterprogramm SBR 0 ausgeführt wird. Am Ende von SBR 0 wird dann zurückgesprungen und mit dem Befehl hinter dem CALL weitergemacht.
Er wird nur ausgeführt, wenn das VKE (Zwischenergebnis der bis dahin ausgeführten logischen Verknüpfungen) "wahr" ist.
Wird er nicht ausgeführt, wird sofort mit dem Befehl hinter dem CALL weitergemacht.
Schreibst du CALL ohne LD SM0.0 oder LD SM0.1, so hängt es von den vorher ausgeführten Verknüpfungen ab, was passiert:

LD E0.0
U E2.7
= A0.4
CALL SBR 13

ruft SBR 13 genau dann auf, wenn auch A0.4 ein ist.
 
Hallo
das LD SM0.0 //immer '1'
sitzt nur davor um es aus oder in KOP konvertieren zu können. Sog. 'Boxen' können nicht ohne vorangeschalteten Kontakt dargestellt werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Wenn ich das richtig verstanden habe, dann schaltet CALL das Unterprpogramm ein und dann läuft das Unterprogramm normal durch und dann läuft das normale Programm weiter. Und wann genau verwende ich ein Unterprogramm?

mfg andi
 
Die ganze Sache dient eigentlich in erster Linie der Strukturierung des Programms,
außerdem ist es damit möglich eine parametrierbaren Baustein zu erstellen.

Mfg
Manuel
 
Hallo!

Wenn ich dann ein Programm im Unterprogramm schreibe aber im Hauptprogramm nicht das CALL verwende dann wird das Unterprogramm nicht bearbeitet oder?

mfg andi
 
MRT schrieb:
Und wann genau verwende ich ein Unterprogramm?
Wenn dieselbe Aufgabe wiederholt zu erledigen ist. Z.B.: Du hast 5 Meßwertaufnehmer, die Signale 4-20mA für 0-15 Bar liefern. Du willst sie auf Bar umrechnen. Dafür schreibst du dir ein Unterprogramm SBR1:

-I VW24,6553 // 6553 = 4 mA
LDW< 0, VW 24 // negativ, dann Drahtbruch
= M 20.0 // Fehlermerker
RETC // und Ende Unterprogramm, keinen Druckwert berechnen
LD SM 0.0 // letzte Bedingung war "false", wir brauchen "true" zur Ausfürung
// der folgenden Anweisungen
ITD VW24,LD0 // erweitern
DTR LD0,LD4 // nach Gleitkomma wandeln
/R 26214.0, LD4 // durch größten Wert teilen
*R 10.0, LD4 // *15 Bar
MOVR LD4, VD132 // als Ergenis speichern
RET // Ende Unterprogramm

Im Hauptprogramm lädtst du nun die einzelnen Werte und rechnest sie um:

LD SM0.0
MOVW AW0,VW24 // 1.Analogeingang nach VW24, dort erwartet das Unterprogramm den
// Wert
CALL SBR1 // Umrechnen
// Das Unterprogramm gibt dir im Merker 20.0 an, wenn Drahtbruch
// aufgetreten ist und, wenn nicht, in VD132 den neuen Druck
LD M20.0
= M30.0 // Drahtbruch 1. Meßwert
LDN M20.0 // nur wenn kein Drahtbruch
MOVR VD132, VD200 // 1.Meßwert kopieren

LD SM0.0
MOVW AW2,VW24 // 2.Analogeingang nach VW24, dort erwartet das Unterprogramm den
// Wert
CALL SBR1 // Umrechnen
// Das Unterprogramm gibt dir im Merker 20.0 an, wenn Drahtbruch
// aufgetreten ist und, wenn nicht, in VD132 den neuen Druck
LD M20.0
= M30.1 // Drahtbruch 2. Meßwert
LDN M20.0 // nur wenn kein Drahtbruch
MOVR VD132, VD204 // 2.Meßwert kopieren
...
LD SM0.0
MOVW AW10,VW24 // 5.Analogeingang nach VW24, dort erwartet das Unterprogramm den
// Wert
CALL SBR1 // Umrechnen
// Das Unterprogramm gibt dir im Merker 20.0 an, wenn Drahtbruch
// aufgetreten ist und, wenn nicht, in VD132 den neuen Druck
LD M20.0
= M30.4 // Drahtbruch 5. Meßwert
LDN M20.0 // nur wenn kein Drahtbruch
MOVR VD132, VD216 // 5.Meßwert kopieren

Nachteilig ist, daß das Unterprogramm den Wert immer in einer festen Speicherstelle erwartet und die Ergebnisse in festen Speicherstellen zurückliefert. Da helfen parametrierbare Unterprogramme.
 
Hallo
irgendwas wird hier durcheinandergewürfelt was die generelle Anwendung von 'call' betrifft. Nach meiner Auffassung und vor geraumer Zeit programmierter Versuchsreihen mit S7-200 ist 'call' ein unbedingter Aufruf. Also unabhängig vom VKE. Damit würde er der Step7 (3/400) Anwendung entsprechen.
Aus der 'Hilfe': Die Operation 'UC' gleicht der Operation 'CALL' mit dem Unterschied das keine Parameter übergeben werden können ...
Das war der einzige Hinweis auf Seiten Siemens, Habermann beschreibt ganz klar 'CALL' als unbedingt.

Frage war/ ist nur: Ob das bei der 200-er zwangsläuig ebenfalls so sein muss ????
Ich denke ja, kam aber nach Lesen dieses Beitrages gestern sofort ins Schwimmen. Wäre nett wenn das in meiner Sichtweise: 'CALL ist immer unbedingt' nocheinmal bestätigt bzw. richtiggestellt werden könnte von jemandem der es definitiv weiss.

Gruss und Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
devinitiv bedingt, schau dir mal in Fup einen SBR-Aufruf an, das EN steht glaube ich für enable (deutsch:möglich), so noch ein Beispiel:
NETWORK 1 // Hauptprogramm
// Im ersten Zyklus SBR_0 aufrufen
LD SM0.1
CALL SBR_0


Das Beispiel ist ein Ausschnitt wenn man einen schnellen 'Zähler aufruft, und das steht sogar im Assistenten: der Zähler darf nur einmal aufgerufen werden, also ist der Befehl VKE abhängig.

mfg

dietmar
 
Call ist bei der S7-200 definitiv ein bedingter Aufruf, denn wenn Call "Alleine" steht ist dies ein Fehler, erst wenn ein LD irgendwas davor steht ist es gültig.

Diesen Krampf das alles VKE unabhängig ausgeführt wird gibt es eigentlich nur bei der 300/400er. Alleine schon diese ganzen hin her sonstwo Sprünge die ganze Zeit.

S7-200 hat mit S7-300/400 eigentlich nur den Aufdruck Siemens gemein.

Mfg
Manuel
 
Zurück
Oben