<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Question concerning pointers and BITADR()</title><link href="https://forge.codesys.com/forge/talk/CODESYS-V2/thread/da5335272a/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/CODESYS-V2/thread/da5335272a/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/CODESYS-V2/thread/da5335272a/</id><updated>2020-02-27T19:44:38.637000Z</updated><subtitle>Recent posts to Question concerning pointers and BITADR()</subtitle><entry><title>Question concerning pointers and BITADR()</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/da5335272a/?limit=25#2e5a" rel="alternate"/><published>2020-02-27T19:44:38.637000Z</published><updated>2020-02-27T19:44:38.637000Z</updated><author><name>shooter</name><uri>https://forge.codesys.com/u/shooter/</uri></author><id>https://forge.codesys.com61a032d671b4510b74c7d6198425d9af77519ee8</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Inside a word you can look for a bit if it is one by:&lt;br/&gt;
out:= WORD_TO_BOOL(inword and (SHL(one,bit)));&lt;br/&gt;
VAR&lt;br/&gt;
out : BOOL;&lt;br/&gt;
inword :WORD:=0; (&lt;em&gt; word to be tested&lt;/em&gt;)&lt;br/&gt;
bit:WORD:=0;       (&lt;em&gt;bit position in word&lt;/em&gt;)&lt;br/&gt;
one:WORD:=1;      (&lt;em&gt; 1 to shift left&lt;/em&gt;)&lt;br/&gt;
END_VAR&lt;br/&gt;
this is nice 61131 and bitadr is not in the code&lt;br/&gt;
other ways are possible look at  w &lt;a class="" href="http://www.oscat.de" rel="nofollow"&gt;www.oscat.de&lt;/a&gt; w  for a nice library.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Question concerning pointers and BITADR()</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/da5335272a/?limit=25#9e9a" rel="alternate"/><published>2020-02-27T19:44:37.364000Z</published><updated>2020-02-27T19:44:37.364000Z</updated><author><name>magil</name><uri>https://forge.codesys.com/u/magil/</uri></author><id>https://forge.codesys.come0b27f4fd42b0fdec5c348d973260b2adb674a8d</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi Vuli,&lt;/p&gt;
&lt;p&gt;Thank you for your reply. It seems that BITADR is indeed very different from ADR.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Question concerning pointers and BITADR()</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/da5335272a/?limit=25#2543" rel="alternate"/><published>2020-02-27T19:44:33.702000Z</published><updated>2020-02-27T19:44:33.702000Z</updated><author><name>Vuli</name><uri>https://forge.codesys.com/u/vuli/</uri></author><id>https://forge.codesys.com0e05a0780d6b2d533008b9f4a541aea55d67d00f</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I guess I will answer my own question in case someone runs into this issue:&lt;/p&gt;
&lt;p&gt;BITADR and ADR operators are very different&lt;/p&gt;
&lt;p&gt;ADR returns pointer&lt;br/&gt;
BITADR returns bit offset&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;VAR&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="nt"&gt;var1&lt;/span&gt; &lt;span class="nt"&gt;AT&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;IX2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;BOOL&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="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bitoffset&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;span class="nt"&gt;bitoffset&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;BITADR&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;var1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The value returned would be &lt;strong&gt;bitoffset = 19 &lt;/strong&gt;(decimal)&lt;br/&gt;
If you consider that %IX2.3 just represents 2nd byte and 3rd bit&lt;br/&gt;
converting it to bits you get &lt;strong&gt;2*8+3=19&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now...at the moment I am not aware of the way to get the actual bit state (true/false) of bit 19 directly.&lt;/p&gt;
&lt;p&gt;I did figure out a decent workaround tho (needs cleaning up but it should work as is):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;VAR&lt;/span&gt;
   &lt;span class="nv"&gt;byteOffset&lt;/span&gt;    : &lt;span class="nv"&gt;POINTER&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;address&lt;/span&gt;    : &lt;span class="nv"&gt;UDINT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;dInputBase&lt;/span&gt;      &lt;span class="nv"&gt;AT&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nv"&gt;IB0&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;       (* FIRST INPUT BYTE *)&lt;/span&gt;
   &lt;span class="nv"&gt;dInputs&lt;/span&gt;     : &lt;span class="nv"&gt;ARRAY&lt;/span&gt;[&lt;span class="mi"&gt;0&lt;/span&gt;..&lt;span class="mi"&gt;100&lt;/span&gt;] &lt;span class="nv"&gt;OF&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;           (* ARRAY of HUNDRED BYTES to COVER IB0 to IB100 *)&lt;/span&gt;
   &lt;span class="nv"&gt;i&lt;/span&gt;      : &lt;span class="nv"&gt;INT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;bitStatus&lt;/span&gt;   : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;bitCount&lt;/span&gt;   : &lt;span class="nv"&gt;UDINT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;byteCount&lt;/span&gt;    : &lt;span class="nv"&gt;UDINT&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;byteOffset&lt;/span&gt; :&lt;span class="o"&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;dInputBase&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;    (* GET A STARTING BYTE POINTER *)&lt;/span&gt;
   &lt;span class="nv"&gt;dInputs&lt;/span&gt;[&lt;span class="mi"&gt;0&lt;/span&gt;] :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;dInputBase&lt;/span&gt;&lt;span class="c1"&gt;;           (* ASSIGN A STARTING BYTE TO FIRST ARRAY ELEMENT *)&lt;/span&gt;
   
   &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;LOOP&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;INCREMENT&lt;/span&gt; &lt;span class="nv"&gt;THE&lt;/span&gt; &lt;span class="nv"&gt;POINTER&lt;/span&gt;, &lt;span class="nv"&gt;SKIP&lt;/span&gt; &lt;span class="nv"&gt;INDEX&lt;/span&gt; &lt;span class="nv"&gt;ZERO&lt;/span&gt;, &lt;span class="nv"&gt;ASSIGNED&lt;/span&gt; &lt;span class="nv"&gt;IN&lt;/span&gt; &lt;span class="nv"&gt;PREVIOUS&lt;/span&gt; &lt;span class="nv"&gt;LINE&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
   &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="nv"&gt;i&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;TO&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt;
      &lt;span class="nv"&gt;address&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;byteOffset&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;address&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;SIZEOF&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;byteOffset&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;  (* INCREMENT TO NEXT POINTER *)&lt;/span&gt;
      &lt;span class="nv"&gt;byteOffset&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;dInputs&lt;/span&gt;[&lt;span class="nv"&gt;i&lt;/span&gt;] :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;byteOffset&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="c1"&gt;;                      (* ASSIGN INPUT BYTE TO ARRAY VIA POINTER TO THAT BYTE *)&lt;/span&gt;
   &lt;span class="nv"&gt;END_FOR&lt;/span&gt;
   
   &lt;span class="ss"&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;BITADR&lt;/span&gt; &lt;span class="nv"&gt;FROM&lt;/span&gt; &lt;span class="nv"&gt;SOME&lt;/span&gt; &lt;span class="nv"&gt;ARBITRARY&lt;/span&gt; &lt;span class="nv"&gt;INPUT&lt;/span&gt; &lt;span class="nv"&gt;VARIABLE&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
   &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;ON&lt;/span&gt; &lt;span class="nv"&gt;MY&lt;/span&gt; &lt;span class="nv"&gt;SYSTEM&lt;/span&gt; &lt;span class="nv"&gt;diAirPressure&lt;/span&gt; &lt;span class="nv"&gt;WAS&lt;/span&gt; &lt;span class="nv"&gt;MAPPED&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;IX76&lt;/span&gt;.&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="nv"&gt;BY&lt;/span&gt; &lt;span class="nv"&gt;TWINCAT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
   &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;BITADR&lt;/span&gt; &lt;span class="nv"&gt;RETURNED&lt;/span&gt; &lt;span class="mi"&gt;612&lt;/span&gt; &lt;span class="nv"&gt;WHICH&lt;/span&gt; &lt;span class="nv"&gt;IS&lt;/span&gt; &lt;span class="mi"&gt;76&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="nv"&gt;BASED&lt;/span&gt; &lt;span class="nv"&gt;ON&lt;/span&gt; &lt;span class="nv"&gt;TWINCAT&lt;/span&gt; &lt;span class="nv"&gt;MAPPING&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;      
   &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;DIVIDE&lt;/span&gt; &lt;span class="mi"&gt;612&lt;/span&gt; &lt;span class="nv"&gt;by&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;GET&lt;/span&gt; &lt;span class="nv"&gt;INTEGER&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt; &lt;span class="nv"&gt;COUNT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
   &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;DIVIDE&lt;/span&gt; &lt;span class="mi"&gt;612&lt;/span&gt; &lt;span class="nv"&gt;by&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="nv"&gt;USING&lt;/span&gt; &lt;span class="nv"&gt;MOD&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;GET&lt;/span&gt; &lt;span class="nv"&gt;BIT&lt;/span&gt; &lt;span class="nv"&gt;COUNT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
   &lt;span class="nv"&gt;byteCount&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;BITADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;diAirPressure&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;bitCount&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;BITADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;diAirPressure&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;MOD&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;bitStatus&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;GETBIT32&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;dInputs&lt;/span&gt;[ &lt;span class="nv"&gt;byteCount&lt;/span&gt; ], &lt;span class="nv"&gt;UDINT_TO_SINT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;bitCount&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</summary></entry><entry><title>Question concerning pointers and BITADR()</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/da5335272a/?limit=25#6211" rel="alternate"/><published>2020-02-27T19:44:32.389000Z</published><updated>2020-02-27T19:44:32.389000Z</updated><author><name>Vuli</name><uri>https://forge.codesys.com/u/vuli/</uri></author><id>https://forge.codesys.com6406c5b70bb1ca75479779abf60f93cf39b9f637</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hey&lt;/p&gt;
&lt;p&gt;Anybody figured out this one by any chance ?&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Question concerning pointers and BITADR()</title><link href="https://forge.codesys.com/forge/talk/Codesys%2520V2.3/thread/da5335272a/?limit=25#1a7a" rel="alternate"/><published>2020-02-27T19:44:31.083000Z</published><updated>2020-02-27T19:44:31.083000Z</updated><author><name>magil</name><uri>https://forge.codesys.com/u/magil/</uri></author><id>https://forge.codesys.coma548b8918cd87e815ea807fa09c0a45cf74f1078</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello, I am wondering about the following code:&lt;/p&gt;
&lt;p&gt;Output       : POINTER TO WORD;&lt;br/&gt;
Toggle       : POINTER TO BOOL;&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Output := ADR(%QW6);&lt;br/&gt;
Output^.1 := TRUE;               - works&lt;/p&gt;
&lt;p&gt;Toggle:= BITADR(%QX6.1);&lt;br/&gt;
Toggle^ := TRUE;                  - crash&lt;/p&gt;
&lt;p&gt;If the ADR function is used on a pointer to a word, the value of the used address can be set using that pointer.&lt;br/&gt;
However, when a pointer to a bool is uses, the BITADR function should be used instead of the ADR() function. This results in an Illigal instruction.&lt;/p&gt;
&lt;p&gt;Can anyone explain what the difference is between ADR() and BITADR()? &lt;br/&gt;
Is there another way to achieve the desired result? (The goal is to make an abstraction layer by refence to the physical IO of a plc, so that if different hardware is used, only the addresses need to be changed)&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>