DP-Diagnosebaustein FC125 Einsatz in SCL

bayernburn

Level-1
Beiträge
38
Reaktionspunkte
0
Zuviel Werbung?
-> 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.

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

Gruß
 
Hallo,

der Pointer stimmt nicht:

Code:
dwDataField.PTR := [COLOR=#ff0000]16#2BC[/COLOR]; //INT_TO_DWORD (700);// OR 16#8400_0000;  // Pointer zeigt zuf Bit, deshalb 8*Byte Nummer


Für den Speicherbereich ab DBX700.0 müsste das vermutlich so aussehen:

Code:
dwDataField.PTR := [COLOR=#ff0000]16#8400_15E0[/COLOR]; //INT_TO_DWORD (700);// OR 16#8400_0000;  // Pointer zeigt zuf Bit, deshalb 8*Byte Nummer
 
Zurück
Oben