<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to DUT (Struct) Property in einem FB Änderungen abfangen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/e0362a1121/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/e0362a1121/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Deutsch/thread/e0362a1121/</id><updated>2023-03-14T23:05:09.344000Z</updated><subtitle>Recent posts to DUT (Struct) Property in einem FB Änderungen abfangen</subtitle><entry><title>DUT (Struct) Property in einem FB Änderungen abfangen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/e0362a1121/?limit=25#90b9/def1" rel="alternate"/><published>2023-03-14T23:05:09.344000Z</published><updated>2023-03-14T23:05:09.344000Z</updated><author><name>paho</name><uri>https://forge.codesys.com/u/paho/</uri></author><id>https://forge.codesys.com9bb6b8e89097dc174c4ed4a63cc942b452a3cb16</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi,&lt;br/&gt;
ja genau so mache ich das im Moment. Dachte mir aber, vielleicht gibt es noch elegantere Lösungen (wie eben bei Properties Get/Set). Auch wenn dieses Beispiel nicht wirklich komplex ist, habe ich Strukturen mit weit über 100 Variablen (diverse Datentypen).&lt;/p&gt;
&lt;p&gt;Meine Hardware (Linux IPC mit Codesys Runtime) packt das locker, aber ich habe immer zwei komplette Strukturen im Speicher (alt und aktuell) um vergleichen zu können. Vom Aufwand aber eh total überschaubar.&lt;/p&gt;
&lt;p&gt;Danke trotzdem für die Hilfe!&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>DUT (Struct) Property in einem FB Änderungen abfangen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/e0362a1121/?limit=250#90b9" rel="alternate"/><published>2023-03-14T09:42:35.408000Z</published><updated>2023-03-14T09:42:35.408000Z</updated><author><name>dkugler</name><uri>https://forge.codesys.com/u/dkugler/</uri></author><id>https://forge.codesys.comebee616638034b45f59301ed18d89937629ac712</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;holst dir als pointer die Startadresse der jeweiligen struct und machst einen Speichervergleich über die Größe der struct.&lt;br/&gt;
Stresst die Steuerung minimalst, da extrem hardwarenah.&lt;br/&gt;
VAR&lt;br/&gt;
    pstruct1: POINTER TO BYTE;&lt;br/&gt;
    pstruct2: POINTER TO BYTE;&lt;br/&gt;
    xValuesChanged: BOOL;&lt;br/&gt;
END_VAR&lt;/p&gt;
&lt;p&gt;pstruct1 := ADR(struct1);&lt;br/&gt;
pstruct2 := ADR(struct2);&lt;/p&gt;
&lt;p&gt;xValuesChanged := DINT_TO_BOOL(sysmemcmp(pstruct1,pstruct2, SIZEOF(struct1))&lt;/p&gt;
&lt;p&gt;So lösche ich z.b. auch ganze Arrays oder Arrays of STRUCT ab: Startadresse ermitteln und dann SysMemSet... über den Speicherbereich!&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>DUT (Struct) Property in einem FB Änderungen abfangen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/e0362a1121/?limit=25#7c64" rel="alternate"/><published>2023-03-13T22:23:05.038000Z</published><updated>2023-03-13T22:23:05.038000Z</updated><author><name>paho</name><uri>https://forge.codesys.com/u/paho/</uri></author><id>https://forge.codesys.com368d981b0729aa7d36edf4eae1b40160babc61ef</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hallo,&lt;/p&gt;
&lt;p&gt;ich wende mich mit der doch nicht so trivialen Frage an euch: wie fange ich am besten Änderungen an Variablen von einer Struktur in einem Funktionsblock ab?&lt;/p&gt;
&lt;p&gt;Beispiel DUT:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;TYPE DUT_Test :&lt;/span&gt;
&lt;span class="err"&gt;    STRUCT&lt;/span&gt;
&lt;span class="err"&gt;        index: INT := -1;&lt;/span&gt;
&lt;span class="err"&gt;        interval: INT := 10;&lt;/span&gt;
&lt;span class="err"&gt;        state: INT := 0;&lt;/span&gt;
&lt;span class="err"&gt;        enable: BOOL := FALSE;&lt;/span&gt;
&lt;span class="err"&gt;    END_STRUCT&lt;/span&gt;
&lt;span class="err"&gt;END_TYPE&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Beispiel FB:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="nt"&gt;TestFb&lt;/span&gt;
&lt;span class="nt"&gt;VAR_INPUT&lt;/span&gt;
    &lt;span class="nt"&gt;CFG&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;DUT_Test&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;VAR_OUTPUT&lt;/span&gt;
    &lt;span class="nt"&gt;OUT_RUN&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;BOOL&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;IF&lt;/span&gt; &lt;span class="nt"&gt;CFG&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;THEN&lt;/span&gt;
    &lt;span class="nt"&gt;IF&lt;/span&gt; &lt;span class="nt"&gt;state&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt; &lt;span class="nt"&gt;AND&lt;/span&gt; &lt;span class="nt"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; &lt;span class="nt"&gt;THEN&lt;/span&gt;
        &lt;span class="nt"&gt;OUT_RUN&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;TRUE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nt"&gt;ELSE&lt;/span&gt;
        &lt;span class="nt"&gt;OUT_RUN&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;FALSE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nt"&gt;END_IF&lt;/span&gt;
&lt;span class="nt"&gt;ELSE&lt;/span&gt;
    &lt;span class="nt"&gt;OUT_RUN&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;FALSE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;END_IF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Beispiel PRG:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;PROGRAM&lt;/span&gt; &lt;span class="nt"&gt;Test&lt;/span&gt;
&lt;span class="nt"&gt;VAR&lt;/span&gt;
    &lt;span class="nt"&gt;xTest&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;TestFb&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;xTest&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;OUT_RUN&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;DO01&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Die CFG-Struktur der xTest-Instanz ist in der Symbolkonfiguration für einen OPC-UA Zugriff freigegeben (R+W).&lt;br/&gt;
Wie kann ich nun auf Veränderungen der CFG-Struktur reagieren, wenn z.B. über OPC-UA die Variablen geändert werden?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;xTest.CFG.enable:=1;&lt;/span&gt;
&lt;span class="err"&gt;xTest.CFG.index:=1;&lt;/span&gt;
&lt;span class="err"&gt;xTest.CFG.state:=1;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Bei wenigen Variablen würde der Weg mittels Eigenschaften (Getter/Setter) funktionieren, aber ich habe auch sehr komplexe DUTs und suche nach einer einfachen Lösung :)&lt;/p&gt;
&lt;p&gt;Grundsätzlich brauche ich diese Funktion nicht für jede Variable, sondern nur ob sich eine Variable in der CFG-Struktur geändert hat, um dann eine Funktion zu starten (abspeichern eines Rezeptes mit den aktuellen Konfigurationswerten). &lt;br/&gt;
Die CFG-Struktur enthält immer alle Konfigurationsparameter für diesen FB, welche immer nach jeder Änderung, Up-to-date mit dem "Runtime-Rezept" sein müssen.&lt;/p&gt;
&lt;p&gt;Danke schon mal für die Hilfe,&lt;br/&gt;
LG, PAHO&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>