<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to VAR_IN_OUT_AS_POINTER and memory usage</title><link href="https://forge.codesys.com/forge/talk/Visualization/thread/bcbc83fe88/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Visualization/thread/bcbc83fe88/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Visualization/thread/bcbc83fe88/</id><updated>2023-06-02T09:51:11.016000Z</updated><subtitle>Recent posts to VAR_IN_OUT_AS_POINTER and memory usage</subtitle><entry><title>VAR_IN_OUT_AS_POINTER and memory usage</title><link href="https://forge.codesys.com/forge/talk/Visualization/thread/bcbc83fe88/?limit=25#006b" rel="alternate"/><published>2023-06-02T09:51:11.016000Z</published><updated>2023-06-02T09:51:11.016000Z</updated><author><name>sbt-277</name><uri>https://forge.codesys.com/u/sbt-277/</uri></author><id>https://forge.codesys.comcd1247a6b052b46b313ede83ce75eabd5dcce3d5</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I tried tvm's solution this in SP16 which comes with stateless visualizations (whatever that means in detail). So, the referenced data will be updated in each cycle.&lt;/p&gt;
&lt;p&gt;Only problem now is that the&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nl"&gt;MeterInterface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AllMeters&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SelectedMeter&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;has to be called at each cycle whether the SelectedMeter value changed or not, because somewhere the old value of MeterInterface gets written back to is. I guess somewhere in the codesys visaulization code the value of the initial value od MeterInterface is stored and written back at each cycle. But where? Sadly there is no documentation about the internals of codesys visualization...&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>VAR_IN_OUT_AS_POINTER and memory usage</title><link href="https://forge.codesys.com/forge/talk/Visualization/thread/bcbc83fe88/?limit=25#5040" rel="alternate"/><published>2020-02-27T18:16:42.715000Z</published><updated>2020-02-27T18:16:42.715000Z</updated><author><name>tvm</name><uri>https://forge.codesys.com/u/tvm/</uri></author><id>https://forge.codesys.come6650251d4d72becb6ca4cb83ea8d49e3a72f602</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Update:  that works quite well.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;FUNCTION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BLOCK&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;METER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IMPLEMENTS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ELECMETER_ITF&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;PROGRAM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ElectricMeters_PRG&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nf"&gt;VAR&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;Meter1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;METER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;Meter2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;METER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;AllMeters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="k"&gt;ARRAY&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1..13&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;OF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;ELECMETER_ITF&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Meter1, Meter2, Meter3, Meter4, Meter5, Meter6, Meter7, Meter8, Meter9, Meter10, Meter11, Meter12, Meter13&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;MeterInterface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;ELECMETER_ITF&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AllMeters&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="s1"&gt;'s very important to initialize this variable with a valid reference, or your visualization won'&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;start&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nl"&gt;SelectedMeter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;UINT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1..13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;END_VAR&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nl"&gt;MeterInterface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AllMeters&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SelectedMeter&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;point the visualization to ElectricMeters_PRG.MeterInterface.  Change the SelectedMeter variable with a button or whatever to change the visualization reference&lt;/p&gt;
&lt;p&gt;Saves &amp;gt;2MB of memory&lt;/p&gt;
&lt;p&gt;Note:  requires 'Activate property handling in all element properties' to be checked in Project Settings/Visualization to allow the use of properties in the visualization&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>VAR_IN_OUT_AS_POINTER and memory usage</title><link href="https://forge.codesys.com/forge/talk/Visualization/thread/bcbc83fe88/?limit=25#2124" rel="alternate"/><published>2020-02-27T18:16:41.433000Z</published><updated>2020-02-27T18:16:41.433000Z</updated><author><name>tvm</name><uri>https://forge.codesys.com/u/tvm/</uri></author><id>https://forge.codesys.comfc8410d8eeee13914020a55db9cc8d90cff99b62</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Ok, I am using SP 12 (Schneider Machine Expert), so I guess I can't change the reference at runtime.  However, what if I do it with interfaces and arrays?&lt;/p&gt;
&lt;p&gt;&lt;span style="color: underline;"&gt;Interface&lt;/span&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;VAR_IN_OUT&lt;/span&gt;
   &lt;span class="nv"&gt;Meter&lt;/span&gt;:    &lt;span class="nv"&gt;METER_ITF&lt;/span&gt;&lt;span class="c1"&gt;;   //function block interface.  This is hard to research because Codesys uses the term "interface" for both visualizations and function blocks&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;..but, in each cycle, the data won't be updated, since I'm using &amp;lt;SP15.  Therefore, in a program:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&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;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;MeterIndex&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="nt"&gt;UINT&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;AllMeters&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;ARRAY&lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;..15&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;OF&lt;/span&gt; &lt;span class="nt"&gt;DATA_ITF&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="o"&gt;//&lt;/span&gt;&lt;span class="nt"&gt;array&lt;/span&gt; &lt;span class="nt"&gt;of&lt;/span&gt; &lt;span class="nt"&gt;interfaces&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;assigned&lt;/span&gt; &lt;span class="nt"&gt;at&lt;/span&gt; &lt;span class="nt"&gt;runtime&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;CurrentMeter&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="nt"&gt;DATA_ITF&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="err"&gt;  &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nt"&gt;linked&lt;/span&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="nt"&gt;interface&lt;/span&gt; &lt;span class="nt"&gt;of&lt;/span&gt; &lt;span class="nt"&gt;visualization&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;END_VAR&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Then at runtime:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;AllMeters&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Meter1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;AllMeters&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Meter2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nl"&gt;CurrentMeter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AllMeters&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MeterIndex&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Seems like it should save a lot of memory.  I won't be able to use the tab control, but should be able to do the same with with a single frame and a bunch of buttons that change the MeterIndex variable&lt;/p&gt;
&lt;p&gt;I haven't tried this yet.  I'll update if it works.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>VAR_IN_OUT_AS_POINTER and memory usage</title><link href="https://forge.codesys.com/forge/talk/Visualization/thread/bcbc83fe88/?limit=25#d47a" rel="alternate"/><published>2020-02-27T18:16:40.335000Z</published><updated>2020-02-27T18:16:40.335000Z</updated><author><name>mprestel</name><uri>https://forge.codesys.com/u/mprestel/</uri></author><id>https://forge.codesys.com1fd2afef1d976bb06024934a793762e3a0d01e9d</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello Tim,&lt;/p&gt;
&lt;p&gt;there are a few reasons for that, but it is mostly that the referenced visualization was not stateless before SP15.&lt;br/&gt;
Starting with SP15 the referenced data will be updated in each cycle. Before SP15 the referenced data was only assigned once in the start of the application.&lt;/p&gt;
&lt;p&gt;I added an improvement to cover this use case and reduce the data size.&lt;/p&gt;
&lt;p&gt;Adding 15 visualization with different data is just a fancy way to write an array with different indexes in my honest opinion &lt;/p&gt;
&lt;p&gt;Best regards,&lt;br/&gt;
Marcel&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>VAR_IN_OUT_AS_POINTER and memory usage</title><link href="https://forge.codesys.com/forge/talk/Visualization/thread/bcbc83fe88/?limit=25#ba55" rel="alternate"/><published>2020-02-27T18:16:37.216000Z</published><updated>2020-02-27T18:16:37.216000Z</updated><author><name>tvm</name><uri>https://forge.codesys.com/u/tvm/</uri></author><id>https://forge.codesys.com17fd00e24763bf48a170d587a233f99c50e706b4</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Now I understand, thank you for that very comprehensive reply.&lt;/p&gt;
&lt;p&gt;I'm still running out of memory, though, and that leads to another question.  Let's say I have a tab control with 15 frames, all pointing to the same visualization, with different references.  By process of elimination (removing one frame at a time), it looks like I'm using the same amount of memory for each frame (about 182K each, for a total of 2.8MB).  I would have thought that the tab element would "know" that each frame is the same, and to only update the references when the tab is switched.  Otherwise what's really the advantage of using a frame--might as well use separate visualizations.  Or is there a different element that would accomplish this?&lt;/p&gt;
&lt;p&gt;Tim&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>VAR_IN_OUT_AS_POINTER and memory usage</title><link href="https://forge.codesys.com/forge/talk/Visualization/thread/bcbc83fe88/?limit=25#6b02" rel="alternate"/><published>2020-02-27T18:16:35.885000Z</published><updated>2020-02-27T18:16:35.885000Z</updated><author><name>mprestel</name><uri>https://forge.codesys.com/u/mprestel/</uri></author><id>https://forge.codesys.come02c45199eb13ed71da35a32d9a120e41467ebd7</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello Tim,&lt;/p&gt;
&lt;p&gt;you are mixing a few things together here so let I try to separate everything:&lt;/p&gt;
&lt;p&gt;&lt;span style="color: 125%;"&gt;Small explanations for this example&lt;/span&gt;&lt;br/&gt;
We have a function block defined in our GVL. The content of the fb does not matter.&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="k"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FBData&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;&lt;span style="color: 125%;"&gt;&lt;strong&gt;Dialogs&lt;/strong&gt;&lt;/span&gt;&lt;br/&gt;
&lt;strong&gt;Normal dialog (VAR_IN_OUT)&lt;/strong&gt;&lt;br/&gt;
&lt;span style="color: underline;"&gt;Interface&lt;/span&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;VAR_IN_OUT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FBData&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;&lt;span style="color: underline;"&gt;Generated code&lt;/span&gt;&lt;br/&gt;
The generated code for this interface kinda 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;VAR_INPUT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FBData&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;The values of the functionblock will be copied once (when the dialog is opened)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;DATA&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GVL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Dialogs with Attribute VAR_IN_OUT_AS_POINTER&lt;/strong&gt;&lt;br/&gt;
&lt;span style="color: underline;"&gt;Interface&lt;/span&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;VAR_IN_OUT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; {&lt;/span&gt;&lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;'VAR_IN_OUT_AS_POINTER'&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="k"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FBData&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;This attribute is only available for dialogs. It has no effect for frames and therefore correctly reports an error.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: underline;"&gt;Generated code&lt;/span&gt;&lt;br/&gt;
The generated code for this interface kinda 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;VAR_INPUT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;REFERENCE&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;FBData&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;The reference to the data will be set once (when the dialog is opened)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;DialogVarInOutPointer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;DATA&lt;/span&gt; &lt;span class="k"&gt;REF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GVL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;span style="color: 125%;"&gt;&lt;strong&gt;Frames&lt;/strong&gt;&lt;/span&gt;&lt;br/&gt;
&lt;span style="color: underline;"&gt;Interface&lt;/span&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;VAR_IN_OUT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;data&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;FBData&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;p&gt;&lt;span style="color: underline;"&gt;Generated code&lt;/span&gt;&lt;br/&gt;
The generated code for this interface kinda 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;VAR_INPUT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;REFERENCE&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;FBData&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 each cycle the reference to the data will be updated (since the data can be different for each referenced visualization).&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="k"&gt;REF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GVL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br/&gt;
Frames will use a reference, no need to use any attribute.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;br/&gt;
Marcel&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>VAR_IN_OUT_AS_POINTER and memory usage</title><link href="https://forge.codesys.com/forge/talk/Visualization/thread/bcbc83fe88/?limit=25#e5ad" rel="alternate"/><published>2020-02-27T18:16:32.791000Z</published><updated>2020-02-27T18:16:32.791000Z</updated><author><name>tvm</name><uri>https://forge.codesys.com/u/tvm/</uri></author><id>https://forge.codesys.com040f906b887eca857c95591b56622426f260854a</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I'm trying to understand how parameters are passed to visualizations through the interface, and how that affects memory usage.  &lt;/p&gt;
&lt;p&gt;According to the manual:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Zitat:&lt;/strong&gt;&lt;br/&gt;
VAR_IN_OUT: If a data structure is transferred, it has to be defined as VAR_IN_OUT. Without pragma, the parameter values are copied when the visualization is opened. Entries are written to the copied data structure. When the visualization is closed, the values are written back to the parameters.&lt;br/&gt;
VAR_IN_OUT with attribute VAR_IN_OUT_AS_POINTER: Objects are allowed to be transferred as references to visualizations. This can be useful in situations where information is to be transferred to a visualization without actually copying the information, or for updating information from outside, while the dialog is open.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have a function block defined in the interface of a visualization:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;VAR_IN_OUT&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nt"&gt;Meter&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;ELECTRIC_METER&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;p&gt;My visualizations work fine with this setup.  But I'm running out of memory.  For example, let's say I have 15 meters, they're all defined in a program somewhere, then each one has an interface in a tab control.  It seems to me that I'm running out of memory because each meter is now taking up twice the space (one for the program, and one in the visualization).&lt;/p&gt;
&lt;p&gt;So, I thought I'd use the attribute VAR_IN_OUT_AS_POINTER, which makes more sense to me, passing a reference to the function block instead of copying it.  &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;VAR_IN_OUT&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;attribute&lt;/span&gt; &lt;span class="err"&gt;'VAR_IN_OUT_AS_POINTER'&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="nt"&gt;Meter&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;ELECTRIC_METER&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;p&gt;Unfortunately that doesn't seem to work with frames or tab controls, only dialogs.  If I use it in a tab control or frame I get the error:  &amp;gt;&lt;strong&gt;Zitat:&lt;/strong&gt;&lt;br/&gt;
The interface of the referenced visualization does not match the current configuration. Please do an update of the frame references in the current visualization.&lt;/p&gt;
&lt;p&gt;Am I understanding this correctly?&lt;/p&gt;
&lt;p&gt;thanks&lt;/p&gt;
&lt;p&gt;Tim&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>