Twincat 3 ,FB_EcCoESdoWrite, ADR mit dynamischer Variable / Datentyp

morris

Level-1
Beiträge
18
Reaktionspunkte
1
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
    [B]IF database[i,2] = 'bool'[/B] THEN
       [B] btempBool := STRING_TO_BOOL(database[i,3]);[/B]
        
        fbWrite_Sensor(
        sNetId          := sNetId,
        nSlaveAddr      := nSlaveAddr,
        nIndex          := nIndex,
        nSubIndex       := STRING_TO_BYTE(database[i,1]),
        [B]pSrcBuf         := ADR(btempBool),
        cbBufLen        := SIZEOF(btempBool),[/B]
        bExecute        := bExecute,
        tTimeout        := T#3S
        );
        
        // Integer
        ELSIF [B]database[i,2] = 'int'[/B] THEN
                [B]ntempInt := STRING_TO_INT(database[i,3]);[/B]
                    
                fbWrite_Sensor(
                    sNetId          := sNetId,
                    nSlaveAddr      := nSlaveAddr,
                    nIndex          := nIndex,
                    nSubIndex       := STRING_TO_BYTE(database[i,1]),
                    [B]pSrcBuf         := ADR(ntempInt),
                    cbBufLen        := SIZEOF(ntempInt),[/B]
                    bExecute        := bExecute,
                    tTimeout        := T#3S
            );
        // Udint    
        ELSIF [B]database[i,2] = 'udint'[/B] THEN
                [B]ntempUdint := STRING_TO_UDINT(database[i,3]);

       //... noch mehrere ElSIF mit sint, string, Word usw[/B]

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
 
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
 
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
 
Zuletzt bearbeitet:
Zurück
Oben