
Zitat von
pjoker22
Wenn ich P#DB31.DBX0.0 Byte 2 angebe geht es, bei DB31.DBW0 kommt immer der Fehler 8184.
F1 - Hilfe zum FC12 PNIO_RECV > Erläuterung der Formalparameter
Parameter: RECV [...] Datentyp: ANY (
als VARTYPE ist nur BYTE zugelassen)
Packe um Dein DBW0 im DB31 eine Struktur und gib die Struktur am Eingang RECV an, dann wird der ANY-Pointer automatisch zu "P#DB31.DBX0.0 Byte 2" gewandelt:
"DB31":
Code:
+0.0 MyPNDevice_Inputs : STRUCT
+0.0 Statuswort_1 : Word
=2.0 END_STRUCT
+2.0 ...
Code:
CALL "PNIO_RECV"
...
RECV:="DB31".MyPNDevice_Inputs //P#DB31.DBX0.0 Byte 2
Eigentlich sollte man Speicherbereiche für ANY immer symbolisch angeben, dann wandelt der Programmeditor die Angabe automatisch in einen passenden ANY. Wenn der Bereich eine STRUCT ist dann wird der Datentyp und die Länge immer als BYTE angegeben.
Wenn Du den/die Speicherbereiche für PNIO_RECV und PNIO_SEND schön strukturierst und symbolisch an die FCs übergibst, dann geht das automatisch richtig, z.B.:
Code:
DATA_BLOCK "PNIO_IO"
STRUCT
Inputs : STRUCT //Eingänge für PNIO_RECV
Device_1 : STRUCT
StatusWort_1 : WORD ;
END_STRUCT ;
Device_2 : STRUCT
StatusWort_1 : WORD ;
StatusWort_2 : WORD ;
END_STRUCT ;
Device_3 : STRUCT
Byte_1 : BYTE ;
Byte_2 : BYTE ;
END_STRUCT ;
END_STRUCT ;
Outputs : STRUCT //Ausgänge für PNIO_SEND
Device_1 : STRUCT
SteuerWort_1 : WORD ;
END_STRUCT ;
Device_2 : STRUCT
SteuerWort_1 : WORD ;
SteuerWort_2 : WORD ;
END_STRUCT ;
Device_3 : STRUCT
Datenbytes : ARRAY [1 .. 10 ] OF BYTE ;
END_STRUCT ;
END_STRUCT ;
END_STRUCT ;
END_DATA_BLOCK
Code:
CALL "PNIO_RECV"
...
RECV:="PNIO_IO".Inputs
L "PNIO_IO".Inputs.Device_1.StatusWort_1
T DB31.DBW0
...
L DB32.DBW0
T "PNIO_IO".Outputs.Device_1.SteuerWort_1
CALL "PNIO_SEND"
...
SEND:="PNIO_IO".Outputs
Harald
Lesezeichen