Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  TM - Plant Simulation
  Zeitverzögerung bei Lichtschrankenbelegung

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Zeitverzögerung bei Lichtschrankenbelegung (420 / mal gelesen)
AlexS1394
Mitglied


Sehen Sie sich das Profil von AlexS1394 an!   Senden Sie eine Private Message an AlexS1394  Schreiben Sie einen Gästebucheintrag für AlexS1394

Beiträge: 6
Registriert: 25.08.2022

erstellt am: 25. Aug. 2022 12:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen,

ich beschäftige mich seit kurzem mit Plant Simulation und stehe grade vor der Aufgabenstellung ein Anlagenteil als Simulationsmodell zu entwerfen.
Jetzt ist es so, dass eine Lichtschranke regelmäßig von BEs aktiviert wird, aber nur wenn diese für einen einstellbaren Zeitraum betätigt bleibt, soll etwas geschehen. Also eine klassische Einschaltverzögerung. Vielleicht übersehe ich eine wesentliche Funktion oder mir fehlt Programmiererfahrung, aber ich habe es bisher nicht hinbekommen.

Mit folgendem Code, in der durch den Sensor aufgerufenen Methode, habe ich es irgendwie hinbekommen. Allerdings kriege ich die Variable "RückstauRechts" so nicht wieder auf false gesetzt und richtig elegant erscheint mir das ganze nicht.

Code:

var Rückstauzeit : time
Rückstauzeit := 1 -- Sekunden
var temp : boolean

for var t := 0 to Rückstauzeit * 1000
if not BandRechts.sensoren.id1.istAusgelöst then
temp := false
exitloop
else
temp := true
end
wait 0.001
next

if temp then
RückstauRechts := true
print "Rückstau Rechts"
end



Hat jemand einen Tipp für mich? Vermutlich kenne ich bloß eine Funktion noch nicht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

AlexS1394
Mitglied


Sehen Sie sich das Profil von AlexS1394 an!   Senden Sie eine Private Message an AlexS1394  Schreiben Sie einen Gästebucheintrag für AlexS1394

Beiträge: 6
Registriert: 25.08.2022

erstellt am: 25. Aug. 2022 15:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Nach vielem rumprobieren habe ich eine Lösung gefunden, mit der ich halbwegs zu frieden bin. Sie funktioniert zumindest und ich kann sie durchblicken. Falls wer nach was ähnlichem gesucht hat:

Code:

var Taktzykluszeit : real
Taktzykluszeit := 0.02
var RückstauEinZähler : integer
var RückstauAusZähler : integer
var RückstauEinMerker : boolean
var RückstauAusMerker : boolean
var RückstauzeitEin : real
var RückstauzeitAus : real
var Rückstau : boolean

RückstauzeitEin := 2.5  -- Sekunden
RückstauzeitAus := 2    -- Sekunden

while true
-- Rückstau einschalten
if Förderstrecke.sensoren.id1.istAusgelöst and not Rückstau
RückstauEinZähler := RückstauEinZähler + 1
RückstauEinMerker := true
--print "RückstauEinZähler: " + to_str(RückstauEinZähler)
elseif RückstauEinMerker
RückstauEinZähler := 0
RückstauEinMerker := false
--print "RückstauEinZähler resettet"
end
if RückstauEinZähler >= RückstauzeitEin / Taktzykluszeit
Rückstau := true
--print "Rückstau ein"
end
-- Rückstau ausschalten
if not Förderstrecke.sensoren.id1.istAusgelöst and Rückstau
RückstauAusZähler := RückstauAusZähler + 1
RückstauAusMerker := true
--print "RückstauAusZähler: " + to_str(RückstauAusZähler)
elseif RückstauAusMerker
RückstauAusZähler := 0
RückstauAusMerker := false
--print "RückstauAusZähler resettet"
end
if RückstauAusZähler >= RückstauzeitAus / Taktzykluszeit
Rückstau := false
--print "Rückstau aus"
end

--##########################################

if Rückstau
Quelle.stopped := true
else
Quelle.stopped := false
end


wait Taktzykluszeit
end


Gibt es eigentlich eine Möglichkeit die Einrückung im Post zu übernehmen? Dachte dafür wäre die Code-Einrahmung extra da...

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

nadin1223
Mitglied
Ing.


Sehen Sie sich das Profil von nadin1223 an!   Senden Sie eine Private Message an nadin1223  Schreiben Sie einen Gästebucheintrag für nadin1223

Beiträge: 938
Registriert: 29.03.2016

erstellt am: 29. Aug. 2022 01:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für AlexS1394 10 Unities + Antwort hilfreich

Hi,

ist schöne Aufgabe und schöne Herangehensweise an den Lösungsweg mit sehr guter Lösung...weil ich mein Spaß damit hatte, paar Punkte:

Code:
if RückstauEinZähler >= RückstauzeitEin / Taktzykluszeit --n.r. dies ist nice Umrechnung  ;-)
Rückstau := true
--print "Rückstau ein"
end


------------------------------------------------
und paar andere Punkte

Bitte die Werte Inizialisieren, wenn diese Abgefragt werden:

Code:

var RückstauEinZähler : integer //n.r. hier ist die Variable beim ersten Verwenden nicht inizialisiert
var RückstauAusZähler : integer //n.r. hier ist die Variable beim ersten Verwenden nicht inizialisiert
var RückstauEinMerker : boolean
var RückstauAusMerker : boolean
var RückstauzeitEin : real
var RückstauzeitAus : real
var Rückstau : boolean //n.r. hier ist die Variable beim ersten Verwenden nicht inizialisiert


----------------------------------------------------------
Weil die zeitliche Werte sich mal ändern könnten:
Code:

Taktzykluszeit := 0.02 --auslagern in globale Variable
RückstauzeitEin := 2.5  --auslagern in globale Variable
RückstauzeitAus := 2    --auslagern in globale Variable



------------------------------------------------------

while true ist eine nette Möglichkeit;  beispielsweise executein() oder Generator sind eleganter; Damit werden dann lokale Variable als nicht zu globalen Pseudo-Variablen ;-)
----------------------------------------------------------------------
Namen von Objekten sind in Plant Simulation gleichzeitig die ID des Objekte. Damit die Namen schnell in Methoden anpassbar bleiben; am besten oben Kodieren.

Code:

var _ichBinFörderstrecke : object := Förderstrecke


---------------------------------------------
Code:
[...].sensoren.id1.[...]  beispielsweise auch mit [...].SensorID(1).[...]

-----------------------------------------

Zitat:
Gibt es eigentlich eine Möglichkeit die Einrückung im Post zu übernehmen? Dachte dafür wäre die Code-Einrahmung extra da...

ich nehme Copy+Paste aus methode, dann stimmt die Einrückung auch ;-)
ok, auch gerade gemerkt, dass da was zur Zeit nicht so klappen will 
---------------------------------------------------


------------------
Die einfachste Art an korrekte Informationen zu gelangen ist, etwas Falsches in ein Forum zu posten und auf die Korrektur zu warten. (Matthew Austern)

[Diese Nachricht wurde von nadin1223 am 29. Aug. 2022 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

nadin1223
Mitglied
Ing.


Sehen Sie sich das Profil von nadin1223 an!   Senden Sie eine Private Message an nadin1223  Schreiben Sie einen Gästebucheintrag für nadin1223

Beiträge: 938
Registriert: 29.03.2016

erstellt am: 29. Aug. 2022 01:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für AlexS1394 10 Unities + Antwort hilfreich


Screenshot2022-08-29013412.png

 
meine kleine Implementierung auf Basis deines Lösungsansatzes. 
sehr gerne kommentieren  

Code:

var Taktzykluszeit : real := 0.02
var _obj_Source : object := current.Source
var _obj_Conveyor : object := current.Conveyor
/*die Möglichkeiten die bei dieser Dev existieren
--current.Conveyor.SensorID(1).isTriggered = true --> etwas ist davor
--current.Conveyor.SensorID(1).isTriggered = false --> nichts ist davor

--current.Source.stopped = true --> eigang ist gesperrt
--current.Source.stopped = false --> eingang ist offen
*/

---hier den ersten BLock abfangen. Dies da sind
--wenn etwas davor und eingang ist offen --> warte t --> wenn 0 dann ändern
--wenn nicht davor und eingang ist gesperrt --> warte t2 --> wenn 0 dann ändern
if _obj_Conveyor.SensorID(1).isTriggered /= _obj_Source.stopped then --alles was ungleich ist
if current.V_Timer  = current.&V_Timer.InitValue then --prüfe ob Wert schon gesetzt
--entweder eine oder die andere Zeit in globale Variable schreiben
current.V_Timer := when _obj_Source.stopped then current.VStatic_RückstauzeitAus else current.VStatic_RückstauzeitEin
else
--und nu zähle jedes mal die Taktzeit ab
current.V_Timer -=Taktzykluszeit
if current.V_Timer <= 0 then --sobald länger als nötig oder genau richtig gewartet
_obj_Source.stopped := not _obj_Source.stopped --ändere den Ausgang
end
end
else -- dann den Rest
--wenn etwas davor und eingang ist gesperrt --> nichts
--wenn nichts davor und eingang ist offen --> nichts
current.V_Timer  := current.&V_Timer.InitValue --setze den Zähler auf Init wert

end
self.executein(Taktzykluszeit)


------------------
Die einfachste Art an korrekte Informationen zu gelangen ist, etwas Falsches in ein Forum zu posten und auf die Korrektur zu warten. (Matthew Austern)

[Diese Nachricht wurde von nadin1223 am 29. Aug. 2022 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

AlexS1394
Mitglied


Sehen Sie sich das Profil von AlexS1394 an!   Senden Sie eine Private Message an AlexS1394  Schreiben Sie einen Gästebucheintrag für AlexS1394

Beiträge: 6
Registriert: 25.08.2022

erstellt am: 29. Aug. 2022 11:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Nadin,

herzlichen Dank, dass du da so viel Mühe reingesteckt hast.
Ich finde deine Lösung wesentlich eleganter. Ich muss zugeben, dass ich aufgrund mangelnder Programmiererfahrung etwas gebraucht habe, um den Code lesen zu können.
Insbesondere das Runterzählen hast du deutlich schöner gelöst. Das werde ich mir wohl abgucken 

Danke dir nochmals!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz