Multiinstanz FB Zugriff auf Instanz DB von aufrufenden FB

Freki

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

habe schon einige Beiträge zu dem Problem von Pointern bei Multiinstanzen gelesen, bin aber nicht so richtig schlau daraus geworden.

Also, folgende Situation:
Im Instanz DB des aufrufenden FB`s sind Sollwerte für jede einzelne Arbeitsstation hinterlegt. Jede Arbeitsstation selber hat bis zu 11 mögliche Positionen die angefahren werden können, und dies jeweils für drei unterschiedliche Motoren. Das ergibt bei 12 Stationen, 12 Positionen und 3 Motoren immerhin 432 Datensätze. Nun soll natürlich pro Station in abhängigkeit der Positionsnummer der richtige Sollwert je Motor ausgegeben werden.

Zur Umsetzung:
Ich dachte an einen FB (1) in dessem Instanz DB alle Sollwerte hinterlegt sind. Die Verwaltung macht ein FB (2), der für jede station als Multiinstanz aufgerufen wird.
Somit übergebe ich an den FB (2) die Positionsummer und den Offest wert für den Speicherbereich (als Integer). Das wäre zum bsp für Station 2 der Wert 72. (12(pos)*2(Int)*3(motoren)).

bisheriger Code:
Code:
      TAR1  #dTempAR1
      TAR2  #dTempAR2

      L     #dTempAR1  //war nur testweise um zu sehen was die anzeigen
      L     #dTempAR2


      L     #Speicherbereich
      SLD   3
      T     #SpeicherW

      LAR1  P##SpeicherW
      TAR2  
      +AR1  

      L     W [AR1,P#0.0]
      L     DW#16#FF
      UW    
      LAR1  
// Schleife
      L     0
      T     #Schleife
M4:   L     #Schleife
      L     #Position
      ==I   
      SPBN  M3
      L     W [AR1,P#0.0]
      T     #Sollwert_M1

M3:   +AR1  P#6.0
      L     #Schleife
      INC   1
      T     #Schleife
      L     12
      <=I   
      SPB   M4

      LAR1  #dTempAR1
      LAR2  #dTempAR2

Ab dem Kommentar Schleife funktioniert alles. Dachte eine schleife für jeden Motor dann zu machen.

Problem: PLCSim geht in Stop, weil ein Fehler drin ist, ich jedoch nicht weiß woran es happert..........
Vielleicht kann mir hierzu ja einer weiterhelfen und sagen wie es geht, oder ob überschüssiger Code drin ist (zb die Register retten), bzw wie man das ganze schöner macht.
 
Zuletzt bearbeitet:
Noch besser:
Online die CPU Eigenschaften öfnnen und den "Stacks" Reiter öffnen.
Dort mit den "Open Block" Taste (deutsch "Block öffnen" ?) um genau dort in Program zu springen wo es schief geht.
 
Weiß zwar nicht wie du das meinst, aber beim Stack reiter kommt dass nur bei Halt oder Stop möglich. Und bei Stop sagt er dann netterweise dass keine B-Stack einträge verfügbar sind.
 
Noch besser:
Online die CPU Eigenschaften öfnnen und den "Stacks" Reiter öffnen.
Dort mit den "Open Block" Taste (deutsch "Block öffnen" ?) um genau dort in Program zu springen wo es schief geht.

Klar ist das noch besser, aber dafür wollte ich erstmal wissen ob der Stop nicht durch eine Zykluszeitüberschreitung ausgelöst wurde.
 
Hatte den OB121 zwischenzeitlich eingefügt. Hab den wieder rausgelöscht, aber trotzdem kommt nix vorhanden.

An der Zykluszeit kann es aber nicht liegen. hab die Schleife davor schon getestet, die funktioniert. Und was anderes das zur auslösen der Zykluszeitüberwachung führen kann habe ich ja nicht drin. Ne shcleife mit 12 Wiederholungen dürften ja noch machbar sein.......
 
Zuletzt bearbeitet:
Das Ziel ist ne CPU314C 2 PN/DP oder wie die sich schimpft. Habe aber gerade nur PLCSim zur Hand.
Hab jedoch bemerkt dass nach dem ganzen rumprobieren das Testprojekt mittlerweile inkosistent war. jetzt blinkt der systemfehler nur noch. Trotzdem bekomme ich den Aufruf nicht zustande.

Heißt dass denn dass der Aufruf so prinzipiell funktionieren müsste, oder sehe ich das falsch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn der Systemfehler blinkt hast du ja noch irgendwo einen Schmerz. Wie sieht jetzt dein Baugruppenzustand bzw. der Diagnosepuffer aus?

Ich könnte mir vorstellen dass dein DB zu kurz war - daher auch die Inkonsistenz.
 
Naja, hab jetzt mal wieder alles neu gestartet. Und jetzt stegt se wieder mit einem Lesefehler aus. Aber....... Im Stack steht jetzt:
OB1 --- -- DB1100
FB1100 -- DB1100 DB1100
FB1101 -- DB1100 DB1100
Falls das einem weiterhilft. Ansonsten lesefehler. FB1100 ist aufrufender FB. FB1101 soll auf Instanzdb von Fb1100 zugreifen (DB1100).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
B-Stack:
--------

Baustein    Symbol                   1. DB     2. DB     

 OB1        - - -                    - - -     DB1100    
 FB1100     - - -                    DB1100    DB1100    
 FB1101     Aufruf_Position          DB1100    DB1100    



L-Stack: Lokaldaten von OB1
---------------------------

Lokaldatenbytes (in Hexadezimalformat):

    0  -    9 :   11   03   01   01   C8   58   00   0A   00   0A
   10  -   19 :   00   1E   13   02   05   14   11   19   13   73
   20  -   25 :   00   00   00   00   01   00
Code:
L-Stack: Lokaldaten von FB1100
------------------------------

Lokaldatenbytes (in Hexadezimalformat):

    0  -    7 :   84   00   00   00   04   4C   01   00
Code:
L-Stack: Lokaldaten von FB1101
------------------------------

Lokaldatenbytes (in Hexadezimalformat):

    0  -    9 :   00   01   00   00   00   00   00   00   84   00
   10  -   11 :   02   70

Code:
U-Stack: Registerinhalte in Prioritätsklasse (OB1)
--------------------------------------------------


Unterbrechungsstelle

Prioritätsklasse:               1, OB1

Unterbrochener Baustein:        FB 1101
Fortsetzung in Baustein:        FB 1101


Aufgeschlagene DBs
                    1. DB    2. DB
Nummer:             DB 1100       DB 1100
Größe in Byte:      92            92


Registerwerte an der Unterbrechungsstelle

Register            Wert                     Anzeigeformat       
Akku1:              0000  0000               Hex                 
Akku2:              0000  0001               Hex                 
Akku3:              0000  0000               Hex                 
Akku4:              0000  0000               Hex                 

Adr.-Reg.1:         6.0                      Adresse             
Adr.-Reg.2:         DB 78.0                  Adresse             

Statuswort:         
                    BIE  A1   A0   OV   OS   OR   STA  VKE  /ER  
                    1    0    0    0    0    0    1    1    0
 
Zuletzt bearbeitet:
Also wenn ich das richtig verstehe (Hab das mit den Stacks noch nie benutzt, da ich die indirekte Adressierung bisher nicht verwendet habe) versucht der auf den DB78.6 zuzugreifen. Und den gibt es logischerweise ja nicht...........
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moment. Ganz langsam.

Wenn ich dich richig verstehe steht im AR1 "DB 878.6"

Das heißt dann, in verbindung mit dem Befehl L W[AR1,P#0.0] dass die CPU das Wort aus dem Datenbaustein, mit der Nummer in DB-Register 1 und der Adresse 878.6 laden soll. Und schon haben wir wieder ein Problem. Bei Lade-Befehlen sind nur Adressen mit der Bit-Adresse 0 zulässig.
Als nächstes fällt mit auf dass du deine Sollwerte ja im Instanz-DB haben wolltest wenn ich mich recht erinnere. Dann sollte aber in deinem AR1 DI 878.6 stehen.

Also passt irgendwas mit der Berechnung der Adresse nicht.
 
Du schreibtst irgendwo in deinem Code:

Code:
[COLOR=#333333]
      L     #Speicherbereich      
      SLD   3 
     T     #SpeicherW 
     LAR1  P##SpeicherW 
     TAR2        +AR1 
       L     W [AR1,P#0.0] 
     L     DW#16#FF 
     UW 
         LAR1 
 [/COLOR]

Was steht in deiner Variable Speicherbereich?
 
Kannst du mir erklären wie du auf 878.6 kommst?
Eigentlich sollte die DB-Nummer 1100 sein (da InstanzDB vom aufrufenden Fb). und die Adresse wäre dann logischerweise 0, da ja n integer-Wert gelesen werden soll.
Somit gebe ich dir vollkommen recht dass mit der Adress-berechnung was nicht passt. Leider komme ich nur nicht drauf was.

Speicherbereich muss = 6 sein. Ist mir gersade mal aufgefallen als ich den Db angeschaut habe.
 
Zuletzt bearbeitet:
Zurück
Oben