<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Communicating with Codesys</title><link href="https://forge.codesys.com/forge/talk/CODESYS-V2/thread/2e0dd16017/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/CODESYS-V2/thread/2e0dd16017/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/CODESYS-V2/thread/2e0dd16017/</id><updated>2020-02-27T23:22:49.568000Z</updated><subtitle>Recent posts to Communicating with Codesys</subtitle><entry><title>Communicating with Codesys</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/2e0dd16017/?limit=25#4035" rel="alternate"/><published>2020-02-27T23:22:49.568000Z</published><updated>2020-02-27T23:22:49.568000Z</updated><author><name>laythea</name><uri>https://forge.codesys.com/u/laythea/</uri></author><id>https://forge.codesys.com06286d53f4206cd90a6abb844b37b2d307595624</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Ok, sounds similar to what I have got setup. In my case I have seperate memory areas, either for reading or writing. &lt;/p&gt;
&lt;p&gt;For Reading data:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;   &lt;span class="o"&gt;//------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Get&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;shared&lt;/span&gt; &lt;span class="nv"&gt;windows&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;area&lt;/span&gt;
   &lt;span class="o"&gt;//------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;hDriverToCodeSys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;RTS_INVALID_HANDLE&lt;/span&gt; &lt;span class="nv"&gt;OR&lt;/span&gt; &lt;span class="nv"&gt;mWindowsShmInitialisationError&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="k"&gt;THEN&lt;/span&gt;
      &lt;span class="nv"&gt;hDriverToCodeSys&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SysSharedMemoryOpen2&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dbName&lt;/span&gt;, &lt;span class="mi"&gt;0&lt;/span&gt;, &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dbSizeBytes&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rxResult&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="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;hDriverToCodeSys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;RTS_INVALID_HANDLE&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="nv"&gt;mWindowsShmInitialisationError&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;ELSE&lt;/span&gt;
         &lt;span class="nv"&gt;mWindowsShmInitialisationError&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;   &lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;
   &lt;span class="nv"&gt;END_IF&lt;/span&gt;
   &lt;span class="nv"&gt;mTmrWindowsShmInitialisationErrorTimeout&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IN&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;mWindowsShmInitialisationError&lt;/span&gt;, &lt;span class="nv"&gt;PT&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MB_TIMEOUT&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;mWindowsShmInitialisationErrorTimeout&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;mTmrWindowsShmInitialisationErrorTimeout&lt;/span&gt;.&lt;span class="nv"&gt;Q&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   
   &lt;span class="o"&gt;//------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;If&lt;/span&gt; &lt;span class="nv"&gt;we&lt;/span&gt; &lt;span class="nv"&gt;have&lt;/span&gt; &lt;span class="nv"&gt;got&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;shared&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;area&lt;/span&gt;, &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nv"&gt;read&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt; &lt;span class="nv"&gt;from&lt;/span&gt; &lt;span class="nv"&gt;it&lt;/span&gt;
   &lt;span class="o"&gt;//------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="k"&gt;IF&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;mWindowsShmInitialisationError&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="k"&gt;THEN&lt;/span&gt;   
      &lt;span class="nv"&gt;rxBytesRead&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SysSharedMemoryRead&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;hDriverToCodeSys&lt;/span&gt;, &lt;span class="mi"&gt;0&lt;/span&gt;, &lt;span class="nv"&gt;rxBufferPointer&lt;/span&gt;, &lt;span class="nv"&gt;dbSizeBytes&lt;/span&gt;, &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rxResult&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="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rxBytesRead&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;dbSizeBytes&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="nv"&gt;mWindowsShmReadError&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;ELSIF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rxBytesRead&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;dbSizeBytes&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;         
         &lt;span class="nv"&gt;mWindowsShmReadError&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;
   &lt;span class="nv"&gt;END_IF&lt;/span&gt;
   &lt;span class="nv"&gt;mTmrWindowsShmReadErrorTimeout&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IN&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;mWindowsShmReadError&lt;/span&gt;, &lt;span class="nv"&gt;PT&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MB_TIMEOUT&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;mWindowsShmReadErrorTimeout&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;mTmrWindowsShmReadErrorTimeout&lt;/span&gt;.&lt;span class="nv"&gt;Q&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;//------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Extract&lt;/span&gt; &lt;span class="nv"&gt;Raw&lt;/span&gt; &lt;span class="nv"&gt;byte&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;Data&lt;/span&gt; &lt;span class="nv"&gt;Block&lt;/span&gt; &lt;span class="nv"&gt;word&lt;/span&gt; &lt;span class="nv"&gt;array&lt;/span&gt;
   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Note&lt;/span&gt;. &lt;span class="k"&gt;Do&lt;/span&gt; &lt;span class="nv"&gt;not&lt;/span&gt; &lt;span class="nv"&gt;just&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;rxDataOK&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;as&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nv"&gt;we&lt;/span&gt; &lt;span class="nv"&gt;will&lt;/span&gt; &lt;span class="nv"&gt;not&lt;/span&gt; &lt;span class="nv"&gt;be&lt;/span&gt; &lt;span class="nv"&gt;able&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;re&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;establish&lt;/span&gt; &lt;span class="nv"&gt;comms&lt;/span&gt;
   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;after&lt;/span&gt; &lt;span class="nv"&gt;eg&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;rolling&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt; &lt;span class="nb"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
   &lt;span class="o"&gt;//------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="nv"&gt;wordIter&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dbSizeBytes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt;   
      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Get&lt;/span&gt; &lt;span class="nv"&gt;Byte&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt;
      &lt;span class="nv"&gt;byteValue1&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;rxBufferPointer&lt;/span&gt;[&lt;span class="nv"&gt;wordIter&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;]&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;byteValue2&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;rxBufferPointer&lt;/span&gt;[&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;wordIter&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="ss"&gt;)&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="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Word&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;byteValue1&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;byteValue2&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
      &lt;span class="nv"&gt;wordValue&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;byteValue1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;wordValue&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;wordValue&lt;/span&gt; &lt;span class="nv"&gt;OR&lt;/span&gt; &lt;span class="nv"&gt;SHL&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;byteValue2&lt;/span&gt;,&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      
      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Assign&lt;/span&gt; &lt;span class="nv"&gt;DB&lt;/span&gt; &lt;span class="nv"&gt;word&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt;
      &lt;span class="nv"&gt;rxDBBufferPointer&lt;/span&gt;[&lt;span class="nv"&gt;wordIter&lt;/span&gt;] :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;wordValue&lt;/span&gt;&lt;span class="c1"&gt;;      &lt;/span&gt;
   &lt;span class="nv"&gt;END_FOR&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;For writing data:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;   &lt;span class="o"&gt;//------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Get&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;shared&lt;/span&gt; &lt;span class="nv"&gt;windows&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;area&lt;/span&gt;
   &lt;span class="o"&gt;//------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;hCodeSysToDriver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;RTS_INVALID_HANDLE&lt;/span&gt; &lt;span class="nv"&gt;OR&lt;/span&gt; &lt;span class="nv"&gt;mWindowsShmInitialisationError&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="k"&gt;THEN&lt;/span&gt;
      &lt;span class="nv"&gt;hCodeSysToDriver&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SysSharedMemoryOpen2&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dbName&lt;/span&gt;, &lt;span class="mi"&gt;0&lt;/span&gt;, &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dbSizeBytes&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;, &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;txResult&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="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;hCodeSysToDriver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;RTS_INVALID_HANDLE&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="nv"&gt;mWindowsShmInitialisationError&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;ELSE&lt;/span&gt;
         &lt;span class="nv"&gt;mWindowsShmInitialisationError&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;   &lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;
   &lt;span class="nv"&gt;END_IF&lt;/span&gt; 
   &lt;span class="nv"&gt;mTmrWindowsShmInitialisationErrorTimeout&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IN&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;mWindowsShmInitialisationError&lt;/span&gt;, &lt;span class="nv"&gt;PT&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MB_TIMEOUT&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;mWindowsShmInitialisationErrorTimeout&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;mTmrWindowsShmInitialisationErrorTimeout&lt;/span&gt;.&lt;span class="nv"&gt;Q&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   
   &lt;span class="o"&gt;//------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;If&lt;/span&gt; &lt;span class="nv"&gt;we&lt;/span&gt; &lt;span class="nv"&gt;have&lt;/span&gt; &lt;span class="nv"&gt;got&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;shared&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;area&lt;/span&gt;, &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;it&lt;/span&gt; 
   &lt;span class="o"&gt;//------------------------------------------------------------------------------------------------------&lt;/span&gt;
   &lt;span class="k"&gt;IF&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;mWindowsShmInitialisationError&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="k"&gt;THEN&lt;/span&gt;   
      
      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Copy&lt;/span&gt; &lt;span class="nv"&gt;Block&lt;/span&gt; &lt;span class="nv"&gt;word&lt;/span&gt; &lt;span class="nv"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;into&lt;/span&gt; &lt;span class="nv"&gt;Tx&lt;/span&gt; &lt;span class="nv"&gt;Byte&lt;/span&gt; &lt;span class="nv"&gt;Buffer&lt;/span&gt;
      &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="nv"&gt;wordIter&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dbSizeBytes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt;   
         
         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Get&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;current&lt;/span&gt; &lt;span class="nv"&gt;word&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;DB&lt;/span&gt;
         &lt;span class="nv"&gt;wordValue&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;txDBBufferPointer&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         
         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Extract&lt;/span&gt; &lt;span class="nv"&gt;word&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="nv"&gt;from&lt;/span&gt; &lt;span class="nv"&gt;two&lt;/span&gt; &lt;span class="nv"&gt;consecutive&lt;/span&gt; &lt;span class="nv"&gt;bytes&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;tx&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;
         &lt;span class="nv"&gt;byteValue1&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;WORD_TO_BYTE&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;wordValue&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;byteValue2&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;WORD_TO_BYTE&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;SHR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;wordValue&lt;/span&gt;,&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         
         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Copy&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;bytes&lt;/span&gt; &lt;span class="nv"&gt;into&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;tx&lt;/span&gt; &lt;span class="nv"&gt;byte&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;
         &lt;span class="nv"&gt;txBuffer&lt;/span&gt;[&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;wordIter&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;] :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;byteValue1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;txBuffer&lt;/span&gt;[&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;wordIter&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;] :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;byteValue2&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      
         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;Next&lt;/span&gt; &lt;span class="nv"&gt;word&lt;/span&gt;   
         &lt;span class="nv"&gt;txDBBufferPointer&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;txDBBufferPointer&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;END_FOR&lt;/span&gt;&lt;span class="c1"&gt;;      &lt;/span&gt;
   
      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Write&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt;
      &lt;span class="nv"&gt;txBytesWrote&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SysSharedMemoryWrite&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;hCodeSysToDriver&lt;/span&gt;, &lt;span class="mi"&gt;0&lt;/span&gt;, &lt;span class="nv"&gt;txBufferPointer&lt;/span&gt;, &lt;span class="nv"&gt;dbSizeBytes&lt;/span&gt;, &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;txResult&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="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;txBytesWrote&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;dbSizeBytes&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="nv"&gt;mWindowsShmWriteError&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;ELSIF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;txBytesWrote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;dbSizeBytes&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;         
         &lt;span class="nv"&gt;mWindowsShmWriteError&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;
   &lt;span class="nv"&gt;END_IF&lt;/span&gt;   
   &lt;span class="nv"&gt;mTmrWindowsShmWriteErrorTimeout&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IN&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;mWindowsShmWriteError&lt;/span&gt;, &lt;span class="nv"&gt;PT&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;MB_TIMEOUT&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;mWindowsShmWriteErrorTimeout&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;mTmrWindowsShmWriteErrorTimeout&lt;/span&gt;.&lt;span class="nv"&gt;Q&lt;/span&gt;&lt;span class="c1"&gt;;   &lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;These are just snippets, but should hopefully be helpful.&lt;/p&gt;
&lt;p&gt;Cheers&lt;br/&gt;
Laythe&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Communicating with Codesys</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/2e0dd16017/?limit=25#1707" rel="alternate"/><published>2020-02-27T23:22:44.964000Z</published><updated>2020-02-27T23:22:44.964000Z</updated><author><name>pohg</name><uri>https://forge.codesys.com/u/pohg/</uri></author><id>https://forge.codesys.com77146f1a1a5fe6b54212d3e2194d2e042812bc71</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I want to try the following scenario.&lt;/p&gt;
&lt;p&gt;Create a shared memory in a .NET application with the kernel32 function "CreateFileMapping". And now I want to read or write to this memory in CoDeSys.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Communicating with Codesys</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/2e0dd16017/?limit=25#973a" rel="alternate"/><published>2020-02-27T23:22:43.287000Z</published><updated>2020-02-27T23:22:43.287000Z</updated><author><name>laythea</name><uri>https://forge.codesys.com/u/laythea/</uri></author><id>https://forge.codesys.com707ab4af05078b2542cc7d147882c1687e0784e6</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Can you be a bit more specific?&lt;/p&gt;
&lt;p&gt;Cheers&lt;br/&gt;
Laythe&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Communicating with Codesys</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/2e0dd16017/?limit=25#620d" rel="alternate"/><published>2020-02-27T23:22:38.705000Z</published><updated>2020-02-27T23:22:38.705000Z</updated><author><name>pohg</name><uri>https://forge.codesys.com/u/pohg/</uri></author><id>https://forge.codesys.comc2f501c0e2babb580438016e943a002b455c3bbd</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;do you have a runnable application?&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Communicating with Codesys</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/2e0dd16017/?limit=25#00a2" rel="alternate"/><published>2020-02-27T23:22:37.032000Z</published><updated>2020-02-27T23:22:37.032000Z</updated><author><name>laythea</name><uri>https://forge.codesys.com/u/laythea/</uri></author><id>https://forge.codesys.com0fa4de736cfcbf5a8922b78cc15df4e5437826d4</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Thanks for the reply.&lt;/p&gt;
&lt;p&gt;I have wrote my own application that interfaces to the Windows Shared Memory areas which I have setup and populated with data in CodeSys, so this is not a problem. This is not really a 'driver'; its just a normal windows application.&lt;/p&gt;
&lt;p&gt;The PLC is running on top of Windows XPe, so it is not a problem to run my driver program. I don't need them to be seperate. I am familiar with OPC and its advantages, however it is an overkill for my requirements, both in terms of cost and performance overhead.&lt;/p&gt;
&lt;p&gt;I have this setup with my Windows application already working fine. There does not seem to be a problem, however my Windows application will be running for years once deployed (with the occasional restart), and I have not tested it for any great length of time. Therefore, the question was, do I need to protect memory access to the Windows Shared Areas, and if so how?&lt;/p&gt;
&lt;p&gt;I can do this protection in my application via the normal semaphore etc protection mechanisms, but I cannot find anything in CodeSys which will avoid the CodeSys application reading data from a Windows Shared Memory area whilst I am still writing data into the memory block from my Windows application.&lt;/p&gt;
&lt;p&gt;I guess I am looking for a Codesys library that allows me to access the Windows semaphores etc?&lt;/p&gt;
&lt;p&gt;Thanks&lt;br/&gt;
Laythe&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Communicating with Codesys</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/2e0dd16017/?limit=25#62e7" rel="alternate"/><published>2020-02-27T23:22:32.370000Z</published><updated>2020-02-27T23:22:32.370000Z</updated><author><name>Rolf-Geisler</name><uri>https://forge.codesys.com/u/rolf-geisler/</uri></author><id>https://forge.codesys.com5f7f85acc362e119eafaec5827288457511fa7b5</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;best way to communicate between CoDeSys and Windows is an OPC connection. &lt;/p&gt;
&lt;p&gt;Shared memory works only, if PLC and Windows are running on the same machine (or at least in the same rack). To have access to the shared memory, you will need a driver running as part of the Windows side of communication. The driver probably has to be a special build for the PLC in use. OPC obviates all these problems.&lt;/p&gt;
&lt;p&gt;Yes, OPC server maybe not free. &lt;/p&gt;
&lt;p&gt;You will need an OPC client running inside the Windows side of communication. OPC is documented pretty well (available in the WWW), any Windows software developer should be able to build such a component. Then, the big advantage is to have a communication method, which works with any PLC, even with remote machines.&lt;/p&gt;
&lt;p&gt;Regards,&lt;/p&gt;
&lt;p&gt;Rolf&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Communicating with Codesys</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/2e0dd16017/?limit=25#f382" rel="alternate"/><published>2020-02-27T23:22:30.595000Z</published><updated>2020-02-27T23:22:30.595000Z</updated><author><name>laythea</name><uri>https://forge.codesys.com/u/laythea/</uri></author><id>https://forge.codesys.comb91dded1a50ae5c3bbec2650d8ea508b57d8094e</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I am trying to communicate between Codesys and my Window application. I have heard of PLCHandler which enables this, but use of this is not an option as its not free.&lt;/p&gt;
&lt;p&gt;The Windows application creates a Windows Shared Memory area, lets say called "DataArea".&lt;/p&gt;
&lt;p&gt;The Codesys application makes use of the SysShm system library.&lt;/p&gt;
&lt;p&gt;In my Codesys application, I am then using the SysSharedMemoryOpen2() function to open this memory area, and then using the SysSharedMemoryRead() and SysSharedMemoryWrite() to get data in and out of the "DataArea" memory block.&lt;/p&gt;
&lt;p&gt;I have read that if I have 2 Windows applications communicating via Windows Shared Memory, then I am supposed to use synchronisation to, for example, avoid one application reading data whilst the other is still writing data.&lt;/p&gt;
&lt;p&gt;I have searched through the Codesys libraries/literature, and cannot find anything that would enable me to "lock" a Windows Shared Memory area whilst I am writing to it in Codesys, so that my Windows app can wait until the lock has been released before reading data from it (and vice-versa)&lt;/p&gt;
&lt;p&gt;I should mention, that I have the setup "working" without any kind of locking mechanisms and it seems to work fine, but having read things about the need for synchronisation between windows applications, I am concerned that I may be missing something here????&lt;/p&gt;
&lt;p&gt;Anyone have any experience of this kind of thing?&lt;/p&gt;
&lt;p&gt;Thanks&lt;/p&gt;
&lt;p&gt;Laythe&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>