nutellahase
Level-2
- Beiträge
- 180
- Reaktionspunkte
- 28
-> Hier kostenlos registrieren
Hallo!
Ich habe in einer Funktion den Datentyp DATE and TIME als Eingangsvariable definiert. Die Funktion wird im OB1 aufgerufen. Innerhalb der Funktion möchte ich jetzt z.B. den DT in das Format DATE zerlegen. Hierzu nehme ich den FC6 aus der IEC Bibliothek. Tja, leider lässt sich der Datentyp nicht so einfach übergeben. Da im OB1 die Variable bereits als Pointer übergeben wird habe ich nun folgendes gemacht:
In weiterer Folge erstell ich mir einen ANY-Pointer, ich weiß dass der Datentyp DT 8 BYTE umfasst!
Dann habe ich noch eine temporäre Date and Time Variable angelegt. Mittels Blockmove werden nun die Informationen auf die der ANY-Pointer zeigt in meine temp. Variable kopiert:
Nun kann ich meine Funktion FC6 aufrufen..
So das ganze funktioniert nur wenn ich im OB1 einen DT aus einem Datenbaustein übergebe. Möchte ich beispielsweise die Lokalvariable #OB1_Date_Time übergeben funktioniert es nicht!
Die einzige Lösung die ich dafür gefunden hab ist, dass ich das AR1 auf die vorherigen Lokaldaten lade und dann mittels absoluter Adressierung arbeite (was mir aber nicht gefällt!). Besonders wenn sich dann Adressen verschieben hätte ich damit ein Problem!
Wieso funktioniert die Vorgehensweise mit den ANY-Pointer auf die Lokaldaten des OB1 nicht??? Mir ist auch klar, dass ich auf die einzelnen Bytes zugreifen könnte bzw. in SCL die AT-Sicht nutzen kann, ich wollte es aber mal in AWL probieren.
Ich habe in einer Funktion den Datentyp DATE and TIME als Eingangsvariable definiert. Die Funktion wird im OB1 aufgerufen. Innerhalb der Funktion möchte ich jetzt z.B. den DT in das Format DATE zerlegen. Hierzu nehme ich den FC6 aus der IEC Bibliothek. Tja, leider lässt sich der Datentyp nicht so einfach übergeben. Da im OB1 die Variable bereits als Pointer übergeben wird habe ich nun folgendes gemacht:
Code:
L P##i_Datum_und_Uhrzeit // Pointer auf Eingangsvariable (Datentyp DT)
LAR1 // ins Adressregister 1 laden
L W [AR1,P#0.0] // DB-Nummer laden (siehe Aufbau Datentyp POINTER)
T #tmp_DBNr
L D [AR1,P#2.0] // Speicherbereich und Adresse laden (siehe Aufbau Datentyp POINTER)
T #tmp_Adresse
In weiterer Folge erstell ich mir einen ANY-Pointer, ich weiß dass der Datentyp DT 8 BYTE umfasst!
Code:
L P##tmp_Any_Pointer
LAR1
L W#16#1002 // HEX 10 für S7 und Datentyp BYTE (02)
T W [AR1,P#0.0]
L 8 // Datentyp Date_and_Time ist 8 Byte lang
T W [AR1,P#2.0]
L #tmp_DBNr // DB Nummer der übergebenen Eingangsvariable
T W [AR1,P#4.0]
L #tmp_Adresse // Speicherbereich der übergebenen Eingangsvariable
T D [AR1,P#6.0]
Dann habe ich noch eine temporäre Date and Time Variable angelegt. Mittels Blockmove werden nun die Informationen auf die der ANY-Pointer zeigt in meine temp. Variable kopiert:
Code:
CALL "BLKMOV"
SRCBLK :=#tmp_Any_Pointer
RET_VAL:=#SFC20_Error
DSTBLK :=#tmp_Date_Time
Nun kann ich meine Funktion FC6 aufrufen..
Code:
CALL "DT_DATE"
IN :=#tmp_Date_Time
RET_VAL:=#o_Datum // Ausgangsvariable vom Typ DATE
So das ganze funktioniert nur wenn ich im OB1 einen DT aus einem Datenbaustein übergebe. Möchte ich beispielsweise die Lokalvariable #OB1_Date_Time übergeben funktioniert es nicht!
Die einzige Lösung die ich dafür gefunden hab ist, dass ich das AR1 auf die vorherigen Lokaldaten lade und dann mittels absoluter Adressierung arbeite (was mir aber nicht gefällt!). Besonders wenn sich dann Adressen verschieben hätte ich damit ein Problem!
Code:
L P##i_Datum_und_Uhrzeit // Pointer auf Eingangsvariable
LAR1 // ins Adressregister 1 laden
L W [AR1,P#0.0] // DB-Nummer laden (siehe Aufbau Datentyp POINTER)
T #tmp_DBNr
L D [AR1,P#2.0] // Speicherbereich und Adresse laden (siehe Aufbau Datentyp POINTER)
T #tmp_Adresse
LAR1
AUF DB [#tmp_DBNr]
L D [AR1,P#0.0]
T LD 10 // hier beginnt meine Lokalvariable tmp_Date_Time
L D [AR1,P#4.0]
T LD 14