S7 SCL: Zugriff auf Zykluszeit, Merker, Zustand von Eingängen oder Ausgängen

trexer

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

ich möchte einen zyklusgenauen Datenlogger in SCL programmieren. Ich kann bereits auf Variablen in DBs zugreifen und diese speichern. Nun würde ich gerne den Zustand der EIngänge/Ausgänge, Merker des S7 oder die letzt Zykluszeit abspeichern. Wie greife ich in SCL auf diese Sachen zu? Zykluszeit z.B. geht ja sonst mit #OB1_PREV_CYCLE, wie aber in SCL?

VIelen Dank!
 
In OB1, #OB1_PREV_CYCLE in ein passender Variabel abspeichern.
Dann kannst du es beliebig verwenden, auch in dein SCL program.

Eingänge, Ausgänge, und Merker werden in SCL genauso addressiert wie in AWL, FUP oder KOP, absolut oder Symbolisch.
In SCL ist es bestens wenn du Symbolische Adressen mit Apostrophen markierst. Z.B.: "Druck_Schalter_33".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Antwort! Leider hab ich es noch nicht so ganz verstanden. Glaube aber wie ich auf Eingänge/Ausgänge zugreife ist mir jetzt klar geworden.

Ok also ohne das anbinden von #OB1_PREV_CYCLE in OB1 und dort zunächst abspeichern geht es nicht?
Kann man in einem FB der in SCL programmiert ist auf ein Merkerwort oder Merkerbyte zugreifen das in einem anderen OB verwendet wird? Ist so ein Merkerbyte also global oder nur in dem Baustein in dem es angelegt wird benutzbar?

Danke!
 
Merker sind global.

Der bessere Weg ist aber sicher, eine Eingangsvariable vom Typ INT in Deinem SCL-Baustein zu deklarieren, an die Du beim Aufruf des SCL-Bausteins den Inhalt von #OB1_PREV_CYCLE übergibst.

Beispiel Auszug SCL-Function:
Code:
[FONT=courier new]FUNCTION TEST : ...[/FONT][FONT=courier new]
[/FONT]
[FONT=courier new]VAR_INPUT[/FONT]
[FONT=courier new]    // Eingangsparameter[/FONT]
[FONT=courier new]    OB1_PREV_CYCLE : INT; [/FONT]
[FONT=courier new]END_VAR[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]...

END_FUNCTION[/FONT]


und Aufruf im OB1:
Code:
[FONT=courier new]      CALL  "Test"[/FONT]
[FONT=courier new]        OB1_PREV_CYCLE:=#OB1_PREV_CYCLE[/FONT]
...
 
Zuletzt bearbeitet:
Merkerbytes sind global. du kannst also von überall her drauf zugreifen.

Aber du könntest ja auch den ob1 direkt in SCL programmieren.
z.B.

Code:
ORGANIZATION_BLOCK CYCL_EXC
TITLE = 'Main'
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

DB1.CYCLE := OB1_PREV_CYCLE;

// oder so

TESTFB.TESTIDB(CYCLE := OB1_PREV_CYCLE); // Wenn du einen FB aufrufen willst dessen Eingangsparameter den Cycle inhalt kriegen soll.

END_ORGANIZATION_BLOCK
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Tipps!

Das einzige was ich jetzt noch gut gebrauchen könnte wäre ein Beispiel für einen FB/FC in SCL wie ich auf einen globalen Merker zugreifen kann. Danke!
 
Danke für die Tipps!

Das einzige was ich jetzt noch gut gebrauchen könnte wäre ein Beispiel für einen FB/FC in SCL wie ich auf einen globalen Merker zugreifen kann. Danke!

Hast du eigentlich jemals in die Online-Hilfe von SCL geschaut?
Da steht genau das drin.

Code:
Bit := M10.0;
Byte := MB10;
Wort := MW10;
...

Gruß
Dieter
 
Danke. Geht um 8 Variablen die zyklisch in einem DB im Real-Format gespeichert werden sollen.
Zur Zeit benutzte ich für Merker:
Real0 := DWORD_TO_REAL(MD[DB996.variable[0].byad]);

Und für Real Typen aus Datenbanken z.B.
Real0 := DWORD_TO_REAL(WORD_TO_BLOCK_DB(DINT_TO_WORD(DB996.variable[0].dbad)).DD[DB996.variable[0].byad]);


Wäre der Block Move schneller und würde die SPS weniger belasten oder was sind die Vorteile?
 
Ab einer bestimmten Datenanzahl ist der SFC20 schneller. Darüber findest über die Suchfunktion einige Infos.

Übrigends:
SCL wird erst richtig schön, wenn man Symbolik verwendet. Und wenn man das richtig macht, dann braucht man auch kaum Type casts.

Gruß
Dieter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
SFC20 guck ich mir mal an danke.

Wie funktioniert das mit Symbolik, was muss ich suchen oder hast du ein Beispiel? Die Rohdaten liegen halt in Real, Integer, Word und so weiter vor... muss ich da nicht jeden Fall einzelnd behandel und mir erst umwandeln?
 
Hallo,
erstmal gibt es ja für die globalen Operanden (E, A, M , T , C usw.) den Symbolik-Editor. Die dort vergebene Sysmbolik kannst du auch statt "E0.0" direkt im SCL-Code einsetzen.
Das geht natürlich auch bei externen DB's vorausgesetzt der DB hat einen symbolischen Namen.
Dann kann man natürlich auch noch im Baustein (vor Allem bei FB's) jede Menge Variablen deklarieren - auf kommst du dann sowieso symbolisch.

symbolisch = den vergebenen Namen (der vielleicht die Funktion repräsentiert) verwenden ...

Gruß
Larry
 
Nochmal zum Punkt Bearbeitungszeit :
Aus dem von dir dargestellten Code-Schnipsel macht SCL (mit Pointern etc.) einen richtigen Code-Berg. Mach dir mal den Spaß und sieh dir den gewandelten AWL-Code davon an (dafür mußt du nur die SCL-Quelle aus dem Projekt verschieben).
Der von Blockmove-Dieter genannte SFC20 "rechnet" sich hier dann auf jeden Fall ...
 
Zurück
Oben