bayernburn
Level-2
- Beiträge
- 38
- Reaktionspunkte
- 0
-> Hier kostenlos registrieren
Liebe Mitglieder des SPS-Forums.
nachdem ich gestern bereits ein Thema gepostet habe, habe ich schon wieder ein kleineres Problemchen.
Und zwar möchte ich gerne den FC125 aufrufen und versorgen.
Ich habe mir dazu Any-Pointer gebastelt und übergebe die Daten an den FC.
Wenn ich den FC in die CPU lade, bekomme ich an der CPU (CPU319) einen Systemfehler und im Diagnosepuffer die Fehlermeldung "Bereichsfehler beim Schreiben" bzw. "Bereichsfehler beim Lesen".
Beim klick auf die Hilfe erscheint dann folgender Text:
Ursache:
Sie haben bei der bereichsübergreifenden registerindirekten Adressierung einen unzulässigen Operandenbereich verwendet. Die Bereichskennung der Zugriffsadresse (Bit 24 -31) ist unzulässig.
Behebung:
Verwenden Sie einen Pointer mit korrekter Bereichskennung.
Somit liegt der Fehler wohl in einer Definition der Pointer.
Ich hoffe es kann mir jemand helfen.
Gruß
nachdem ich gestern bereits ein Thema gepostet habe, habe ich schon wieder ein kleineres Problemchen.
Und zwar möchte ich gerne den FC125 aufrufen und versorgen.
Ich habe mir dazu Any-Pointer gebastelt und übergebe die Daten an den FC.
Wenn ich den FC in die CPU lade, bekomme ich an der CPU (CPU319) einen Systemfehler und im Diagnosepuffer die Fehlermeldung "Bereichsfehler beim Schreiben" bzw. "Bereichsfehler beim Lesen".
Beim klick auf die Hilfe erscheint dann folgender Text:
Ursache:
Sie haben bei der bereichsübergreifenden registerindirekten Adressierung einen unzulässigen Operandenbereich verwendet. Die Bereichskennung der Zugriffsadresse (Bit 24 -31) ist unzulässig.
Behebung:
Verwenden Sie einen Pointer mit korrekter Bereichskennung.
Somit liegt der Fehler wohl in einer Definition der Pointer.
Code:
//=============================================================================
//This function will handle the global settings of the plant program.
//FC7
FUNCTION CommGeneral : VOID
TITLE = 'Communication, Visualisizing General'
// KNOW_HOW_PROTECT
AUTHOR :Maier
FAMILY :Comm
NAME :VisGen
VERSION :'1.0'
VAR_TEMP
dummy0 :WORD;
dummy2 :WORD; // do not enter any declaration before
dummy4 :WORD;
LedCounter :DWORD;
x320 :INT;
Byteindex :INT;
DataField:ANY; // Symbolischer Name des ANY Pointers
dwDataField AT DataField: STRUCT // Mit dem AT Befehl wird der gleiche Bereich in einer anderen Form définiert
ID : WORD; // ID für ANY (1002 hex = es wird mit Bytes gearbeitet)
NBR : INT; // Anzahl Daten
DBN : INT; // DB der im ANY Pointer benutzt wird ANY
PTR : DWORD; // Pointer Doppelwort um den Angfang des Datenbereichs und den Datentyp zu definieren (84hex = DB Datentyp)
END_STRUCT;
ListSlavesNotPresent:ANY;
dwListSlavesNotPresent AT ListSlavesNotPresent: STRUCT
ID : WORD;
NBR : INT;
DBN : INT;
PTR : DWORD;
END_STRUCT;
ListSlavesError:ANY;
dwListSlavesError AT ListSlavesError: STRUCT
ID : WORD;
NBR : INT;
DBN : INT;
PTR : DWORD;
END_STRUCT;
SumSlavesDiag_I : INT;
RetVal_I : INT;
LedID :WORD;
LedStatus :BYTE;
DummyWord :INT;
SZL_HEADER :STRUCT
LENTHDR :WORD;
N_DR :WORD;
END_STRUCT;
END_VAR
BEGIN
// Read Profibus mastersystems status info
"CommProfibus".x320 := 0;
x320 := BYTE_TO_INT("CommProfibus".x320);
FOR x320 := 0 TO 96 BY 1 DO
Byteindex := 700+x320;
"CommProfibus".DB[Byteindex] :=0; // Clear Datafields DB4.DBB700 - DB4.DBB796
END_FOR;
// Aufbauen des ANY Pointers der Quelle (VON) (z.B. P#DB150.DBX10.0 BYTE 100)
dwDataField.ID := 16#1002; // ID 10 et 02 um mit Bytes zu arbeiten
dwDataField.NBR := 50; // entspricht BYTE 100. Könnte eine Variable sein.
dwDataField.DBN := 4; // DB 150
dwDataField.PTR := 16#2BC; //INT_TO_DWORD (700);// OR 16#8400_0000; // Pointer zeigt zuf Bit, deshalb 8*Byte Nummer
dwListSlavesNotPresent.ID := 16#1002; // ID 10 et 02 um mit Bytes zu arbeiten
dwListSlavesNotPresent.NBR := 16; // entspricht BYTE 100. Könnte eine Variable sein.
dwListSlavesNotPresent.DBN := 4; // DB 150
dwListSlavesNotPresent.PTR := 16#2BC; //INT_TO_DWORD (760);// OR 16#8400_0000; // Pointer zeigt zuf Bit, deshalb 8*Byte Nummer
dwListSlavesError.ID := 16#1002; // ID 10 et 02 um mit Bytes zu arbeiten
dwListSlavesError.NBR := 16; // entspricht BYTE 100. Könnte eine Variable sein.
dwListSlavesError.DBN := 4; // DB 150
dwListSlavesError.PTR := 16#2BC; //INT_TO_DWORD (780);// OR 16#8400_0000; // Pointer zeigt zuf Bit, deshalb 8*Byte Nummer
MW5000 := dwDataField.ID;
MW5002 := INT_TO_WORD(dwDataField.NBR);
MW5004 := INT_TO_WORD(dwDataField.DBN);
MD5008 := dwDataField.PTR;
SumSlavesDiag_I:= WORD_TO_INT(DB4.DW752);
RetVal_I:= WORD_TO_INT(DB4.DW754);
DP_Diagnose(CHECK_ACTIV := TRUE, // +++ FC125 DP Diagnose Auslesen
EXTERNAL_DP_INTERFACE := FALSE,
DP_MASTERSYSTEM := 1,
DATA_FIELD := DataField,
SUM_SLAVES_DIAG := SumSlavesDiag_I,
LIST_SLAVES_NOT_PRESENT := ListSlavesNotPresent,
LIST_SLAVES_ERROR := ListSlavesError,
RETVAL := RetVal_I,
BUSY := DB4.DX756.0);
DB4.DW752 := INT_TO_WORD(SumSlavesDiag_I);
DB4.DW754 := INT_TO_WORD(RetVal_I);
END_FUNCTION
Ich hoffe es kann mir jemand helfen.

Gruß