Zähler generieren

amateur

Level-1
Beiträge
26
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Ich habe folgendes Problem: Ich habe einen Drehmotor und möchte mit Hilfe eines Zählers herausbekommen, wie lange der Motor sich gedreht hat. Hab schon selbst gesucht aber alles, was ich bis jetzt gefunden habe, hat mir nicht weiter geholfen.
Wäre echt nett, wenn mir jemand einen Hinweis geben könnte, wie ich das in SCL machen könnte...

Vielen Dank!
Amateur
 
Um Hinweise zu bekommen wäre es sinnvoll wenn Du noch schreiben würdest welche art von Sensorik Du hast. Oder wie die Hardware im allgemeinen aufgebaut ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oh ja, entschuldigung... Also ich habe eine S7-300 (315-2 DP), jeweils eine analoge Ein- und Ausgangsbaugruppe und jeweils ein digitale Ein- und Ausgangsbaugruppe. (ich denke mal, dazu brauchst du keine weiteren Angaben, oder?)
Der Motor wird durch ein bestimmtes Ereignis in Bewegung gesetzt (bstimmte Uhrzeit erreicht) und dreht sich so lange bis die Entsprechende Bedingung zum Drehen nicht mehr erfüllt ist oder eine definierte Endlage erreicht ist. Ich möchte jetzt einfach nur wissen, wie lange sich der Motor gedreht hat, nach Möglichket auf Millisekunden genau...

Bin für jeden Hinweis dankbar...
 
Nein, nein... die drehzahl interessiert mich gar nicht. ich möchte einfach nur wissen wie lange er sich gedreht hat. Also mit dem Startereignis den Zähler starten und wenn der Motor angehalten wird, den Zähler wieder stoppen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also hier mal eine Idee wie man die Zeit messen kann solange das Signal Run auf True ist.

Den Rest solltest Du alleine hinbekommen.

Code:
FUNCTION FC123 : VOID

VAR_INPUT
  Run       :BOOL;  (* Signal Run = True solange der Motor Läuft *)
  OB1Cycle  :INT;   (* Variable OB1_prev_cycle aus dem OB1 *)
  Reset     :BOOL;  (* True Setzt die Gemessene Zeit zurück *)
END_VAR

VAR_IN_OUT          (* Bei einem FC VAR_IN_OUT und in einem FB einfach nur VAR *)
  ET        :TIME;  (* Verstrichene Zeit *)
END_VAR


IF RUN THEN
  ET := ET + DINT_TO_TIME(OB1Cycle);
END_IF;

IF Reset THEN
  ET := t#0s;
END_IF;

END_FUNCTION
 
Zuletzt bearbeitet:
Erfolgt die Ansteuerung zyklisch? Oder in dem OB1?

Bei Zyklischem durschlauf:

if (Motor = True) then
x = x + 1

Ansonsten einen Takt mit Flanke erzeugen
if (Motor = ture and takt = ture) then
x = x +1

Gruß

Ron
 
such mal nach Takmerkerbyte der CPU

dort suchst du dir die Passende Frequenz raus, und zählt mit ner positiven Flanke und dem Takt so lange ein Merkword hoch wie dein Motor an ist....

U Bedinung_Motor_An
U TakmerkbyteX
FP M0.0
spbn M001

L 1
L Zaehler_Motor
+I
T Zaehler_Motor


M001: Naechstes mal ordentlich suchen!!!!
 
...
nach Möglichket auf Millisekunden genau...

Also auf die Millisekunde genau geht bei einer S7 nicht dafür ist die einfach zu Lahmarschig.
Wenn Du jetzt auf einen Taktmerker zurückgreifst wird das nur noch schlimmer. Eine der genausten und dazu noch einfachen Lösungen ist das aufaddieren des OB1_prev_cycle.
 
oder direkt mit der systemzeit arbeiten.
temp-vars im ob1 bzw scf1
weiterhin fc6 und fc8 aus den iec.

eine subtraktion aus date liefert die differenz in tagen zurück
eine subtraktion von time_of_day liefert die differenz in milisekunden zurück

guckst du bild :ROFLMAO:
 

Anhänge

  • Zwischenablage02.gif
    Zwischenablage02.gif
    9,7 KB · Aufrufe: 28
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Hab doch noch ein kleines Problem. Zunächst mal habe ich ET als DINT deklarieren müssen, da ich sonst die Fehlermeldung "Unzulässige Operandentypen" bekommen habe. Jedenfalls bleibt ET bei mir 0 und ändert sich nicht. Vielleicht gibt es da noch was zu "OB1_prev_cycle", was ich wissen sollte. Ist das eine Systemvariable, die ich nicht weiter zu initialisieren brauche? Laut Beschreibung sollte ich das Ding ja nur einmal mit INT deklarieren. Weiß jetzt halt nicht, woher diese Variable ihre Werte bekommt...
 
OB1 in FUP Programmiert hier als AWL Quelle
Code:
ORGANIZATION_BLOCK OB 1
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 =

      U     E      0.0; 
      =     L     20.0; 
      BLD   103; 
      U     E      0.1; 
      =     L     20.1; 
      BLD   103; 
      CALL FC   123 (
           Run                      := L     20.0,
           OB1Cycle                 := #OB1_PREV_CYCLE,
           Reset                    := L     20.1,
           ET                       := MD    30);
      NOP   0; 
END_ORGANIZATION_BLOCK
SCL Code:
Code:
FUNCTION FC123 : VOID

VAR_INPUT
  Run       :BOOL;  (* Signal Run = True solange der Motor Läuft *)
  OB1Cycle  :INT;   (* Variable OB1_prev_cycle aus dem OB1 *)
  Reset     :BOOL;  (* True Setzt die Gemessene Zeit zurück *)
END_VAR

VAR_IN_OUT          (* Bei einem FC VAR_IN_OUT und in einem FB einfach nur VAR *)
  ET        :TIME;  (* Verstrichene Zeit *)
END_VAR


IF RUN THEN
  ET := ET + DINT_TO_TIME(OB1Cycle);
END_IF;

IF Reset THEN
  ET := t#0s;
END_IF;

END_FUNCTION

Das läuft bei mir.
 
Hallo!
Erst mal vielen Dank für die Antwort! Das klappt aber immer noch nicht. Hab jetzt wie beschrieben alle Befehle in einen FC ausgelagert. Wenn ich diese Funktion aufrufe, muss ich OB1Cycle ja auch irgendeinen Wert zuweisen. Wenn ich das nicht tue, bekomme ich eine Fehlermeldung.
Ich hab aber auch noch keine zusätzlichen Informationen bekommen, woher OB1_prev_cycle nun seine Werte bekommt. Vielleicht kann mir da ja mal jemand auf die Sprünge helfen. Ich komm so einfach nicht weiter...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Variable wird vom System Beschrieben und ist ja im OB1 Automatisch deklariert.

Teste mal das Projekt im Anhang ;o(
 

Anhänge

  • Ob1prevc.zip
    426,3 KB · Aufrufe: 13
Zurück
Oben