Verständnisproblem Zeiger/AWL

kiestumpe

Level-1
Beiträge
726
Reaktionspunkte
84
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich versuche grade Bytes, die zu einem CHAR-Array gehören in ein anderes CHAR-Array zu kopieren. Eigentlich recht elementar, jedoch entäuscht mit das Ergebnis:

Zunächst wird der Stringzeiger geladen.
STR1 : CHAR[1..32] ist Statisch im FB

L P##STR1
LAR1#

L LB[AR1,P#0.0] // Leider wird hier schon etwas anderes Ausgelesen als in STR1 steht - was mach ich verkehrt ?

AUF DB[DB_NR2]
T DBB153

STR1 läßt sich im Intstanzbaustein wunderbar mit dem Zeichen '0' beobachten.

MFG

Frank
 
Hallo,

dein Problem ist der Befehl 'L LB[AR1,P#0.0]'!

Falls deine Zeichen im Instanz-DB in einem Array of Char stehen,
dann musst du die Char auch aus dem Instanz-DB laden und nicht
aus den temporären Lokaldaten.

In deinem Fall benötigtst du den Befehl 'L DIB[AR1,P#0.0]'!

Gruß Eumel
 
Danke Onkel Dagobert,

mit L B...scheint's im FB zu funktionieren
Im FC scheitert jedoch noch das Rausschreiben auf den Ausgang

L P##WERT
LAR1
L P##WERT_AUS // Zeiger auf Ausgangsstring
LAR2

L B[AR1,P#3.0]
T B[AR2,P#6.0]

Warum kann für den Ausgangsstring keine Dimension angeben, sonder nur mit der Länge 254 arbeiten?


Gibt's da eigentlich e systematische Referenz auf die Kennzeichen DI,LB, B usw.? Im AWL-Hanbuch-Index findet sich leider nicht viel zu diesem Thema.

MfG

Frank
 
Zuletzt bearbeitet:
Hallo nochmal,

hab mich leider etwas zu früh gefreut.

An anderen Stellen wird ein Integer in eine String umgewandelt.
Das ganze geschieht per Aufruf eines Multiinstanz-FB's innerhalb meines FBs

Wenn ich den Baustein alleine, also ohne Multiinstanz aufrufe, funzt die Sache einwandfrei.
Jedoch nicht mehr als Multiinstanz, erhalt ich als Ergebnis immer 0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab ich aus einem anderen Beitrag von Volker mal ebend rauskopiert:

  • s7 verwendet bei multiinstanzfähigen funktionsbausteienen das ar2 als basisadressregister für instanzdaten. beim aufruf einer instanz steht p#dbx0.0 im ar2 und alle zugriffe auf bausteinparameter oder statische lokaldaten im fb verwenden die registerindirekte bereichsinterne adressierung mit dem operandenbereich di über dieses register. ein aufruf eine lokalinstanz erhöht mit +ar2 p#y.x die basisadresse, so dass innerhalb des aufgerufenen fb, der den instanz-db des aufgerufenen fb verwendet, relativ zu dieser adresse zugeriffen werden kann. auf diese weise können fb sowohl als eigenständige instanz als auch als lokalinstanz(und hier an beliebiger stelle in einem fb, auch mehrfach) aufgerufen werden.
Sich doch mal im Forum unter "Multiinstanz"
 
Hallo Ralle,

habe das mit Ar2 ausprobiert, Wie kann ich diesen Wert Addieren, bzw. nutzen?

Wenn ich
L P##Wert
TAR2
+D

LAR1

und dann Zugriff mit
T B [Ar1,P#0.0]
macht die CPU die Krätsche und geht in Stopp :???:

Gruss
Frank
 
Hab mich mit dem Thema erst rel. wenig auseinandergesetzt, da ich die Multiinstanzen nicht so toll finde (ständig Probleme bei Programmänderungen, DB muß übersetzt werden etc.)

Hier mal noch etwas, eas ich mit extra mal aus einem Post gezogen hatte und den Adressoffset betrifft:

Code:
// Adressregister sichern und Offset ermitteln
      
      TAR1  #SaveAR1      // Adressregister 1 sichern #SaveAR1 <-- Temporärer Variable vom Typ DWord
      TAR2         // Adressoffset ermitteln
      L     DW#16#FFFFFF
      UD    
      T     #AdrOffset  // Adressoffset auf temporärer Variable ablegen #AdrOffset vom Typ DWord
      
      
      // Zeiger aufschlüsseln
      
      L     P##Zeiger_DB  // Zeiger laden Input-Variable vom Typ Pointer
      L     #AdrOffset  // Adressoffset dazuaddieren
      +D    
      LAR1         // Adresse ins Adressregister 1 laden
// Datenbausteinnummer herausziehen
      L     W [AR1,P#0.0] // Datenbausteinnummer aus Zeiger herausholen und in den Akku laden
      T     #DBNr     // Datenbausteinnummer auf Temporärer Variable ablegen #DBNr vom Typ Word
// Adresse herausziehen und ins Adressregister kopieren
      L     D [AR1,P#2.0] // Adresse aus Zeiger herausholen und in den Akku laden
      LAR1         // Adresse in das Adressregister laden
// Datenbaustein aufschlagen
      AUF   DB [#DBNr]    // zuvor ermittelten Datenbaustein aufschlagen
      
      
      
// Auf DB-Daten zugreifen Beispiele
   L     W [AR1,P#2.0]   // lädt im Datenbaustein bzw. Ab der angegebenen Adresse im Datenbaustein das 2. Wort      
   L     D [AR1,P#4.0]   // lädt im Datenbaustein bzw. ab der angegebenen Adresse im Datenbaustein das 2. Doppelwort
   
// Adressregister innerhalb des DB´s inkrementieren
   L     1              // Wert 1 in den Akku laden
   +AR1                 // Wert im Akku zum Adressregister dazuaddieren
   

//---------------------------------------------------------------------------   
// mit Schleife auf DB-Inhalte zugreifen Beispiel
//---------------------------------------------------------------------------

// Schleifenzaehler initialisieren
      L     0
      T     #Schleifenzaehler  // Temporärer Variable #Schleifenzaehler vom Typ INT
// Schleifenzaehler
Loop: L     #Schleifenzaehler
      L     15
      >=I   
      SPB   Ende
// Daten aus DB holen

      L     W [AR1,P#0.0]               // 1. Wort

      L     W [AR1,P#2.0]               // 2. Wort
      
// Schleifenzaehler und Adressregister erhoehen
      L     #Schleifenzaehler
      L     1
      +I    
      T     #Schleifenzaehler
      L     P#4.0
      +AR1  
      SPA   Loop

Ende: NOP   0

   
   
// Am Ende des FB´s muss das Adressregister 1 zurückgesichert werden !
      LAR1  #SaveAR1     // Adressregister 1 zurücksichern
 
Zurück
Oben