Zu viele E/A´s in die Simulation bzw. echte CPU???

Katrin1982

Level-1
Beiträge
134
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich hab hier ein etwas größe Anlage.

Anlagenbeschreibung:

CPU 315-2DP / PN
E/A´s direkt auf der CPU über Erweiterungkarten:
24 AI
32 DI
32 DO

Über Janiza UMG 96 S
EW 256-319
AW 256

Antriebsteilnehmer
Über Darwin-Gateway Feld1:
E0.0 - E37.7
A0.0 - A37.7
Über Darwin-Gateway Feld2:
E40.0 - E93.7
A40.0 - A93.7
Über Darwin-Gateway Feld3:
E94.0 - E127.7
A94.0 - A127.7
Über Darwin-Gateway Feld4:
E128.0 - E177.7
A128.0 - A177.7
Über Darwin-Gateway Feld5:
E178.0 - E209.7
A178.0 - A209.7

29 Freuenzumrichter
EW 256 - 544
AW 256 - 544

Möchte gerne mit PLCSIM das ganz simulieren, aber bei EB128 ist schluss. Kann die Simulation nicht mehr?

Reicht meine CPU überhaupt für das Vorhaben aus?
 
PLCSIM geht bei mir bis EB16383.

Die CPU 315-2DP / PN hat einen Adressbereich von 2048 Byte.

Das Prozessabbild der Ein- und Ausgänge ist voreingestellt
auf 128 Byte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie kann ich das Abbild ändern?
HW-Konfig -> CPU -> Eigenschaften -> Zyklus/Taktmerker

Ich lese direkt meine EB ein, brauch das als Statusmeldung für den Farbumschlag auf meinem Panel.
 
Zuletzt bearbeitet:
Ich glaube bei den 315ern geht das Prozessabbild nicht zu vergrößern (bei den 317ern geht es).

Lies doch diese Bytes direkt z.B. so:

L PEB 129
 
Perfekt, so einfach kann es gehen. :)

Danke

Hab jetzt aber noch eine Frage.
Möchte mir gerne einen FB schreiben, wo ich das EB des Antriebs und das EB das Antriebs davor abfrage, an meinen Baustein möchte ich dann wirklich nur EB0 und EB1 dran schreiben müssen, brauch die Bits aber im Baustein selber aufgelöst, wir bekomm ich das denn hin?
 
Perfekt, so einfach kann es gehen. :)

Danke

Hab jetzt aber noch eine Frage.
Möchte mir gerne einen FB schreiben, wo ich das EB des Antriebs und das EB das Antriebs davor abfrage, an meinen Baustein möchte ich dann wirklich nur EB0 und EB1 dran schreiben müssen, brauch die Bits aber im Baustein selber aufgelöst, wir bekomm ich das denn hin?

Das geht wenn du den Eingangsparameter(EB oder EW) als Struct of bool innerhalb des FB deklarierst.


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde das ganze so machen intern mit Pointer
auf die EB's zugreifen.

Hier der ganze Code als Quelle:

Code:
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1


VAR_INPUT
  EB_1 : BYTE ;    
  EB_2 : BYTE ;    
END_VAR
VAR
  EB1_0 : BOOL ;    
  EB1_1 : BOOL ;    
  EB1_2 : BOOL ;    
  EB1_3 : BOOL ;    
  EB1_4 : BOOL ;    
  EB1_5 : BOOL ;    
  EB1_6 : BOOL ;    
  EB1_7 : BOOL ;    
  EB2_0 : BOOL ;    
  EB2_1 : BOOL ;    
  EB2_2 : BOOL ;    
  EB2_3 : BOOL ;    
  EB2_4 : BOOL ;    
  EB2_5 : BOOL ;    
  EB2_6 : BOOL ;    
  EB2_7 : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =EB_1

      L     P##EB_1; 
      LAR1  ; 
      U      [AR1,P#0.0]; 
      =     #EB1_0; 
      U      [AR1,P#0.1]; 
      =     #EB1_1; 
      U      [AR1,P#0.2]; 
      =     #EB1_2; 
      U      [AR1,P#0.3]; 
      =     #EB1_3; 
      U      [AR1,P#0.4]; 
      =     #EB1_4; 
      U      [AR1,P#0.5]; 
      =     #EB1_5; 
      U      [AR1,P#0.6]; 
      =     #EB1_6; 
      U      [AR1,P#0.7]; 
      =     #EB1_7; 

NETWORK
TITLE =EB_2

      L     P##EB_2; 
      LAR1  ; 
      U      [AR1,P#0.0]; 
      =     #EB2_0; 
      U      [AR1,P#0.1]; 
      =     #EB2_1; 
      U      [AR1,P#0.2]; 
      =     #EB2_2; 
      U      [AR1,P#0.3]; 
      =     #EB2_3; 
      U      [AR1,P#0.4]; 
      =     #EB2_4; 
      U      [AR1,P#0.5]; 
      =     #EB2_5; 
      U      [AR1,P#0.6]; 
      =     #EB2_6; 
      U      [AR1,P#0.7]; 
      =     #EB2_7; 

END_FUNCTION_BLOCK

DATA_BLOCK DB 1
TITLE =
VERSION : 0.0

 FB 1
BEGIN
   EB_1 := B#16#0; 
   EB_2 := B#16#0; 
   EB1_0 := FALSE; 
   EB1_1 := FALSE; 
   EB1_2 := FALSE; 
   EB1_3 := FALSE; 
   EB1_4 := FALSE; 
   EB1_5 := FALSE; 
   EB1_6 := FALSE; 
   EB1_7 := FALSE; 
   EB2_0 := FALSE; 
   EB2_1 := FALSE; 
   EB2_2 := FALSE; 
   EB2_3 := FALSE; 
   EB2_4 := FALSE; 
   EB2_5 := FALSE; 
   EB2_6 := FALSE; 
   EB2_7 := FALSE; 
END_DATA_BLOCK

ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1


VAR_TEMP
  OB1_EV_CLASS : BYTE ;    //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ;    //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ;    //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ;    //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ;    //Reserved for system
  OB1_RESERVED_2 : BYTE ;    //Reserved for system
  OB1_PREV_CYCLE : INT ;    //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ;    //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ;    //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ;    //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =

      CALL FB     1 , DB     1 (
           EB_1                     := EB     0,
           EB_2                     := EB     1);
      NOP   0; 
END_ORGANIZATION_BLOCK


Oder mit Schmiermerkern: :)

Code:
 L     #EB_1
 T     MB   250

 L     #EB_2
 T     MB   251
 
Zuletzt bearbeitet:
OK, und wie kann ich dann mit den einzelnen Bits arbeiten?

Ich mein, kann das Struct ja nicht direkt an ein UND/ODER Gatter anlegen.
 
OK, und wie kann ich dann mit den einzelnen Bits arbeiten?

Ich mein, kann das Struct ja nicht direkt an ein UND/ODER Gatter anlegen.

Sorry, habe kein S7, daher die Quelle.

Code:
FUNCTION_BLOCK FB1
TITLE =
VERSION : 0.1

VAR_INPUT
   test : STRUCT
     e0_0 : bool;
     e0_1 : bool;
     e0_2 : bool;
     e0_3 : bool;
   END_STRUCT;
ENDVAR

BEGIN
NETWORK
TITLE

   U #test.e0_0
   U #test.e0_1
   = M 0.0

END_FUNCTION_BLOCK

bike


P.S: Es müssen nicht immer Pointer sein. :)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Quelle ließ sich nicht übersetzen,
so geht es:

Code:
FUNCTION_BLOCK FB5
TITLE =
VERSION : 0.1

VAR_INPUT
   test : STRUCT
     e0_0 : bool;
     e0_1 : bool;
     e0_2 : bool;
     e0_3 : bool;
   END_STRUCT;
END_VAR

BEGIN
NETWORK
TITLE =

   U #test.e0_0;
   U #test.e0_1;
   = M 0.0;

END_FUNCTION_BLOCK
Aber wie kann ich da jetzt von außen ein EB verwenden.
Da steht jetzt IN: STRUCT und bei einem EB kommt die Meldung
Typkonflikt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry, habe kein S7 hier.

Werde wohl etwas alt inzwischen.
Der Eingang muss ein Wort sein, das mit dem SFC 20 in eine interne Variable umkopiert wird.
Ungefähr so:

Code:
FUNCTION_BLOCK FB 1

TITLE = 
VERSION : 0.1


VAR_INPUT
  eing : word;
END_VAR
VAR_TEMP
  test_intern : struct
    e00 : BOOL;
    e01 : BOOL;
    e02 : BOOL;
    e03 : BOOL;
  END_STRUCT ;
END_VAR
BEGIN
Netwwork
TITLE = 
  CALL "BLKMOV"(
      SBCBKL   := #eing,
      RET_VAL  := MW 20,
      DSTBLK    := #test_intern);
  NOP 0;

NETWORK
TITLE = 

   U #test_intern.e00;
   U #test_intern.e01;
   = M0.0;

END_FUNCTIONSBLOCK
Und wenn ich einen Strichpunkt oder einen Punkt vergessen habe, dann bitte nachführen.

Werde morgen mal testen, was ich hier geschrieben habe. :confused:

bike
 
Es gibt auch nocht die Quick and Dirty-Variante, wobei ich die Pointer-Variante eindeutig bevorzugen würde.

Code:
L #Einganbsbyte //IN Parameter FC
T #Hilfsbyte_0  //Lokaldatenbyte (Adresse 0)

U L0.0 ...

Das ist sozusagen die moderne Variante des Schmiermerkers ...

Mfg
Manuel
 
Hier das ganze korrigiert und mit Byte:

Code:
FUNCTION_BLOCK FB 5

TITLE = 
VERSION : 0.1


VAR_INPUT
  eing : byte;
END_VAR
VAR_TEMP
  test_intern : struct
    e00 : BOOL;
    e01 : BOOL;
    e02 : BOOL;
    e03 : BOOL;
  END_STRUCT ;
END_VAR
BEGIN
Network
TITLE =
  CALL "BLKMOV"(
      SRCBLK   := #eing,
      RET_VAL  := MW 20,
      DSTBLK    := #test_intern);
  NOP 0;

NETWORK
TITLE = 

   U #test_intern.e00;
   U #test_intern.e01;
   = M0.0;

END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier das ganze korrigiert und mit Byte:

Code:
FUNCTION_BLOCK FB 5

TITLE = 
VERSION : 0.1


VAR_INPUT
  eing : byte;
END_VAR
VAR_TEMP
  test_intern : struct
    e00 : BOOL;
    e01 : BOOL;
    e02 : BOOL;
    e03 : BOOL;
  END_STRUCT ;
END_VAR
BEGIN
Network
TITLE =
  CALL "BLKMOV"(
      SRCBLK   := #eing,
      RET_VAL  := MW 20,
      DSTBLK    := #test_intern);
  NOP 0;

NETWORK
TITLE = 

   U #test_intern.e00;
   U #test_intern.e01;
   = M0.0;

END_FUNCTION_BLOCK

Danke, wir können uns mal bei einem Bier treffen und eine AWL-Quelle schreiben.
Mal sehen, ob dir kein Fehler passiert.
Es ist nicht als Programm gedacht, sondern als Tipp.

Es gibt für diese Aufgabenstellung viele Wege, meiner muss nicht der richtige sein, aber es passt und kann ohne Problem auch für andere Aufgabenstellungen verwendet werden.

Nix für ungut

bike
 
Hui da fühlt sich aber einer auf den Schlips getreten. :)

Ich habe das ganze nur mal mit Byte ausprobiert
und es hat auch funktioniert.
 
Zurück
Oben