Positive Flanke

nameunbekannt

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

gleich zum Anfang, ich bin blutiger Anfänger und versuche mir alles über ein Selbststudium bei zu bringen, was wirklich nicht sehr einfach ist, wenn man schon paar Jahre nichts mehr damit zu tun hatte.

Ich arbeite mich gerade in die Flanken ein und versuche zu programmieren, dass AUS nur eine 1 hat, wenn EIN 1 ist und EIN_ALT vorher 0 war. Ich bin mir aber nicht sicher ob AUS mit diesem Programm wirklich den Zustand von EIN_ALT mitbekommt, obwohl es in der Simulation eigentlich so aussieht.
 

Anhänge

  • DSC_1298.JPG
    DSC_1298.JPG
    5,4 MB · Aufrufe: 118
Dein Code sieht vieeel zu kompliziert aus.
Eine Flankenerkennung benötigt keine RS, sondern nur eine Merk-Variable für den Zustand im Zyklus vorher.
Du kannst einfach nur den fertigen R_TRIG verwenden:
Code:
       R_TRIG_1
      +--------+
      | R_TRIG |
EIN --|CLK    Q|-- AUS
      +--------+

Oder selbst etwas basteln:
Code:
          +---+
    EIN --| & |-- AUS     //ist nur bei steigender Flanke an EIN für einen Zyklus lang TRUE
EIN_ALT -o|   |
          +---+

          +------+
    EIN --| MOVE |-- EIN_ALT
          +------+

(Ich weiß nicht wie in Codesys-FUP das Bool-Kopieren/Zuweisen aussieht. MOVE könnte falsch sein. Vielleicht muß man auch ein AND mit nur einem Eingang nehmen?)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich wollte ja auch über einen Merker gehen, aber ich finde nicht so richtig irgendwo was wie man im Codesys einen Merker setzt.

Ich muss jetzt auch mal dumm fragen: wenn EIN betätigt wird, hat die positive Flanke den Wert 1,geht die Flanke dann auch wieder auf 0,wenn EIN nicht mehr betätigt wird? Dann wäre ja zumindest die negative Flanke völlig überflüssig. Dann bräuchte ich ja doch nur einen Merker der den Zustand speichert, wenn EIN betätigt wird.
 
Du musst keinen "Merker" verwenden, sondern nur irgendeine Variable, die etwas bis zum nächsten Zyklus speichern (sich "merken") kann. Das kann eine globale Variable, oder eine FB-Instanz-Variable, oder ein Merker sein. Die "Merker" sollte man aber möglichst nur verwenden, wenn es nicht anders geht.

Der Ausgang einer (zyklisch aufgerufenen) Flankenerkennung ist für genau einen Zyklus lang 1 (genau der Zyklus wo die Flanke ist), egal ob der Eingang auf 1 bleibt oder gleich oder irgendwann wieder 0 wird.
Oder präziser - schau Dir die AND-Verknüpfung an: AUS ist nur dann 1, wenn der EIN-Eingang 1 ist und der negierte Eingang 0 ist. Bei einer Flankenerkennung ist am negierten Eingang der Zustand des EIN-Signals vom Zyklus vorher verschaltet.

Wenn man die Aufgabe klar in Umgangssprache/Klartext formuliert, dann ergibt sich ganz einfach wie die Flankenerkennung verschaltet werden muß:
- Positive/steigende Flanke: wenn das Signal jetzt 1 ist und vorher 0 war
- Negative/fallende Flanke: wenn das Signal jetzt 0 ist und vorher 1 war

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
R_trig, ein Bild sagt mehr als tausend Worte...
Wenn man solche Signal/Zeitdiagramme lesen kann...
Wenn jemand Anfänger ist und einen Satz "ist nur bei steigender Flanke an EIN für einen Zyklus lang TRUE" nicht versteht und nochmal nachfragen muß, dann braucht es wohl tausend Worte.

Harald
 
Moin Zusammen,

kann es sein das man in Siemens keine Flanke von einem Merkerbit abfragen kann?
ich habe in AWL eine Sprungbedingung daran gekoppelt. Es scheitert aber schon an der Flanke des Merkerbits.
Ich will einmalig beim Betätigen eines Tasters + Bedingungen einen Zählwert speichern.

Das sollte wie folgt gehen:

U(
O "Profibus".Manuelle_Pruefung_DFM //BOOL
O
U M 0.0 //allways False
U "Profibus".OPERATION_Spritzen //BOOL

U "Profibus".Betrieb_Manuel //BOOL
O M 310.3 //Flanke aus anderem Netzwerk
)
FP M 280.1 //zusätzliche Flanke das er einmalig das Speichert!
= "Sprung_Z2_DFM_abgleich" //VKE = 1 in dem Fall speichern
SPBN _090
L ED 32
T "Startwert_Z2_DFM_Abgleic"

_090: NOP 0

---------------------------------------------------------------------------------------------------------
Anderes Netzwerk:
Bedingungen (TRUE) = M50.7
M50.7 = P-Flanke" M310.3"

(Die Variablen sind hier stark vereinfacht, weil ich nicht den ganzen Kontext hier beschreiben wollte bezüglich der Sinnhaftigkeit habe ich mal den Datentyp angeschrieben.)
Das hat bis jetzt nur nie geklappt weil M310.3 Dauer True wird und die darauffolgende P-Flanke M280.1 immer False bleibt.
Also warum wird meine erste Flanke auf M310.3 immer True und die andere M280.1 immer False?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo @DeltaMikeAir ,

also das funktioniert nicht :)
U "Start DFM"
FP M 310.0
= M 310.3

Wo hast du M10.0 und M10.1 deklariert ich habe einfach die Merkerbits genommen die noch Frei waren.
Muss ich vlt. im FC temporäre Variablen erstellen?
 
@PN/DP muss der Vergleichswert des Zählers für eine kontinuierliche Ausführung von OB40 immer zurückgesetzt werden?
Sprich VG4 erreicht setzte Zählerwert = 0.

Weil er meinen OB40 gar nicht mehr ausführt nur einmalig zum Zeitpunkt Vergleichswert = 4.
Das wäre denkbar ungünstig gelöst.
Ich will eigentlich folgendes Bezwecken:

Vergleichswert erreicht, dann führe einen Code im OB40 aus.
Oder ganz allgemein
Vergleichswert erfüllt, dann überführe einen messwert in einen Datenbaustein.
Den Code für den Datenbaustein hab ich schon getestet.

Mir fehlt nur noch die richtige "Aufrufumgebung" oder halt "Aufrufbedingung".

Wäre klasse wenn jemand das weiß.
 
Weil ich einen Impulsausgang eines Sensor nutze jede 4 Impulse einen Analogeingang zu speichern.
Das macht man meines Kenntnisstandes nach mit einem Hardware Interrupt.

Kläre mich aber gerne auf.
 
Weil ich einen Impulsausgang eines Sensor nutze jede 4 Impulse einen Analogeingang zu speichern.
Das macht man meines Kenntnisstandes nach mit einem Hardware Interrupt.
Dann ist doch der OB40 bereits eine Flanke. Er wird bei deinem Interruptereignis genau 1x aufgerufen.

Vielleicht schreibst du einmal ganz genau was du vor hast.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weil ich einen Impulsausgang eines Sensor nutze jede 4 Impulse einen Analogeingang zu speichern.
Das macht man meines Kenntnisstandes nach mit einem Hardware Interrupt.
Hardwarezähler und Prozessalarm macht man nur, wenn der Sensor-Impuls kürzer als die längste OB1-Zykluszeit ist. Wenn der Sensor-Impuls und die Pause zwischen den Impulsen z.B. länger als 150 ms sind, dann kannst Du Deinen Code normal im OB1 programmieren. Wenn Du den Code im OB35 programmieren willst, dann muß Sensor-Impuls und -Pause jeweils mindestens so lang wie die OB35-Aufrufzeit sein. Dann musst Du außerdem den Sensor-Eingang direkt an der Peripherie abfragen (L PEW...), weil Ex.y nur im Takt des OB1 aktualisiert werden (Prozessabbild der Eingänge, OB1-PA).

Harald
 
Also ich habe einen Impulsausgang der zwischen 0-33,33Hz entsprechen kann.
Dies entspricht einer Wassermenge 0-1000 Liter, das heißt das Verhältnis entspricht 2imp/L.

Jetzt nehmen wir die kritischste Situation an mit 33,33Hz, weil hier die Periodendauer T am geringsten ist.
T = 1/33,33
T = 0,03s oder auch 30ms

Das ganze kann sich bezüglich der Genauigkeit meiner Messung noch verändern, da ich über das Verhältnis meine kleinste Menge bestimme.
4imp/L wären ja schon 250ml pro Impuls anstatt 500ml entsprechend steigt die Frequenz an und die Periodendauer nimmt ab.

Also nach meiner bisherigen Annahme habe ich bei einem Vergleichswert von 4 Impulsen genau 4x30ms also 120ms Zeit für die Rechnung.
Wer hier aufgepasst hat ist aufgefallen das ich den Vergleichswert für den OB40 beliebig hoch setzten kann nur dann entsprechend den Teilfaktor erhöhen muss.
Damit am Ende das "Impuls zu Liter" Verhältnis gleich bleibt.

Für mein Beispiel will ich das ganze aber mit Vergleichswert 4 machen.
Damit gilt innerhalb das ich max. 4 Impulse Zeit habe für den Aufruf des Codes das entspricht 120ms.
Nach meinem Verständis hätte ich alles so gelassen wie es ist im OB40 und würde nur am Schluss die Zeile einfügen:
1. Zählwert vorladen in LADDR1 (Wert = 0)
2. Steuerwort Z0 parametrieren
2.1. Ausgang A11.5 "Lade Wert aus Register - LADDR1" = True

L 0
S A11.5
NOP 0

Dann hätte ich meinen Zähler wieder mit 0 gefüttert zum neuen Aufruf des OB40 richtig?
Also würde ich folgendes Zahlenbeispiel haben im Zählwert:
0,1,2,3,4 sind das dann überhaupt 4 Impulse, denn ich zähle 5 Werte.
Oder muss ich hier den LADDR1 mit 1 laden.
 
Steinigt mich nicht wenn ich hier komplett falsch denke aber ich muss alle 4 Impulse mein Codeschnippsel ausführen.
Die Zykluszeit der Umgebung darf da keine Rolle spielen! Also sollte vielfaches schneller sein.
 
Zurück
Oben