Zugriff auf OB1_SCAN_1 aus FB heraus

Franky08

Level-2
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich möchte die lokale Variable OB1_SCAN_1 aus dem Baustein OB1 in einem
Funktionsbaustein FB1 auswerten. Das Programm im FB1 ist in SCL geschrieben.

Sinn ist es zu ermitteln, wie oft der FB1 in einem Zyklus aufgerufen wird.

Zur Zeit übergebe ich die lokale Variable OB1_SCAN_1 als Parameter an den FB1, was auch funktioniert. Allerdings möchte ich die Variable OB1_SCAN_1 gerne direkt und absolut aus meinem FB1 ansprechen.

Wie mache ich das in SCL?

Und ist es überhaupt möglich auf den L-Stack des OB1 aus einem FB direkt zuzugreifen? Geht das evtl. mit Pointern?

Bis dann.

Gruß
Frank
 
Also in AWL ginge das und würde so aussehen, vorrausgesetzt Du rufst Deinen FB im OB1 auf:
Code:
      L     DW#16#87000000              //Bereichskennung auf Lokaldaten des Vorgängerbausteins ab LB0
      LAR1  
      L     B [AR1,P#1.0]               //#OB1_SCAN_1 
      .........

Aber wozu um Himmels Willen sollte man sowas machen? :confused:
 
Danke für die schnelle Antwort. :)

Also ich wollte das OB1_SCAN_1 aus der Schnittstelle des FB1 raus nehmen, um nicht unnötig viele Eingänge zu haben.

Und ich wollte den FB1 später aus einem anderen FB aufrufen. Dann müsste ich OB1_SCAN_1 durch diesen auch durchreichen.

Das ganze ist ein Hobbyprojekt und zum Lernen gedacht. Ich hab mir einen Kran aus Fischertechnik gebaut. An dem sind mehrere Motoren, Endschalter Lichtschranken usw. Alles wird über eine SPS gesteuert.

Nun wollte ich die Motoren gerne auch in der Geschwindigkeit bzw. Drehzahl steuern können. Da eine analoge Ausgabebaugruppe verdammt teuer ist, griff ich zu einem Microcontroller. Der erzeugt eine PWM-Frequenz, um die Motoren zu steuern.

Über mehrere Ausgänge der SPS wird seriell ein Signal an den Microcontroller übermittelt, um die Drehzahl aus der SPS heraus einstellen zu können. Funktioniert soweit ganz gut. Ich habe somit 8 analoge Ausgänge, die ich steuern kann.

Mein FB1 erzeugt nun das Signal, damit der Microcontroller arbeiten kann. Er wird für jeden Motor einzeln aufgerufen. Also instanzmäßig.
In dem FB1 ist ein Zähler. Der muss bedingt durch mein Programm im Microcontroller für jede Instanz syncron arbeiten.
Ich habe das zunächst über eine Variable im L-Stack gelöst und einen eigenen Taktgeber mit Zähler im FB programmiert.

Naja, und damit der Zähler nicht immer bei jedem FB1-Aufruf hochzählt, benötige ich die Anzahl der Bausteinaufrufe, damit er nur beim ersten Aufruf des FB1 zählt. Wollte die gerne automatisch ermitteln lassen.

Also soviel zu meinem Vorhaben. ;-)

Wollte das Programm nun in SCL neu schreiben, um es übersichtlicher zu machen. Wie würde das funktionieren?

Gruß

Frank
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Frank,

Code:
FUNCTION_BLOCK FB1

VAR_TEMP
  TOP_SI: struct
    EV_CLASS: byte;
    EV_NUM:   byte;
    PRIORITY: byte;
    NUM:      byte;
    TYP2_3:   byte;
    TYP1:     byte;
    ZI1:      word;
    ZI2_3:    dword;
  end_struct;
  START_UP_SI: struct
    EV_CLASS: byte;
    EV_NUM:   byte;
    PRIORITY: byte;
    NUM:      byte;
    TYP2_3:   byte;
    TYP1:     byte;
    ZI1:      word;
    ZI2_3:    dword;
  end_struct;
  ERR : INT;
END_VAR
VAR
END_VAR

BEGIN

(* OB1_SCAN_1  BYTE  -  B#16#01: Abschluss des Neustarts (Warmstarts)
   = TOP_SI.EV_NUM   -  B#16#02: Abschluss des Wiederanlaufs
                     -  B#16#03: Abschluss des freien Zyklus
                     -  B#16#04: Abschluss des Kaltstarts
                     -  B#16#05: Erster OB 1-Zyklus der neuen Master-CPU nach 
                                 Master-Reserve-Umschaltung und STOP des 
                                 bisherigen Masters *)

  ERR := RD_SINFO (TOP_SI := TOP_SI, START_UP_SI := START_UP_SI);

  
END_FUNCTION_BLOCK

In TOP_SI.EV_NUM steht dann der Wert aus dem OB1 (OB1_SCAN_1).

Gruss Daniel
 
Zurück
Oben