rs-plc-aa schrieb:
Hallo,
da bin ich gerade dabei...
Ich hab dann mal
gegen
Code:
L 0
L "Module_soll"
==I
SPB nene // ... oder auch nicht ...
...
So ist es richtiger. War das andere von mir?
Was ich jetzt zwar sehe aber nicht verstehe ist das:
Code:
AUF DB [#idbn]
L #Nummer
L 8 // 8-bit-Einträge
*I
T LD 12 // Temp index
L DBB [LD 12]
SPL tbig // wenn Nummer größer als Anzahl Sprungziele ist
SPA BM00
SPA BM01
SPA BM02
SPA BM03
SPA BM04
SPA BM05
SPA BM06
tbig: NOP 0
// hier kann eine Störmeldung o.Ä. erzeugt werden...
SPA ende
BM00: NOP 0
UN "M1_Bereit" // betriebsbereit BM0
....
Wenn jetzt z.B. #Nummer = 6 ist, dann wird ja mit 8 multipliziert und in LD 12 kopiert (habe es von LD0 auf LD12 geändert...).
Hier steht dann 48 drin...
Nach der Anweisung
L DBB [LD 12]
steht 4 im Akku 1... warum ???
Wohl deshalb weil im 7 Byte des IndexDB die Nummer 4 stand. Das kann ich aber nur aus dem Ergebnis schließen.
Nummer =6 bedeutet: 7.Eintrag im IndexDB = DBB6
Nummer =0 bedeutet: 1.Eintrag im IndexDB = DBB0
Die Byte-Nummer (hier 6) ist mit 8 zu multiplizieren. Das ist einfach eine Vorraussetzung damit der Befehl
funktioniert.
Es haben ja schon Leute versucht, "pointer" zu erklären. Eigentlich finde ich das keine gute Erklärung, weil:
1. Step7 auch noch "typisierte" Pointer kennt, z.B. P#DB20.DBX0.0, P#E60.0, die eine Information über den Speicherbereich beinhalten.
2. Die hier verwendeten Adressen im Gegensatz zu pointern anderer Programmiersprachen stehen: Im Gegenstatz zu Pascal ist Rechnen mit "pointern" erlaubt. Im Gegenstatz zu C wird bei den Berechnungen aber eben nicht die Größe des Zielobjekts automatisch berücksichtigt.
Man könnte meinen, der Befehl
behandele den Speicher als ein "array of bits". Nur: dann sollte es möglich sein, mittels eines Ausdrucks wie L DBB [5] ein byte zu lesen des erste 3 bits aus DBB0 und die anderen 5 aus DBB1 stammen. Geht aber nicht.
Fazit: der Befehl
braucht immer die 8-fache Bytenummer, was zufällig auch die Bit-Nummer ist. Das ist weder vernünftig, noch dem Wesen nach durch den Begriff "Pointer" zu erklären, sondern schlicht eine "Schrulle" der Siemens-Entwickler, mit der man jetzt leben muß.
mir ist klar daß in meinem Beispiel das BM 4 (Sprungziel ist allerdings BM3 weil von 0 an gezählt) in der Indexliste an sechster stelle steht --> also eigentlich richtig gedeutet.
Ja, genau.
Laut Programmstatus wird aber an der Marke BM 5 (=Modul 6) weitergemacht...
Kann ich nicht nachvollziehen, eventuell siehst du einen Durchlauf in einem anderen Zyklus?
Kan der Simulator Einzelschritt?
In wirklichkeit wird aber das reale Modul 4 (Marke BM3) eingeschaltet.
Das soll es ja auch.