<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/</id><updated>2020-02-28T14:46:12.634000Z</updated><subtitle>Recent posts to Programm wird von mehreren Tasks ausgerufen</subtitle><entry><title>Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/?limit=25#9d3a" rel="alternate"/><published>2020-02-28T14:46:12.634000Z</published><updated>2020-02-28T14:46:12.634000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com179a3b141f113264d9bf508d3d75078c7e6e5697</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; mg&lt;/p&gt;
&lt;p&gt;zu den unerklärlichen Abstürzen muß ich nun erwähnen es war NICHT von der Software abhängig:&lt;/p&gt;
&lt;p&gt;Der Controller hatte Probleme mit den ereignishabhängigen Tasks und stürzte deshalb immer wieder ab. Ich habe die Software umgeschreiben und es funktionierte VIEL besser.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/?limit=25#8929" rel="alternate"/><published>2020-02-28T14:46:09.301000Z</published><updated>2020-02-28T14:46:09.301000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.coma0278638c8a9550b8315b0493ed505d7cff4a223</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; Bernhard Werner&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;mg hat geschrieben:&lt;/strong&gt;&lt;br/&gt;
 Was passiert wenn ich ein Programm ("PRG") von einem Task mit höherer Priorität aufrufe, aber das Programm momentan gerade von einem anderen Task abgearbeitet wird? UND insbesondere dann, wenn zB eine Datei geschreiben wird - Greift das Teil dann gleichzeitig auf die Datei zu? UND da die meisten PLC eine maximal geöffnete Anzahl von Dateien vorgeben - werden die dann u.U. unwillkürlich überschritten usw.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Es kommt natürlich darauf an was das Dateisystem zu einem zweimaligen öffnen sagt, in der Regel funktioniert das einfach gar nicht, bis die Datei wieder geschlossen wird. &lt;/p&gt;
&lt;p&gt;Dennoch: Es passieren die schlimmsten Dinge. Multithreading (und um das handelt es sich bei IEC-Tasks) ist des Teufels. Mit Semaphore hat man auch noch längst nicht alle Probleme aus der Welt geschafft. Dann muss man erstmal nachweisen dass es nicht zu Verklemmungen kommen kann.&lt;/p&gt;
&lt;p&gt;Man sollte am besten überhaupt keine Programme in zwei Tasks verwenden. Nur Funktionen kann man mit Einschränkung problemlos in zwei Tasks aufrufen, dazu dürfen sie aber nicht auf globale Variablen zugreifen oder statische Zustände haben.&lt;/p&gt;
&lt;p&gt;Bernhard&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/?limit=25#3f02" rel="alternate"/><published>2020-02-28T14:46:01.639000Z</published><updated>2020-02-28T14:46:01.639000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com78d93ca72f0f560bb91cb16fc61800d1a65ad127</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; mg&lt;/p&gt;
&lt;p&gt;Entschuldigung!&lt;/p&gt;
&lt;p&gt;Habe das Wörtchen "unterbrechbar" einfach überlesen. Nun ist mir diese Diskussion klar.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/?limit=25#85e8" rel="alternate"/><published>2020-02-28T14:45:58.957000Z</published><updated>2020-02-28T14:45:58.957000Z</updated><author><name>Belacqua</name><uri>https://forge.codesys.com/u/belacqua/</uri></author><id>https://forge.codesys.comd47ebd936a8b3cdc63f82cbdcf0982caf144c03e</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Moin!&lt;/p&gt;
&lt;p&gt;Das braucht man deshalb nicht weil man mit Semaphoren sicherstellen will, dass kein anderer Task als derjenige der den Semaphor belegt hat auf die Daten zugreifen können soll. Ein unterbrechbarere Semaphor ist daher genau so gut wie gar keinen zu verwenden.&lt;/p&gt;
&lt;p&gt;Was genau passiert wenn ein höherpriorer Task den aktuellen unterbricht und auf die gleichen Daten zugreift ist im allgemeinen unberechenbar und daher streng zu vermeiden da die Fehlersuche schon so manchen an den Rand des Wahnsinns gebracht hat. Daher hat irgendwann einmal jemand Semaphore erfunden - die ein wesentlicher Grundbaustein von Multitasking-Applikationen sind.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/?limit=25#58ee" rel="alternate"/><published>2020-02-28T14:45:56.232000Z</published><updated>2020-02-28T14:45:56.232000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com5fc8aa9f8bbf80e44b76c6dfa2afe23af56a21a4</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; mg&lt;/p&gt;
&lt;p&gt;Hallo Bernhard&lt;/p&gt;
&lt;p&gt;... zuerst mal, es geht um die Version 2.9.X&lt;/p&gt;
&lt;p&gt;... warum braucht man das nicht. ... und nun nochmals die Frage auch an Dich. Was passiert wenn ich ein Programm ("PRG") von einem Task mit höherer Priorität aufrufe, aber das Programm momentan gerade von einem anderen Task abgearbeitet wird? UND insbesondere dann, wenn zB eine Datei geschreiben wird - Greift das Teil dann gleichzeitig auf die Datei zu? UND da die meisten PLC eine maximal geöffnete Anzahl von Dateien vorgeben - werden die dann u.U. unwillkürlich überschritten usw.&lt;/p&gt;
&lt;p&gt;Soll nur eine grundlegende Frage sein. Meine PLC betrifft das eh nicht. Die stürzt mit oder ohne Semaphore ab. Aber mich würde das Thema schon sehr interessieren.&lt;/p&gt;
&lt;p&gt;Danke&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/?limit=25#c898" rel="alternate"/><published>2020-02-28T14:45:48.688000Z</published><updated>2020-02-28T14:45:48.688000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.comb5ca0516010d874ee23a5bc037a16441b98043ec</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; Bernhard Werner&lt;/p&gt;
&lt;p&gt;Noch eine Anmerkung zu:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Uwe hat geschrieben:&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;zu gar nichts und aus neueren Versionen der Standardlib ist der Baustein auch rausgeflogen. Stand so mal explizit in der Norm, keine Ahnung was die Idee dahinter war, dort ist er aber denke ich auch entfernt worden.&lt;/p&gt;
&lt;p&gt;Für die 3x haben wir als Sprachmittel mal dne Operator TEST_AND_SET reserviert. Mit dem liesse sich ein Semaphor auch in IEC schreiben.&lt;/p&gt;
&lt;p&gt;Bernhard Werner&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/?limit=25#ab6f" rel="alternate"/><published>2020-02-28T14:45:45.788000Z</published><updated>2020-02-28T14:45:45.788000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com4e535e28def85d7ce6bb5cc34523c5524619e1ee</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; mg&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;Danke&lt;/span&gt; &lt;span class="n"&gt;nochmals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Ich&lt;/span&gt; &lt;span class="n"&gt;hatte&lt;/span&gt; &lt;span class="n"&gt;das&lt;/span&gt; &lt;span class="n"&gt;nicht&lt;/span&gt; &lt;span class="n"&gt;gewu&lt;/span&gt;&lt;span class="err"&gt;ß&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;und&lt;/span&gt; &lt;span class="n"&gt;auch&lt;/span&gt; &lt;span class="n"&gt;bisher&lt;/span&gt; &lt;span class="n"&gt;nicht&lt;/span&gt; &lt;span class="n"&gt;beachtet&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;aber&lt;/span&gt; &lt;span class="n"&gt;SEHR&lt;/span&gt; &lt;span class="n"&gt;wichtig&lt;/span&gt; &lt;span class="n"&gt;ist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;... hat zwar die Probleme mit meinem Wahnsinns-Controller nicht gelöst, aber ich werde in Zukunft diese Problematik im Kopf behalten.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/?limit=25#851e" rel="alternate"/><published>2020-02-28T14:45:38.089000Z</published><updated>2020-02-28T14:45:38.089000Z</updated><author><name>Uwe</name><uri>https://forge.codesys.com/u/uwe/</uri></author><id>https://forge.codesys.com660ec3f357d97f26a93224cf0db295514a5e73ba</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Ich schieb noch ein paar Info's für Interessierte nach weil mir das Thema für alle Task-Fetischisten  wichtig erscheint.&lt;/p&gt;
&lt;p&gt;Also das Grundprinzip ist folgendes :&lt;/p&gt;
&lt;p&gt;Die Task die mit Daten hantiert die nicht gleichzeitig von einer anderen &lt;/p&gt;
&lt;p&gt;Task benutzt werden sollen &lt;/p&gt;
&lt;p&gt;die schaut auf ein für alle Mitspieler sichtbares Bit ob die Daten gerade frei sind oder von jemanden benutzt werden.&lt;/p&gt;
&lt;p&gt;Wenn dieses Bit gesetzt ist dann löscht diese Task das Bit, signalisiert hiermit den Anderen die Belegung&lt;/p&gt;
&lt;p&gt;und kann nun die Daten benutzen.&lt;/p&gt;
&lt;p&gt;Nach der Benutzung muss die Task das Bit natürlich wieder setzen (freigeben) damit die Daten für die Anderen &lt;/p&gt;
&lt;p&gt;und natürlich auch für sich selbst beim nächsten Aufruf wieder frei sind.&lt;/p&gt;
&lt;p&gt;Die anderen Task müssen es natürlich genauso machen und sich an diese Spielregeln halten sonst geht's schief .&lt;/p&gt;
&lt;p&gt;Prinzipiell sieht es so aus&lt;/p&gt;
&lt;p&gt;-----PROBLEMZONE--------------&lt;/p&gt;
&lt;p&gt;IF NOT Bit THEN &lt;/p&gt;
&lt;p&gt;RETURN;&lt;/p&gt;
&lt;p&gt;END_IF&lt;/p&gt;
&lt;p&gt;Bit := FALSE;&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;(&lt;em&gt; Bearbeitung der Daten jeweils nur von einer Task &lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;Bit := TRUE;   // Die Daten / Resourcen wieder freigeben&lt;/p&gt;
&lt;p&gt;Im obigen Beispiel gibt es eine Problemzone in der eine zweite Task&lt;/p&gt;
&lt;p&gt;die Erste unterbrechen könnte und auch das Bit abfragt bevor die Erste&lt;/p&gt;
&lt;p&gt;das Bit belegt hat.&lt;/p&gt;
&lt;p&gt;Es könnten beide Task das Bit abgefragt haben und beide haben es als TRUE&lt;/p&gt;
&lt;p&gt;also Daten frei erkannt.&lt;/p&gt;
&lt;p&gt;Um diese Problematik zu lösen gibt es Semaphore.&lt;/p&gt;
&lt;p&gt;Semaphore können in einer atomaren Einheit (also nicht unterbrechbar)&lt;/p&gt;
&lt;p&gt;dieses Bit abfragen und ggf. auch belegen.&lt;/p&gt;
&lt;p&gt;Gruß&lt;/p&gt;
&lt;p&gt;Uwe&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/?limit=25#2f1f" rel="alternate"/><published>2020-02-28T14:45:35.401000Z</published><updated>2020-02-28T14:45:35.401000Z</updated><author><name>Uwe</name><uri>https://forge.codesys.com/u/uwe/</uri></author><id>https://forge.codesys.com5be7189a5627a30d9bf9bd959d5dfcb89750a41a</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hallo mg,&lt;/p&gt;
&lt;p&gt;als erstes legst du eine globale Variable an&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;VAR_GLOBAL&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;g_mySema&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="n"&gt;FFFF_FFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;und dein PRG musst du dann so modifizieren&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;(*--- Falls der Sema noch nicht erzeugt wurde --------------------------*)&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="n"&gt;g_mySema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="n"&gt;FFFF_FFFF&lt;/span&gt; &lt;span class="n"&gt;THEN&lt;/span&gt; &lt;span class="c"&gt;(* neuen Sema erzeugen *)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;g_mySema&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;SysSemCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TRUE&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;END_IF&lt;/span&gt;
&lt;span class="c"&gt;(*--------------------------------------------------------------------------------------*)&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="n"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;SysSemEnter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g_mySema&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;THEN&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;RETURN&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c"&gt;(* PRG beenden wenn der Sema schon von irgendjemanden belegt ist *)&lt;/span&gt;
&lt;span class="n"&gt;END_IF&lt;/span&gt;
&lt;span class="c"&gt;(* so wenn ich hier bin dann war der Sema frei und ich habe ihn belegt *)&lt;/span&gt;
&lt;span class="c"&gt;(* hier steht mein code der nicht unterbrochen werden soll *)&lt;/span&gt;
&lt;span class="c"&gt;(* . *)&lt;/span&gt;
&lt;span class="c"&gt;(* . *)&lt;/span&gt;
&lt;span class="c"&gt;(* . *)&lt;/span&gt;
&lt;span class="c"&gt;(* . *)&lt;/span&gt;
&lt;span class="c"&gt;(*--- Ich habe den Sema belegt-&amp;gt; also muß ich ihn auch freigeben *)&lt;/span&gt;
&lt;span class="n"&gt;SysSemLeave&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g_mySema&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Habe ich jetzt so kurzfristig nicht getestet.&lt;/p&gt;
&lt;p&gt;Kann also noch nen Tippfehler drin sein sollte aber prinzipiell so  funktionieren.&lt;/p&gt;
&lt;p&gt;Gruß&lt;/p&gt;
&lt;p&gt;Uwe&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Programm wird von mehreren Tasks ausgerufen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/bc04b7b9d4/?limit=25#9782" rel="alternate"/><published>2020-02-28T14:45:27.768000Z</published><updated>2020-02-28T14:45:27.768000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.comcc512458901a6c7c9dc255b0e6c5f58456732066</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; mg&lt;/p&gt;
&lt;p&gt;Hallo Uwe&lt;/p&gt;
&lt;p&gt;... das klingt gut ...!&lt;/p&gt;
&lt;p&gt;ABER hat da irgendwer vielleicht ein kleines Beispiel dafür. Ich habe mir das kurz angeschaut.   Ich verstehe nur Bahnhof   Muss das vor dem Variablenzugriff stehen? Und wie sage ich der lib welche Variablen, ich für kritisch halte? Oder hat das mit der Taskabarbeitung zu tun. Aber dann weiß ich nicht wie ich das ins Codesys einbinden soll.&lt;/p&gt;
&lt;p&gt;Der Controller hat die Lib offensichtlich. (... ist noch nicht ganz sicher, weil ich nicht weiß was ich damit tun soll)&lt;/p&gt;
&lt;p&gt;Danke&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>