Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 34

Thema: Pointer <- Indirekter DB möglich ?

  1. #11
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    So nun für die Nachwelt die Version für die ich mich nun entschieden habe:

    @Volker: Da war noch ein Tippfehler drin bei dir in der Version von deiner Homepage - T LB1 0 sollte mit sicherheit T LB 1 heissen...

    Mein Verwendungszweck ist der daß ich nun meinen "Alarm_FB" (beinhaltet die komplette Abwicklung der Alarm_S / Alarm_SQ geschichte) nun endlich auch multiinstanzfähig hinbekommen habe !

    Der Pointer ist zuständig für die Übergabe der jeweiligen Begleitwerte an die SFC 17 / 18 Aufrufe. Er bildet sich aus dem Instanzdatenbaustein des FBs, der Länge und der Anfangsadresse (hier Beginn des STAT-Bereichs)

    So baute ich nun im ersten Netzwerk folgendes ein, und kann - da die Struktur immer gleich ist die Nummer des Instanz-DBs von aussen reinschieben !

    Für alle die es interressiert:

    Code:
    // Den Begleitwerten einmalig den passenden Instanzdatenbaustein zuweisen
    // Hierzu einen ANY_Pointer verwenden:
    // Pointer im Format für die Begleitwerte der Alarm_S und SQ SFCs bilden
          L     B#16#10                     // TYP (Teil1): 10h für s7
          T     LB     0
          L     B#16#2                      // TYP (Teil2): BYTE
          T     LB     1
          L     12                          // Anzahl (Bytes) ab Startadresse
          T     LW     2
          L     #DI_Number                  // Nummer des Datenbausteins (IN:INT)
          T     LW     4
          L     1200                        // Startadresse im DB (Beginn STAT-Bereich)
          SLD   3                           // Pointer erzeugen
          T     LD     6
          L     B#16#85                     // Speicherbereichstyp: 85h für IDB
          T     LB     6
    // Der hiermit erzeugte Pointer liegt nun im TEMP-Bereich ab Adresse 0
    // Dort eine Variable #Begleitwerte des Typs ANY anlegen und bei SD zuweisen.
    edit: Speicherbereichstyp von 84 auf 85 geändert (da Instanz-DB) !
    Geändert von rs-plc-aa (24.03.2007 um 12:59 Uhr) Grund: Code korrigiert.
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  2. #12
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    ...
    Jetzt muss ich die Geschichte doch noch mal aufgreifen - leider.

    Also ich stehe jetzt kurz vor der Abnahme der Anlage und musste mich mit allerhand Kram rumärgern (Teile kamen nicht rechtzeitig / defekt - usw.) und hatte im zuge der IB manchmal schon ein wenig gestutzt daß bis jetzt noch kein Begleitwert funktionierte (immer 0). Heute hatte ich dann mal Zeit der Sache auf den Zahn zu fühlen.

    Die beschriebene Methode muss irgendwo noch einen Fehler haben - ich habe nun mal zum Test an einer Störung die ich auf jeden Fall herbei bringe und die einen Begleitwert hat am SD-Eingang der SFC17 den AnyZeiger entfernt und direkt den ersten (in dem Fall einzigen) Begleitwert direkt angegeben -> das hat funktioniert

    Das bedeutet also daß am Panel der richtige Text mit dem passenden Begl.Wert ankam.

    Was also geht an dem AnyZeiger nicht ?

    Der AnyZeiger wird am Beginn des FBs gebildet und verweist im Prinzip auf den aktuellen Instanzdatenbaustein des Alarm-FBs, genauer gesagt auf dessen Beginn des STAT-Bereichs. Hier sind 3 Begleitwerte deklariert die vor jedem Aufruf einer SFC 17/18 mit den passenden Werten gefüllt werden. Im Endeffekt wird das so benötigt da die SFC 17/18 nur alle Begleitwerte in einem Rutsch einlesen kann, also bei mehr als einem mit einem Pointer. Das hatte bisher bei nur einer einzigen Instanz funktioniert da der Pointer die Adresse des IDBs beinhaltete. Nun möchte ich aber den selben FB in mehreren Instanzen laufen lassen - daher benötige ich nun einen Umweg um die Adresse anzugeben. Der Ansatz war eigentlich auch schlüssig nur verstehe ich jetzt nicht so ganz was da nicht gehen soll.

    ABER: Vielleicht geht das ja noch viel einfacher...

    Ne Alternative hätte ich schon mal ausgedacht:

    Warum den Umweg überhaupt über den STAT-Bereich machen ? Wäre es nicht schon ausreichend die Begleitwerte in den TEMP-Bereich zu verschieben und einen "normalen" Pointer darauf zu richten ?

    Damit stets der korrekte Wert mitgegeben wird muß dieser ja sowieso immer neu zugewiesen werden.

    Sprich: Die Begleitwerte müssen ja gar nicht gespeichert werden da sie beim nächsten SFC17/18 Aufruf im selben FB ohnehin immer erneuert werden müssen...

    Bin mir jetzt auch ziemlich sicher daß das klappen würde, nur hätte ich trotzdem zu gern gewusst was da jetzt mit dem AnyZeiger nicht geht.
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________
    Zitieren Zitieren Irgendwas stimmt da doch noch nicht  

  3. #13
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 183 Danke für 168 Beiträge

    Standard

    Hallo!

    Stelle sonst mal deinen Pointer so wie du ihn gemacht hast hier herein.

    Ich mache es so: (Habe ich jetzt auf einen Instanz DB geändert)
    Code:
    //Für Flexible gestalteten Datenbaustein
          L     DINO                        //Wenn der Pointer in dem FB gebildet wird von dem du auf den Instanz Datenbaustein zugreifen willst (DINO = Nummer des Insatnzdatenbaustein)
          T     #DB_Nummer                  //Es kann aber auch ein X beliebige Datenbaustein Nummer (vorrausgesetzt es gibt den Datenbaustein) in DB_Nummer Transferiert werden
     
    //ANY Pointer für Datentypen
          L     P##Temp_ANY_Pointer_in      //Lade Pointer von Variable
          LAR1                              //Schreibe Pointer in Adressregister 1
          L     B#16#10                     //Syntax ID für Step7
          T     LB [AR1,P#0.0]
          L     B#16#2                      //Wert für TYP: 1 Bool, 2 Byte, 3 Char, 4 Word, 5 Int, 6 Dword, 7 Dint, 8 Real, 9 Date, A TOD, B Time, C S5Time, E DT, 13 String
          T     LB [AR1,P#1.0]
          L     DILG                        //Anzahl der zu Übertragenden Daten zb. für 5 Byte einfach 5 (in diesem fall wird der ganze DB kopiert, Bei globalen DB den Befehl DBLG)
          T     LW [AR1,P#2.0]
          L     #DB_Nummer                  //Datenbausteinnummer
          T     LW [AR1,P#4.0]
          L     P#DBX 0.0                   //Bereichszeiger, in diesem Fall vom ersten Bit an. Wenn von Byte 10 an erwünscht dann  P#DBX 10.0 
          T     LD [AR1,P#6.0]
     
          CALL  SFC   20
           SRCBLK :=#Temp_ANY_Pointer_in
           RET_VAL:=MW0
           DSTBLK :=#Temp_ANY_Pointer_out
     
    Alle Variablen sind im Temp bereich abgelegt
    Temp_ANY_Pointer_in : ANY ; 
    Temp_ANY_Pointer_out : ANY ; 
    DB_Nummer : INT ;
    Ich hoffe es hilft dir nochmals weiter.

    godi

  4. #14
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Na ja ich hatte es so wie es oben gepostet ist - also:
    Code:
    // Den Begleitwerten einmalig den passenden Instanzdatenbaustein zuweisen
    // Hierzu einen ANY_Pointer verwenden:
    // Pointer im Format für die Begleitwerte der Alarm_S und SQ SFCs bilden
          L     B#16#10                     // TYP (Teil1): 10h für s7
          T     LB     0
          L     B#16#2                      // TYP (Teil2): BYTE
          T     LB     1
          L     12                          // Anzahl (Bytes) ab Startadresse
          T     LW     2
          L     #DI_Number                  // Nummer des Datenbausteins (IN:INT)
          T     LW     4
          L     1200                        // Startadresse im DB (Beginn STAT-Bereich)
          SLD   3                           // Pointer erzeugen
          T     LD     6
          L     B#16#85                     // Speicherbereichstyp: 85h für IDB
          T     LB     6
    // Der hiermit erzeugte Pointer liegt nun im TEMP-Bereich ab Adresse 0
    // Dort eine Variable #Begleitwerte des Typs ANY anlegen und bei SD zuweisen.
    Ok die Übergabe von #DI_Number wäre überflüssig wenn man L DINO verwendet, klar.

    Was bei deinem Beispiel für mich nicht klar ist - und das ist ja genau das Thema wo ich null Ahnung von habe - was mit dem Adressregister passiert?

    Ganz einfach formuliert hätte es ein variabler Pointer werden sollen der unabhängig welche Nummer der aktuelle Instanz-DB hat -> immer auf den Beginn des STAT_Bereichs zeigt, weil dort die drei einzelnen Begleitwerte zwischengespeichert werden die nur als "12 Byte Stück" der SFC 17/18 mitgegeben werden können...

    Daher meine Idee das aus dem STAT Bereich rauszuschmeißen und in den TEMP Bereich verschieben.

    Dann würde der Pointer IMMER z.B. P#L0.0 Byte 12 heissen - an jedem SFC17/18 CALL. Der aktuelle Wert muss ja ohnehin passend zur Meldung UNMITTELBAR vorher reinkopiert werden.
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  5. #15
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 183 Danke für 168 Beiträge

    Standard

    Habe dir das mit der indirekten Adressierung noch mal Kommentiert villeicht hilfts weiter. Ansonsten im Forum suchen und die Hilfe von S7 lesen. Da ist das ganze auch brauchbar beschrieben.

    Code:
    //Für Flexible gestalteten Datenbaustein
          L     DINO                        //Wenn der Pointer in dem FB gebildet wird von dem du auf den Instanz Datenbaustein zugreifen willst (DINO = Nummer des Insatnzdatenbaustein)
          T     #DB_Nummer                  //Es kann aber auch ein X beliebige Datenbaustein Nummer (vorrausgesetzt es gibt den Datenbaustein) in DB_Nummer Transferiert werden
    //ANY Pointer für Datentypen
          L     P##Temp_ANY_Pointer_in      //Lade Pointer von Variable
          LAR1                              //Schreibe Pointer in Adressregister 1. Jetzt steht die Anfangsadresse der Variable im Adressregister 1 (wenn du in der Deklaration den Temp Bereich aufmachst hast du eine Spalte wo die Adresse steht. Dieser Wert steht jetzt im AR 1)
          L     B#16#10                     //Syntax ID für Step7
          T     LB [AR1,P#0.0]              //Transferiere Syntax ID für Step7 in das Byte 0 von Temp_ANY_Pointer_in (Warum Byte 0? Wegen dem P#0.0 => gibt Offset an)
          L     B#16#2                      //Wert für TYP: 1 Bool, 2 Byte, 3 Char, 4 Word, 5 Int, 6 Dword, 7 Dint, 8 Real, 9 Date, A TOD, B Time, C S5Time, E DT, 13 String
          T     LB [AR1,P#1.0]              //Hier wird in Byte 1 Transferiert weil AR1 + P#1.0 = Byte 1 von Temp_ANY_Pointer_in
          L     DILG                        //Anzahl der zu Übertragenden Daten zb. für 5 Byte einfach 5 (in diesem fall wird der ganze DB kopiert, Bei globalen DB den Befehl DBLG)
          T     LW [AR1,P#2.0]              //Hier wird das AR1 um P#2.0 erhöht. Also jetzt wird das Byte 2 angesprochen 
          L     #DB_Nummer                  //Datenbausteinnummer
          T     LW [AR1,P#4.0]
          L     P#DBX 0.0                   //Bereichszeiger, in diesem Fall vom ersten Bit an. Wenn von Byte 10 an erwünscht dann  P#DBX 10.0 
          T     LD [AR1,P#6.0]
    
          CALL  SFC   20
           SRCBLK :=#Temp_ANY_Pointer_in
           RET_VAL:=MW0
           DSTBLK :=#Temp_ANY_Pointer_out
     
    Alle Variablen sind im Temp bereich abgelegt
    Temp_ANY_Pointer_in : ANY ; 
    Temp_ANY_Pointer_out : ANY ; 
    DB_Nummer : INT ;

  6. #16
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Ok, ich komm schon in etwa mit...

    Jetzt dämmerts glaube ich schon langsam.

    Der von mir gepostete Code macht doch eigentlich das selbe nur wird dort direkt in den Lokaldatenbereich geschrieben.

    Q1: Warum also überhaupt das Adressregister benutzen ? - Geht es NUR so ? (vielleicht geht es bei mir deshalb nicht?)

    Q2: Muss dies vor JEDEM Ansprechen der Daten erneut ausgeführt werden ? - Ich habe das ja nur am Anfang des FBs stehen und es soll für alle Operationen die danach den Speicherbereich verwenden gültig sein -> geht es vielleicht deshalb nicht ?
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  7. #17
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    vom prinzip sollte dein zeiger funktionieren.
    siehe mal ein bild

    im unteren beispiel baust du den zeiger indirekt.
    bei der anweisung lar1 siehst du, dass im ar1 die anfangsadresse 12.0 steht wie auch im deklarationsbereich.
    die folgenden anweisungen mit dem ar1 beziehen sich nun auf diese anfangsadresse.
    T LD [AR1,P#6.0]
    dies transferiert also in das ld18

    der vorteil ist offensichtlich.
    fügst du ein variable vor dem any-zeiger in den dekl.bereich ein verschieben sich seine adressen und bei direkter adressierung müsstest du dein programm anpassen. bei indirekten ist das egal, da du ja mit
    L P##varany
    LAR1
    die anfangsadresse des any-zeigers ins ar lädst.
    Angehängte Grafiken Angehängte Grafiken
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  8. #18
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Soweit klar,
    nur wenn ich das auf meinen Fall umlege dann sieht das so aus:

    Du lädst "33" in den DB, baust den Zeiger und setzt Ihn an "SRCBLK"...

    Ich baue den Zeiger, lade anschließend "33" und setze ihn an "SRCBLK"...

    Dann fasse ich den Zeiger nicht mehr an und lade dann z.B. "44", transferiere das in den DB und gehe davon aus daß der Zeiger immer noch dort hinzeigt - setze also ohne ihn erneut zu bauen an "SRCBLK" und dachte daß dann "44" übertragen wird...

    Ist hier der Fehler ?
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  9. #19
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    die richtung ist völlig egal.
    der anyzeiger bleibt dir auf jeden fall erhalten.
    prüfe mal, ob du irgendwo im baustein in den lokaldatenbereich schreibst.
    Angehängte Grafiken Angehängte Grafiken
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  10. #20
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    mach ich...

    Melde mich dann wieder.
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 06.11.2009, 13:03
  2. Indirekter Bausteinaufruf
    Von Supervisor im Forum Simatic
    Antworten: 26
    Letzter Beitrag: 03.12.2007, 11:47
  3. SCL - Indirekter Zugriff auf DB/AR1,2
    Von Floh im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 07.06.2006, 10:32
  4. Indirekter Datenbausteinaufruf in SCL
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 13.09.2005, 14:47
  5. indirekter DB zugriff
    Von bassknecht im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 20.08.2005, 12:44

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •