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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Übergabe von Datenbereichen in einen Funktionsblocl

  1. #1
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich hab mal wieder eine Frage

    und zwar möchte ich einen Funktionsbaustein erzeugen, welcher als Input Variable einen ANY Zeiger für Datentypen und UDTs verarbeiten kann. Irgendwie bekomme ich nur Pointer die ich dann zwar zu Any Zeigern umbauen kann nur fehlt mir dann halt der Wiederholungsfaktor. Ich habe die Input Variable zwar als ANY Datentyp angegeben bekomme aber trotzdem einen Pointer. Mit den UDTs komme ich im moment gar nicht weiter.

    Gruß Tim
    Zitieren Zitieren Übergabe von Datenbereichen in einen Funktionsblocl  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo,
    es werden dir für diese Variablentypen (ARRAY, STRUCT, UDT, ANY etc.) generell Pointer erzeugt, die auf die Speicherstelle zeigen an der der Quell-Datentyp (also in deinem Fall der ANY) definiert ist - aslo der daten-Inhalt davon steht.

    Gruß
    Larry

  3. #3
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    okay, was bringt es dann den Datentyp beim Input auf Any zu stellen wenn ich so oder so einen Pointer bekomme?

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Es wird ja ein Datenbereich vom Typ ANY (z.B.) erzeugt - nur nicht in der Schnittstelle ... dort steht nur wo die Daten (also die Inhalte) des ANY stehen. Du mußt also die 10 Byte des Any (oder die 100 Byte des UDT z.B.) an/ab der Speicherstelle laden, auf die der Pointer zeigt - nicht aber aus dem Pointer einen ANY machen - das wäre falsch ...

  5. #5
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    achso und wie genau mach ich das?

  6. #6
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    ich hab mir jedes Byte von den Input Zeigern angeguckt, diese Bytes haben genau die Anordnung die ich versucht hatte nach zubauen . Das Problem was aber noch besteht ist das ich die Daten auf die dieser Zeiger zeigt mit BLOCLMOVE (SFC20) in einen Array in der Instanzdatenbaustein laden will. Jedoch bekomme ich da einen Fehler : "Konstantenformat zu datentyp Pointer paßt nicht zu formalen Datentyp Any des Formalparameters SRCBLK". Warum erkennt die Funktion SFC20 nicht das der Eingang ein ANY zeiger ist? Oder hab ich da was falsch verstanden?

  7. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Ich muß mich erstmal korrigieren ...!!!

    Die Aussage, die ich gemacht habe, bezog sich auf die Verwendung dieser Variablen im Bereich IN_OUT eines FB !!!
    Auf der IN-Schnittstelle werden die direkt abgebildet. Du kannst da also auch direkt drauf zugreifen.

    Jetzt stellt sich mir allerdings die Frage, was du da machst und vor Allem wie du es machst ...
    Du hast eine IN-Variable vom Typ UDT1 (z.B.) - was willst du damit denn jetzt machen ? Auf die Einzelelemente zugreifen ? Das ginge dann mit z.B. "U #mein_IN_UDT.dessen_UntervariablenName"

    Poste doch bitte mal deinen Code ...

    Gruß
    Larry

  8. #8
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    okay das mit den Daten lesen hab ich nun so gelöst:

    Code:
    //**************
    //* Zeiger erstellen für die OID ("Z_OID")
    //**************
    
          L     P##OID
          LAR1  
          L     D [AR1,P#0.0]
          T     LD    10
          L     D [AR1,P#4.0]
          T     LD    14
          L     W [AR1,P#8.0]
          T     LW    18
    
    //**************
    //* OID im Array "A_OID" speichern
    //**************
    
          CALL  "BLKMOV"                    //Mit dieser Funktion wird der durch den Zeiger markierte Array Bereich
           SRCBLK :=#Z_OID                  //in den Array "A_OID" kopiert
           RET_VAL:=#S_BLKM_COM
           DSTBLK :=DB501.A_OID
    mit den UDTs hab ich noch nicht wirklich eine Idee . In meinem Funktionsblock ist unteranderem der Funktionsblock FB 65 (erstellt eine Kommunikationsschicht zum Senden von bspielsweise UDP Nachrichten). Dieser Funktionsblock braucht eine UDT mit den Verbindungsparametern (Welche mit Hilfe von OCWizrad erstellt wurde) jetzt ist es möglich in den Instanzdatenbaustein diese UDT zu laden und dierekt auf den FB 65 zu geben. Mein Ziel ist es nun diese UDT in meinen Funktionsblock zuübergeben (welcher zum Beispiel den FB 65 enthält) und den von mir erstellten Funktionsblock diese UDT an den Funktionsblock 65 zuübergeben. Ich hoffe man konnte es nachvollziehen

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    OK ... jetzt verstehe ich etwas besser ...
    Der UDT65, der von dem OC-Wizzard erzeugt wird, ist (wie jeder andere UDT auch) nur eine Vorschrift, die den Aufbau und die Vorbelegung eines noch zu definierenden Speicherbereichs beschreibt. Er ist keine Datenblock sondern wird erst zu einem wenn du ihn irgendwo als Datentyp für eine Variable anlegst. In deinem Fall kannst du also z.B. in deinem DB501 eine Variable anlegen, die vielleicht Connection_Par heißt und vom Typ UDT65 ist. Damit wird die dann korrekt eingestellt und du kannst sie in der Folge verwenden ...
    War es das ?

  10. #10
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Nicht ganz^^ ich möchte wenn das fertig ist diesen Funktionsblock mehrmals mit unterschiedlichen Verbindungspartnern benutzen, d.h. es wird für jeden Verbindungspartner eine andere UDT geben. Mache ich das für eine UDT fest in dem ich im Instanzdatenbaustein, beispielsweise UDT 65, würde die Funktion nur mit dem verbindungspartner von UDT 65 kommunizieren oder? Das wollte ich ja gerade variable machen quasi so wie bei dem Funktionsblock 65 selbst, da wird die UDT ja auch als Eingang eingegeben

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 27.09.2011, 13:35
  2. WinCC Übergabe von Variablen
    Von Shino im Forum HMI
    Antworten: 2
    Letzter Beitrag: 18.02.2009, 10:13
  3. Antworten: 17
    Letzter Beitrag: 14.08.2008, 14:45
  4. Antworten: 3
    Letzter Beitrag: 07.03.2008, 11:09
  5. Übergabe von Parametern
    Von Thomas86 im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 17.04.2007, 08:57

Lesezeichen

Berechtigungen

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