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

Ergebnis 1 bis 3 von 3

Thema: Twincat 3 ,FB_EcCoESdoWrite, ADR mit dynamischer Variable / Datentyp

  1. #1
    Registriert seit
    02.10.2014
    Beiträge
    18
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Beitrag


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute, habe folgende Problematik :

    Aus einer Textdatei lese ich Datend ein, die für die Initialisierung eines Sensors notwendig sind. Diese sind umgewandelt in einem 2 dimensionalen Array "database" of String.
    Beispieldaten (Slaveadresse, Datentyp Wert) :
    ...
    2999;int;20
    3500;str;blablubb
    3550;bool,TRUE
    ...
    Nun möchte ich mit Hilfe eines Aufrufs (in Schleifen und CASE fällen) von FB_EcCoESdoWrite die Werte in den Sensor schreiben.

    Momentan funktioniert dies indem ich für jeden verschiedenen Datentypen den ich einlese ( 7! ) einen Aufruf von FB_EcCoESdoWrite brauche und eine weitere TempVariable (z.b. btempBool) mit dem richtigen Datentyp, da ich sonst nicht weiß wie ich es hinbekommen, dass der pSrcBuf[Dword] und cbBufLen[udint] Eingang "dynamisch" mit Hilfe von ADR die Adresse (und die Länge) bekommt.

    Code:
    1 :    
    
    // bool
        IF database[i,2] = 'bool' THEN
            btempBool := STRING_TO_BOOL(database[i,3]);
            
            fbWrite_Sensor(
            sNetId          := sNetId,
            nSlaveAddr      := nSlaveAddr,
            nIndex          := nIndex,
            nSubIndex       := STRING_TO_BYTE(database[i,1]),
            pSrcBuf         := ADR(btempBool),
            cbBufLen        := SIZEOF(btempBool),
            bExecute        := bExecute,
            tTimeout        := T#3S
            );
            
            // Integer
            ELSIF database[i,2] = 'int' THEN
                    ntempInt := STRING_TO_INT(database[i,3]);
                        
                    fbWrite_Sensor(
                        sNetId          := sNetId,
                        nSlaveAddr      := nSlaveAddr,
                        nIndex          := nIndex,
                        nSubIndex       := STRING_TO_BYTE(database[i,1]),
                        pSrcBuf         := ADR(ntempInt),
                        cbBufLen        := SIZEOF(ntempInt),
                        bExecute        := bExecute,
                        tTimeout        := T#3S
                );
            // Udint    
            ELSIF database[i,2] = 'udint' THEN
                    ntempUdint := STRING_TO_UDINT(database[i,3]);
    
           //... noch mehrere ElSIF mit sint, string, Word usw
    Ich brauche also immer die richtige Adresse der einzulesenden Daten und deren Länge.

    Gibt es sowas wie einen "ANY" datentyp oder kann man das problem mit Pointern lösen oder sowas wie "überladene Funktion"? ( habe da noch keine Erfahrung mit)
    wenn Ja bitte kurz mit Beispielcode oder Link.

    Vielen Dank im Voraus !


    MFG Morris
    Zitieren Zitieren Twincat 3 ,FB_EcCoESdoWrite, ADR mit dynamischer Variable / Datentyp  

  2. #2
    Registriert seit
    10.08.2012
    Beiträge
    245
    Danke
    0
    Erhielt 70 Danke für 66 Beiträge

    Standard

    So ganz ist mir noch nicht klar was du wünscht.
    Die Kombi ADR und SIZEOF ist ja de facto ein Pointer auf die Startadresse (eines beliebigen Datentyps) und die Länge.
    Für jeden Aufruf muss du ja explizit das CoE-Objekt kennen.

    Was du nun machen könntest wäre
    TC3: Einen Variable vom Typ Union zu definieren. U.a. mit einem Bytearray (max länge) sowohl deine verschiedenen Datentypen die dir das CoE-Objekt liefert/benötigt.
    Der Aufruf in der Schleife wäre dann immer über das ByteArray, du musst die Werte aber natürlich dann wegkopieren (es sei denn du definierst dir ein Array und schreibst das in x Werte). Verschwendet zwar ein paar Bytes aber "so what".
    Danach könntest du in deinem Code über den tatsächlichen Variablentyp darauf zugreifen.

    Alternative ist der Aufruf über ein Bytearray und danach "kopierst" du dir die Werte z.B. über ein Memcopy wo auch immer du sie haben willst.

    Ach ja: Die IEC redet zwar vom Datentyp ANY, ich kenne jedoch kein System das diesen als generischen Typ auch als solchen unterstützt. Bausteine wie der MOVE werden zum Compile - Zeitpunkt dann immer festgezurrt.


    Guga

  3. Folgender Benutzer sagt Danke zu Guga für den nützlichen Beitrag:

    morris (08.10.2015)

  4. #3
    morris ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.10.2014
    Beiträge
    18
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Herzlichen Dank Guga für die schnelle Antwort !
    Der Datentyp Union war mir noch unbekannt, aber mit ihm hat es wunderbar geklappt !.

    So ganz ist mir noch nicht klar was du wünscht.
    Mein Wunsch war, dass ich nicht x mal den FB_EcCoESdoWrite für jeden Datetnyp den ich einlesen möchte aufrufen muss, damit ich dem Sensor ( micro-epsilon optpNCDT1700 über eine RS 422 Erweiterungsklemme, EthreCat) die passenden parameter mit Datentyp ( bzw. länge) über eine txt. Datei geben kann.


    MFG Morris
    Geändert von morris (15.10.2015 um 10:32 Uhr)

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 18.05.2015, 22:27
  2. Variable/Datentyp Byte of Array
    Von Systeme im Forum PHOENIX CONTACT
    Antworten: 1
    Letzter Beitrag: 30.04.2015, 13:05
  3. Antworten: 6
    Letzter Beitrag: 25.11.2013, 18:32
  4. Antworten: 6
    Letzter Beitrag: 19.08.2011, 14:08
  5. Antworten: 4
    Letzter Beitrag: 23.05.2007, 12:18

Stichworte

Lesezeichen

Berechtigungen

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