Umwandeln!

Zuviel Werbung?
-> Hier kostenlos registrieren
Multiinstanz

Zum SFB0,
das Stichwort lautet Multiinstanz.
Die Forumssuche sollte dabei helfen.

Generell könnte ich mich aber nicht erinnern wann ich das letzte Mal Zähler benutzt habe,
bei der S7 tendiere ich sogar zu nie, eigenlicht habe ich in letzter Zeit immer nur INT's oder DINT's inkrementiert.

Mfg
Manuel
 
jetzt mal unabhängig davon wie sinnvoll ein zähler ist.

typüberprüfung abschalten und den dez-ausgang benutzen. fertig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe es ja nicht so mit der S7 aber wer keinen FB will (schau zu Ralle) der kann ja auch einen FC bauen und die VAR_IN_OUT als Speicher gebrauchen.

Hier mal ein ganz einfacher (primitiver) ZV mit zwei IN_OUTs die eben mit statischer Variablen beschaltet sein müssen.

Code:
FUNCTION FC 66 : VOID

VAR_INPUT
  ZV : BOOL ;   
  R : BOOL ;    
END_VAR
VAR_IN_OUT
  Count : INT ; 
  FPbit : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =

      U     #ZV; 
      FP    #FPbit; 
      SPBN  M001; 
      L     #Count; 
      L     1; 
      +I    ; 
      T     #Count; 
M001: CLR   ; 
      U     #R; 
      SPBN  M002; 
      L     0; 
      T     #Count; 
M002: CLR   ; 

END_FUNCTION
 
nimm einfach einen ADD_I (Positiv-Addierer) und triggere den "EN" Eingang beim hochzählen
und einen zweiten ADD_I (Negativ-Addierer) und triggere den "EN" Eingang beim runterzählen.




IN1 belegt mit Aktuellem Zählwert (aus DB)

IN2 belegt mit "1" (BZW MINUS 1 beim "Negativ-Addierer")

OUT belegt mit Aktuellem Zählwert +/-1 (aus DB)


kannst aber auch gleich alles mit ADD_D und DINT machen, denn sonst ist die Grenze +32767 / -32 768

Ich habe mich für diese Lösung entschieden und funktioniert für meine Funktion super!

Wo wir gleich beim Zählen sind! Ich habe einen Zähler programmiert der von 1 - 36 zählt! Es gibt ein Soll und IST Wert(Zählwert)! Ist der Soll unterschiedlich vom IST, nimmt er den kürzesten Weg zum Soll-Wert (z.b. IST = 2 , SOLL = 35 -> entsprechen rückwärts 3 Positionen ohne "0")
Jetzt möchte ich gerne ein Merker melden lassen, wenn der IST-Wert sprich der Zählwert 2 Positionen vor dem Soll ist! Mein Problem ist wie ich das mache, wenn der Fall ist wie im Beispiel, dass der Zähler über 1 auf 35 zurückzählt bzw vorwärts 34 auf 3 oder so!?
Hoffe ihr versteht mein Problem!
 
Ich habe mich für diese Lösung entschieden und funktioniert für meine Funktion super!

Wo wir gleich beim Zählen sind! Ich habe einen Zähler programmiert der von 1 - 36 zählt! Es gibt ein Soll und IST Wert(Zählwert)! Ist der Soll unterschiedlich vom IST, nimmt er den kürzesten Weg zum Soll-Wert (z.b. IST = 2 , SOLL = 35 -> entsprechen rückwärts 3 Positionen ohne "0")
Jetzt möchte ich gerne ein Merker melden lassen, wenn der IST-Wert sprich der Zählwert 2 Positionen vor dem Soll ist! Mein Problem ist wie ich das mache, wenn der Fall ist wie im Beispiel, dass der Zähler über 1 auf 35 zurückzählt bzw vorwärts 34 auf 3 oder so!?
Hoffe ihr versteht mein Problem!

So wie du es hier schon erklärt bekommen hast:
http://www.sps-forum.de/showthread.php?t=14927&highlight=Positionieren
nur mit 36 statt 20.
 
Hier mal eine SCL Funktion die den kürzesten Abstand zwischen Soll und Ist berechnet.

Code:
FUNCTION FC55 : INT

VAR_INPUT
  // input Variablen
  Range :INT;
  Soll  :INT;
  Ist   :INT;
END_VAR


VAR_TEMP
  // temporäre Variablen
  Delta :INT;  
END_VAR

IF ABS(Soll - Ist) < (Range / 2) THEN
  Delta := Soll - Ist;
ELSE
  IF Soll - Ist > 0 THEN
    Delta := Soll - Ist  - Range;
  ELSE
    Delta := Soll - Ist + Range;
  END_IF;
END_IF;

FC55 := Delta;

END_FUNCTION
 
Hier mal eine SCL Funktion die den kürzesten Abstand zwischen Soll und Ist berechnet.

Code:
FUNCTION FC55 : INT

VAR_INPUT
  // input Variablen
  Range :INT;
  Soll  :INT;
  Ist   :INT;
END_VAR


VAR_TEMP
  // temporäre Variablen
  Delta :INT;  
END_VAR

IF ABS(Soll - Ist) < (Range / 2) THEN
  Delta := Soll - Ist;
ELSE
  IF Soll - Ist > 0 THEN
    Delta := Soll - Ist  - Range;
  ELSE
    Delta := Soll - Ist + Range;
  END_IF;
END_IF;

FC55 := Delta;

END_FUNCTION

Habe das gerade mal versucht in AWL bzw mit Fup zu lösen, aber dafür fehlen mir ein paar Infos! Ich mag den SCL Stil ja auch am liebsten, weil ich früher mal mit Excel VB angefangen bin!
Aber bei dieser Lösung,hmm! Range ist die Hälfte an Positionen oder? Also 18 !?? Bei IST=4 und SOLL= 5 z.B würde ja beide IF-Abfragen "Wahr" sein oder nicht?
Wofür steht dieses ABS hinter dem ersten IF?

Schöne Grüße
 
Ich spiel schon den ganzen Tag mit Excel rum, um eine Formel zu entwerfen und die dann in Fup zu realsieren bzw in AWl, aber da bin ich noch nicht so fit es zu schreiben! Aber irgendwie fehlt mir immer noch ein Lösungsansatz für die Aufgabe! :confused:
 
Wo scheiterts denn konkret?
Am ABS?

Hier mal der code von ABS aber ohne Kommentare damit das du auch was zum Überlegen hast:
Code:
      L     #Wert1
      L     #Wert2
      -I    
      SPO   end
      SPPZ  next
      NEGI  
next: T     #RET_VAL
end:  NOP   0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eher an der Formel in SCL! Range heißt doch AnzahlPos / 2 oder ?

Nehmen wir das Beispiel IST = 2 , Soll = 35 (3 Positionen entfernt), dann würde Soll-ISt > 0 gleich Wahr sein! Dann würde Soll(35) - ISt(2) - Range 18 = 15 sein! Hmm irgendwie kann ich rechnen wie ich will! Habe leider kein SCl und versuche es daher in Excel bisschen nach zu konstruieren! Oder hat das Delta noch was davor zu sagen ?
 
Zuletzt bearbeitet:
Eher an der Formel in SCL! Range heißt doch AnzahlPos / 2 oder ?

Nehmen wir das Beispiel IST = 2 , Soll = 35 (3 Positionen entfernt), dann würde Soll-ISt > 0 gleich Wahr sein! Dann würde Soll(35) - ISt(2) - Range(18) = 15 sein! Hmm irgendwie kann ich rechnen wie ich will! Habe leider kein SCl und versuche es daher in Excel bisschen nach zu konstruieren! Oder hat das Delta noch was davor zu sagen ?


Nee Range ist in Deinem Beispiel 36 also 1..36.

Ich kann Dir das ganze als vba in Excel schreiben wenn Du das möchtest.
 
Naja in Simatic wollte ich das nachher gerne auch haben! Nur ich habe für Range ja 36 eingesetzt (NUr Formel ist ja Range /2) also 18 ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also PDFs gibt es nur auf Verlangen ;o)

Aber im Anhang eine Excel Datei gezippt.

Und hier das was Step7 aus dem SCL Code gemacht hat:

Code:
      SET   
      SAVE  
      =     L      2.1
      L     #Soll
      L     #Ist
      -I    
      L     W#16#0
      >=I   
      TAK   
      SPB   I007
      NEGI  
I007: L     #Range
      TAK   
      T     LW     4
      TAK   
      L     2
      /I    
      L     LW     4
      TAK   
      <I    
      SPBN  A7d0
      L     #Soll
      L     #Ist
      -I    
      T     #Delta
      SPA   A7d1
A7d0: L     #Soll
      L     #Ist
      -I    
      L     0
      >I    
      SPBN  A7d2
      L     #Soll
      L     #Ist
      -I    
      L     #Range
      -I    
      T     #Delta
      SPA   A7d1
A7d2: L     #Soll
      L     #Ist
      -I    
      L     #Range
      +I    
      T     #Delta
A7d1: L     #Delta
      T     #RET_VAL
      CLR   
      U     L      2.1
      SAVE  
      BE
Ich wollte daraus eine AWL-Quelle machen das ging leider nicht ;o( aber Range, Soll, Ist sind Integer VAR_IN und Delta ist eine Integer VAR_TEMP der als RET_VAL genommen wird.
 

Anhänge

  • sr83.zip
    9,4 KB · Aufrufe: 4
Eher an der Formel in SCL! Range heißt doch AnzahlPos / 2 oder ?

Nehmen wir das Beispiel IST = 2 , Soll = 35 (3 Positionen entfernt), dann würde Soll-ISt > 0 gleich Wahr sein! Dann würde Soll(35) - ISt(2) - Range 18 = 15 sein! Hmm irgendwie kann ich rechnen wie ich will! Habe leider kein SCl und versuche es daher in Excel bisschen nach zu konstruieren! Oder hat das Delta noch was davor zu sagen ?


Ok Planspiel

Range := 36;
Soll := 35;
Ist := 2;

Code:
[COLOR=Red]       ____33____     ____18___[/COLOR]
IF ABS(Soll - Ist) < (Range / 2) THEN   [COLOR=Red]//Also unwahr! -> ELSE [/COLOR]      
  Delta := Soll - Ist;
ELSE
[COLOR=Red]     ____33____[/COLOR]
  IF Soll - Ist > 0 THEN  [COLOR=Red]//Das ist wahr also direkt weiter[/COLOR]
[COLOR=Red]    __-3_    _35_ - _2_  - _36__[/COLOR]
    Delta := Soll - Ist  - Range;
  ELSE
    Delta := Soll - Ist + Range;
  END_IF;
END_IF;

[COLOR=Red]Delta ist also -3.[/COLOR]
 
So nun habe ich mich in Ruhe nochmal hingesetzt und nu klappt das auch.... Vielen vielen Dank für die nette Hilfsbereitschaft :)
 
Zurück
Oben