direkter Lokaldatenzugriff

Zuviel Werbung?
-> Hier kostenlos registrieren
Das einzige Problem was ich immer wieder mit Lokaldaten an verschiedenen Anlagen habe ist, dass gelesen wird ohne vorher zu schreiben oder dass jemand setzen/rücksetzen will. Manchmal aus Versehen manchmal aus Unwissenheit...
Mich hat immer am meisten gewurmt, wenn das Lesen von Temps vor dem Definieren selbiger in der Software des SteuerungsHerstellers (Siemens/Fanuc) gut versteckt und durch KnowHowSchutz unsichtbar gemacht war. Bekenne mich schuldig, in solchen Fällen guten Gewissens den Schutz geknackt zu haben - war halt "Notwehr".

Gegen Setzen/Rücksetzen von Temps ist doch nichts einzuwenden. Die Setz-/RücksetzOrgie muss natürlich innerhalb des GeltungsBereichs der Temps und des Zyklus abgeschlossen sein.
 
Hier mal der komplette Code. Ist für die Kommunikation mit KBR Messgeräten gedacht.
Vielleicht erkennt es ja jemand wieder ;)

Code:
FUNCTION "KOMM_KBR_PB1" : VOID
TITLE =Kommunikationsorganisation mit KBR auf PB1
VERSION : 0.0


VAR_INPUT
  ErstPEW : INT ;    
  ErstPAW : INT ;    
  DBZ : INT ;    
  ErstDBDZ : INT ;    
  WTIME : TIMER ;    
  DBZV : INT ;    
  ErstDBDZV : INT ;    
END_VAR
VAR_IN_OUT
  SCHR : WORD ;    
END_VAR
VAR_TEMP
  SCHRT : WORD ;    
  Adr : DWORD ;    
  DBZT : INT ;    
  DBZVT : INT ;    
END_VAR
BEGIN
NETWORK
TITLE =Takt Timer Sekundenimpuls
//
//
      L     #SCHR; 
      T     #SCHRT; 

      U     #WTIME; //prüfe ob Timer läuft
      SPB   w6; 

      L     0; //Lade null
      ==I   ; 
      S     L      0.0; 
      <>I   ; 
      SPB   w0; 



w0:   UN    L      0.0; //Messwerttyp 1 - Spannung Phase-Null
      SPB   w1; 

      L     #ErstPEW; 
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     PEB [AR1,P#0.0]; //Kennung überprüfen
      L     B#16#6; 
      <>I   ; 
      SPB   x1; 

      L     PEB [AR1,P#1.0]; //Index überprüfen
      L     B#16#1; 
      <>I   ; 
      SPB   x1; 

      ==I   ; 
      SPB   y1; 

x1:   L     #ErstPAW; //schreibe Kennung=6 in erstes PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#6; 
      T     PAB [AR1,P#0.0]; 

      L     #ErstPAW; //schreiben von Index=1 in zweites PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#1; 
      T     PAB [AR1,P#1.0]; 
      SPA   w6; //zu Bausteinende

y1:   L     PEB [AR1,P#8.0]; //Umladen Messwert1
      T     LB    11; 
      L     PEB [AR1,P#9.0]; 
      T     LB    10; 
      L     PEB [AR1,P#10.0]; 
      T     LB     9; 
      L     PEB [AR1,P#11.0]; 
      T     LB     8; 

      L     PEB [AR1,P#12.0]; //Umladen Messwert2
      T     LB    15; 
      L     PEB [AR1,P#13.0]; 
      T     LB    14; 
      L     PEB [AR1,P#14.0]; 
      T     LB    13; 
      L     PEB [AR1,P#15.0]; 
      T     LB    12; 

      L     PEB [AR1,P#16.0]; //Umladen Messwert3
      T     LB    19; 
      L     PEB [AR1,P#17.0]; 
      T     LB    18; 
      L     PEB [AR1,P#18.0]; 
      T     LB    17; 
      L     PEB [AR1,P#19.0]; 
      T     LB    16; 

      L     #DBZ; //ZielDB öffnen
      T     #DBZT; 
      AUF   DB [#DBZT]; 
      L     #ErstDBDZ; //Übergabe Momentane EinstiegsAdresse
      SLW   3; //Schiebe Binär m drei Positionen nach links
      LAR1  ; 
      L     LD     8; //schreibe Werte in ZielDB
      T     DBD [AR1,P#0.0]; 
      L     LD    12; 
      T     DBD [AR1,P#4.0]; 
      L     LD    16; //schreibe Werte in ZielDB]
      T     DBD [AR1,P#8.0]; 

      U     L      0.0; 
      R     L      0.0; 
      S     L      0.1; 

      L     #ErstPAW; 
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#3; 
      T     PAB [AR1,P#1.0]; //schreiben von Index=3 in Ausgang
      SPA   w6; //zu Bausteinende





w1:   UN    L      0.1; //Messewerttyp 2 - Wirkstrom
      SPB   w2; 

      L     #ErstPEW; 
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     PEB [AR1,P#1.0]; //Index überprüfen
      L     B#16#3; 
      <>I   ; 
      SPB   x2; 

      ==I   ; 
      SPB   y2; 

x2:   L     #ErstPAW; //schreibe Kennung=6 in erstes PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#6; 
      T     PAB [AR1,P#0.0]; 

      L     #ErstPAW; //schreiben von Index=3 in zweites PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#3; 
      T     PAB [AR1,P#1.0]; 
      SPA   w6; //zu Bausteinende


y2:   L     PEB [AR1,P#8.0]; //Umladen Messwert1
      T     LB    23; 
      L     PEB [AR1,P#9.0]; 
      T     LB    22; 
      L     PEB [AR1,P#10.0]; 
      T     LB    21; 
      L     PEB [AR1,P#11.0]; 
      T     LB    20; 

      L     PEB [AR1,P#12.0]; //Umladen Messwert2
      T     LB    27; 
      L     PEB [AR1,P#13.0]; 
      T     LB    26; 
      L     PEB [AR1,P#14.0]; 
      T     LB    25; 
      L     PEB [AR1,P#15.0]; 
      T     LB    24; 

      L     PEB [AR1,P#16.0]; //Umladen Messwert3
      T     LB    31; 
      L     PEB [AR1,P#17.0]; 
      T     LB    30; 
      L     PEB [AR1,P#18.0]; 
      T     LB    29; 
      L     PEB [AR1,P#19.0]; 
      T     LB    28; 

      L     #DBZ; //ZielDB öffnen
      T     #DBZT; 
      AUF   DB [#DBZT]; 
      L     #ErstDBDZ; //Übergabe Momentane EinstiegsAdresse
      SLW   3; //Schiebe Binär m drei Positionen nach links
      LAR1  ; 
      L     LD    20; //schreibe Werte in ZielDB
      T     DBD [AR1,P#12.0]; 
      L     LD    24; 
      T     DBD [AR1,P#16.0]; 
      L     LD    28; 
      T     DBD [AR1,P#20.0]; 

      U     L      0.1; 
      R     L      0.1; 
      S     L      0.2; 

      L     #ErstPAW; 
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#8; 
      T     PAB [AR1,P#1.0]; //schreiben vonn Index=3
      SPA   w6; 




w2:   UN    L      0.2; //Messwerttyp 3 cos phi
      SPB   w3; 


      L     #ErstPEW; 
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     PEB [AR1,P#1.0]; //Index überprüfen
      L     B#16#8; 
      <>I   ; 
      SPB   x3; 

      ==I   ; 
      SPB   y3; 

x3:   L     #ErstPAW; //schreibe Kennung=6 in erstes PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#6; 
      T     PAB [AR1,P#0.0]; 

      L     #ErstPAW; //schreiben von Index=8 in zweites PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#8; 
      T     PAB [AR1,P#1.0]; 
      SPA   w6; 

y3:   L     PEB [AR1,P#8.0]; //Umladen Messwert1
      T     LB    35; 
      L     PEB [AR1,P#9.0]; 
      T     LB    34; 
      L     PEB [AR1,P#10.0]; 
      T     LB    33; 
      L     PEB [AR1,P#11.0]; 
      T     LB    32; 

      L     PEB [AR1,P#12.0]; //Umladen Messwert2
      T     LB    39; 
      L     PEB [AR1,P#13.0]; 
      T     LB    38; 
      L     PEB [AR1,P#14.0]; 
      T     LB    37; 
      L     PEB [AR1,P#15.0]; 
      T     LB    36; 

      L     PEB [AR1,P#16.0]; //Umladen Messwert3
      T     LB    43; 
      L     PEB [AR1,P#17.0]; 
      T     LB    42; 
      L     PEB [AR1,P#18.0]; 
      T     LB    41; 
      L     PEB [AR1,P#19.0]; 
      T     LB    40; 

      L     #DBZ; //ZielDB öffnen
      T     #DBZT; 
      AUF   DB [#DBZT]; 
      L     #ErstDBDZ; //Übergabe Momentane EinstiegsAdresse
      SLW   3; //Schiebe Binär m drei Positionen nach links
      LAR1  ; 
      L     LD    32; //schreibe Werte in ZielDB
      T     DBD [AR1,P#24.0]; 
      L     LD    36; 
      T     DBD [AR1,P#28.0]; 
      L     LD    40; 
      T     DBD [AR1,P#32.0]; 

      U     L      0.2; 
      R     L      0.2; 
      S     L      0.3; 

      L     #ErstPAW; 
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#6; 
      T     PAB [AR1,P#1.0]; 
      SPA   w6; //zu Bausteinende




w3:   UN    L      0.3; //Messwerttyp 4 Wirkleistung
      SPB   w4; 

      L     #ErstPEW; 
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     PEB [AR1,P#1.0]; //Index überprüfen
      L     B#16#6; 
      <>I   ; 
      SPB   x4; 

      ==I   ; 
      SPB   y4; 

x4:   L     #ErstPAW; //schreibe Kennung=6 in erstes PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#6; 
      T     PAB [AR1,P#0.0]; 

      L     #ErstPAW; //schreiben von Index=6 in zweites PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#6; 
      T     PAB [AR1,P#1.0]; 
      SPA   w6; 

y4:   L     PEB [AR1,P#8.0]; //Umladen Messwert1
      T     LB    47; 
      L     PEB [AR1,P#9.0]; 
      T     LB    46; 
      L     PEB [AR1,P#10.0]; 
      T     LB    45; 
      L     PEB [AR1,P#11.0]; 
      T     LB    44; 

      L     PEB [AR1,P#12.0]; //Umladen Messwert2
      T     LB    51; 
      L     PEB [AR1,P#13.0]; 
      T     LB    50; 
      L     PEB [AR1,P#14.0]; 
      T     LB    49; 
      L     PEB [AR1,P#15.0]; 
      T     LB    48; 

      L     PEB [AR1,P#16.0]; //Umladen Messwert3
      T     LB    55; 
      L     PEB [AR1,P#17.0]; 
      T     LB    54; 
      L     PEB [AR1,P#18.0]; 
      T     LB    53; 
      L     PEB [AR1,P#19.0]; 
      T     LB    52; 

      L     #DBZ; //ZielDB öffnen
      T     #DBZT; 
      AUF   DB [#DBZT]; 
      L     #ErstDBDZ; //Übergabe Momentane EinstiegsAdresse
      SLW   3; //Schiebe Binr m drei Positionen nach links
      LAR1  ; 
      L     LD    44; //schreibe Werte in ZielDB
      L     1.000000e+003; 
      /R    ; 
      T     DBD [AR1,P#36.0]; 
      L     LD    48; 
      L     1.000000e+003; 
      /R    ; 
      T     DBD [AR1,P#40.0]; 
      L     LD    52; 
      L     1.000000e+003; 
      /R    ; 
      T     DBD [AR1,P#44.0]; 

      U     L      0.3; 
      R     L      0.3; 
      S     L      0.4; 

      L     #ErstPAW; 
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#7; 
      T     PAB [AR1,P#1.0]; //schreiben von Index=6
      SPA   w6; //zu Bausteinende




w4:   UN    L      0.4; //Messwerttyp 5 Blindleistung
      SPB   w5; 

      L     #ErstPEW; 
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     PEB [AR1,P#1.0]; //Index überprüfen
      L     B#16#7; 
      <>I   ; 
      SPB   x5; 

      ==I   ; 
      SPB   y5; 

x5:   L     #ErstPAW; //schreibe Kennung=6 in erstes PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#6; 
      T     PAB [AR1,P#0.0]; 

      L     #ErstPAW; //schreiben von Index=7 in zweites PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#7; 
      T     PAB [AR1,P#1.0]; 
      SPA   w6; 

y5:   L     PEB [AR1,P#8.0]; //Umladen Messwert1
      T     LB    59; 
      L     PEB [AR1,P#9.0]; 
      T     LB    58; 
      L     PEB [AR1,P#10.0]; 
      T     LB    57; 
      L     PEB [AR1,P#11.0]; 
      T     LB    56; 

      L     PEB [AR1,P#12.0]; //Umladen Messwert2
      T     LB    63; 
      L     PEB [AR1,P#13.0]; 
      T     LB    62; 
      L     PEB [AR1,P#14.0]; 
      T     LB    61; 
      L     PEB [AR1,P#15.0]; 
      T     LB    60; 

      L     PEB [AR1,P#16.0]; //Umladen Messwert3
      T     LB    67; 
      L     PEB [AR1,P#17.0]; 
      T     LB    66; 
      L     PEB [AR1,P#18.0]; 
      T     LB    65; 
      L     PEB [AR1,P#19.0]; 
      T     LB    64; 

      L     #DBZ; //ZielDB öffnen
      T     #DBZT; 
      AUF   DB [#DBZT]; 
      L     #ErstDBDZ; //Übergabe Momentane EinstiegsAdresse
      SLW   3; //Schiebe Binr m drei Positionen nach links
      LAR1  ; 
      L     LD    56; //schreibe Werte in ZielDB
      L     1.000000e+003; 
      /R    ; 
      T     DBD [AR1,P#48.0]; 
      L     LD    60; 
      L     1.000000e+003; 
      /R    ; 
      T     DBD [AR1,P#52.0]; 
      L     LD    64; 
      L     1.000000e+003; 
      /R    ; 
      T     DBD [AR1,P#56.0]; 

      U     L      0.4; 
      R     L      0.4; 
      S     L      0.5; 

      L     #ErstPAW; //schreibe Kennung=1 in erstes PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#1; 
      T     PAB [AR1,P#0.0]; 

      L     #ErstPAW; //schreibe Kennung=22 in erstes PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#50; 
      T     PAB [AR1,P#1.0]; 

//    L     #ErstPAW                    //schreiben von Starttag = 01 in 20. PAB
//  SLW   3
//  T     #Adr
//    LAR1  
//  L     B#16#1
//  T     PAB [AR1,P#20.0]

//     L     #ErstPAW                    //schreiben von Startmonat = 01 in 21. PAB
//   SLW   3
// T     #Adr
//     LAR1  
//   L     B#16#1
//  T     PAB [AR1,P#21.0]

//    L     #ErstPAW                    //schreiben von Endtag = 31 in 22. PAB
//  SLW   3
//     T     #Adr
//   LAR1  
// L     B#16#1F
//   T     PAB [AR1,P#22.0]

//   L     #ErstPAW                    //schreiben von Endmonat = 12 in 23. PAB
// SLW   3
//     T     #Adr
//   LAR1  
// L     B#16#12
//  T     PAB [AR1,P#23.0]

//  SPA   w6                          //zu Bausteinende




w5:   UN    L      0.5; //Messwerttyp 6 - Wirk- und Blindarbeit
      SPB   w6; 

      L     #ErstPEW; //Kennung überprüfen
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     PEB [AR1,P#0.0]; 
      L     B#16#1; 
      <>I   ; 
      SPB   x6; 

      L     #ErstPEW; //Index überprüfen
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     PEB [AR1,P#1.0]; 
      L     50; 
      <>I   ; 
      SPB   x6; 

      ==I   ; 
      SPB   y6; 

x6:   L     #ErstPAW; //schreibe Kennung=1 in erstes PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#1; 
      T     PAB [AR1,P#0.0]; 

      L     #ErstPAW; //schreiben von Index=22 in zweites PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#32; 
      T     PAB [AR1,P#1.0]; 

//      L     #ErstPAW                    //schreiben von Starttag = 01 in 20. PAB
//    SLW   3
//  T     #Adr
//   LAR1  
// L     B#16#1
//      T     PAB [AR1,P#20.0]

//    L     #ErstPAW                    //schreiben von Startmonat = 01 in 21. PAB
//  SLW   3
//      T     #Adr
//    LAR1  
//  L     B#16#4
//T     PAB [AR1,P#21.0]

//      L     #ErstPAW                    //schreiben von Endtag = 31 in 22. PAB
//    SLW   3
//  T     #Adr
//LAR1  
//      L     B#16#1A
//    T     PAB [AR1,P#22.0]

//  L     #ErstPAW                    //schreiben von Endmonat = 12 in 23. PAB
//SLW   3
//      T     #Adr
//    LAR1  
//  L     B#16#4
//T     PAB [AR1,P#23.0]

      SPA   w6; 


y6:   L     PEB [AR1,P#20.0]; //Umladen Messwert1
      T     LB    71; 
      L     PEB [AR1,P#21.0]; 
      T     LB    70; 
      L     PEB [AR1,P#22.0]; 
      T     LB    69; 
      L     PEB [AR1,P#23.0]; 
      T     LB    68; 

      L     PEB [AR1,P#24.0]; //Umladen Messwert2
      T     LB    75; 
      L     PEB [AR1,P#25.0]; 
      T     LB    74; 
      L     PEB [AR1,P#26.0]; 
      T     LB    73; 
      L     PEB [AR1,P#27.0]; 
      T     LB    72; 

      L     #DBZV; //ZielDB öffnen
      T     #DBZVT; 
      AUF   DB [#DBZVT]; 
      L     #ErstDBDZV; //Übergabe Momentane EinstiegsAdresse
      SLW   3; //Schiebe Binr m drei Positionen nach links
      LAR1  ; 
      L     LD    68; //schreibe Werte in ZielDB
      L     1.000000e+003; 
      /R    ; 
      T     DBD [AR1,P#0.0]; 
      L     LD    72; 
      L     1.000000e+003; 
      /R    ; 
      T     DBD [AR1,P#4.0]; 

      U     L      0.5; 
      R     L      0.5; 
      S     L      0.0; 

      L     #ErstPAW; //schreibe Kennung=1 in erstes PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#6; 
      T     PAB [AR1,P#0.0]; 

      L     #ErstPAW; //schreibe Kennung=1 in erstes PAB
      SLW   3; 
      T     #Adr; 
      LAR1  ; 
      L     B#16#1; 
      T     PAB [AR1,P#1.0]; 
      SPB   w6; 


w6:   NOP   0; //Aktualisierung Schieberegister und Wartetimer
      L     #SCHR; 
      L     #SCHRT; 
      <>I   ; 
      L     S5T#1S; // Laufzeit fest eingestellt 30 Sekunden
      SV    #WTIME; // Takt - Timer  Wartezeit lesen
      L     #SCHRT; 
      T     #SCHR; 



END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke schon. ..
Na fein, dann lass den Baustein in der laufenden Anlage einfach unverändert (never touch ..), oder deklariere den tatsächlich verwendeten Lokaldatenbereich in der Variablendeklaration mittels Symbolen, so wie es schon vorgeschlagen wurde. Damit wäre die schlimmste Sünde behoben. Für neue Anlagen schreibst du diese Funktion nach deinen eigenen Vorstellungen und nach den Vorschlägen, die du hier bekommst komplett neu. Dann würden wir alle mal lernen, wie man so etwas besser macht.

  1. als erstes sollte man die Schnittstellenbeschreibung des Messgerätes analysieren
  2. Vorschläge ?
 
Um Gottes Willen, ich habe nicht vor das anzufassen. Neue Anlagen würde ich komplett anders aufschalten.
Aktuell läuft es Mess- und Schaltgeräte -> Profibus -> S7 -> Netzwerk -> OPC Server -> BACNet -> Leittechnik
Die neue Variante wäre Mess- und Schaltgeräte -> Modbus -> Koppelcontroller -> BACNet -> Leittechnik
 
Zurück
Oben