CoDeSys mit HBM Messverstärker

rKtiC

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

vorab: ich erwarte nicht, dass hier mein Code von jemand anderem geschrieben wird. Ich stelle hier nur das Problem und meinen Code für das Verständnis meines Problems hier ein.

ich arbeite jetzt seit einer Woche mit CoDeSys und habe noch ein paar Probleme.
Ich arbeite mit folgender Installation:
An dem Messverstärker HMB PMX ist eine Waage angeschlossen die kontinuierlich den aktuellen Wert bereitstellt.

Folgendes möchte ich in CoDeSys realisieren:
Die Waage ist so eingestellt, dass wenn eine spezielle Box auf die Waage gestellt wird, ungefähr der Wert 0 angezeigt wird. Nacheinander sollen nun 4 Werkstücke eingelegt werden. Bei den Werkstücken handelt es sich um zwei Größen von Quadern. Wird ein Werkstück eingelegt, wird überprüft, ob es im Toleranzbereich für einen kleinen oder großen Quader liegt. Ist dies der Fall soll eine grüne Lampe angehen. Der aktuelle Wert wird manuell tariert und es kann das nächste Werkstück eingelegt werden.
Liegt ein Werkstück nicht im Toleranzbereich geht eine rote Lampe an. Werden große und kleine Quader gemischt, geht eine rote Lampe an.

Ich habe nur wie folgt begonnen für die Überprüfung eines kleines Quaders:
Code:
PROGRAM PLC_PRG
VAR
    MeasVal : REAL; (*Messwert*)
    Weight_KB : REAL := 0.598;  (*Gewicht der Kanbanbox*)
    //Maße der Böden
    D25Side : REAL := 0.0394;
    D25Depth : REAL := 0.0207;
    D40Side : REAL := 0.0592;
    D40Depth : REAL := 0.0207;
    Dens : REAL := 2850; (*[kg/m^3]*)
    //Gewichtsgrenzwerte der Böden
    D25Max : REAL;
    D25Min : REAL;
    D25Tol : REAL := 0.05;
    D40Max : REAL;
    D40Min : REAL;
    D40Tol : REAL := 0.05;
    LampGreen : BOOL := FALSE;
    LampRed : BOOL := FALSE;
    LampYellow : BOOL := FALSE;
    PartCount : DINT;  (*Zähler der Teile [1..4]*)
    TableCount : DINT; (*Zähler in der Tabelle*)
    Counter : DINT := 0; (*Zähler für alle Teile*)
    Reject : DINT := 0; (*Ausschusszähler*)
    Table : ARRAY[1..50] OF REAL;  (*Tabelle*)
    TarHandle : DINT;
    TarSwitch : BOOL; (*Fußtaster*)
    Alarm : BOOL;
    Info : BOOL;    
END_VAR

//Kalkulation der Grenzwerte
D25Max := WeightCal(D25Side, D25Side, D25Depth, Dens) + D25Tol;
D25Min := WeightCal(D25Side, D25Side, D25Depth, Dens) - D25Tol;
D40Max := WeightCal(D40Side, D40Side, D40Depth, Dens) + D40Tol;
D40Min := WeightCal(D40Side, D40Side, D40Depth, Dens) - D40Tol;

IF (MeasVal <= -0.5) THEN
    LampGreen := FALSE;
    LampRed := FALSE;
    LampYellow := FALSE;
    TarSwitch := FALSE;
END_IF
// Wird die Kanban-Box erkannt, geht die gelbe Lampe an
IF (MeasVal >= -0.03) THEN
    LampYellow := TRUE;
    PartCount := 0;
    IF (MeasVal >= D25Min AND MeasVal <= D25Max) THEN
        FOR PartCount := 1 TO 4 BY 1 DO
            IF (MeasVal >= D25Min AND MeasVal <= D25Max) THEN 
                Counter := Counter + 1;
                // Grüne Lampe an
                LampGreen := TRUE;
                // Zähler um eins erhöhen
                PartCount := PartCount + 1;
                // Nächste freie Zeile in der Tabelle ermitteln bestimmen
                IF (TableCount >= 50) THEN
                    TableCount := 1;
                END_IF;
                // Wert in Tabelle schreiben
                Table[TableCount] := MeasVal;
                TableCount := TableCount + 1;
                 // Messwert tarieren (für Kanal 2.1), Grüne Lampe aus (aus  Beispielprogramm von HBM, Waage hängt aber an Kanal 2.1)
                IF (HBM_PMX_LIBRARY.isFinished(TarHandle)) THEN
                    IF(TarSwitch = TRUE) THEN
                        TarHandle := HBM_PMX_LIBRARY.setToZero(2,1);
                        TarSwitch := FALSE;
                        LampGreen := FALSE;
                    END_IF;
                END_IF;
            ELSE
                LampRed := TRUE;
                LampGreen := FALSE;
                Info := 1;
                Counter := Counter + 1;
                Reject := Reject + 1;
            END_IF;
        END_FOR;
     ELSE
        LampRed := TRUE;
        LampGreen := FALSE;
        Alarm := 1;
        Counter := Counter + 1;
        Reject := Reject + 1;
    END_IF;
END_IF;

Dabei habe ich noch folgende Fragen/Probleme:

  • Das Programm läuft endlos und der Zähler wird kontinuierlich erhöht. Was muss ich ändern, damit das Programm beim tarieren unterbrochen wird?

Vielen Dank schonmal. ;)
 
Hallo rKtiC,
ich vermute mal das Du, was das Programmieren angeht, aus der PC-Schiene kommst, denn Deine Fragen hören sich verdächtig nach meinen Problemen beim ersten Versuch ein SPS-Programm zu schreiben an. Ich würde aus dem Ganzen eine Schrittkette machen und im letzten Schritt warten, bis der Tariervorgang erledigt ist. Das Ganze mit If-Abfragen zu machen geht zwar auch, wird aber schnell unübersichtlich und schwer wartbar, außerdem bekommt man bei den vielen Möglichkeiten und Verriegelungen irgendwann Logikknoten im Gehirn und die können wehtun.

Gruß

Oliver
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@oliver.tonn: Du hast recht. Bisher habe ich am PC programmiert und vielen Dank für den Hinweis mit der Schrittkette.

Nach kurzer Suche habe ich hier im Forum den folgenden Ansatz für Schrittketten in ST gefunden:
Schrittketten in ST gehen gut mit CASE-Anweisungen:
Code:
(* Bedingung für Start der Schrittkette*)
IF Startbdingung AND NOT Abbruchbedingung THEN
  Schrittzahler := 1;
END_IF

CASE Schrittzahler OF
1: (*....*)
    Schrittzahler := 2;
2: (*....*)
    Schrittzahler := 3;
3: (*....*)
    Schrittzahler := 4;
4: (*....*)
    Schrittzahler := 0;
END_CASE

(* Abbruch der Schrittkette *)
IF Abbruchbedingung THEN
   Schrittzahler := 0;
END_IF

Meintest du so etwas?

Dazu hätte ich noch Fragen:
1. Ist das dann so gemeint:
Code:
CASE Schrittzahler OF
1: (*....*)
    Schrittzahler := 2;

Solange der Schrittzähler=1 ist mache (*....*) und dann setze den Schrittzähler auf 2?

2. Ich stehe noch etwas auf dem Schlauch: Meine Abbruchbedingung ist ja wenn 4 Teile in der Kiste liegen also
Code:
PartCount = 4
Was aber ist meine Startbedingung?
3. Wie kann ich bei den kontinuierlichen Werten die Unterscheidung treffen ob das Teil was drin liegt ein kleiner Quader, ein großer Quader oder keines von beiden ist?
 
Zurück
Oben