Erstellen eigener log. Bausteine

M

Manticor

Guest
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo zusammen, ich sitze gerade an meinem S7-Projekt fürs Studium und komme einfach nicht mehr weiter. Ich möchte eigentlich nur ein ganz simples Lauflicht mit Hilfe eines Schiebregisters mit D-Flip Flops realisieren.
Deshalb habe ich mir zunächst einen Funktionsbaustein FB1 geschrieben, der ein D-FF realisiert, welches auch sehr gut funktioniert und keinerlei Fehler enthält.
Dann bin ich auf die Idee gekommen, diesen Baustein FB1 in einem andern Baustein FB2 mehrfach aufzurufen und die Ausgänge miteinander zuverschalten. Leider erhalte ich nicht das gewünschte Ergebnis, sondern es scheint mir so, als ob alle FB1 gleichzeit abgearbeitet würden, obwohl sie hintereinander geschlatet sind.
Danach mein D-FF in einem Netzwerk realisiert und in einem FB mehrmals hintereinander gefügt. Dies führte zu dem von mir erwünschten Erfolg. Doch ist nun leider mein Code sehr unübersichtlich.

Nun zu meiner Frage, gibt es eine Möglichkeit in Simantic S7 ein logischer Baustein (z.b. D-FF) so zu speichern, dass er in anderen Funktionen hintereinander verschaltet werden kann?

Ich würde mich freuen, wenn jemand dazu was weiß und mir vielleicht erklären kann wie ich das mache.


Gruß
Steffen Hellwig
 

Jochen Kühner

Well-known member
Beiträge
4.154
Punkte Reaktionen
474
Hilfe...

Schick mal n bisschen Quelltext, dann ist vieleicht leichter nachzuvollziehen.

N Lauflist kannst aber auch über RLD realisieren:

FC1:
UN M1.0
SPB ANF

U T1
SPB END
L MD2
RLD
T MD2
L S5T#500MS
SA T1
SPA END



ANF:
L B#(0, 0, 0, 1)
T MD2
S M1.0
END: NOP 0


Denkemal des müsst gehe...
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.410
Punkte Reaktionen
3.378
Zuviel Werbung?
->Hier kostenlos registrieren
Gleichzeitig abarbeiten geht bei einer S7 eigentlich nicht.

Wenn du deinen FB mit IN- und Out-Variablen versorgt hast, könnte hier das Problem liegen. In-Variablen kannst du zwar im FB verändern (beschreiben), nach Rückkehr aus dem FB haben sie aber nach außen hin wieder den alten Wert. In diesem Fall nimm INOUT-Variablen.

Gruß Ralle !
 
OP
M

Manticor

Guest
Zu meiner Aufgabe im Projekt gehört es leider die D-FF selbst zu basteln und damit das Lauflicht zu realisieren.

Ich verusche mal den quellcode zu schicken, weiß aber nicht ob es möglich ist, da ich in FUP programmiert habe.

habe den FUP jetzt in awl umgewandelt. Hier ein kleiner Auszug aus dem Programm. Es handelt sich um jeweils eine funktion die ein D-Flip Flop darstellt. Und mit dem anderen verbunden ist.


Code:
erstes netzwerk:
  U     #C
      =     L      1.0
      BLD   103
      U     #D
      =     L      1.1
      BLD   103
      CALL  FC     2
       C:=L1.0
       D:=L1.1
       Q:=#Merker1
      NOP   0

zweites:
      U     #C
      =     L      1.0
      BLD   103
      U     #Merker1
      =     L      1.1
      BLD   103
      CALL  FC     2
       C:=L1.0
       D:=L1.1
       Q:=#Merker2
      NOP   0


Ich hoffe, ich konnte dir mein Problem damit etwas genauer schildern. Jetzt schon einmal vielen dank für deine Hilfe



// edit by markus
source in code-tags gesetzt
 
OP
M

Manticor

Guest
Zuviel Werbung?
->Hier kostenlos registrieren
Ich habe es nun meine In - Out-Variablen durch IN/OUT-Variablen erstetzt dennoch schaltet er alle FFs direkt durch. Ich habe zur Sicheheit meine FF-Schaltung nochmal in Digitrace aufgebaut, aber da lief es ohne probleme.

Kann es daran liegen, dass ich eine Funktion und keinen Funktionsbaustein zum Aufrufen meines FFs verwendet habe ?
 

Zottel

Well-known member
Beiträge
2.299
Punkte Reaktionen
277
Manticor schrieb:
Zu meiner Aufgabe im Projekt gehört es leider die D-FF selbst zu basteln und damit das Lauflicht zu realisieren.
Code:
      CALL  FC     2
       C:=#C
       D:=#D
       Q:=#Merker1.1

      CALL  FC     2
       C:=#C
       D:=#Merker1.1
       Q:=#Merker2
Sollte reichen. Poste mal deinen FB2.
Wichtig ist, dass Q von FB2 OUT oder INOUT ist.
Ferner deucht es mich, dass die Nachbildung eines D-Flipflops einen Hilfsmerker zur Erkennung massgeblichen Flanke benötigt. Auch dieser muss über mehrere Aufrufe hinweg seinen Zustand speichern. Also müsste da noch ein Hilfsmerker sein, vom Typ INOUT.
 

RonOro

Active member
Beiträge
34
Punkte Reaktionen
0
Hallo,

falls Du die FC 2 - Aufrufe mit Lokaldaten (#) beschaltest wird es auch nicht funktionieren, da darin keine Werte über Bausteingrenzen hinweg speichern kannst.
 

Zottel

Well-known member
Beiträge
2.299
Punkte Reaktionen
277
Zuviel Werbung?
->Hier kostenlos registrieren
Code:
      CALL  FC     2
       C:=#C
       D:=#D
       Q:=#Merker1.1

      CALL  FC     2
       C:=#C
       D:=#Merker1.1
       Q:=#Merker2

Mir fällt gerade auf, dass du vielleicht ein Pegelgetriggertes D-FlipFlop hast (eben ohne Hilfsmerker).
Dann stell mal den Code so um:
Code:
      CALL  FC     2
       C:=#C
       D:=#Merker1.1
       Q:=#Merker2

      CALL  FC     2
       C:=#C
       D:=#D
       Q:=#Merker1.1
Denn er wird ja sequntiell ausgeführt und bei z.B. Clock=1 "fällt"
das Ergebnis bis hinten durch.
 

Hagen

Well-known member
Beiträge
147
Punkte Reaktionen
4
Sorry für diese Frage, aber was macht ein D-Flip-Flop? Der Begriff
Flipflop ist mir zwar bekannt, bekomme es aber trotzdem nicht zusammen.

Gruss Hagen
 
OP
M

Manticor

Guest
Um auszuschließen, dass ich beim Funktionsaufruf Probleme mit lokalen Variablen bekomme, hab ich mal die Funktion im OB1 aufgerufen.

CALL FC 2
C:=E0.1
D:=E0.2
Q:=A0.1

Funktioniert wunderbar



CALL FC 2
C:=#E0.2
D:=#Merker1
Q:=#Merker2


CALL FC 2
C:=#Takt
D:=E1.1
Q:=#Merker1

U #Merker1
= #Q1

U #Merker1
= #Q2

Wieder der gleiche Fehler, dass alle Ausgänge eine Eins liefern.


Kann es sein, dass ich vielleicht bei FC2 noch ein Endezeichen einsetzen muß, damit sie nicht unendlich läuft. Denn ich habe gerade getestet 2mal FC2 aufzurufen ohne, dass sie in Verbindung stehen und ich hatte wieder das gleiche Problem.

Was mich unabhängig von meinen Flip Flop Problem interessiert ist, ob es keine Möglichkeite gibt mit Simatic einen eigenen Baustein zu definieren, den ich später zum Bau anderer Bausteinen mehrmals einsetzen kann. Ich hab gehört, dass die in Elau/Epas möglich sein soll.



@Hagen
hier mal einen kleine Wertetabelle, da ich nicht weiß wie ich es erklären soll.

D(Eingang) C(Takt) Q(Ausgang)
0 0 alter Zustand
1 0 alter Zustand
1 1 1
0 0 1
0 1 0

Diese Flip Flop schaltet also immer das am Eingang anliegende Signal durch, wenn ein Takt anliegt.



Vielen Dank euch allen für eure Antworten
 

Zottel

Well-known member
Beiträge
2.299
Punkte Reaktionen
277
Zuviel Werbung?
->Hier kostenlos registrieren
Manticor schrieb:
Um auszuschließen, dass ich beim Funktionsaufruf Probleme mit lokalen Variablen bekomme, hab ich mal die Funktion im OB1 aufgerufen.

CALL FC 2
C:=E0.1
D:=E0.2
Q:=A0.1

Funktioniert wunderbar
Du hast immer noch nicht deinen FC2 gepostet. Nach deiner Wahrheitstabelle unten funtioniert er etwa so:
UN C
BEB
U D
= Q

Wenn C high wird D nach Q übertragen.
Dein D-Flip-Flop ist dann Pegelgetriggert.
Auch mit realen solchen Bausteinen funktioniert dein Lauflicht so NICHT, da der Pegel sofort zu nächsten durchgereicht wird, wenn C high ist.

Mein voriger Vorschlag ging dahin, die Übernahme in das Nachfolger Flip-Flop vor der Änderung des Vorgängers durchzuführen.
Dies würde funktionieren, wenn die SPS nach dem Wechsel low->high an C nur einen einzigen Zyklus durchliefe.
Sie macht jedoch mehrere Zyklen mit dem high Pegel an C und schiebt pro Zyklus eins weiter. Das geht so schnell, dass du meinst, alle Flip-Flops kippten gleichzeitig.

Du darfst nur einmal auf den Wechsel low-->high von C regieren.
Das kannst du auf zwei Arten erreichen:
1. Du bildest deine Flip-Flops im FC2 als Flankengetriggerte D-FlipFlops aus:
U C
UN CALT
u D
S Q

UC
UN CALT
UN D
R Q

U C
= CALT

hier stimmt die Bedingung Clock und nicht Clock Alt nur für einen Zyklus nach der steigenden Flanke.
Du brauchst aber den Hilfsmerker CALT, der INOUT und pro Aufruf ein anderes Bit sein muss.
Dies ist eine möglichst exakte Nachbildung der Flankengetriggerten Flip-Flops wie sie z.B. ein 74374 enthält.

Wenn du das nicht brauchst, gehts auch noch anders:

1. Du rufst den umgebenden FC(1? ,der der die Aufrufe von FC2 enthält), nur auf wenn eine Flanke an C auftritt.

2. Oder du bildest die einen Impuls:
U C
UN CALT
= CIMP
U C
= CALT
jetzt setzt du CIMP überall da ein, wo du C verwendet hast.

3. Du sparst dir die Modellierung der Flipflops ganz:
U Q2
U CIMP
S Q3

UN Q2
U CIMP
R Q3

U Q1
U CIMP
S Q2

UN Q1
U CIMP
R Q2

U Q0
U CIMP
S Q1

UN Q0
U CIMP
R Q1

U E
U CIMP
S Q0

UN E
U CIMP
R Q0

bildet das Schieberegister in einem "Rutsch" nach.
Aber dann kanst du auch gleich Worte schieben...
 
Oben