Step 7 Bereichslängenfehler AR2

mrtommyt

Level-2
Beiträge
130
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

habe ein Problem mit der Nutzung AR1/AR2 bei der indirekten Adressierung. Ich habe Testweise den Zähler auf 1 gesetzt. Tausch ich am Transferbefehl AR2 gegen AR1 kommt kein Fehler. Ansonsten kommt immer Bereichslängenfehler schreiben Adresse 540.
Der Datenbaustein geht bis DBB 558.
(CPU ist eine relativ alte 313-C FW 2.0.8)


Code:
// Pointer auf Quelle
      L     "DB 4 HMI System".Bildnummer.Ausgewaehlte_Typdaten
      T     #tTyp
      ITD   
      L     L#1                         // Adressbereich startet bei 0.0 => 17.0
      -D    
      L     L#18                        // Länge Datenbereich
      *D    
      SLD   3
      LAR1  
// Pointer auf Ziel
      L     L#540
      SLD   3
      LAR2  

// Zähler initialisieren
      L     1
aa:   T     #tcount

      L     DBB [AR1,P#0.0]
      T     DBB [AR2,P#0.0]
      +AR1  P#1.0
      +AR2  P#1.0

      L     #tcount
      LOOP  aa
end:  NOP   0
 
Hast du das AR2 vorher mit TAR2 gesichert und wird es nachher mit LAR2 wiederhergestellt? AR2 wird ja für Instanzen im FB automatisch im Hintergrund verwendet. Wo wird der DB geöffnet? Ist Quell- und Ziel-DB der gleiche? Sieht nämlich so aus. Ansonsten mit AUF DB und AUF DI arbeiten und z.B. T DIB verwenden.


Edit: Würde ein Blockmove in diesem Fall nicht reichen?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo funkey,

der Aufruf erfolgt in einem FC. Habe trotzdem mal TAR2 vor und LAR2 nach dem code geschrieben. Keine Besserung. Blockmove wäre schön, allerdings ist der eingangsstring dynamisch, hab grad keine idee das hin zu bekommen :( . Quell und Ziel-DB sind identisch AUF DBxxx.
 
TAR2 und LAR2 alleine nützen noch nichts. Das AR2 muss auch noch in einer Variable (DWORD) gespeichert werden bzw. von einer Variable wieder hergestellt werden.

Hier einige Ansätze wie das mit einem Any-Pointer zu lösen ist: [FONT=Verdana,Arial,Tahoma,Calibri,Geneva,sans-serif]https://www.sps-forum.de/simatic/11324-sfc20-blockmove-indirekt-adressiert.html[/FONT]
 
@senator...Auf DB steht drin, war im Auszug nicht zu sehen

Code:
      AUF   "DruckerJob"
// Pointer auf Quelle
      L     "DB 4 HMI System".Bildnummer.Ausgewaehlte_Typdaten
      T     #tTyp
      ITD   
      L     L#1                         // Adressbereich startet bei 0.0 => 17.0
      -D    
      L     L#18                        // Länge Datenbereich
      *D    
      SLD   3
      LAR1  
// Pointer auf Ziel
      L     L#540
      SLD   3
      LAR2  

// Zähler initialisieren
      L     1
aa:   T     #tcount

      L     DBB [AR1,P#0.0]
      T     DBB [AR2,P#0.0]
      +AR1  P#1.0
      +AR2  P#1.0

      L     #tcount
      LOOP  aa
end:  NOP   0
 
@senator...Auf DB steht drin, war im Auszug nicht zu sehen

Code:
      [COLOR="#FF0000"]AUF   "DruckerJob"[/COLOR] ---------------------------------------------------------+
// Pointer auf Quelle                                                             |
      L     [COLOR="#0000FF"]"DB 4 HMI System"[/COLOR].Bildnummer.Ausgewaehlte_Typdaten                    |
      T     #tTyp                                                                 |
      ITD                                                                         |
      L     L#1                         // Adressbereich startet bei 0.0 => 17.0  |
      -D                                                                          |
      L     L#18                        // Länge Datenbereich                     |
      *D                                                                          |
      SLD   3                                                                     |
      LAR1                                                                        |
// Pointer auf Ziel                                                               |
      L     L#540                                                                 |
      SLD   3                                                                     |
      LAR2                                                                        |
            <------------- AUF DB.. gehört hier hin ------------------------------+
// Zähler initialisieren
      L     1
aa:   T     #tcount

      L     DBB [AR1,P#0.0]
      T     DBB [AR2,P#0.0]
      +AR1  P#1.0
      +AR2  P#1.0

      L     #tcount
      LOOP  aa
end:  NOP   0
Das " AUF "DruckerJob" " steht an völlig falscher Stelle. Direkt in der nächsten Zeile wird es wieder zunichte gemacht durch das im vollqualifizierten L-Befehl integrierte " AUF "DB 4 HMI System" "
Willst Du eigentlich innerhalb eines DB umkopieren oder zwischen 2 DB? Dann müsste auch der zweite DB noch geöffnet werden.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
dp/dp war schneller: :smile:


AUF "DruckerJob"
---> L "DB 4 HMI System".Bildnummer.Ausgewaehlte_Typdaten // ist ja auch ein:
// AUF "DB 4 HMI System"
// L db......
 
aaarrrgh...is einfach zu lange her...blöder Fehler...thx

Code:
// Pointer auf Quelle
      L     "DB 4 HMI System".Bildnummer.Ausgewaehlte_Typdaten
      T     #tTyp
      ITD   
      L     L#1                         // Adressbereich startet bei 0.0 => 17.0
      -D    
      L     L#18                        // Länge Datenbereich
      *D    
      SLD   3
      LAR1  
// Pointer auf Ziel
      L     L#540
      SLD   3
      LAR2  

// Zähler initialisieren
      L     18
aa:   T     #tcount
      AUF   "DruckerJob"
      L     DBB [AR1,P#0.0]
      T     DBB [AR2,P#0.0]
      +AR1  P#1.0
      +AR2  P#1.0

      L     #tcount
      LOOP  aa
end:  NOP   0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin mrTommyt,

wie lang ist denn Dein IDB? Ich meine AR2 bezieht sich auf den IDB, oder?

Ich bin der Meinung, dass Du, weil Du ja nicht explizit eine anderen DI geöffnet hast, mit dem AR2 auf dem IDB des FBs rumorgelst. Du müsstest mit "AUF DI nnn" eine andere Nummer für den Instanz-DB öffnen. Dann aber Vorsicht mit STAT / IN / OUT /INOUT ! Die beziehen sich dann auf den geöffneten DI und das sogar, obwohl Du sie symbolisch verwendest. Mit Temp-Variablen sollte es gehen (tcounter).

Aber danach den IDB, der zum FB gehört wieder aufschlagen!

Übrigens: Bei Multiinstanzen enthält AR2 die Offsetadresse der angelegten Struktur des FB. Also beim zweiten Aufruf der Instanz steht im AR2 nicht mehr p#0.0 drin, sondern etwas anderes. Das gilt es zu beachten, wenn man mit dem AR2 hantiert und den FB als Multiinstanz verwenden will.

VG

MFreiberger
 
aaarrrgh...is einfach zu lange her...blöder Fehler...thx

Code:
...
// Zähler initialisieren
      L     18
aa:   T     #tcount
      AUF   "DruckerJob"
      L     DBB [AR1,P#0.0]
      T     DBB [AR2,P#0.0]
Auch blöde... durch das AUF.. in der Schleife wird der Code unnötig verlangsamt. Setze das AUF.. besser dahin wo Senator42 und ich empfohlen haben: vor die Schleife.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich meine AR2 bezieht sich auf den IDB, oder?

Ich bin der Meinung, dass Du, weil Du ja nicht explizit eine anderen DI geöffnet hast, mit dem AR2 auf dem IDB des FBs rumorgelst.
Nein, tut er nicht. Beide indirekten Befehle beziehen sich auf den mit AUF DB.. geöffneten DB "DruckerJob"
Code:
      AUF   "DruckerJob"
...
      L     [COLOR="#0000FF"]DBB[/COLOR] [AR1,P#0.0]
      T     [COLOR="#0000FF"]DBB[/COLOR] [AR2,P#0.0]
Nicht das AR1 oder AR2 bestimmt auf welchen DB es sich bezieht, sondern die Bereichskennung der Operation. Damit sich das "T DBB [AR2.." auf den DI bezieht müsste es heißen "T DIB [AR2.."
Code:
      L     [COLOR="#0000FF"]DBB[/COLOR] [AR1,P#0.0]
      T     [COLOR="#FF0000"]DIB[/COLOR] [AR2,P#0.0]

Harald
 
Code:
// Pointer auf Quelle
      L     "DB 4 HMI System".Bildnummer.Ausgewaehlte_Typdaten
      T     #tTyp
      ITD   
      L     L#1                         // Adressbereich startet bei 0.0 => 17.0
      -D    
      L     L#18                        // Länge Datenbereich
      *D    
      SLD   3
      LAR1  
// Pointer auf Ziel
      L     L#540
      SLD   3
      LAR2
So kann man das etwas effizienter formulieren:
Code:
// Pointer auf Quelle
      L     "DB 4 HMI System".Bildnummer.Ausgewaehlte_Typdaten
      T     #tTyp
      +     -1                          // 1..x --> 0..x-1
      L     18                          // Länge Datenbereich
      *D
      SLD   3
      LAR1
// Pointer auf Ziel
      L     P#540.0        //sollte besser "L P##MyBereich" sein, geht aber nur in FB auf STAT
      LAR2
Und wenn man das so programmiert, dann erscheint die Programmstelle mit dem Schreibzugriff sogar freundlicherweise in den Referenzdaten/Querverweisen:
Code:
// Pointer auf Quelle
      L     "DB 4 HMI System".Bildnummer.Ausgewaehlte_Typdaten
      T     #tTyp
      +     -1                          // 1..x --> 0..x-1
      L     18                          // Länge Datenbereich
      *D
      SLD   3
      LAR1
// Pointer auf Ziel
      L     P#540.0        //sollte besser "L P##MyBereich" sein, geht aber nur in FB auf STAT
      LAR2

[COLOR="#0000FF"]// für Referenzdaten/Querverweise
      SPA   adb
      T     DBx.DBB540     //(DBx durch DB-Nummer des DB "DruckerJob" ersetzen)

adb:[/COLOR]  AUF   "DruckerJob"   [COLOR="#0000FF"]//oder: L DBx.DBB0, dann erscheint auch das Lesen in den Querverweisen[/COLOR]

// Zähler initialisieren
      L     18
// Kopierschleife
aa:   T     #tcount
      L     DBB [AR1,P#0.0]
      T     DBB [AR2,P#0.0]
Harald
 
Zurück
Oben