Zeitmessung über Prozessalarm

tigger

Level-1
Beiträge
66
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Liebes SPS-Forum-Team, ich versuche schon seit Tagen eine Zeitmessung mit Hilfe des OB 40 und einer Digitalen Eingangsbaugruppe (mit Prozess und Diagnosealarm) hin zu bekommen. Leider ohne Erfolg.
Ich habe an dem 1.Eingang und am 3.Eingang ein Digitaleingang. Durch eine negative Flanke am 1. soll die Zeitmessung starten und durch eine positive Flanke wieder stoppen.So habe ich ein Häkchen "fallende Flanke" am Eingang 0-1 und eine Häkchen "steigende Flanke" am Eingang 2-3 gesetzt.

Ich denke das ich einen Programmierfehler im OB 40 mache. Hat einer vielleicht eine Idee wie ich dort eine Zeitmessung am besten programmiere?
 
Nur so als kleine Anregung:
Wenn Du glaubst, einen Programmierfehler zu haben wäre es vielleicht nicht schlecht, wenn Du den Code posten würdest. Zumindestens, wenn Dir jemand helfen soll...
 
Ich dachte nur das ich euch mit meinem Mist verwirre, aber gut ;-)

L #OB40_POINT_ADDR
T db166.dbd78

U #zeitmessung_bereit
UN DB166.DBX 78.2
S #zeitmessung_start
U #zeitmessung_bereit
U DB166.DBX 78.3
R #zeitmessung_start

U #zeitmessung_start
L S5T#20S
SI T16

LC T16
T db166.dbw122

U(
U(
L db166.dbw122
BTI
T #zeit_int
SET
SAVE
CLR
U BIE
)
SPBNB _001
L 200
L #zeit_int
-I
T #zeit_int
UN OV
SAVE
CLR
_001: U BIE
)
SPBNB _002
L #zeit_int
L 100
*I
T #zeit_int
_002: NOP 0

#zeit_int = Ergebnis
 
beim OB40 etwas zu beobachten ist immer schwer, vlt. lässt du ihn nur
deine Alarmeingänge Triggern und speicherst die Zeit des Aufrufs mit
"OB40_DATE_TIME" zwischen und machst die Auswertung dann im
Zyklischen Programm.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was du in Beitrag #4 geschrieben hast wird nicht funktionieren, du musst
die Zeit des ersten Impuls speichern wie schon gesagt mit "OB40_DATE_TIME",
dann die Zeit deines zweiten Impulses und diese voneinander abziehen.

Dein OB40 wird bei jeden Alarm, also Impuls deines Alarmeinganges nur für
einen Zyklus aufgerufen. Also nicht wie z.b. wie der OB1 der Zyklisch läuft.
 
Helmut hat recht.
Du könntest zwar prinzipiell auch mit einer S5TIME arbeiten, müsstest dann aber anders da ran gehen. Wenn Deine Zeit gestartet wird, wird der OB einmal durchlaufen und der volle Zeitwert ausgegeben. Der OB wird das nächste Mal durchlaufen, wenn die Zeit gestoppt wird, aber dann ist "zeitmessung_start" schon wieder zurückgesetzt und somit wird der Zeitwert nicht übertragen.

Code:
P.S: Code als "Code" posten erhöht die Lesbarkeit deutlich
 
Was du in Beitrag #4 geschrieben hast wird nicht funktionieren, du musst
die Zeit des ersten Impuls speichern wie schon gesagt mit "OB40_DATE_TIME",
dann die Zeit deines zweiten Impulses und diese voneinander abziehen.

Danke, woher weiß ich denn, dass der 1.Impuls für die fallende Flanke und der 2.Impuls für die steigende Flanke kam, damit ich mir "OB40_DATE_TIME" merken kann. Kann ich mir die,wenn es denn gehen sollte auch gleich in einem DB speichern.
z.B.

u #zeitmessung_bereit
fn ?????
l "OB40_DATE_TIME"
t DB1DBD0

u #zeitmessung_bereit
fp ?????
l "OB40_DATE_TIME"
t DB1DBD4

Oder sollte ich lieber den zweiten Eingang mit einem extra-OB (z.B.OB41) bearbeiten?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke, woher weiß ich denn, dass der 1.Impuls für die fallende Flanke und der 2.Impuls für die steigende Flanke kam, damit ich mir "OB40_DATE_TIME" merken kann. Kann ich mir die,wenn es denn gehen sollte auch gleich in einem DB speichern.
Anders:
Du hast doch ein Startsignal und ein Stoppsignal.
Wenn das Startsignal kommt, rettest Du den aktuellen OB40_DATE_TIME entweder in Merker oder DB. Wenn Dein Stoppsignal kommt, ziehst Du den geretteten Wert vom aktuellen ab und schon hast Du die abgelaufene Zeit.

P.S. Setze doch Mal Deinen Code in "Code"-Zeichen
 
Danke, woher weiß ich denn, dass der 1.Impuls für die fallende Flanke und der 2.Impuls für die steigende Flanke kam, damit ich mir "OB40_DATE_TIME" merken kann. Kann ich mir die,wenn es denn gehen sollte auch gleich in einem DB speichern.
z.B.

u #zeitmessung_bereit
fn ?????
l "OB40_DATE_TIME"
t DB1DBD0

u #zeitmessung_bereit
fp ?????
l "OB40_DATE_TIME"
t DB1DBD4

Oder sollte ich lieber den zweiten Eingang mit einem extra-OB (z.B.OB41) bearbeiten?


Du fragst im Zyklischen Programm einfach deine Eingänge ab, gehe mal
einfach davon aus das die Flanken der Alarmeingänge nicht Zeitgleich
kommen, wenn doch kannst du sie eh nicht Auswerten.
Also steigende Flanke Startalarms die Letzte Zeit in einen normalen Zwischenspeicher
ablegen. Fallende Flanke Endalarms diese Zeit in den nächsten Zwischenspeicher
und dann diese beiden Werte voneinander abziehen. Das war es.

Im OB40 nichts anderes machen wie:
Code:
L #OB40_DATE_TIME
T #Speicher_OB40

Den rest im Zyklischen Programm, so kannst du es auch dann wunderbar
beobachten und intreptieren. Die Flanken stehen doch so lange an das Sie
im Zyklischen Programm ausgewertet werden können?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
woher weiß ich denn, dass der 1.Impuls für die fallende Flanke und der 2.Impuls für die steigende Flanke kam, damit ich mir "OB40_DATE_TIME" merken kann.
Du mußt doch sowieso über OB40_MDL_ADDR und OB40_POINT_ADDR auswerten, welcher Digitaleingang Deinen OB40 ausgelöst hat. Dann weißt Du doch auch, ob es das Start- oder Stopsignal war und ob Du OB40_DATE_TIME speichern oder mit dem gespeicherten Wert verrechnen mußt.
Es ist wohl eher unwahrscheinlich, doch Du solltest immer beide Alarmbits prüfen, ob nicht etwa die steigende Flanke des einen Eingangs und die fallende Flanke des anderen Eingangs gleichzeitig aufgetreten sind.

Oder sollte ich lieber den zweiten Eingang mit einem extra-OB (z.B.OB41) bearbeiten?
Das ist nicht nötig und z.B. bei S7-300-CPU auch nicht möglich, nur S7-400-CPU.

Die Zeitmessung mit nur OB40 ist sogar mit nur 1 Digitaleingang möglich (steigende Flanke Start, fallende Flanke Stop). Dann müsstest Du nur zusätzlich den Zustand 1 oder 0 des Digitaleingangs im OB40 wissen, z.B. über L PEBx.

Harald
 
Zurück
Oben