<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Semaphore</title><link href="https://forge.codesys.com/forge/talk/CODESYS-V2/thread/a2b79e5a9b/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/CODESYS-V2/thread/a2b79e5a9b/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/CODESYS-V2/thread/a2b79e5a9b/</id><updated>2020-02-27T23:16:42.981000Z</updated><subtitle>Recent posts to Semaphore</subtitle><entry><title>Semaphore</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/a2b79e5a9b/?limit=25#24a0" rel="alternate"/><published>2020-02-27T23:16:42.981000Z</published><updated>2020-02-27T23:16:42.981000Z</updated><author><name>Romuald</name><uri>https://forge.codesys.com/u/romuald/</uri></author><id>https://forge.codesys.comab9cd0b58a1170799d083855c9dce1ebe542e06d</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;In fact there is a library more reliable for semaphores : SysLibSem.lib&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Semaphore</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/a2b79e5a9b/?limit=25#2b7f" rel="alternate"/><published>2020-02-27T23:16:38.334000Z</published><updated>2020-02-27T23:16:38.334000Z</updated><author><name>Romuald</name><uri>https://forge.codesys.com/u/romuald/</uri></author><id>https://forge.codesys.comdb4159a464c9de251a1cd126c997f519abdb7daf</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I need to use a semaphore to protect a global variable between several tasks. CoDeSys says that the FB SEMA is interruptable ! So if it is the case, is it reliable ?&lt;/p&gt;
&lt;p&gt;Below a small program that would tend to prove that it is not reliable:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;VAR_GLOBAL&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nt"&gt;gSema&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;SEMA&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nt"&gt;gVar&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;DWORD&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;PROGRAM&lt;/span&gt; &lt;span class="nv"&gt;TASK1&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
  &lt;span class="nv"&gt;var1&lt;/span&gt;: &lt;span class="nv"&gt;DWORD&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;gSema&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;CLAIM&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;, &lt;span class="nv"&gt;RELEASE&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="nv"&gt;gSema&lt;/span&gt;.&lt;span class="nv"&gt;BUSY&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
  &lt;span class="nv"&gt;var1&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;var1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;gVar&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;gVar1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;gSema&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;CLAIM&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;, &lt;span class="nv"&gt;RELEASE&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;PROGRAM&lt;/span&gt; &lt;span class="nv"&gt;TASK2&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
  &lt;span class="nv"&gt;var2&lt;/span&gt;: &lt;span class="nv"&gt;DWORD&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;gSema&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;CLAIM&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;, &lt;span class="nv"&gt;RELEASE&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="nv"&gt;gSema&lt;/span&gt;.&lt;span class="nv"&gt;BUSY&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
  &lt;span class="nv"&gt;var2&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;var2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;gVar&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;gVar1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;gSema&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;CLAIM&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;, &lt;span class="nv"&gt;RELEASE&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;After a time, gSema.BUSY is TRUE in the two tasks !&lt;/p&gt;
&lt;p&gt;So what real alternatives I have to protect the variable ?&lt;/p&gt;
&lt;p&gt;Thanks for your help,&lt;/p&gt;
&lt;p&gt;Romuald.&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>