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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 29

Thema: ANY-Pointer auf temporären Struct im FB

  1. #1
    Registriert seit
    14.10.2008
    Beiträge
    44
    Danke
    8
    Erhielt 3 Danke für 2 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute...

    Ich bin gerade dabei mich ein wenig in die any Pointer einzuarbeiten...

    Folgenden Gegebenheiten: Ich bin berade dabei ein Motorbaustein für diverse Antriebe zu schreiben. In einem seperaten DB befinden sich die Daten (jeweils 50Byte) für die Antriebe.

    Ich möchte nun am Anfang des Motor-FBs die Daten aus dem DB in einen struct (gleich aufgebaut wie Motordaten im DB) im temporären Bereich des Fb's laden. Der FB arbeitet dann seine übrigen Funktionen ab und schreibt es am Ende wieder zurück.

    Ich hab mir dabei gedacht das man dem Baustein die DBNr und den Anfang und die Länge übergibt. Mit den Daten kann ich dan einen Quellzeiger aufbreiten.
    Mit dem Tutorial http://sps-forum.de/showthread.php?t=12923 hab ich den Quellzeiger für den BLKMOV schon hinbekommen.

    #IN : Quelle_DBNR (INT) 0.0
    Quelle_Anfang (INT) 2.0
    Quelle_Laenge (INT) 4.0

    #Temp: Zeiger_Quelle (any) 0.0
    Zeiger_Ziel (any) 10.0
    Motordaten (struct) 20.0

    //Quellzeiger
    L P##Zeiger_Quelle
    LAR1
    L W#16#1002
    T LW [AR1,P#0.0]
    L #Quelle_DBNR
    T LW [AR1,P#4.0]
    L #Quelle_Anfang
    SLD 3
    OD DW#16#84000000
    T LD [AR1,P#6.0]
    L #Quelle_Laenge
    T LW [AR1,P#2.0]

    Jetzt happert es nur am Zielzeiger für den temporären Struct. Wie muss der ausschauen?

    Mit Bitte um Hilfe
    Christian
    Zitieren Zitieren ANY-Pointer auf temporären Struct im FB  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    das müßte dann ungefähr so aussehen :
    Code:
    //Quellzeiger
    L P##Zeiger_Ziel
    LAR1 
    L W#16#1002
    T LW [AR1,P#0.0]
    L 0
    T LW [AR1,P#4.0]
    L p##Motordaten
    OD DW#16#86000000
    T LD [AR1,P#6.0]
    L #Quelle_Laenge
    T LW [AR1,P#2.0]
    .. ist nicht getestet ...

    Gruß
    LL

  3. #3
    Registriert seit
    14.10.2008
    Beiträge
    44
    Danke
    8
    Erhielt 3 Danke für 2 Beiträge

    Standard

    Aha wie ich sehe war ich schon nahe dran... (siehe übersprungenen Codeteil)

    @ Larry ich hab deinen Codeteil mal in Folgenendem Beispielprojekt implementiert.

    Motor-DB: DB10 3Byte lang

    Aufruf des Motor-FBs in OB1 mit den Werten:
    Quelle_DBNR: 10
    Quelle_Anfang: 0
    Quelle_Länge: 3

    Motorbaustein:
    Code:
    //Quellzeiger aufbreiten
          L     P##Zeiger_Quelle
          LAR1  
          L     W#16#1002
          T     LW [AR1,P#0.0]
          L     #Quelle_DBNR
          T     LW [AR1,P#4.0]
          L     #Quelle_Anfang
          SLD   3
          OD    DW#16#84000000
          T     LD [AR1,P#6.0]
          L     #Quelle_Laenge
          T     LW [AR1,P#2.0]
    
    //Zielzeiger aufbreiten (Eigen)
          SPA   M001
    
          L     P##Zeiger_Ziel
          LAR1  
          L     W#16#10
          T     LB [AR1,P#0.0]
          L     W#16#2
          T     LB [AR1,P#1.0]
          L     #Quelle_Laenge
          T     LW [AR1,P#2.0]
          L     0
          T     LW [AR1,P#4.0]
          L     20
          SLD   3
          T     LD [AR1,P#6.0]
          L     B#16#86
          T     LB [AR1,P#6.0]
    M001: NOP   0
    
    //Zielzeiger aufbreiten (Larry)
          L     P##Zeiger_Ziel
          LAR1  
          L     W#16#1002
          T     LW [AR1,P#0.0]
          L     0
          T     LW [AR1,P#4.0]
          L     P##Motor
          OD    DW#16#86000000
          T     LD [AR1,P#6.0]
          L     #Quelle_Laenge
          T     LW [AR1,P#2.0]
    
    //Daten laden
          CALL  "BLKMOV"
           SRCBLK :=#Zeiger_Quelle
           RET_VAL:=#Fehlercode
           DSTBLK :=#Zeiger_Ziel
    
    //Interne DB-Funktionen
          L     #Motor.Byte1
          L     #Motor.Byte2
          +I    
          T     #Motor.Byte3
    
    //Daten rausschreiben
          CALL  "BLKMOV"
           SRCBLK :=#Zeiger_Ziel
           RET_VAL:=#Fehlercode
           DSTBLK :=#Zeiger_Quelle

    Leider hatte ich damit noch keine Erfolg. Die BLKMOV liefern beide Fehlercodes (33573 und 33060) und wenn ich die Bytes im Fb beobachte bleiben sie auch leer. Leider

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

    Standard

    wieso baust du dir einen zielzeiger?
    zeiger_ziel ist doch schon ein any-pointer im tempbereich. lass deine aufbereitung mal weg
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  5. #5
    Registriert seit
    14.10.2008
    Beiträge
    44
    Danke
    8
    Erhielt 3 Danke für 2 Beiträge

    Standard

    @ volker: wie meinst du das?

    Sicher ist Zeiger Ziel bereits ein Any-Pointer. Aber er zeigt ja noch nicht auf den struct im temporären Bereich des FB oder???

    irgendwie muss der BLKMOV ja wissen wo er die Daten hischreiben soll.

    Das heißt ich muss irgendwie einen Any-Pointer erzeugen der auf diese Stelle im temporären Bereich zeigt.
    Geändert von ChristianPaier (15.07.2009 um 10:47 Uhr)

  6. #6
    Registriert seit
    14.10.2008
    Beiträge
    44
    Danke
    8
    Erhielt 3 Danke für 2 Beiträge

    Standard

    Ich bin jetzt schon mal soweit das es im beispiel mit 3Bytes funktioniert...
    Das Problem ist nur ich weiß nicht wieso!

    Code:
    //Quellzeiger aufbreiten
          L     P##Zeiger_Quelle
          LAR1  
          L     W#16#1002
          T     LW [AR1,P#0.0]
          L     #Quelle_DBNR
          T     LW [AR1,P#4.0]
          L     #Quelle_Anfang
          SLD   3
          OD    DW#16#84000000
          T     LD [AR1,P#6.0]
          L     #Quelle_Laenge
          T     LW [AR1,P#2.0]
    
    //Zielzeiger aufbreiten
          L     P##Zeiger_Ziel
          LAR1  
          L     W#16#1002
          T     LW [AR1,P#0.0]
          L     0
          T     LW [AR1,P#4.0]
          L     20
          SLD   3
          OD    DW#16#87000000 <<-- ACHTUNG SIEHE HIER
          T     LD [AR1,P#6.0]
          L     3
          T     LW [AR1,P#2.0]
    
    //Daten laden
          CALL  "BLKMOV"
           SRCBLK :=#Zeiger_Quelle
           RET_VAL:=#Fehlercode
           DSTBLK :=#Zeiger_Ziel
    
    //Daten ändern
          L     #Motor.Byte1
          L     #Motor.Byte2
          +I    
          T     #Motor.Byte3
    
    //Daten zurückschreiben
    
          CALL  "BLKMOV"
           SRCBLK :=#Zeiger_Ziel
           RET_VAL:=#Fehlercode
           DSTBLK :=#Zeiger_Quelle
    Ich hab als Speicherbereich des Zielzeigers 87 statt 86 verwendet. Jetzt funktioniert es. Aber warum? Schließlich ist 87 der Speicherbereich "Vorherige Lokaldaten" und 86 steht für "Lokaldaten (L-Stack)".

    Was ist der unterschied zwischen beiden. Warum funktioniert das so????

  7. #7
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    Hallo Christian,

    Zitat Zitat von ChristianPaier Beitrag anzeigen
    Ich hab als Speicherbereich des Zielzeigers 87 statt 86 verwendet. Jetzt funktioniert es. Aber warum? Schließlich ist 87 der Speicherbereich "Vorherige Lokaldaten" und 86 steht für "Lokaldaten (L-Stack)".

    Was ist der unterschied zwischen beiden. Warum funktioniert das so????
    der SFB 20 greift mit 87 auf die Lokaldaten deines Motor-FBs zu. Mit 86 würde er auf seine eigenen Lokaldaten zugreifen.

    Grüße
    Gebs

  8. #8
    Registriert seit
    14.10.2008
    Beiträge
    44
    Danke
    8
    Erhielt 3 Danke für 2 Beiträge

    Standard

    Aha, verstehe schon.

    Das heist das es eigentlich vorher hauptsächlich (ich sag bewusst hauptsächlich) am falschen Speicherbereich gelegen hat. Oder?

  9. #9
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    So sehe ich das auch!

    Grüße
    Gebs

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von ChristianPaier Beitrag anzeigen
    @ volker: wie meinst du das?

    Sicher ist Zeiger Ziel bereits ein Any-Pointer. Aber er zeigt ja noch nicht auf den struct im temporären Bereich des FB oder???

    irgendwie muss der BLKMOV ja wissen wo er die Daten hischreiben soll.

    Das heißt ich muss irgendwie einen Any-Pointer erzeugen der auf diese Stelle im temporären Bereich zeigt.
    da du die ganze zeit vom temporären bereich geschrieben hast, bin ich davon ausgegangen das du im deklarationsbereich temp meinst.
    so wie es jetzt aussieht, meintest du aber den stat - bereich.
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 08.04.2011, 14:36
  2. Struct vergleich mit pointer und sizeof
    Von hago10 im Forum CODESYS und IEC61131
    Antworten: 17
    Letzter Beitrag: 31.01.2011, 18:22
  3. SCL: Pointer auf Struct in DB
    Von DunderHEAD im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 13.08.2010, 10:05
  4. Twincat POINTER STRUCT
    Von Basstarono im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 21.07.2008, 11:30
  5. pointer über temp struct...
    Von Jochen Kühner im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.09.2006, 10:23

Lesezeichen

Berechtigungen

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