Findet den Fehler:) IF THEN ELSE

spsbenutzer1

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

ich habe ein kleines Programm geschrieben,habe allerdings einen Fehler gemacht, hoffe ihr könnt mir helfen.

Programmablauf

Ein Förderband transportiert Teile welche auf io bzw nio geprüft werden sollen.
An Punkt A werden die Teile von einer Kamera erfasst,daraufhin wird ein io oder nio Signal ausgegeben.
An Punkt B werden die io Teile per Druckluft vom Band geblasen.Zwischen Punkt A und B passt genau kein Teil mehr,das heisst wenn an Punkt B gepustet wird, wird gleichzeitig an Punkt A von der Kamera geprüft.Punkt A und B werden durch Sensoren b2 und b3 erkannt.

Problemstellung

Hab ein Programm in ST mit if-Anweisungen geschrieben.Funktioniert bis zu dem Punkt an dem TOF meinen letzten Merker m3 auflösen soll.Es werden derzeit leider io als auch nio Teile weggepustet weil m3 auch aktiviert wird wenn nio=0 ist,was aber nicht sein darf.Wenn ich aber den Timer aus dem Programm entferne funktioniert das Programm, nur das halt m3 nicht aufgelöst wird. Bitte um Fehlersuche und Berichtigung oder um einen anderen Weg um m3 aufzulösen.Hoffe Ihr helft mir....Bitte geht bei euren Antworten davon aus, dass ich höchsten Grundwissen habe.Vielen Dank im Vorraus

s1=Start-Schalter
motor=Bandmotor
trigger=löst Kamera aus

IF s1=1 THEN motor:=1;m1:=1;
ELSE motor:=0;m1:=0;
END_IF

IF b2=1 THEN trigger:=1;
ELSE trigger:=0;
END_IF
IF io=1 AND nio=0 THEN m2:=1;
END_IF
IF io=0 AND nio=1 THEN m2:=0;
END_IF
IF m2=1 THEN m3:=1;
END_IF
IF m3=1 THEN m2:=0;
END_IF
IF b3=1 AND m3=1 THEN v1:=1;
ELSE v1:=0;
END_IF
TOFInst(IN := b3, PT:= T#50s);

m3 :=TOFInst.Q;
 
Du mußt dir am Punkt Kamera dein Ergebnis merken bis das Teil am Punkt Pusten ankommt.
Dann kannst du blasen.
Dafür brauchst du erstmal keinen Timer (außer vielleicht für die Länge des Blasimpulses) sondern eher ein einfaches FIFO oder Schieberegister.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich gebe zu, in ST bin ich (noch) nicht so arg firm, aber ich sehe das Problem, das Du den Merker M2 hier

Code:
IF io=1 AND nio=0 THEN m2:=1;
auf True setzt,
aber später im Programm wieder False setzt
Code:
IF m3=1 THEN m2:=0;

Die Eigenart einer SPS ist ja, das eben nicht so Zeilenweise abgearbeitet wird wie in anderen Programmiersprachen, somit wird immer das letzte VKE wirksam. Da M3 50 Sekunden lang True ist wird M2 erst wieder auf IO/NIO nach Ablauf dieser Zeit reagieren können. Probier mal, wenn Du die Zeit drastisch verkürzt und dann der SPS "zuschaust" was die einzelnen Variablen machen...

Ich hoffe Dein Problem damit erschlagen zu haben.

Gruß

Christian
 
@Christian:
Mit ST oder SCL verhält es sich grundsätzlich nicht anders als mit AWL oder KOP oder FUP.
Da könntest du ja auch schreiben : "U E0.0 S M0.0" und viele Zeilen tiefer : "U E0.3 R M0.0"
Der Merker wird auf jeden Fall so arbeiten, wie programmiert und selbst wenn E0.0 UND E0.3 beide True sind wird der M0.0 zwischen den Anweisungen auch True sein ...
Somit wird das (aus meiner Sicht) auch nicht das Problem des Programm-Schnipsels lösen ... (die Kamera kann für das Teil "Jetzt" ein ganz anderes Ergebnis haben wie bei dem Teil "Vorher")
 
Hallo.

Also ich denke die Hauptfrage ist wohl was macht b3 den innerhalb der 50s.
Es ist js ein TOF also Ausschalt Verzögerung, sprich der b3 muss mehr als 50s 0 sein bevor sich der Status von Q ändert.
Also bleib m3 noch 50s auf 1 wenn b3 konstant auf 0 hat. Wenn zwischenzeitlich b3 wieder 1 führt fängt es von vorne an.
Ich erkläre es deshalb, da ich auch schon erfahrene Anwender gesehen habe die sich mit TON/TOF schwer getan haben.
Also müsste man erst mal raus finden was b3 während der 50s macht.

Ansonsten springt mir grad kein Fehler ins Auge.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Christian
Es stimmt, dass ich erst das nächste Teil auswerten kann wenn m3 wieder false ist,also nach Ablauf der Zeit welche schon auf 50ms gestellt war.Das oben 50s steht ist ein Fehler.Das komische an der Sache ist,dass wenn ich den Timer entferne, Teile als nio erkannt werden und auch nicht ausgeblasen werden.Dann bleibt halt nur m3 true weil der Timer entfernt wurde und m3 somit nicht zurückgesetzt wird.Bei hinzugefügtem Timer werden nio Teile auch abgeblasen.Ich kann auf den Timer verzichten dann muss aber m3 anders aufgelöst werden,weiss aber net wie
 
Das oben 50s ist ein Fehler von mir,es sind eigentlich 50ms.Es ist richtig das die Steuerung erst für das nächste Teil bereit ist wenn m3 wieder false ist.Das komische ist nur wenn m3 durch den Timer aufgelöst wird dann lösen Teile die nio geprüft trotzdem m2 und somit auch m3 aus,was ja aber nicht sein darf.wenn ich den Timer rausnehme da werden teile zwar korrekt erkannt aber man kann halt nur ein teil durchlaufen lassen weil m3 ja nicht aufgelöst wird.hat jemand ne andere Idde um am Ende m3 aufzulösen?
 
könnte es damit zu tun haben,dass die Eingansvariable für TOF,welche bei mir ja b3 ist,bei einer TOF ja eigentlich false sein muss um den TOF korrekt auszulösen.in der Beschreibung steht Q also der Ausgang der TOF ,bei mir m3, wird false wenn der Eingang also IN,bei mir b3,false ist. Bei mir ist ja aber b3 true
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok 50ms das ist mal ne andere Zahl.

Aber grad seh ich etwas das seltsam ist.
Du schreibst IF m2=1 then m3=1
Und drunter IF m3=1 then m2=0
Das ist schon seltsam.
Und vor allem bekommst Du dann zusammen mit TOF eine doppelte Zuweisung von m=3.
Das sollte nicht sein.
 
@schaible.r
das hab ich gemacht damit m2 wieder frei für das nächste teil ist.mir wird aber grad selber klar dass das ja unötig ist weil wenn das nächste teil kommt muss ja auch m3 wieder frei sein oda?!
 
uff...aber das muss doch mit einer einfachen Programmierung über merker machbar sein ein Signal zu merken und dann das Teil wegzublasen während schon das nächste geprüft wird?!
 
Nun ja so wie ich das lese schaltest Du ja m2 aus sobald m3 ein ist.
Wenn man nun den Ablauf einer SPS drüber legt ist m2 nur zwischen den Zeilen mit nio/io und dem m3 rucksetzen auf 1 und somit kommt an derE/A immer nur 0 an.

Und was m3 an geht ... hier schaltest Du zwar m3 mit m2 auf 1 aber das interessiert die E/A auch nicht, denn für die ist nur das Ergebniss von TOF.Q interessant.

Als erstes würde ich die beiden Zuweisungen mal verschmelzen.

Zur Übersicht erst mal m3 durch z.b. m3temp ersetzen in der IF abfrage. Also ber der Zuweisung.
Beim Abfragen bleibt m3.
Und dann solltest Du IF m2 umschreiben in IF (m2=1 or b3=1)

Und am Eingang vom TOF den m3temp statt b3.

Das mal die ersten Schritte, so ist dann auf jeden Fall besser nach zu vollziehen was passiert.
 
Sind die Variablen eigentlich BOOLs oder (D)INTs?
Von den Werten (0/1) her, sieht's ja eher nach Ersterem aus. Vom zugewiesenem Format allerdings nach Letzterem.
 
IF s1=1 THEN motor:=1;m1:=1;
ELSE motor:=0;m1:=0;
END_IF
Um den guten MSB zu zitieren... :rolleyes:
Ah, wie ich dieses sinnfreie Konstrukt doch liebe ...
Du könntest das wesentlich einfacher schreiben...
Code:
motor := s1; m1 := s1;
also vollständig
Code:
s1=Start-Schalter
motor=Bandmotor
trigger=löst Kamera aus

motor := s1;
m1 := s1;
trigger:= b2;

IF io AND NOT nio THEN m2:=1;              //Hier muss das IF bleiben damit bei io=1 und nio=1 (oder beide 0) - 
ELSEIF NOT io AND nio THEN m2:=0;       //m2 nicht zugewiesen wird
END_IF
 
IF m2 THEN m3:=TRUE;
END_IF
 
IF m3 THEN m2:=FALSE;
END_IF
 
v1 := b3 AND m3;

TOFInst(IN := b3, PT:= T#50s);

m3 :=TOFInst.Q;
Das ändert zwar nichts am Grundproblem, aber ich glaube du versinkst ein wenig im IF-ELSE-Jungel... :ROFLMAO:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest das wesentlich einfacher schreiben...
Aber nur, wenn die ganzen Variablen tatsächlich BOOLs sind.
Soll auch Leute geben, die lieber INTs nutzen, um ggf. mehr als zwei Zustände darstellen zu können.
Allein aus dem Code des TE's kann man da m.M.n. nicht zweifelsfrei rückschließen. Daher zuerst meine Nachfrage.

Wenn die Vermutung aber tatsächlich zutrifft, geb' ich Dir
*ACK*
 
Dann wäre es vom TE schon allein ein bescheidener Programmierstil, die Variablen mit der impliziten Umwandlung von 0 und 1 anstatt mit FALSE oder TRUE zuzuweisen.
 
Zurück
Oben