<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Namespaces and how to use them</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/2f83c3bb6a/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Engineering/thread/2f83c3bb6a/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Engineering/thread/2f83c3bb6a/</id><updated>2020-02-27T14:20:07.273000Z</updated><subtitle>Recent posts to Namespaces and how to use them</subtitle><entry><title>Namespaces and how to use them</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/2f83c3bb6a/?limit=25#6ae3" rel="alternate"/><published>2020-02-27T14:20:07.273000Z</published><updated>2020-02-27T14:20:07.273000Z</updated><author><name>plcmax</name><uri>https://forge.codesys.com/u/plcmax/</uri></author><id>https://forge.codesys.comb56eba969554171719db5ba2937c1f035ca35d0d</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;for me this chapter was a great help.&lt;br/&gt;
&lt;a class="" href="https://help.codesys.com/webapp/index-libdevsum;product=LibDevSummary;version=3.5.12.0" rel="nofollow"&gt;https://help.codesys.com/webapp/index-l ... n=3.5.12.0&lt;/a&gt;&lt;br/&gt;
Best regards&lt;br/&gt;
plcmax&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Namespaces and how to use them</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/2f83c3bb6a/?limit=25#c8cf" rel="alternate"/><published>2020-02-27T14:20:06.742000Z</published><updated>2020-02-27T14:20:06.742000Z</updated><author><name>Krowi</name><uri>https://forge.codesys.com/u/krowi/</uri></author><id>https://forge.codesys.com2bfdeb71adefc0ad8fcf583af1eb280d5ef09426</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello everyone,&lt;/p&gt;
&lt;p&gt;My team and I are using CoDeSys to program our controllers and we recently made some changes and done some refactoring. During the refactoring we had something "wierd" happen (wierd because we never had it before. I'll explain what we had and what changed and what my question is. All code examples are not code we use, it's just to explain my question.&lt;/p&gt;
&lt;p&gt;Let's say you have &lt;strong&gt;Lib1&lt;/strong&gt; which is a library that has a global variable file &lt;strong&gt;GVL_Definition&lt;/strong&gt;. In this file has variables called &lt;strong&gt;bStart&lt;/strong&gt; and &lt;strong&gt;bStop&lt;/strong&gt;. The code looks like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Lib1&lt;/span&gt; &lt;span class="n"&gt;GVL_Definition&lt;/span&gt; &lt;span class="n"&gt;Code&lt;/span&gt;
&lt;span class="n"&gt;VAR&lt;/span&gt; &lt;span class="k"&gt;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;bStart&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="n"&gt;BYTE&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&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;bStop&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="n"&gt;BYTE&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&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;In a second library &lt;strong&gt;Lib2&lt;/strong&gt; we put Lib1 in the Library Manager. In this Lib2 we have a method &lt;strong&gt;mxStartByte&lt;/strong&gt; which uses bStart from Lib1. We can directly use it without explicitly putting namespaces or file names in front of the variable. The code is something like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;Lib2&lt;/span&gt; &lt;span class="nv"&gt;mxStartByte&lt;/span&gt; &lt;span class="nv"&gt;Code&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt;   &lt;span class="nv"&gt;bStart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="nv"&gt;mxStartByte&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;mxStartByte&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;; END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now we have a third library &lt;strong&gt;Lib3&lt;/strong&gt;. This library needs both Lib1 and Lib2 to work and are both added in the Library Manager. It has a method named &lt;strong&gt;mxStop&lt;/strong&gt; and this is the code:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;Lib3&lt;/span&gt; &lt;span class="nv"&gt;mxStop&lt;/span&gt; &lt;span class="nv"&gt;Code&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;mxStartByte&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;bStop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="nv"&gt;mxStop&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;mxStop&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;; END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now, the above is how we have it. The namespace of each library is the name of the library to keep this example simple.&lt;/p&gt;
&lt;p&gt;Due to something in Lib3, the code in mxStop changed to this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;Lib3&lt;/span&gt; &lt;span class="nv"&gt;mxStop&lt;/span&gt; &lt;span class="nv"&gt;Code&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;mxStartByte&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;Lib1&lt;/span&gt;.&lt;span class="nv"&gt;bStop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="nv"&gt;mxStop&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;mxStop&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;; END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I've done some searching and came across this article: &lt;a class="" href="https://stefanhenneken.wordpress.com/2016/11/22/iec-61131-3-namespaces/" rel="nofollow"&gt;https://stefanhenneken.wordpress.com/20 ... amespaces/&lt;/a&gt;. It explains how namespaces are used to unambiguously declare multiple variables with the same name. I do understand that it's used for that but I was wondering if there is another use case for namespaces.&lt;/p&gt;
&lt;p&gt;If we go back to the example above. Lib3 requires Lib1 and Lib2 to work. Lib2 requires Lib1 to work. The required libraries are added to the Library Manager each time. After some testing I found that it's possible to add Lib1 to Lib2's Library Manager and ONLY add Lib2 to Lib3's Library manager and with adding the namespace of Lib1 in front of the global variables in that library I could access those without putting Lib1 in Lib3's library manager. This gives us the following code:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;Lib3&lt;/span&gt; &lt;span class="nv"&gt;mxStop&lt;/span&gt; &lt;span class="nv"&gt;Code&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;mxStartByte&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;Lib2&lt;/span&gt;.&lt;span class="nv"&gt;bStop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="nv"&gt;mxStop&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;mxStop&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;; END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;What surprised me is that the variable bStop is visible from Lib2 even though it's in Lib1. This leads me to think that all variables, methods, ... in a library that is added to the Library Manager of a library are visible from that library when it's added to another Library Manager in its turn. Have a look at the following code on how I can access bStop in Lib3 with different conditions:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;1&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;Lib3&lt;/span&gt; &lt;span class="n"&gt;LM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Library&lt;/span&gt; &lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;Lib2&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;Lib1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Lib2&lt;/span&gt; &lt;span class="n"&gt;LM&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;Lib1&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&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;bStop&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&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;Lib1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bStop&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&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;Lib2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bStop&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&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;Lib2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lib1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bStop&lt;/span&gt;
&lt;span class="mi"&gt;2&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;Lib3&lt;/span&gt; &lt;span class="n"&gt;LM&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;Lib2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Lib2&lt;/span&gt; &lt;span class="n"&gt;LM&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;Lib1&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&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;Lib2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bStop&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&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;Lib2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lib1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bStop&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The above code really makes things confusing for me.&lt;/p&gt;
&lt;p&gt;On another note, a colleague of mine told me there is this option: "Publish all IEC symbols to that project as if this reference would have been included there directly." If I thick this option and if I refer back to the last code example above, option 2's sub cases are the same as option 1's. For me this is a 3rd possible option of adding / not adding libraries to Library Managers and accessing variables in one way or another.&lt;/p&gt;
&lt;p&gt;My final question is, what is the correct way to access variables in a library which is also in the LM of a higher library that you need. (Lib3 needs Lib1 and Lib2 but Lib2 already has Lib1)&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>