-> 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.
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
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