<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to IOs in Klassen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/313685d12d/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/313685d12d/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Deutsch/thread/313685d12d/</id><updated>2020-02-27T23:47:06.858000Z</updated><subtitle>Recent posts to IOs in Klassen</subtitle><entry><title>IOs in Klassen</title><link href="https://forge.codesys.com/forge/talk/Deutsch/thread/313685d12d/?limit=25#bc3e" rel="alternate"/><published>2020-02-27T23:47:06.858000Z</published><updated>2020-02-27T23:47:06.858000Z</updated><author><name>elfrosch</name><uri>https://forge.codesys.com/u/elfrosch/</uri></author><id>https://forge.codesys.comab302ade086421bfbf78b0f1305b3f21d4cc1e0d</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hallo zusammen,&lt;/p&gt;
&lt;p&gt;ich hab mit der sufu nichts brauchbares gefunden und google war auch nicht mein Freund, darum trage ich mein Anliegen hier vor...&lt;/p&gt;
&lt;p&gt;Ich wollte zum spielen mal einen Zylinder implementieren&lt;/p&gt;
&lt;p&gt;also erstmal ein Interface:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;INTERFACE&lt;/span&gt; &lt;span class="n"&gt;ICylinder&lt;/span&gt;
&lt;span class="k"&gt;METHOD&lt;/span&gt; &lt;span class="n"&gt;move2Home&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ICylinder&lt;/span&gt;
&lt;span class="k"&gt;METHOD&lt;/span&gt; &lt;span class="n"&gt;move2WorkingPos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ICylinder&lt;/span&gt;
&lt;span class="k"&gt;METHOD&lt;/span&gt; &lt;span class="n"&gt;isInHomePos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;
&lt;span class="k"&gt;METHOD&lt;/span&gt; &lt;span class="n"&gt;isInWorkingPos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Nun kommt ein Zylinder mit 2 Ausgängen und 2 Eingängen:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="nv"&gt;Cylinder2Out2In&lt;/span&gt; &lt;span class="nv"&gt;IMPLEMENTS&lt;/span&gt; &lt;span class="nv"&gt;ICylinder&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
   &lt;span class="nv"&gt;DO_Cylinder2WorkingPos&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;BOOL&lt;/span&gt;&lt;span class="c1"&gt;; (* digital output for move cylinder to working position *)&lt;/span&gt;
   &lt;span class="nv"&gt;DO_Cylinder2HomePos&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;BOOL&lt;/span&gt;&lt;span class="c1"&gt;; (* digital output for move cylinder to home position *)&lt;/span&gt;
   &lt;span class="nv"&gt;DI_CylinderInHomePos&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;BOOL&lt;/span&gt;&lt;span class="c1"&gt;; (* digital input for cylinder is in home position *)&lt;/span&gt;
   &lt;span class="nv"&gt;DI_CylinderInWorkingPos&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;BOOL&lt;/span&gt;&lt;span class="c1"&gt;; (* digital input for cylinder is in working position *)&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;move2Home&lt;/span&gt;: &lt;span class="nv"&gt;ICylinder&lt;/span&gt;
   &lt;span class="nv"&gt;DO_Cylinder2WorkingPos&lt;/span&gt;&lt;span class="o"&gt;^&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;DO_Cylinder2HomePos&lt;/span&gt;&lt;span class="o"&gt;^&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;move2Home&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;move2WorkingPos&lt;/span&gt;: &lt;span class="nv"&gt;ICylinder&lt;/span&gt;
   &lt;span class="nv"&gt;DO_Cylinder2WorkingPos&lt;/span&gt;&lt;span class="o"&gt;^&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;DO_Cylinder2HomePos&lt;/span&gt;&lt;span class="o"&gt;^&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;move2Home&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;isInHomePos&lt;/span&gt;: &lt;span class="nv"&gt;BOOL&lt;/span&gt;
   &lt;span class="nv"&gt;isInHomePos&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;DI_CylinderInHomePos&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;DI_CylinderInWorkingPos&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="ss"&gt;)))&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;isInWorkingPos&lt;/span&gt;: &lt;span class="nv"&gt;BOOL&lt;/span&gt;
   &lt;span class="nv"&gt;isInHomePos&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;DI_CylinderInWorkingPos&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;DI_CylinderInHomePos&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="ss"&gt;)))&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;constructor&lt;/span&gt;: &lt;span class="nv"&gt;Cylinder2Out2In&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
   &lt;span class="nv"&gt;doCylinder2WorkingPos&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;BOOL&lt;/span&gt;&lt;span class="c1"&gt;; (* digital output for move cylinder to working position *)&lt;/span&gt;
   &lt;span class="nv"&gt;doCylinder2HomePos&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;BOOL&lt;/span&gt;&lt;span class="c1"&gt;; (* digital output for move cylinder to home position *)&lt;/span&gt;
   &lt;span class="nv"&gt;diCylinderInHomePos&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;BOOL&lt;/span&gt;&lt;span class="c1"&gt;; (* digital input for cylinder is in home position *)&lt;/span&gt;
   &lt;span class="nv"&gt;diCylinderInWorkingPos&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;BOOL&lt;/span&gt;&lt;span class="c1"&gt;; (* digital input for cylinder is in working position *)&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
   &lt;span class="nv"&gt;DO_Cylinder2WorkingPos&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;doCylinder2WorkingPos&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;DO_Cylinder2HomePos&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;doCylinder2HomePos&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;DI_CylinderInHomePos&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;diCylinderInHomePos&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;DI_CylinderInWorkingPos&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;diCylinderInWorkingPos&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;constructor&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;this&lt;/span&gt;&lt;span class="c1"&gt;;   &lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;so würde das Ganze in etwa aussehen, ich weiß es gibt keine Fehlerbehandlung und die getter für home und working pos sind auch nicht schön...&lt;br/&gt;
Mein Problem ist ich bekomme keine Bits in die Klasse, Booleans haben eine länge von 1 Byte... liegen nun meine Ausgänge auf QX1.0 und QX1.1 dann Funktioniert das nicht.&lt;br/&gt;
Nun könnte man sagen, abreite halt mit Byte und Bit Adressen:&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="n"&gt;OutByte&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DO_Cylinder2WorkingPos&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Aber das ist auch Lahm, nun hat sich 3S sicher was dabei gedacht uns Klassen und Interfaces zur Verfügung zu stellen, denn PLCs verarbeiten halt Hauptsächlich IOs.&lt;br/&gt;
POINTER TO BIT geht leider nicht, REFERENCE TO BIT geht auch nicht. Ist auch logisch die Adressen können vom Aufbau her auf nichts zeigen was kleiner wie ein Byte ist, Siemens kann dass, dafür sind Siemens Pointer für sonst nichts zu gebrauchen, da sie auf keine echten Bereiche im Speicher zeigen. &lt;/p&gt;
&lt;p&gt;Das ist der nächste Punkt, ich will eigentlich nicht mit Pointern Arbeiten sondern mit Referencen aber ich bekomme die Referencen via setter nicht initialisiert.&lt;/p&gt;
&lt;p&gt;Ich habe mich gefreut über die Interfaces, weil wir so Polymorphie in die Steuerungen bekommen, aber ich brauche IOs.&lt;/p&gt;
&lt;p&gt;Ich bin dankbar für Hints und Lösungen, Flames bitte an  e &lt;a class="" href="mailto:flames@trashmail.com"&gt;flames@trashmail.com&lt;/a&gt; e &lt;/p&gt;
&lt;p&gt;Viele Grüße&lt;/p&gt;
&lt;p&gt;elfrosch&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>