Stoppuhr über SPS ansteuern ?!?!

SPS-Klempner

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Ich habe von meinem Chef die Aufgabe bekommen, eine Stoppuhr über eine S7 300 anzusteuern (Ansteuerung der Uhr über BCD). Nebenbei soll noch ein kleines "Effektgewitter" (Ansteuerung von verschiedenen Lichteffekten und dergleichen) ablaufen, aber das ist nicht das Problem.

Da ich von SPS mehr oder weniger keine Ahnung habe (bin in der Micro-Elektronik zu Hause), hab ich das Internet nach einer schnellen Lösung befragt. Leider musste ich feststellen, dass ich mit meinen FUP- und KOP-Kenntnissen nicht weit komme.

Für Vorschläge und Anregungen wär ich sehr dankbar (evtl auch Buchtipps).

mfG,
Uli
 
Hi

wenn man sich die Lösung schon im Internet sucht dann wären etwas mehr Angaben oder eine genauere Beschreibung von Vorteil.

1. Die Stopuhr-Funktion läuft in der SPS ????
2. Du möchtest über Ausgänge 7-Segment-Anzeigen ansteuern ????
3. Wie viele Stellen vor und nach dem Komma -> 999,9 ????

Oder habe ich das ganz falsch verstanden und bin auf dem Holzweg???

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Die Stoppuhr gibts noch nicht. Hab gehofft, ich könnte einen Timer nehmen (z.B. einschaltverzögert) und irgendwie den aktuellen Zeitwert abfragen (wird ja dezimal und dual ausgegeben, wenn ich das richtig verstanden hab).
2. Ich möchte eine vorhandene 7-Segment-Anzeige BCD-codiert ansteuern. Ein Modul für die Umwandlung von BCD zu 7-Segment ist vorinstalliert.
3. Die Anzeige zeigt volle Sekunden. Die Anzeige ist dreistellig, ohne Nachkommstelle.

mfG,
Uli
 
soll die restzeit oder die abgelaufene zeit angezeigt werden?
woher kommt die sollzeit?
 
Restzeit von was?

Hier mal eine AWL Quelle, hier wird von 0 nach 1h gezählt. Für rückwärts müsste der Code etwas angepasst werden. Ein Überlauf ist noch nicht berücksichtigt.

Code:
DATA_BLOCK DB 4
TITLE =
AUTHOR : SIMATIC
FAMILY : IEC_TC
VERSION : 0.0
"TON"
BEGIN
   IN := FALSE; 
   PT := T#0MS; 
   Q := FALSE; 
   ET := T#0MS; 
   STATE := B#16#0; 
   STIME := T#0MS; 
   ATIME := T#0MS; 
END_DATA_BLOCK
FUNCTION "Stoppuhr" : VOID
TITLE =
VERSION : 0.1

VAR_TEMP
  Start : BOOL ; 
  Not_Used : BOOL ; 
  TON_ET : TIME ; 
  TON_ET_DINT : DINT ; 
  TON_ET_S : DINT ; 
  TON_ET_S_BCD : DWORD ; 
END_VAR
BEGIN
NETWORK
TITLE =
      U     E      0.0; 
      =     #Start; 
NETWORK
TITLE =
      U     #Start; 
      =     L     18.0; 
      BLD   103; 
      CALL "TON" , DB     4 (
           IN                       := L     18.0,
           PT                       := T#1H,
           Q                        := #Not_Used,
           ET                       := #TON_ET);
      NOP   0; 
NETWORK
TITLE =
      U(    ; 
      L     #TON_ET; 
      T     #TON_ET_DINT; 
      SET   ; 
      SAVE  ; 
      CLR   ; 
      U     BIE; 
      )     ; 
      SPBNB _001; 
      L     #TON_ET_DINT; 
      L     L#1000; 
      /D    ; 
      T     #TON_ET_S; 
_001: NOP   0; 
NETWORK
TITLE =
      L     #TON_ET_S; 
      DTB   ; 
      T     #TON_ET_S_BCD; 
      NOP   0; 
END_FUNCTION
ORGANIZATION_BLOCK "Cycle Execution"
TITLE = "Main Program Sweep (Cycle)"
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
NETWORK
TITLE =
      CALL "Stoppuhr" ;
      NOP   0; 
END_ORGANIZATION_BLOCK
 
zählt rückwärts
mw10 ist die sollzeit dezimal.
e1.0 starttaster
ab3,4,5 die bcd-anzeige

awl-quelle
Code:
FUNCTION FC 9 : VOID
TITLE =
VERSION : 0.1
 
VAR_TEMP
  puffer : WORD ; 
END_VAR
BEGIN
NETWORK
TITLE =
      U     E      1.0; 
      S     M      1.1; 
      U(    ; 
      U     A      1.0; 
      U     E      1.0; 
      ON    E      1.1; 
      )     ; 
      R     M      1.1; 
      NOP   0; 

NETWORK
TITLE =
      U(    ; 
      L     MW    10; 
      ITB   ; 
      T     #puffer; 
      UN    OV; 
      SAVE  ; 
      CLR   ; 
      U     BIE; 
      )     ; 
      SPBNB _001; 
      L     #puffer; 
      L     W#16#2000; 
      +I    ; 
      T     MW    12; 
_001: NOP   0; 
NETWORK
TITLE =
      U     M      1.1; 
      L     MW    12; 
      SE    T      1; 
      NOP   0; 
      L     T      1; 
      T     MW    14; 
      LC    T      1; 
      T     MW    16; 
      NOP   0; 
NETWORK
TITLE =
      U     T      1; 
      =     A      1.0; 
NETWORK
TITLE =
      L     MW    14; 
      ITB   ; 
      T     AW     2; 
      NOP   0; 
END_FUNCTION

wie soll denn die sollzeit vorgegeben werden? oder ist die immer gleich?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

also da muß du Dir schon etwas basteln.
Da Timer immer etwas von der Zykluszeit beeinflußt werden würde ich eine
Stoppuhr mit dem OB35 (Weckalarm) bei der S7-300 realisieren.
In der Hardware -Konfig zB. den Aufruf auf 100ms einstellen als Basis-Takt.

Dann bei Starten Deinen Wert laden zB. 30 sek - 30000 ms und immer 100 ms
beim durchlaufen vom OB35 abziehen oder so in der Art.

Gruß
 
timer sind zyklusunabhängig.

deshalb funktioniert mein beispiel.

wenn man das über rauf/runterzählen eines dw's machen würde, wäre der ob35 angesagt.
 
volker schrieb:
timer sind zyklusunabhängig.


Hm, das ist so "nicht ganz" richtig.

Die Timer sind sehr ungenau.
Wenn man eine Zeit recht genau erfassen will, sollte mann schon mit Timeclicks oder Alarm - OB arbeiten.

Ein Timer geht im Bereich von mehreren % falsch, das ist für eine genau Zeiterfassung nicht ausreichend.

Für normale "Zeiten" ists natürlich egal.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also ich habe das eben in einer 113c2dp getestet.
bei s5t#900s habe ich 0 sekunden abweichung mit der zeit in meinem pc.

ok cpu lief nur mit dem timer und hatte daher eine zykluszeit von nur 2ms

aber wenn du mehrere % schreibst sollte man zumindest eine geringe abweichung feststellen können.
 
Hallo Volker,

Hab bei einem Stundentimer knappe 6 Sekunden Verzug festgestellt,

hast recht, dass sind letztendlich "nur" 0.17%, aber bei einem OB - Aufruf im Sekundentakt war die Abweichung genau 0.0.

Und 6 Sekunden pro Stunde falsch, dass ist z.B. für ne Stopuhr eindeutig zu mies.
 
Also Timer sind nicht sehr genau auch wenn Du das mal ebend in
Deiner 313c-2DP ausprobiert hast.
Betriebsstundenzähler mit Timern sind auch nicht 100% genau.

Aber da ja nur Sekunden gefordert bzw. gebraucht werden spiel das dann hier auch keine Rolle und man kann es dann auch so lösen.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alles ein Frage der Genauigkeit

Siemens schreibt doch fast überall, dass die Timer eine Unschärfe in Höhe der Zeitbasis besitzen (S5-Timer); diese Unschärfe ist ein fester Wert. Die tatsächliche Abweichung ist ein Zufallswert zwischen 0 und der Zeitbasis. Das ist der absolute Fehler. Um diesen möglichtst gering zu halten wird empfohlen, die kleinstmögliche Zeitbasis zu verwenden.

Der meist interessantere relative Fehler hängt vom absoluten Fehler und der Anzahl der Timer-Ticks ab. Er wird mit fortschreitender Zeit immer kleiner.

Die Timer laufen asynchron zum OB1 ab. Die Zeit-OBs aber auch. Bei gleicher Zeitbasis bieten die Zeit-OBs keine größere Genauigkeit als Timer, vorrausgesetzt man bleibt im Zählbereich.

Es spricht also nichts dagegen, einen Timer zu verwenden, solange die geforderte Genauigkeit eingehalten werden kann.
 
natürlich ist ein aufruf im ob35 genauer.

wie genau er das haben will ist aber ne ganz andere sache.
für diese anwendung wird das aber vermutlich reichen.

und der vollständigkeit halber der code für den ob1/ob35 ;)

Code:
U E0.0
S M1.0
U E0.0
U A1.0
R M1.0
R A1.0
Code:
UN M 1.0
SPBN m001
L MW10 //soll*10
T MW12 //ist
m001: nop 0
 
U A1.0
BEB
 
L MW12 
L 10 
-I
T MW12
L 0
==I
S A 1.0

so und nun werd ich mich auf das spiel vorbereiten :ROFLMAO:
 
@argv_user

das die genauigkeit der timer abhängig ist von der zeitbasis, wusste ich.
das das bei den zeit-ob's auch so ist, ist mir aber neu
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Logisch hast du bei den Zeit-OB's auch eine Unschärfe in höhe der Aufrufzeit,

weil - schematischer Ablauf:

1. Du stellst fest, aha jetzt muss ich meine Zeit zählen
2. Dummerweise war das aber 1ms bevor der OB35 aufgerufen wird, also fehlen dir bei den ersten 100ms 99ms
3. Dadurch zählst du deinen Zeitwert also zwischen 1 - 99 ms zu früh hoch / runter
 
Zuletzt bearbeitet:
Wenn ich eine Stunde stoppe und dabei um 1..99 ms unscharf bin, ist mir dass so ziemlich egal!

Der OB35 ist ein Interrupt, ich zähle im OB35, also ist die Unschärfe nur bei Abfrage ausserhalb des Interrupts zu erwarten.

Die Timer hingegen haben IMMER Unschärfe UND Ungenauigkeit, wie oben bereits beschrieben wurde!
 
Hallo nochmal.

Allen die mir geholfen haben schonmal vielen Dank. Hab mit Hilfe des Programms, das plc_tippser hier zur Verfügung gestellt hat, mal versucht die Ausgänge zu beschalten.
Der abgelesene, BCD-codierte Zahlenwert soll also so ausgegeben werden, dass einzelne 7-Segment-Anzeigen (3 Stück) angesprochen werden können. Funktioniert aber leider nicht. Wär nett, wenn ihr mal drüberschauen könntet, denn ich bin - wie gesagt - AWL-Laie.

DANKE!

[DATA_BLOCK DB 4
// Anfang
TITLE =
AUTHOR : SIMATIC
FAMILY : IEC_TC
VERSION : 0.0
"TON"
// "TON" - Variablendeklarationsteil
BEGIN
IN := FALSE;
PT := T#0MS;
Q := FALSE;
ET := T#0MS;
STATE := B#16#0;
STIME := T#0MS;
ATIME := T#0MS;
END_DATA_BLOCK
FUNCTION "Stoppuhr" : VOID
// VOID: Kein Rückgabewert bei einem Funktionsaufruf
TITLE =
VERSION : 0.1
VAR_TEMP
// tempöräre Variablen ???
Start : BOOL ;
// Start --> #Start --> E0.0
Not_Used : BOOL ;
TON_ET : TIME ;
TON_ET_DINT : DINT ;
TON_ET_S : DINT ;
TON_ET_S_BCD : DWORD ;
END_VAR
// Ende der Deklaration
BEGIN
// Start des eigentlichen Programms
NETWORK
TITLE =
U E 0.0;
// E0.0 initialisiert #Start
= #Start;
NETWORK
TITLE =
U #Start;
// #Start initialisiert Ladevorgang
= L 18.0;
// Lade 18.0 ???
BLD 103;
// Bildaufbauoperation; wie NOP
CALL "TON" , DB 4 (
// Laden der unter "TON" abgelegten Variablen
IN := L 18.0,
PT := T#1H,
// Laufzeit: eine Stunde
Q := #Not_Used,
ET := #TON_ET);
NOP 0;
NETWORK
TITLE =
U( ;
L #TON_ET;
// Laden der Time-Variable
T #TON_ET_DINT;
// Transfer
SET ;
SAVE ;
// Sichere Verknüpfungsergebnis in "BIE"
CLR ;
// Setzte VKE zurück (=0)
U BIE;
) ;
SPBNB _001;
// Sprung, wenn VKE=0; VKE ins "BIE"
L #TON_ET_DINT;
// Lade
L L#1000;
// Lade
/D ;
// Division von "#TON_ET_DINT" durch L#1000
T #TON_ET_S;
// Transfer
_001: NOP 0;
// No Operation
NETWORK
TITLE =
L #TON_ET_S;
DTB ;
// wandelt Ganzzahl in BCD
T #TON_ET_S_BCD;
NOP 0;
T MW200;
// BCD_Wert
U M 201.0;
// Ausgabe Einerzahl (E.1)
= A 4.0;
U M 201.1;
// E.2
= A 4.1;

U M 201.2;
// E.3
= A 4.2;
U M 201.3;
// Ausgabe Zehnerzahl (Z.1)
= A 4.3;

U M 201.4;
// Z.2
= A 4.4;
U M 201.5;
// Z.3
= A 4.5;
U M 201.6;
// Ausgabe Hunderterzahl (H.1)
= A 4.6;
U M 201.7;
// H.2
= A 4.7;
U M 201.8;
// H.3 (M 201.8 richtig???)
= A 5.0;
END_FUNCTION
ORGANIZATION_BLOCK "Cycle Execution"
TITLE = "Main Program Sweep (Cycle)"
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
NETWORK
TITLE =
CALL "Stoppuhr" ;
NOP 0;
END_ORGANIZATION_BLOCK]

Ach so: Versucht zu programmieren hab ich mit Simatic Manager V5.3
 
Zurück
Oben