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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: UDT in FB durchreichen

  1. #11
    Registriert seit
    16.06.2003
    Ort
    88356 Ostrach
    Beiträge
    4.811
    Danke
    1.231
    Erhielt 1.101 Danke für 527 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    also...

    1. das fummeln am AR2 ist in FBs recht gefährlich, du musst es nach verwendung unbedingt wieder zurücksichern. Der ganze Zugriff auf deine Statvariablen bassiert auf dem AR2, und wenn du den irgendwo verbiegst, dann pasen die Zugriffe danch nicht mehr...

    also vorher
    TAR2 #T_AR2
    und danach
    LAR2 #T_AR2

    #T_AR2 ist DWORD im temp bereich


    2. wie thomas schon sagte geht das mit INOUT so nicht, in dem Fall wird nicht die Struktur übergeben, sonder ein abgespeckter ANY-Zeiger, ein sogenanter "6-byte_pointer". das siehst du relativ leicht wenn du nach der struktur noch ne variable deklarierst, dann siehst du das der utd nur 6 byte hat...


    3. den aufbau von anypointer findest du ind er faq hier oder in der hilfe gut beschrieben, er enrhält im wesenltichen den db, die startadresse und die länge des datenblocks.
    ein "6-byte-pointer" enthält nur startadresse und länge

    4. ich würde anstelle des udt am inout einfach einen any an die in-schnittstelle machen, da kannst du später auch deine struktur symbolisch dranpacken. du hast dann mittels des ans im baustein alles was du brauchst um deine daten zu adressieren.
    der zugriff über inout mitels "6-byte-pointer" ist im mc7 code später auch nichts anderes als ein indirekter zugriff auf jede variable, sprich späte in der sps wird für jeden variablenzugriff ein pointer gerechnet - diese bausteine werden deshlab RIESIG im vergleich zur folgenden lösugn wo anfangs alle in den temp bereich kopiert und am ende wieder zurück wird.
    (riesig und die pointerrechnerei geht auch noch auf die laufzeit)

    5. vorschlag
    IN als any wo de struktur später aussen dran kommt(UDT_blabla)
    ANY im temp bereich deklarieren (ANY_Aktoren)
    struktur im temp bereich deklarieren (blabla)
    mit dem any einen pointer für nen blockmov (sfc20) bauen und umkopieren

    Pointer einlesen

    Code:
      L     P##UDT_blabla
          LAR1  
          L     B [AR1,P#0.0]               // Syntax-ID aus dem Any-Pointer auslesen
          T     #SyntaxID
          L     B [AR1,P#1.0]               // Bereichstyp auslesen (B#16#2 = Byte;  B#16#3 = Int; B#16#4 = Word;  B#16#7 = DInt; B#16#8 = DWord)
          T     #Bereichstyp
          L     W [AR1,P#2.0]               // Anzahl der zu übertragenden Werte (Byte/Word)
          T     #Anzahl_Werte
          L     W [AR1,P#4.0]               // DB-Nummer auslesen
          T     #DB_Nr
          L     D [AR1,P#6.0]               // Pointer Startadresse auslesen
          T     #Startadresse

    pointer für blockmove bauen

    Code:
     L     P##ANY_blabla
          LAR1  
          L     #SyntaxID
          T     B [AR1,P#0.0]               // Syntax-ID in den Any-Pointer schreiben
          L     #Bereichstyp
          T     B [AR1,P#1.0]               // Bereichstyp schreiben (B#16#2 = Byte; B#16#4 = Word)
          L     #Anzahl_Werte
          T     W [AR1,P#2.0]               // Anzahl der zu übertragenden Werte (Byte/Word)
          L     #DB_Nr
          T     W [AR1,P#4.0]               // DB-Nummer schreiben
          L     #Startadresse
          T     D [AR1,P#6.0]               // Pointer Startadresse schreiben
    daten in dem temp breich kopieren

    Code:
          CALL  "BLKMOV"
           SRCBLK :=#ANY_blabla
           RET_VAL:=#retval
           DSTBLK :=#blabla
    hier steht dein programm wo du die daten im temp bereich manipulierst bzw. die temp struktur auch an die aufgerufenen fcs übergibst (in denen kannst du ja so wie du es hast arbeiten - achte nur auf die codelänge wegen der zugriffe, wenn dir der code zu lange wird, kannst du es ja auch so machen wie beim fb


    am ende des fb muss der inhalt der temp struktur zurück in die anparametrierte struktur...

    Code:
          CALL  "BLKMOV"
           SRCBLK :=#blabla
           RET_VAL:=#retval
           DSTBLK :=#ANY_blabla
    "Es ist weit besser, große Dinge zu wagen, ruhmreiche Triumphe zu erringen, auch wenn es manchmal bedeutet, Niederlagen einzustecken, als sich zu den Krämerseelen zu gesellen, die weder große Freude noch großen Schmerz empfinden, weil sie im grauen Zwielicht leben, das weder Sieg noch Niederlage kennt." Theodore Roosevelt - President of the United States (1901-1909)

  2. Folgende 2 Benutzer sagen Danke zu Markus für den nützlichen Beitrag:

    thomasgull (27.02.2010),Thomas_v2.1 (26.02.2010)

  3. #12
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Sehr schön zusammengefasst Markus.

    Auch dass ein UDT-Parameter viel Speicher und Rechenleistung frisst ist gut zu erwähnen.
    Jedoch muss ich sagen, dass ich mich da mittlerweile nicht mehr drum schere. Die neuen 315 CPU sind so leistungsfähung, dass ich keine Lust mehr habe irgendwo zu Lasten der Übersichtlichkeit was an der Performance oder Speicherauslastung zu optimieren. Bei mir kommt erst der Algorithmus, dann die Optimierung (wenn es Engpässe gibt).
    Wenn man sich die Codesys-Steuerungen ansieht: da kann man nichtmal mehr sehen wie viel Speicher sein einzelner Baustein benötigt.

    Mit einem Any-Pointer kann ich alles machen, jedoch gebe ich damit auch jedwede Typ-Überprüfung seitens des Compilers auf (der Step7-Editor ist ein Compiler, wenn auch abgespeckt). Vergleichbar ist das in groben Zügen mit dem Void-Zeiger in der C-Programmierung. Dort hat der Compilier auch fast keine Möglichkeiten mehr die Korrektheit der Typen zu überprüfen.

  4. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    thomasgull (27.02.2010)

  5. #13
    thomasgull ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    16.12.2004
    Ort
    Winterthur, Schweiz
    Beiträge
    157
    Danke
    21
    Erhielt 3 Danke für 2 Beiträge

    Standard

    ist das ein Problem mit dem Temp bereich? ist ja nur für den Transfer in den IO bereich des nächsten Baustein.


    Thomas
    Geändert von thomasgull (27.02.2010 um 09:21 Uhr)

  6. Folgender Benutzer sagt Danke zu thomasgull für den nützlichen Beitrag:

    Markus (27.02.2010)

  7. #14
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Zitat Zitat von thomasgull Beitrag anzeigen
    ist das ein Problem mit dem Temp bereich? ist ja nur für den Transfer in den IO bereich des nächsten Baustein.
    Der Speicherbereich auf den der Zeiger dann im unterlagerten FB zeigt ist damit vom Typ "vorherige Lokaldaten" (V, Kennung 0x87).
    Ich habe damit schonmal rumexperimentiert und in PLCSim funktioniert das auf jeden Fall. Ich erinnere mich aber an ein Handbuch in dem stand, dass es diesen Speicherbereich nur bei den 400er CPUs gibt. Die Step7-Hilfe weist diese Beschränkung jedoch nicht aus.

  8. #15
    Registriert seit
    16.06.2003
    Ort
    88356 Ostrach
    Beiträge
    4.811
    Danke
    1.231
    Erhielt 1.101 Danke für 527 Beiträge

    Standard

    Zitat Zitat von thomasgull Beitrag anzeigen
    ist das ein Problem mit dem Temp bereich? ist ja nur für den Transfer in den IO bereich des nächsten Baustein.


    Thomas
    achso.. du meinst falll die aufgerufenen bausteine auch im temp bereich rumfummeln?
    ja, das kann ein problem geben bzw. ist nicht sauber... in dem fall legst du halt die struktur in den stat bereich des fb...

    sorry - das war ein fehler von mir!
    "Es ist weit besser, große Dinge zu wagen, ruhmreiche Triumphe zu erringen, auch wenn es manchmal bedeutet, Niederlagen einzustecken, als sich zu den Krämerseelen zu gesellen, die weder große Freude noch großen Schmerz empfinden, weil sie im grauen Zwielicht leben, das weder Sieg noch Niederlage kennt." Theodore Roosevelt - President of the United States (1901-1909)

  9. #16
    Registriert seit
    28.08.2008
    Beiträge
    56
    Danke
    2
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Hallo Markus!
    Sorry, daß ich den Thread aus der Versenkung hebe, vielleicht gibt es anderenorts schon weiterführende Infos...
    Das mit dem stat bereich ist gut, du meinst also die parametrierte UDT auch im Statbereich parametrieren und über den Anypointer mit BLKMOV die UDT dort hin kopieren?
    Aber wie kann ich die Adresse des UDT im STATbereich ermitteln wenn sich die UDT oder andere Parameter am FB geändert haben?
    grüße
    thomas

  10. #17
    Registriert seit
    05.12.2013
    Ort
    Graz / Austria
    Beiträge
    149
    Danke
    9
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Man könnte (?) auch "TRICK 22" benutzen ... nämlich den Befehl :

    TDB

    Die DB ,DIB sollen ... über TEMP Bereich kommunizieren ! Adressierung mit P##xxx und AR1 ...etc
    " P##xxx " wäre der erste Formalparameter in FB ....(der ist zugleich auch erster in DIB nach TDB )... alle Positionen in DIB nach TDB wären so über dem AR1 aufm DB-Anfang bezogen erreichbar .

    Keine Sorge beim OB1-zyklischem FB Aufruf wird immer die richtige DIB gewählt (die ist ja in der CALL FB Definition gegeben )
    Umkopieren würde dann über eine einfache Schleife gehen ... ohne ANY ... ohne BLOCKMOVE
    Alles symbolisch in TEMP ... SELBSTVERSTÄNDLICH

    (TEMP Daten werden von dem TDB Befehl nicht verändert)
    Geändert von Sioan (20.12.2013 um 02:10 Uhr)

  11. #18
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    @SPS.at:
    was genau möchtest du machen ?
    Der IN-Parameter (oder OUT-Parameter) eines FB ist vom Typ her festgelegt - den kannst du nicht variieren. Der Bereich bildet den ganzen UDT ab - das gibt also kein Problem.

    @Sioan - 00alex:
    Bitte nicht überall herum-spammen ... !!!

    Gruß
    Larry

  12. #19
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.480
    Danke
    1.141
    Erhielt 1.242 Danke für 973 Beiträge

    Standard

    Zitat Zitat von SPS.at Beitrag anzeigen
    Aber wie kann ich die Adresse des UDT im STATbereich ermitteln wenn sich die UDT oder andere Parameter am FB geändert haben?
    Du kannst symbolisch auf die UDT im Stat-Bereich zugreifen.
    Hier ein Code-Schnippsel von mir

    Code:
    // ----------------
    // Any-Pointer PSrc
    // ----------------
    // Adresse des Anypointer PSrc
          L     P##PSrc
          LAR1  
    // System-Code für Anypointer
          L     B#16#10
          T     B [AR1,P#0.0]
    // Datentype Byte
          L     B#16#2
          T     B [AR1,P#1.0]
    // DB-Nr 
          L     #BahnDBNr
          T     W [AR1,P#4.0]
    // StartByte-Nr
          L     P#DBX 0.0                   // Daten Platz 1
          T     D [AR1,P#6.0]
    // Anzahl der Bytes zum Kopieren
          L     280                         // Grösse UDT_Bahn
          T     W [AR1,P#2.0]
    // Daten von BahnDB nach Instanzdaten "Bahn" kopieren
          CALL  "BLKMOV"
           SRCBLK :=#PSrc
           RET_VAL:=#iRetVal
           DSTBLK :=#Bahn
    PSrc ist als Any-Pointer im Temp-Bereich definiert.
    Bahn ist als UDT im Stat-Bereich definert.

    Gruß
    Dieter

  13. Folgender Benutzer sagt Danke zu Blockmove für den nützlichen Beitrag:

    SPS.at (22.12.2013)

  14. #20
    Registriert seit
    28.08.2008
    Beiträge
    56
    Danke
    2
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke für die Antworten!
    @larry
    Es geht nach wie vor um das Durchreichen von IN/OUT-UDT's
    @blockmove
    Ganz steige ich bei deinem Beispiel noch nicht durch...
    Du kopierts die Daten von der unter PSrc hinterlegten Adresse auf den InstanzDB?
    Die Destinationadresse im IDB beginnt bei 0.0 und das UDT ist 280 Byte lang - bin ich soweit richtig?
    Was aber wenn sich die Länge des UDT ändert? Oder jemand einen zusätzlichen IN am FB Parametriert?
    grüße
    thomas

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 05.12.2010, 16:27
  2. Antworten: 9
    Letzter Beitrag: 25.05.2010, 18:31
  3. [?] Codesys Pointer durchreichen
    Von Kurt im Forum Sonstige Steuerungen
    Antworten: 7
    Letzter Beitrag: 10.01.2007, 14:29

Lesezeichen

Berechtigungen

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