Baustein mit SCL programmieren

mr_spooner

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal hallo an alle. Ich bin in der Programmierung mit SCL so neu wie hier in dem Forum ;-). Ich hoffe ich bin hier richtig und vielleicht kann mir jemand helfen.
Ich will einen Baustein mit SCL programmieren, der 2 ID`s scannt und mir einmal die 2 ID`s zusammensetzt und ausgibt und dann mir noch ein Bit setzt.

Zusammenfassung:
1. Der 1. Scan MUSS immer die "Ort-ID" sein. Diese wird mit im Baustein fest hinterlegten ID`s verglichen. Sollte es diese ID geben, so wartet der Baustein auf Scan 2! Scan muss gespeichert werden für Punkt 3.
2. Der 2. Scan ist die "Produkt-ID". Scan muss gespeichert werden für Punkt 3.
3. Der Baustein soll jetzt die 2 Scans zusammensetzen und sie mir an einem Ausgang ausgeben. Die ID`s sind jeweils [STRING19].
Der Baustein soll mir gleichzeitig an einem Ausgang ein Bit setzen.

!! Ist Scan 1 nicht die "Ort-ID", so darf nichts passieren und der Baustein wartet weiterhin auf eine richtige "Ort-ID" !!

Die Variablen:

TYPE UDT_STAT_ID

STRUCT
Ort_ID_A : STRING[19] := '1001'; //Ort-ID für Platz 1
Ort_ID_B : STRING[19] := '1002'; //Ort-ID für Platz 2
Ort_ID_C : STRING[19] := '1003'; //Ort-ID für Platz 3
END_STRUCT

END_TYPE

VAR_INPUT

Scannen_ID : STRING[19]; // Scanner für ID`s

END_VAR

VAR_OUTPUT

Q_Scan1 : STRING[19]; // Scan 1, Ort-ID
Q_Scan2 : STRING[19]; // Scan 2, Produkt-ID
Q_Scan1_Scan2_A : INT := 0; // Zusammengesetzte IDs AS A
Q_SND_A : BOOL := 0; // Bit für Sendebaustein zu AS A

END_VAR

VAR_TEMP

HV_Scan1 : STRING [19]; // Hilfsvariable zum Merken der Ort-ID (Scanvorgang 1)
HV_Scan2 : STRING [19]; // Hilfsvariable zum Merken der Produkt-ID (Scanvorgang 2)

END_VAR

Eins der großen Probleme die ich habe ist, dass mir nicht genau klar ist, wie ich das mit nur einem Eingang lösen soll. Ich hoffe sehr, es kann mir jemand helfen. Es ist erst mein 2. SCL-Projekt, deshalb hoffe ich ihr habt ein wenig Nachsicht.
 
Zuletzt bearbeitet:
Ich hoffe ich habe deine Frage richtig verstanden.

Also das mit dem Problem, dass du nur einen Eingang hast würde ich so lösen, dass du die Ankommende ID prüfst ob es die ist die du benötigst (also Scann1: Ort's ID) und wenn ja diese Statisch zwischenspeicherst (benötigst also FB).

Die nächst kommende ID prüfst du dann ob es die Produkt-ID ist und wenn ja, kannst du diese ja dann (eventuell auch statisch zwischenspeichern) mit der gespeicherten Ort's ID kombinieren.

Diesen Teil:

VAR_TEMP

HV_Scan1 : STRING [19]; // Hilfsvariable zum Merken der Ort-ID (Scanvorgang 1)
HV_Scan2 : STRING [19]; // Hilfsvariable zum Merken der Produkt-ID (Scanvorgang 2)

END_VAR

solltest du eventuell auch als statische Variablen anlegen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
zu dem Thema zunächst erstmal noch ein paar Fragen :
- woher kommt dein Scan ? Barcodeleser (oder so) ?
- kannst du den 1. und den 2. Scan-Vorgang im Ablauf unterscheiden ? oder willst du generell den 2. Scan hinter den ersten Scan hängen, wenn der erste Scan passt ?

Auf jeden Fall solltest du den Einwand von Steve beachten - mit TEMP geht das gar nicht ...

Gruß
LL
 
Davon ausgehend, daß eine Kohlenstoffeinheit den Scanvorgang betreibt, müßte diese gemeldet bekommen, daß der Scanvorgang unkorrekt ist. Es gibt ja mehrere Möglichkeiten: Der erste Scanvorgang der Orts-ID ist korrekt, der folgende ebenfalls; oder der erste Scanvorgang ist falsch und muß wiederholt werden; oder der erste Scanvorgang ist iO und der zweite nicht. Die möglichen Fehler sollten gemeldet werden können. HMI vorhanden?
Irgendwas muß ja auch melden, daß ein Scanvorgang stattgefunden hat, oder soll das durch die Änderung des Eingangsstrings gelöst werden?
Gehen wir mal davon aus.
Code:
FUNCTION_BLOCK FBxxx
TYPE UDT_STAT_ID
STRUCT 
Ort_ID_A : STRING[19] := '1001'; //Ort-ID für Platz 1
Ort_ID_B : STRING[19] := '1002'; //Ort-ID für Platz 2
Ort_ID_C : STRING[19] := '1003'; //Ort-ID für Platz 3
END_STRUCT 
END_TYPE 
VAR_INPUT 
Scannen_ID : STRING[19]; // Scanner für ID`s
END_VAR
VAR_OUTPUT 
Q_Scan1 : STRING[19]; // Scan 1, Ort-ID
Q_Scan2 : STRING[19]; // Scan 2, Produkt-ID
Q_Scan1_Scan2_A : INT := 0; // Zusammengesetzte IDs AS A
Q_SND_A : BOOL := 0; // Bit für Sendebaustein zu AS A 
END_VAR
VAR
ScanSave : STRING[19]; //Hilfsvariable zur Feststellung einer Eingangsänderung
Scan1_OK : BOOL; 
END_VAR
BEGIN
IF Scannen_ID <> ScanSave THEN
 
  IF NOT Scan1_OK THEN    
    IF (Scannen_ID = Ort_ID_A) OR (Scannen_ID = Ort_ID_B) OR (Scannen_ID = Ort_ID_C) THEN
        Q_Scan1 := Scannen_ID;
        Scan1_OK := TRUE;
    END_IF;
  ELSIF Scan1_OK THEN
    IF NOT ((Scannen_ID = Ort_ID_A) OR (Scannen_ID = Ort_ID_B) OR (Scannen_ID = Ort_ID_C)) THEN
        Q_Scan2 := Scannen_ID;
        Scan1_OK := FALSE;
        Q_SND_A := TRUE;
    END_IF;
  END_IF;
 
ScanSave := Scannen_ID;
 
END_FUNCTION_BLOCK

Jetzt muß noch die Sammel-ID gebaut werden und Q_SND_A irgendwann zurückgesetzt werden, die Meldungen an die Kohlenstoffeinheit generiert werden und solcherlei, aber so in etwa würde ich anfangen.
 
Zuletzt bearbeitet:
Hallo,
zu dem Thema zunächst erstmal noch ein paar Fragen :
- woher kommt dein Scan ? Barcodeleser (oder so) ?
- kannst du den 1. und den 2. Scan-Vorgang im Ablauf unterscheiden ? oder willst du generell den 2. Scan hinter den ersten Scan hängen, wenn der erste Scan passt ?

Auf jeden Fall solltest du den Einwand von Steve beachten - mit TEMP geht das gar nicht ...

Gruß
LL

Erstmal vielen Dank an alle für die schnelle Hilfe!

So zum Thema. Der Scanner ist ein Handscanner den ein Anlagenbediener betätigt.
Ja, der 2. Scan wird hinter den 1. gehängt, sobald der 1. Scan eine Orts-ID ist. Die Orts-IDs sind bekannt.
Nachdem der 1. Scanvorgang erfolgt ist und OK ist, wartet der Baustein auf den zweiten. Egal was dann gescannt wird, wird der 1. und 2. Scan zusammengesetzt und an das MES weitergeleitet. Dort wird dann der 2. verglichen.

Am Mittwoch werde ich das gleich mal ausprobieren.:-D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So habs heute probiert und soweit funktioniert das eigentlich super. Jetzt habe nich nur noch das Problem wenn ich eine weitere AS dazubauen will, d.h. weitere 3 "Ort-IDS" im UDT und 2 Ausgänge, überschreibt er mir beim 2. Scanvorgang, wenn da eine Ort-ID der anderen AS gescannt wird, Q_Scan1 und Q_Scan2. Woran kann das liegen?

z.B.:

1. scanne ich die Ort-ID "1001" --------> Q_Scan1 übernimmt "1001"
2. scanne ich die Produkt-ID z.B. "xy"---> Q_Scan2 übernimmt "xy"
------->Q_SND_A gibt eine "1" aus.

Das passt so.

Das Problem ist, wenn ich

1. scanne die Ort-ID "1001" -----------> Q_Scan1 übernimmt "1001"

ABER wenn jetzt beim 2. Scan eine Ort-ID einer anderen AS z.B. "2002" gesannt wird überschreibt er mir Q_Scan1 und Q_Scan2 mit "2002"!

Hoffe auf nen Tip!
 
Irgendwo die neuen AS-IDs nicht mit einbezogen in die Abfrage.

Um genaueres zu sagen, müßtest Du mal hier reinstellen, was Du zusammengetippt hast.
 
Code:
TYPE UDT_STAT_ID
     STRUCT                                                                                
       Stat_Ablage_T100       : STRING[19] := 'T100_101';                      //Station Ablage AS T100
       Stat_Start_T100          : STRING[19] := 'T100_102';                      //Station Startprodukt AS T100
       Stat_Produkt_T100      : STRING[19] := 'T100_103';                      //Station Produktabzug AS T100
       Stat_Ablage_T110       : STRING[19] := 'T110_101';                      //Station Ablage AS T110
       Stat_Start_T110          : STRING[19] := 'T110_102';                      //Station Startprodukt AS T110
       Stat_Produkt_T110      : STRING[19] := 'T110_103';                      //Station Produkt AS T110
   END_STRUCT 
END_TYPE 
 
FUNCTION_BLOCK xxx
 
VAR_INPUT 
 
    ScanID                                       : STRING[19];         // Gescannte ID
 
END_VAR 
 
VAR_OUTPUT 
 
    Q_Scan1                                     : STRING [19];         // Stations-ID (Scanvorgang 1)    
    Q_Scan2                                     : STRING [19];         // TRMI-ID (Scanvorgang 2)
    Q_Scan1_Scan2_T100                      : INT := 0;               // Zusammengesetzte IDs T100 
    Q_Scan1_Scan2_T110                      : INT := 0;               // Zusammengesetzte IDs T110
    Q_SND_T100                                   : BOOL := 0;            // Bit für Sendebaustein zu AS T100
    Q_SND_T110                                   : BOOL := 0;            // Bit für Sendebaustein zu AS T110
 
END_VAR 
 
VAR
 
ScanSaveT100                                      : STRING[19]; //Hilfsvariable zur Feststellung einer Eingangsänderung
ScanT100_OK                                       : BOOL; 
ScanSaveT110                                      : STRING[19]; //Hilfsvariable zur Feststellung einer Eingangsänderung
ScanT110_OK                                       : BOOL; 
 
END_VAR
 
BEGIN
 
//------------------------AS T100----------------------------// 
 
IF ScanID <> ScanSaveT100 THEN
 
  IF NOT ScanT100_OK THEN    
    IF (ScanID = 'T100_101') OR (ScanID = 'T100_102') OR (ScanID = 'T100_103') THEN
        Q_Scan1 := ScanID;
        ScanT100_OK := TRUE;
    END_IF;
  ELSIF ScanT100_OK THEN
    IF NOT ((ScanID = 'T100_101') OR (ScanID = 'T100_102') OR (ScanID = 'T100_103')) THEN
        Q_Scan2 := ScanID;
        ScanT100_OK := FALSE;
        Q_SND_T100 := TRUE;
    END_IF;
  END_IF;
 
ScanSaveT100 := ScanID;
END_IF;
 
//--------------------------AS T110---------------------------//
 
IF ScanID <> ScanSaveT110 THEN
 
  IF NOT ScanT110_OK THEN    
    IF (ScanID = 'T110_101') OR (ScanID = 'T110_102') OR (ScanID = 'T110_103') THEN
        Q_Scan1 := ScanID;
        ScanT110_OK := TRUE;
    END_IF;
  ELSIF ScanT100_OK THEN
    IF NOT ((ScanID = 'T110_101') OR (ScanID = 'T110_102') OR (ScanID = 'T110_103')) THEN
        Q_Scan2 := ScanID;
        ScanT110_OK := FALSE;
        Q_SND_T110 := TRUE;
    END_IF;
  END_IF;
 
ScanSaveT110 := ScanID;
END_IF;
END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
So das wäre es. Muss erweiterbar sein, da noch weitere ASen dazukommen. Aber wenn ich das mit den 2 hinbekommen hätte wäre das weitere ja dank KOPIEREN kein Problem. Leider haperte es daran schon:rolleyes:
Wäre echt dankbar wenn mir einer nen goldenen Hinweis geben könnte.
 
Mit dem selben Eingang zweimal Flanken bilden klappt nicht. Dann muß man in etwa so vorgehen:

Code:
FUNCTION_BLOCK xxx
 
VAR_INPUT 
 
    ScanID                                       : STRING[19];         // Gescannte ID
 
END_VAR 
 
VAR_OUTPUT 
 
    Q_Scan1                                     : STRING [19];         // Stations-ID (Scanvorgang 1)    
    Q_Scan2                                     : STRING [19];         // TRMI-ID (Scanvorgang 2)
    Q_Scan1_Scan2_T100                      : INT := 0;               // Zusammengesetzte IDs T100 
    Q_Scan1_Scan2_T110                      : INT := 0;               // Zusammengesetzte IDs T110
    Q_SND_T100                                   : BOOL := 0;            // Bit für Sendebaustein zu AS T100
    Q_SND_T110                                   : BOOL := 0;            // Bit für Sendebaustein zu AS T110
 
END_VAR 
 
VAR
 
ScanSave                                          : STRING[19]; //Hilfsvariable zur Feststellung einer Eingangsänderung
ScanT100_OK                                       : BOOL; 
ScanT110_OK                                       : BOOL; 
 
END_VAR
 
BEGIN
 
 
IF ScanID <> ScanSave THEN
 
  IF NOT ScanT100_OK AND NOT ScanT110_OK THEN    
    IF (ScanID = 'T100_101') OR (ScanID = 'T100_102') OR (ScanID = 'T100_103') THEN
        Q_Scan1 := ScanID;
        ScanT100_OK := TRUE;
    END_IF;
    IF (ScanID = 'T110_101') OR (ScanID = 'T110_102') OR (ScanID = 'T110_103') THEN
        Q_Scan1 := ScanID;
        ScanT110_OK := TRUE;
    END_IF;    
  ELSIF ScanT100_OK THEN
    IF NOT ((ScanID = 'T100_101') OR (ScanID = 'T100_102') OR (ScanID = 'T100_103')) THEN
        Q_Scan2 := ScanID;
        ScanT100_OK := FALSE;
        Q_SND_T100 := TRUE;
    END_IF;
  ELSIF ScanT100_OK THEN
    IF NOT ((ScanID = 'T110_101') OR (ScanID = 'T110_102') OR (ScanID = 'T110_103')) THEN
        Q_Scan2 := ScanID;
        ScanT110_OK := FALSE;
        Q_SND_T110 := TRUE;
    END_IF;
  END_IF;
 
ScanSave := ScanID;
END_IF;

END_FUNCTION_BLOCK
 
Zurück
Oben