Datenvergleich mit nachträglicher Ausgabe über einen FC

Christian_1

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,
ich soll in Anlehnung eines Praktikums einen FC Programmieren, der nachfolgenden Daten miteinander Vergleichen soll und einen Wert bei erfolgreichem Vergleich ausgibt.
Bei der verwendeten CPU handelt es sich um einen 315-2 DP.

zum Ablauf:

Über eine Austragschnecke wird das Material in eine Durchflusswaage geleitet. Die Austragschnecke wird über zwei Timer: laufzeit und Pausenzeit gesteuert. Mit Hilfe der Waage konnte ich bei bestimmten Förderleistungen die entsprechende Pausenzeit aufnehmen (Laufzeit ist Konstant).
Daraus ergibt sich z.B. Pausenzeit: 0s --> Förderleistung 100kg/h
10s --> Förderleistung 70kg/h
usw.

Ziel des FC´s soll nun sein, einen bestimmten Wert der Förderleistung (Wird über Touch eingegeben) mit den aufgenommenen Werten der Förderleistung zu vergleichen und dann die entsprechende Pausenzeit an den Timer zu schreiben.

Da ich mit der Programmierung in AWl noch nicht allzuviel erfahrung habe, wollte ich auf diesem Weg mal fragen, ob jemand eine Idee zur Umsetztung dieser Aufgabe oder einen Denkanstoß hat.

Vielen Dank im vorraus.
 
Hallo erstmal.

Wenn ich dich richtig verstehe, soll die Berechnung mathematisch so aussehen.

1s Pause = 3 kg/h weniger...

t= 100 - Förderleistung * 3s

Dein FC bekommt dann einen IN-Parameter (Foerderleistung) als Integer und einen OUT-Parameter (Pausenzeit) als S5Time.

Code:
L   100
L   #Foerderleistung
-I
L    3            // Pausenzeit in sec
ITB
L  W#16#2000  // Timer in sec
OW
T  #Pausenzeit
ggf. kannst du noch den In-Parameter noch auf Gültigkeit prüfen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Es sollte ohne mathematischen Berechnungen ablaufen, da das Austragsverhalten der Schnecke nicht linear ist.
Ich habe alle Daten für die gewünschten Förderleistungen aufgenommen.
d.h zu jeder Förderleistung die entsprechende Pausenzeit.

Die Daten sollen nach der gewünschten Förderleistung durchsucht werden um dann bei Übereinstimmung die entsprechende Pausenzeit auszugeben.
 
Hallo Christian,

ich finde es schon komisch wenn man hier einfach ein paar Fakten zu einer Aufgabenstellung schreibt und eine Lösung in Codeform erwartet, die man einfach abtippen kann.
M.M.n. läuft es so nicht im wahren Leben. Wenn du bei einem Kunden vor Ort stehst, erwartet der auch eine Lösung - und zwar von DIR!

Ich bin auch nicht der beste SPS Programmierer, habe aber schon einige Aufgaben gestemmt. Manche auch durch Hilfe des Forums.

Vielleicht stellst du deine Gedankengänge hier ein, bzw. eine Art "Pseudocode" wenn du es nicht so mit der Programmiersprache hast?

Bei einer Übersetzung kann man dir bestimmt helfen!

Hilfreich wären vielleicht auch weitere Infos. Z.B. wie viele Daten hast du aufgenommen etc.


Gruß
Daniel
 
Die Daten sollen nach der gewünschten Förderleistung durchsucht werden um dann bei Übereinstimmung die entsprechende Pausenzeit auszugeben.
Also brauchst du einen Datenbaustein in dem du pro Förderleistung die Pausezeit hinterlegst.
Wenn du dann die Pausezeit je kg/h weißt, wären das ja 100 Einträge.

Und dann liest du einfach die Tabelle wieder aus:
Code:
     L #Förderleistung
     L 2 // da Werte in der Tabelle Integer
     *I
     SLW 3
     LAR1
     AUF DB "Pausezeiten"
     L DBW[AR1,P#0.0]
     T #AktuellePausezeit
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder man nimmt nen Baustein der einenen so genannten Polygonzug macht, also die Kennlinie nach belieben knickt.

Habe so einen Baustein hier, mit 10 Wertepaaren.

Code:
FUNCTION FC 152 : VOID
TITLE =Skalierung von 10 Abschnitten
VERSION : 0.1


VAR_INPUT
  IN : REAL ;    //Eingangsvariable
  X1 : REAL ;    //Grenze 1 der Eingangsvariablen
  Y1 : REAL ;    //Grenze 1 der Ausgangsvariablen
  X2 : REAL ;    //Grenze 2 der Eingangsvariablen
  Y2 : REAL ;    //Grenze 2 der Ausgangsvariablen
  X3 : REAL ;    //Grenze 3 der Eingangsvariablen
  Y3 : REAL ;    //Grenze 3 der Ausgangsvariablen
  X4 : REAL ;    //Grenze 4 der Eingangsvariablen
  Y4 : REAL ;    //Grenze 4 der Ausgangsvariablen
  X5 : REAL ;    //Grenze 5 der Eingangsvariablen
  Y5 : REAL ;    //Grenze 5 der Ausgangsvariablen
  X6 : REAL ;    //Grenze 6 der Eingangsvariablen
  Y6 : REAL ;    //Grenze 6 der Ausgangsvariablen
  X7 : REAL ;    //Grenze 7 der Eingangsvariablen
  Y7 : REAL ;    //Grenze 7 der Ausgangsvariablen
  X8 : REAL ;    //Grenze 8 der Eingangsvariablen
  Y8 : REAL ;    //Grenze 8 der Ausgangsvariablen
  X9 : REAL ;    //Grenze 9 der Eingangsvariablen
  Y9 : REAL ;    //Grenze 9 der Ausgangsvariablen
  X10 : REAL ;    //Grenze 10 der Eingangsvariablen
  Y10 : REAL ;    //Grenze 10 der Ausgangsvariablen
  X11 : REAL ;    //Grenze 11 der Eingangsvariablen
  Y11 : REAL ;    //Grenze 11 der Ausgangsvariablen
END_VAR
VAR_OUTPUT
  OUT : REAL ;    //Ausgangsvariable
END_VAR
VAR_TEMP
  X1_FC153 : REAL ;    //untere Grenze der Eingangsvariablen
  X2_FC153 : REAL ;    //obere Grenze der Eingangsvariablen
  Y1_FC153 : REAL ;    //untere Grenze der Ausgangsvariablen
  Y2_FC153 : REAL ;    //obere Grenze der Ausgangsvariablen
  PAFE_FC153 : BOOL ;    //Parametrierfehler X1=X2
  IN_X1 : BOOL ;    //Eingangsvariable < X1
  IN_X11 : BOOL ;    //Eingangsvariable >= X11
END_VAR
BEGIN
NETWORK
TITLE =Eingangsvariable < X1 ?

      L     #IN; 
      L     #X1; 
      <R    ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _001; 
      L     #Y1; 
      T     #OUT; 
_001: NOP   0; 
      U     L     17.0; 
      BLD   102; 
      =     #IN_X1; 
NETWORK
TITLE =Eingangsvariable zwischen X1 und X2 ?

      U(    ; 
      L     #IN; 
      L     #X1; 
      >=R   ; 
      )     ; 
      U(    ; 
      L     #IN; 
      L     #X2; 
      <R    ; 
      )     ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _002; 
      L     #X1; 
      T     #X1_FC153; 
_002: NOP   0; 
      U     L     17.0; 
      SPBNB _003; 
      L     #X2; 
      T     #X2_FC153; 
_003: NOP   0; 
      U     L     17.0; 
      SPBNB _004; 
      L     #Y1; 
      T     #Y1_FC153; 
_004: NOP   0; 
      U     L     17.0; 
      SPBNB _005; 
      L     #Y2; 
      T     #Y2_FC153; 
_005: NOP   0; 
NETWORK
TITLE =Eingangsvariable zwischen X2 und X3 ?

      U(    ; 
      L     #IN; 
      L     #X2; 
      >=R   ; 
      )     ; 
      U(    ; 
      L     #IN; 
      L     #X3; 
      <R    ; 
      )     ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _006; 
      L     #X2; 
      T     #X1_FC153; 
_006: NOP   0; 
      U     L     17.0; 
      SPBNB _007; 
      L     #X3; 
      T     #X2_FC153; 
_007: NOP   0; 
      U     L     17.0; 
      SPBNB _008; 
      L     #Y2; 
      T     #Y1_FC153; 
_008: NOP   0; 
      U     L     17.0; 
      SPBNB _009; 
      L     #Y3; 
      T     #Y2_FC153; 
_009: NOP   0; 
NETWORK
TITLE =Eingangsvariable zwischen X3 und X4 ?

      U(    ; 
      L     #IN; 
      L     #X3; 
      >=R   ; 
      )     ; 
      U(    ; 
      L     #IN; 
      L     #X4; 
      <R    ; 
      )     ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _00a; 
      L     #X3; 
      T     #X1_FC153; 
_00a: NOP   0; 
      U     L     17.0; 
      SPBNB _00b; 
      L     #X4; 
      T     #X2_FC153; 
_00b: NOP   0; 
      U     L     17.0; 
      SPBNB _00c; 
      L     #Y3; 
      T     #Y1_FC153; 
_00c: NOP   0; 
      U     L     17.0; 
      SPBNB _00d; 
      L     #Y4; 
      T     #Y2_FC153; 
_00d: NOP   0; 
NETWORK
TITLE =Eingangsvariable zwischen X4 und X5 ?

      U(    ; 
      L     #IN; 
      L     #X4; 
      >=R   ; 
      )     ; 
      U(    ; 
      L     #IN; 
      L     #X5; 
      <R    ; 
      )     ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _00e; 
      L     #X4; 
      T     #X1_FC153; 
_00e: NOP   0; 
      U     L     17.0; 
      SPBNB _00f; 
      L     #X5; 
      T     #X2_FC153; 
_00f: NOP   0; 
      U     L     17.0; 
      SPBNB _010; 
      L     #Y4; 
      T     #Y1_FC153; 
_010: NOP   0; 
      U     L     17.0; 
      SPBNB _011; 
      L     #Y5; 
      T     #Y2_FC153; 
_011: NOP   0; 
NETWORK
TITLE =Eingangsvariable zwischen X5 und X6 ?

      U(    ; 
      L     #IN; 
      L     #X5; 
      >=R   ; 
      )     ; 
      U(    ; 
      L     #IN; 
      L     #X6; 
      <R    ; 
      )     ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _012; 
      L     #X5; 
      T     #X1_FC153; 
_012: NOP   0; 
      U     L     17.0; 
      SPBNB _013; 
      L     #X6; 
      T     #X2_FC153; 
_013: NOP   0; 
      U     L     17.0; 
      SPBNB _014; 
      L     #Y5; 
      T     #Y1_FC153; 
_014: NOP   0; 
      U     L     17.0; 
      SPBNB _015; 
      L     #Y6; 
      T     #Y2_FC153; 
_015: NOP   0; 
NETWORK
TITLE =Eingangsvariable zwischen X6 und X7 ?

      U(    ; 
      L     #IN; 
      L     #X6; 
      >=R   ; 
      )     ; 
      U(    ; 
      L     #IN; 
      L     #X7; 
      <R    ; 
      )     ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _016; 
      L     #X6; 
      T     #X1_FC153; 
_016: NOP   0; 
      U     L     17.0; 
      SPBNB _017; 
      L     #X7; 
      T     #X2_FC153; 
_017: NOP   0; 
      U     L     17.0; 
      SPBNB _018; 
      L     #Y6; 
      T     #Y1_FC153; 
_018: NOP   0; 
      U     L     17.0; 
      SPBNB _019; 
      L     #Y7; 
      T     #Y2_FC153; 
_019: NOP   0; 
NETWORK
TITLE =Eingangsvariable zwischen X7 und X8 ?

      U(    ; 
      L     #IN; 
      L     #X7; 
      >=R   ; 
      )     ; 
      U(    ; 
      L     #IN; 
      L     #X8; 
      <R    ; 
      )     ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _01a; 
      L     #X7; 
      T     #X1_FC153; 
_01a: NOP   0; 
      U     L     17.0; 
      SPBNB _01b; 
      L     #X8; 
      T     #X2_FC153; 
_01b: NOP   0; 
      U     L     17.0; 
      SPBNB _01c; 
      L     #Y7; 
      T     #Y1_FC153; 
_01c: NOP   0; 
      U     L     17.0; 
      SPBNB _01d; 
      L     #Y8; 
      T     #Y2_FC153; 
_01d: NOP   0; 
NETWORK
TITLE =Eingangsvariable zwischen X8 und X9 ?

      U(    ; 
      L     #IN; 
      L     #X8; 
      >=R   ; 
      )     ; 
      U(    ; 
      L     #IN; 
      L     #X9; 
      <R    ; 
      )     ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _01e; 
      L     #X8; 
      T     #X1_FC153; 
_01e: NOP   0; 
      U     L     17.0; 
      SPBNB _01f; 
      L     #X9; 
      T     #X2_FC153; 
_01f: NOP   0; 
      U     L     17.0; 
      SPBNB _020; 
      L     #Y8; 
      T     #Y1_FC153; 
_020: NOP   0; 
      U     L     17.0; 
      SPBNB _021; 
      L     #Y9; 
      T     #Y2_FC153; 
_021: NOP   0; 
NETWORK
TITLE =Eingangsvariable zwischen X9 und X10 ?

      U(    ; 
      L     #IN; 
      L     #X9; 
      >=R   ; 
      )     ; 
      U(    ; 
      L     #IN; 
      L     #X10; 
      <R    ; 
      )     ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _022; 
      L     #X9; 
      T     #X1_FC153; 
_022: NOP   0; 
      U     L     17.0; 
      SPBNB _023; 
      L     #X10; 
      T     #X2_FC153; 
_023: NOP   0; 
      U     L     17.0; 
      SPBNB _024; 
      L     #Y9; 
      T     #Y1_FC153; 
_024: NOP   0; 
      U     L     17.0; 
      SPBNB _025; 
      L     #Y10; 
      T     #Y2_FC153; 
_025: NOP   0; 
NETWORK
TITLE =Eingangsvariable zwischen X10 und X11 ?

      U(    ; 
      L     #IN; 
      L     #X10; 
      >=R   ; 
      )     ; 
      U(    ; 
      L     #IN; 
      L     #X11; 
      <R    ; 
      )     ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _026; 
      L     #X10; 
      T     #X1_FC153; 
_026: NOP   0; 
      U     L     17.0; 
      SPBNB _027; 
      L     #X11; 
      T     #X2_FC153; 
_027: NOP   0; 
      U     L     17.0; 
      SPBNB _028; 
      L     #Y10; 
      T     #Y1_FC153; 
_028: NOP   0; 
      U     L     17.0; 
      SPBNB _029; 
      L     #Y11; 
      T     #Y2_FC153; 
_029: NOP   0; 
NETWORK
TITLE =Eingangsvariable >= X11 ?

      L     #IN; 
      L     #X11; 
      >=R   ; 
      =     L     17.0; 
      U     L     17.0; 
      SPBNB _02a; 
      L     #Y11; 
      T     #OUT; 
_02a: NOP   0; 
      U     L     17.0; 
      BLD   102; 
      =     #IN_X11; 
NETWORK
TITLE =Skalierung
//Abarbeitung nur, wenn Eingangsvariable zwischen X1 und X11 liegt
      UN    #IN_X1; 
      UN    #IN_X11; 
      SPBNB _02b; 
      CALL FC   153 (
           IN                       := #IN,
           X1                       := #X1_FC153,
           X2                       := #X2_FC153,
           Y1                       := #Y1_FC153,
           Y2                       := #Y2_FC153,
           OUT                      := #OUT,
           PAFE                     := #PAFE_FC153);
_02b: NOP   0; 
END_FUNCTION
FC152 aufrufen in diesem wird der FC153 aufgerufen.
 
Fc153

und die FC153

Code:
FUNCTION FC 153 : VOID
TITLE =Skalierung nach Geradengleichung y=mx+n
//Formel:
//
//    Y2-Y1             Y2-Y1
//Y = ----- * X + (Y1 - ----- * X1)
//    X2-X1             X2-X1
VERSION : 0.1


VAR_INPUT
  IN : REAL ;    //Eingangsgröße
  X1 : REAL ;    //untere Grenze der Eingangsgröße
  X2 : REAL ;    //obere Grenze der Eingangsgröße
  Y1 : REAL ;    //untere Grenze der Ausgangsgröße
  Y2 : REAL ;    //obere Grenze der Ausgangsgröße
END_VAR
VAR_OUTPUT
  OUT : REAL ;    //Ausgangsgröße
  PAFE : BOOL ;    //Parameterfehler X1=X2
END_VAR
VAR_TEMP
  m : REAL ;    //Anstieg der Geraden
  n : REAL ;    //Nulldurchgang bei x=0
  Zw_Erg : REAL ;    //Zwischenergebnis
END_VAR
BEGIN
NETWORK
TITLE =Fehlerbit initialisieren

      U     M      1.0; 
      =     #PAFE; 
NETWORK
TITLE =Prüfen, ob X1 <> X2
//wegen Division durch 0
      L     #X1; 
      L     #X2; 
      ==R   ; 
      SPB   FEHL; 
NETWORK
TITLE =Ausgangsgröße berechnen

      L     #X2; 
      L     #X1; 
      -R    ; 
      T     #Zw_Erg; 

      L     #Y2; 
      L     #Y1; 
      -R    ; 
      L     #Zw_Erg; 
      /R    ; 
      T     #m; //Anstieg
      L     #X1; 
      *R    ; 
      T     #Zw_Erg; 

      L     #Y1; 
      L     #Zw_Erg; 
      -R    ; 
      T     #n; //Nulldurchgang

      L     #m; 
      L     #IN; 
      *R    ; 
      L     #n; 
      +R    ; 
      T     #OUT; //Ausgangsgröße
      BEA   ; 
NETWORK
TITLE =Fehlerbit setzen

FEHL: U     M      1.1; 
      =     #PAFE; 
NETWORK
TITLE =Baustein Ende

END_FUNCTION
 
Hallo Christian,

ich finde es schon komisch wenn man hier einfach ein paar Fakten zu einer Aufgabenstellung schreibt und eine Lösung in Codeform erwartet, die man einfach abtippen kann.
M.M.n. läuft es so nicht im wahren Leben. Wenn du bei einem Kunden vor Ort stehst, erwartet der auch eine Lösung - und zwar von DIR!

So sehe ich das grundsätzlich auch.
 
Zurück
Oben