FB_GetDPRAMInfo
Der Funktionsbaustein FB_GetDPRAMInfo ermittelt den Addresspointer und die konfigurierte Größe des NOV/DP-RAM einer Feldbuskarte. Der Addresspointer kann z.B. dazu benutzt werden, um direkt auf das NOV-RAM der FCxxx-0002 (Beckhoff) Karten oder DPRAM der von TwinCAT nicht unterstützten Karten (Dritthersteller) schreibend oder lesend zugreifen zu können. Die Karte muss vorher in TwinCAT System als allgemeines NOV/DP-RAM konfiguriert werden. Im SPS-Programm können dann die MEMCPY-, MEMSET- oder MEMCMP-Funktionen benutzt werden um auf einen beliebigen Speicheroffset schreibend/lesend zugreifen zu können.
Wenn das NOV/DP-RAM einen speziellen Zugriff (z.B. BYTE, aligned WORD) erfordert gibt dieser Funktionsbaustein einen Service Not Supported (16#701) Fehler zurück. In diesem Fall kann der Baustein FB_NovRamReadWriteEx verwendet werden um Daten aus dem NOV/DP-RAM zu lesen oder Daten in das NOV/DP-RAM zu schreiben. Z.B. das NOV-RAM vom CX9000 erlaubt nur BYTE-Zugriffe, so dass in diesem Falle der Baustein FB_NovRamReadWriteEx verwendet werden sollte.
VAR_INPUT
VAR_INPUT
nDevId : UDINT;
bExecute : BOOL;
tTimeOut : TIME := DEFAULT_ADS_TIMEOUT;
END_VAR
nDevId: Die Geräte-Id einer NOV/DP-RAM-Karte. Über die Id wird die Karte spezifiziert, deren Informationen gelesen werden sollen. Die Geräte-Ids werden während der Hardware-Konfiguration vom TwinCAT System festgelegt.
bExecute: Bei einer positiven Flanke an diesem Eingang wird der Baustein aktiviert.
tTimeOut: Gibt die Timeout-Zeit an, die bei der Ausführung des Kommandos/Funktion nicht überschritten werden darf.
VAR_OUTPUT
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrId : UDINT;
stInfo : ST_NovRamAddrInfo;
END_VAR
bBusy: Bei der Aktivierung des Funktionsbausteins wird dieser Ausgang gesetzt und bleibt gesetzt, bis die Ausführung abgeschlossen wurde.
bError: Sollte ein Fehler bei der Ausführung erfolgen, dann wird dieser Ausgang gesetzt..
nErrId: Liefert bei einem gesetzten bError-Ausgang die ADS-Fehlernummer.
stInfo: Eine Struktur mit der Adresse und Größe des NOV/DP-RAM (Typ: ST_NovRamAddrInfo).
Beispiel:
In MAIN wird ein Pointer auf eine Instanz der ST_NOVRAM-Strukturvariablen deklariert. Dieser Pointer wird beim Programmstart mit der Adresse des NOV-/DP-RAM initialisiert. Durch Referenzieren des Pointers kann auf die einzelnen Strukturelemente (und das NOV-/DP-RAM) schreibend oder lesend zugegriffen werden.
TYPE ST_NOVRAM :
STRUCT
dwParam_0 : DWORD;
dwParam_1 : DWORD;
dwParam_2 : DWORD;
dwParam_3 : DWORD;
cbSize : DWORD;
wCounter : WORD;
func : BYTE;
sMsg : STRING(20);
(* ...other NOV-/DP-RAM variables *)
END_STRUCT
END_TYPE
PROGRAM MAIN
VAR
pNOVRAM : POINTER TO ST_NOVRAM;
cbNOVRAM : DWORD;
fbGetInfo : FB_GetDPRAMInfo;
state : INT := 0;
bInit : BOOL := FALSE;
timer : TON;
bReset : BOOL;
END_VAR
CASE state OF
0:
IF NOT bInit THEN
state := 1;
END_IF
1:
fbGetInfo( bExecute := FALSE ); (* reset fb *)
fbGetInfo( nDevId:= 3,
bExecute:= TRUE, (* start fb execution *)
tTimeOut:= T#10s );
state := 2;
2:
fbGetInfo( bExecute := FALSE );
IF NOT fbGetInfo.bBusy THEN
IF NOT fbGetInfo.bError THEN
IF fbGetInfo.stInfo.pCardAddress <> 0 THEN
pNOVRAM := fbGetInfo.stInfo.pCardAddress;
cbNOVRAM := fbGetInfo.stInfo.iCardMemSize;
bInit := TRUE;
state := 0; (* ready, go to the idle step *)
ELSE
state := 100; (* error *)
END_IF
ELSE
state := 100; (* error *)
END_IF
END_IF
100:
; (* error, stay here *)
END_CASE
IF bInit THEN
(* read from or write to NOV-/DP-RAM*)
IF bReset THEN (* reset all bytes to 0 *)
bReset := FALSE;
MEMSET( pNOVRAM, 0, cbNOVRAM );
END_IF
timer( IN := TRUE, PT := T#1s );
IF timer.Q THEN
timer( IN := FALSE );
pNOVRAM^.dwParam_0 := pNOVRAM^.dwParam_0 + 1;
pNOVRAM^.dwParam_1 := pNOVRAM^.dwParam_1 - 1;
END_IF
END_IF
Voraussetzungen
Entwicklungsumgebung |
Zielplattform |
IO-Hardware |
Einzubindende SPS-Bibliotheken (Kategoriegruppe) |
---|---|---|---|
TwinCAT v3.1.0 |
PC oder CX (x86) |
FCxxxx cards mit NOV-RAM (FCxxxx-0002) |
Tc2_IoFunctions (IO) |