CPU LEDs abfragen

plc_typ

Level-2
Beiträge
215
Reaktionspunkte
30
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
hab mir momentan eine Anwendung bei der ich die Zustände
der CPU LEDs abfragen müsste. Hab selbst schon etwas
dazu geschieben, nur leider funktionierts in keinster weise.
Ist das erste mal das ich mit dem SFC51 arbeite, hab mir
mal so einiges durchgelesen und es dann mal so zusammengeschrieben
wie es für mich "plausibel" schien.

Hier mal mein FC

Code:
FUNCTION "FC_DIAG" : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  BEAT_2HZ : BOOL ;    
  BEAT_0_5Hz : BOOL ;    
  ENABLE : BOOL ;    
END_VAR
VAR_TEMP
  DEAD : INT ;    
  BUSY : BOOL ;    
  INDEX : WORD ;    
  LED_ON : BOOL ;    
  LED_FLASHS_NOT : BOOL ;    
  LED_FLASHS_2Hz : BOOL ;    
  LED_FLASHS_0_5Hz : BOOL ;    
  ADRESSREGISTER : DWORD ;    
END_VAR
BEGIN
NETWORK
TITLE =Adressregister widerherstellen

      TAR1  #ADRESSREGISTER; 
NETWORK
TITLE =Reset Sprungzähler

      L     "DB_DP_DIAGNOSE".SPL_BYTE; 
      L     B#16#6; 
      ==I   ; 
      SPBN  _SET; 
      L     B#16#0; 
      T     "DB_DP_DIAGNOSE".SPL_BYTE; 
_SET: NOP   0; 
NETWORK
TITLE =Sprungliste

      L     "DB_DP_DIAGNOSE".SPL_BYTE; 
      SPL   _OUT; 
      SPA   _SF; 
      SPA   _RUN; 
      SPA   _FRC; 
      SPA   _STP; 
      SPA   _BF1; 
      SPA   _BF2; 
_OUT: SPA   _MVE; 

_SF:  L     W#16#1; 
      T     #INDEX; 
      +AR1  P#0.0; 
      SPA   _MVE; 

_RUN: L     W#16#4; 
      T     #INDEX; 
      +AR1  P#0.1; 
      SPA   _MVE; 

_FRC: L     W#16#6; 
      T     #INDEX; 
      +AR1  P#0.2; 
      SPA   _MVE; 

_STP: L     W#16#5; 
      T     #INDEX; 
      +AR1  P#0.3; 
      SPA   _MVE; 

_BF1: L     W#16#B; 
      T     #INDEX; 
      +AR1  P#0.4; 
      SPA   _MVE; 

_BF2: L     W#16#C; 
      T     #INDEX; 
      +AR1  P#0.5; 

_MVE: NOP   0; 
NETWORK
TITLE =Read DP

      CALL "RDSYSST" (
           REQ                      := TRUE,
           SZL_ID                   := W#16#19,
           INDEX                    := #INDEX,
           RET_VAL                  := #DEAD,
           BUSY                     := #BUSY,
           SZL_HEADER               := "DB_DP_DIAGNOSE".SZL_HEADER,
           DR                       := P#DB1.DBX8.0 BYTE 4);

NETWORK
TITLE =SET Output

      U     #BUSY; 
      SPB   NON; 

      L     "DB_DP_DIAGNOSE".led_on; 
      L     1; 
      ==I   ; 
      =     #LED_ON; 

      L     "DB_DP_DIAGNOSE".ed_blink; 
      L     0; 
      ==I   ; 
      =     #LED_FLASHS_NOT; 
      TAK   ; 
      L     1; 
      ==I   ; 
      =     #LED_FLASHS_2Hz; 
      TAK   ; 
      L     2; 
      ==I   ; 
      =     #LED_FLASHS_0_5Hz; 


      AUF   "DB_DP_DIAGNOSE"; 
      U     #LED_ON; 
      U     #LED_FLASHS_2Hz; 
      U     #BEAT_2HZ; 
      O     ; 
      U     #LED_ON; 
      U     #LED_FLASHS_0_5Hz; 
      U     #BEAT_0_5Hz; 
      O     ; 
      U     #LED_ON; 
      U     #LED_FLASHS_NOT; 
      =     DBX [AR1,P#14.0]; 

NON:  NOP   0; 
NETWORK
TITLE =Sprungzähler

      U     #ENABLE; 
      UN    #BUSY; 
      SPBN  _CNT; 
      L     "DB_DP_DIAGNOSE".SPL_BYTE; 
      INC   1; 
      T     "DB_DP_DIAGNOSE".SPL_BYTE; 
_CNT: NOP   0; 
NETWORK
TITLE =Adressregister sichern

      LAR1  #ADRESSREGISTER; 
END_FUNCTION
Schonmal Danke im vorraus
 
Code:
_BF2: L     W#16#C; 
      T     #INDEX; 
      [COLOR="Red"]+AR1  P#0.5; [/COLOR]

_MVE: NOP   0; 
NETWORK
TITLE =Read DP

      CALL "RDSYSST" (
           REQ                      := TRUE,
           SZL_ID                   := W#16#19,
           INDEX                    := #INDEX,
           RET_VAL                  := #DEAD,
           BUSY                     := #BUSY,
           SZL_HEADER               := "DB_DP_DIAGNOSE".SZL_HEADER,
           DR                       := P#DB1.DBX8.0 BYTE 4);

Wozu soll der rot geschriebene Code genau dienen, was soll er wo bewirken?
Was gibt Ret_Val aus?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hab grad selber auch noch ein wenig nachgeforscht, die RET_VAL
sagt "0081 Länge des Ergebnisfeldes zu klein ". Verstehe nicht ganz
wo das herrührt, in der Operationsliste sind 4 Byte als speicherbedarf
angegeben und so wurds auch beschaltet.

+AR1 P#0.5 soll den versatz vorgeben für
= DBX [AR1,P#14.0]... jedenfalls hab ich mir das so gedacht :ROFLMAO:
 
OK, man sollte zwar denken, daß der SFC51 das AR1 sichert und wiederherstellt, falls er damit etwas macht, aber zur Sicherheit würde ich mir das AR1 in einem DWord merken und dann kurz vor dem Verwenden nochmals zuweisen. Solange der SFC51 natürlich die Länge bemängelt, gibt er auch keine Daten raus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
momentan liegt das größte problem erstmal dadrin das ich keine
daten aus dem SFC51 bekomme. Deshalb hier nochmal die genaue
beschaltung.

Code:
            CALL "RDSYSST" (
           REQ                      := TRUE, 
           SZL_ID                   := W#16#19, //19 = Zustand aller LEDs     
           INDEX                    := #INDEX,  //Abfragen der verschiedenen LEDs
           RET_VAL                  := #DEAD,    
           BUSY                     := #BUSY,
           SZL_HEADER               := "DB_DP_DIAGNOSE".SZL_HEADER,    //Struct aus DB
           DR                       := P#DB1.DBX8.0 BYTE 4);    // Pointer für ausgabewert
 
Hallo,

ich habe das auch schon mal gemacht. Da war mein Empfangsfeld größer. In den 4 Bytes sind ja nur die Informationen einer LED. Es wird aber der Zustand aller LEDs der CPU abgefragt. Daher mach deinen Empfangsbereich mal größer.

Ich hatte 20 x 4 Byte
 
so, hab die geschichte jetzt am laufen.
2 fehler waren drin, der erste und gravierendste war das die Falsche
SZL_ID angegeben war, stat w#16#19 wird für die LED zustände w#16#74
benötigt.
2. fehler war das bei der Sprungliste +AR1 verwendet wir, richtig hier ist den
versatz per LAR1 zu laden.

Nochmal danke für die hilfe
 
Zurück
Oben