Step 7 Pointer variabler Operand

B

BlackDice

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,
ich möchte 12 Char Werte in zwei Statische Strings verschieben. Der DB und die Adresse innerhalb des DB sind allerdings variabel und werden als Integer am Baustein parametriert.
Den DB rufe ich ganz oben im FB auf. Nur bekomme ich das mit den Adressen nicht hin. Kann mir da jemand weiter helfen?

Ich habe auch schon überlegt die 12 Char werte in 3 Doppelwörtern zu transferieren. Daraus habe ich aber dann auch keine Strings bekommen. Das "zweite" Doppelwort müsste ich ja irgendwie teilen.


Viele Grüße
BlackDice
 
was die pointer betrifft guckst du hier
Pointer Zeiger FIFO LIFO und hier
Any-Zeiger für Datentypen

ein string ist folgendermassen aufgebaut.
Byte 0 = maximale länge des strings
Byte 1 = tatsächliche länge
Byte 2 ... x = deine zeichen.

willst du aus deinem arrray of char einen string machen musst du Byte 0 und 1 beschreiben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist das im Ziel-DB tatsächlich ein String? Ist die Zieladresse die Adresse des String-Headers oder der String-Zeichen? Ist der String-Header bereits initialisiert? Wieso zwei Strings?
Wo kommen die Char Werte her?
Wieso "das zweite Doppelwort irgendwie teilen"?

Darf es lustige old-school-AR-Adressiererei sein oder sollte es sauber in modernerer Hochsprache (z.B. SCL) programmiert werden? Soll der Code auch für S7-1200/1500 konvertierbar sein?

Grundgerüst AWL
Code:
      L     #IN_iDBnr
      T     #temp_iDBnr

      L     #IN_iOffset
      SLD   3
      LAR1

      L     #MyChar1
      AUF   DB [#temp_iDBnr]
      T     DBB [AR1,P#0.0]

      L     #MyChar2
//      AUF   DB [#temp_iDBnr]
      T     DBB [AR1,P#1.0]

      ...

      L     #MyChar12
//      AUF   DB [#temp_iDBnr]
      T     DBB [AR1,P#11.0]

Könnte man evtl. auch in einer Schleife machen, doch für nur 12 Chars ein bisschen viel Overhead.
SCL wäre besser lesbar.
Man kann vielleicht auch ANY-Pointer basteln und SFC20 BLKMOV aufrufen. Ist vermutlich ebenfalls umständlicher als die 12 Chars (oder evtl. 3 DWords) direkt zum Ziel zu kopieren.


PS: Meinst Du mit "Statische Strings" Strings in Instanz-DBs, deren DB-Nummer als Integer angegeben wird? Zugriffe von außen auf IDB sind Pfui. Äußere Schreibzugriffe auf IDB, welche nicht in den Referenzdaten gefunden werden können, sind doppelt Pfui.

Harald
 
Ich habe in meinen Statischen Variablen Name: Strang1 und Datentyp: String[6] stehen. In einen String kommt das Datum und in den anderen String die Uhrzeit.
Das mit den drei Doppelwörtern hat sich erledigt.

"L #MyChar" heißt dass ich die vorher schon als Char in meine Stats abgelegt habe?
"L #IN_iDBNr" ist dann auch ein Integer Eingang?
 
"L #IN_iDBNr" ist dann auch ein Integer Eingang?
Ja klar, so wie Du es bei Deiner Frage beschrieben hast:
Der DB und die Adresse innerhalb des DB sind allerdings variabel und werden als Integer am Baustein parametriert.
Ich gehe jetzt einfach mal davon aus, daß das die Adresse sein soll, wo die 12 CHARs hintereinanderweg liegen:
Code:
      L     #IN_iDBnr          //IN-Parameter: INT : DB-Nummer der CHARs
      T     #temp_iDBnr        //TEMP : INT oder WORD

      L     #IN_iOffset        //IN-Parameter: INT : Offset/Adresse der CHARs in dem DB
      SLD   3                  //n --> P#n.0 (ohne Bereichskennung!)
      LAR1                     //AR1 hat jetzt den Offset der CHARs innerhalb des angegebenen DB

      AUF   DB [#temp_iDBnr]   //DB mit den CHARs öffnen
      L     DBB [AR1,P#0.0]    //erstes CHAR
      T     #Strang1[1]        //in lokalen String kopieren
      L     DBB [AR1,P#1.0]    //zweites CHAR
      T     #Strang1[2]        //...
      L     DBB [AR1,P#2.0]
      T     #Strang1[3]
      L     DBB [AR1,P#3.0]
      T     #Strang1[4]
      L     DBB [AR1,P#4.0]
      T     #Strang1[5]
      L     DBB [AR1,P#5.0]
      T     #Strang1[6]

      L     DBB [AR1,P#6.0]    //siebentes CHAR
      T     #Strang2[1]        //in lokalen String kopieren
      L     DBB [AR1,P#7.0]    //achtes CHAR
      T     #Strang2[2]        //...
      L     DBB [AR1,P#8.0]
      T     #Strang2[3]
      L     DBB [AR1,P#9.0]
      T     #Strang2[4]
      L     DBB [AR1,P#10.0]
      T     #Strang2[5]
      L     DBB [AR1,P#11.0]
      T     #Strang2[6]

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke das hat geklappt.
Jetzt möchte ich die Strings in jeweils ein Statischen DINT wandeln. Wenn ich den FC37 nehme geht meine SPS auf Stop. Der Ein- und Ausgang ist symbolisch parametriert. Ich habe den Wert auch mal in einen DB schreiben lassen und da bleibt meine SPS grün nur es wird kein Wert angezeigt.

Ich habe als Datentyp "String[6]" angegeben. Das heißt ja dass mein String 6 Byte an Daten hat. Ist dann die Länge und tatsächliche Länge auch schon parametiert?

BlackDice
 
Zuletzt bearbeitet:
Das kannst Du Dir ganz einfach mit einer Variablenbeobachtungstabelle anschauen, indem Du Dir da die beiden Bytes auf den Adressen vor dem "MyIDB".MyString[1] ansiehst.

Wenn man im FB bei der Deklaration des String als Anfangswert '' stehen läßt, dann wird beim Generieren des IDB die Max-Länge auf 6 und die Ist-Länge auf 0 initialisiert. Wenn man als Anfangswert z.B. '123456' festlegt, dann werden Max-Länge und Ist-Länge auf 6 initialisiert. Der IDB muß natürlich nach Änderungen an der FB-Deklaration neu generiert und in die CPU geladen werden.

Vermutlich steht bei Dir als Ist-Länge noch 0 drin, deshalb wandelt der FC37 nicht, wie man in der Bausteinhilfe zum FC37 nachlesen kann.

Harald
 
Danke. Gibt es dazu eigentlich irgendwelche unterlagen? Hab in der Manager Hilfe und im Netz nicht wirklich was gefunden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da bin ich mir jetzt nicht sicher, ob die Step7 Hilfe da Anfänger-gerecht ausführlich ist. Ich meine, die Hilfen sind eher sehr kurz gefasst, und oft auch missverständlich oder gar falsch formuliert... ich habe das meiste meines Wissens durch ausführliches Ausprobieren und Beobachten gewonnen. Tip: PLCSIM benutzen

Es gibt bei Siemens auch frei downloadbare Ausbildungsunterlagen, doch die gehen nach meiner Erinnerung auch nicht genau genug auf Details ein.

Harald
 
Zurück
Oben