Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 32

Thema: Baustein mit INOUT oder Baustein mit Interface?????

  1. #11
    Registriert seit
    24.02.2009
    Beiträge
    1.246
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Interfaces lohnen sich vorallem dann wenn man Bausteine / Klassen mit gleichen Eigenschaften und oder Methoden verwendet, die aber ansonsten einen unterschiedlichen Unterbau haben.
    Gerade Antriebsbausteine sind da ein Paradebeispiel für. Die Funktionen sind idR. gleich (Links-/Rechtlauf, Stop, Vsoll etc.) aber die Ansteuerung variiert von Hersteller zu Hersteller.

    Das Larry meint, dass er in .net keine Interfaces nutzt, zeigt wie gut man damit arbeiten kann ohne sich Gedanken darüber zu machen. So ziehmlich alle Klassen die im Framework enthalten sind, haben min. ein Interface implementiert. Und wenn es nur IDisposable oder im Falle von Collections IEnumerable ist.
    Sänd from mei Kombjudder mitse Dastadurr.

  2. #12
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.840
    Danke
    400
    Erhielt 2.427 Danke für 2.023 Beiträge

    Standard

    ... das heißt auch nicht, dass ich die .Net-Interfaces nicht selbst schon mit eingebunden habe - ich habe nur noch keinen Ansatz gefunden, wo es wichtig (für mich) gewesen wäre, Eigene zu erstellen ...

  3. #13
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Finde es halt grade im Bereich, wo man Daten auch in einer Visu darstellen will "einfacher" oder "sinnvoller" direkt eine Struktur zu erstellen und an den FB zu übergeben, als dann nochmals die Eigenschaften eines Interfaces an Visu Variablen zu übergeben.

  4. #14
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard

    Zitat Zitat von SY50 Beitrag anzeigen
    Finde es halt grade im Bereich, wo man Daten auch in einer Visu darstellen will "einfacher" oder "sinnvoller" direkt eine Struktur zu erstellen und an den FB zu übergeben, als dann nochmals die Eigenschaften eines Interfaces an Visu Variablen zu übergeben.
    Ich denke, man sollte einmal klar stellen, worüber man reden möchte. Ich gebe mal meine etwas verkürzte Vorstellung der beiden Begriffe hier.

    Interface: Ein Interface beschreibt abstrakt eine Menge von Methoden und deren Aufrufumgebung. Es enthält keine Informationen, wie innerhalb der Methoden konkret gearbeitet wird. Also keine Implementation von irgendwelchen Funktionalitäten.

    Interfaces dienen dazu, verschiedene vergleichbare aber unterschiedlich gelöste Aufgaben unter einen Hut zu bringen, damit man sie von einer höheren Ebene mit der gleichen Strategie ansprechen kann.

    Structuren: In Structuren fasst man Variablen gleichen oder unterschiedlichen Typs zusammen, um sie gebündelt bearbeiten zu können. Structuren sind selbst definierte Datentypen und können selber wieder Structuren enthalten.

    Auf verschiedenen Ebenen werden Structuren entweder als ganzes gesehen oder aufgedröselt in die einzelnen Elemente bearbeitet.

    Structuren werden also dazu verwendet, um auf einer höheren Ebene zusammengehörige Einzeldaten zusammenzufassen, eben zu strukturieren.

    Deshalb aus meiner Sicht erübrigt sich die Frage von SY50: er braucht keine Interfaces im Moment sollte aber seine Daten auf der höheren Programmier Ebene übersichtlich in Structuren zusammenfassen.

    N.B. Da vorher einmal gepostet wurde, dass die Adressberechnung für die Structurelemente aufwendig ist, das erledigt im Prinzip zum grossen Teuil der Compiler, der weiss, an welcher Adresse der Startpunkt der Structur liegt und muss dann lediglich noch den Offset zum Punkt hinzuaddieren, an dem dann innerhalb der Structur das gewünschte Element liegt.

    In der Regel müsste das im Maschinencode so aussehen: Lade Adressregister, Addiere Offset und fertig ist es, das ist keine Aufblähung vom Code.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Verständnisfrage  

  5. #15
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke für die Ausführungen.
    Denke die Frage ist damit geklärt

  6. #16
    Registriert seit
    29.03.2004
    Beiträge
    5.860
    Danke
    144
    Erhielt 1.721 Danke für 1.250 Beiträge

    Standard

    Da muss man als alter Siemensianer auch umdenken, denn alles was auf einer S7 extrem langsam und speicherfressend abläuft, ist auf allen anderen (heutzutage üblichen) Prozessoren gerade schnell und speichersparend, wie eben die Parameterübergabe über Zeiger.

  7. #17
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.495
    Danke
    933
    Erhielt 3.377 Danke für 2.731 Beiträge

    Standard

    Zitat Zitat von RobiHerb Beitrag anzeigen
    N.B. Da vorher einmal gepostet wurde, dass die Adressberechnung für die Structurelemente aufwendig ist, das erledigt im Prinzip zum grossen Teuil der Compiler, der weiss, an welcher Adresse der Startpunkt der Structur liegt
    Bei Übergabe per Referenz: Der Compiler kann nicht wissen, an welcher Adresse die zur Laufzeit übergebene Struktur liegt. Er muß zunächst die Adresse aus dem Übergabeparameter lesen und kann erst danach auf die Struktur zugreifen. Das sollte doch wenigstens "ein klein wenig" aufwendiger sein als direkt auf die an bekannter Adresse liegende Struktur zuzugreifen.
    Weiß denn jemand sicher, wieviel aufwendiger oder weniger aufwendig diese Parameterübergabe per Zeiger ist? Wäre ja mal interessant die Programmgrößen und Ausführungszeiten zu vergleichen, z.B. eine Struktur von 20 REAL an eine Funktion oder eine Funktionsbaustein-Instanz übergeben und die Summe der 20 Werte zurückgeben. Mal als Struct an IN und mal an INOUT.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #18
    Registriert seit
    24.02.2009
    Beiträge
    1.246
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Eine INOUT Variable kann aber nicht zur Laufzeit dynamisch verknpüft werden. D.h. der Compiler kennt schon die Addresse der Variablen / Struktur.
    Ansonsten muss man Pointer verwenden, und da hängt es halt vom ADR Befehl ab (oder was halt immer benutzt wird um die Startaddresse zu holen). Die restlichen Offsets sind ja dann wieder im Pointer-Typ enthalten.
    Einzig beim Any-Datentyp könnte ich mir vorstellen, das da einiges zu rechnen ist. Aber ich bin mir nichtmal sicher ober der Überhaupt von CodeSys oder TwinCAT unterstützt wird (TC3 kennt den Any-Type glaube ich).
    Sänd from mei Kombjudder mitse Dastadurr.

  9. #19
    Registriert seit
    29.03.2004
    Beiträge
    5.860
    Danke
    144
    Erhielt 1.721 Danke für 1.250 Beiträge

    Standard

    Bei x86 oder besser aktuell IA-32 macht es keinen Sinn mehr die Zyklen zu zählen, weil die Geschwindigkeit zusätzlich von diversen anderen Faktoren abhängt.

    Bei Übergabe eines Zeigers auf eine Struktur, wird in der Funktion nur einmalig ein Register wie ebx mit der Adresse geladen, und die folgenden Anweisungen laufen dann über sowas wie MOV eax, word ptr [ebx+0]. Bei Intel schimpft sich das dann Micro-Fusion, wo mehrere einzelne Anweisungen zu einer kombiniert werden. Zumindest schafft der Prozesser dann trotzdem 4 oder 5 Anweisungen pro Zyklus zu bearbeiten. Ich würde darum mal annehmen, dass es trotz kompliziert aussender Operation in einem Zyklus verarbeitet wird.

    Wenn die ganzen Werte einer Struktur als einzelne Parameter übergeben würden, müssten diese bei Funktionsaufruf auch einzeln auf den Stack gepusht werden. Ich glaube nicht dass das performanter ist. Die Prozessoren sind auf die Sprache C ausgelegt, und da ist eine Übergabe einer Struktur per Zeiger Standard, d.h. alles ist darauf optimiert.

  10. #20
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.495
    Danke
    933
    Erhielt 3.377 Danke für 2.731 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von MasterOhh Beitrag anzeigen
    Eine INOUT Variable kann aber nicht zur Laufzeit dynamisch verknpüft werden. D.h. der Compiler kennt schon die Addresse der Variablen / Struktur.
    Das betrifft die äußere Beschaltung - da weiß der Compiler, welche Adresse in den INOUT geschrieben wird. Doch wie ist das mit der Entgegennahme des Zeigers in einer Instanz eines Funktionsbausteines? Wie kann der Compiler die an der FB-Instanz außen angelegte Adresse berücksichtigen? Oder wenn die FB-Instanz oder eine Function mehrmals aufgerufen wird, wie kann in dem Baustein die Adresse schon zur Compilierzeit bekannt sein?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Schützüberwachung mit Baustein SF_EDM
    Von bernd81 im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 27.09.2013, 13:36
  2. Baustein mit IN & OUT Paramtern, oder INOUT`erstellen?
    Von Bensen83 im Forum CODESYS und IEC61131
    Antworten: 13
    Letzter Beitrag: 23.11.2012, 13:08
  3. Codeübergabe am FB Baustein mit SCL
    Von Blackforest im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 02.01.2009, 17:57
  4. Baustein mit SCL programmieren
    Von mr_spooner im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 20.11.2008, 09:19
  5. Zählerfunktion mit einem DB Baustein
    Von Irocke im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 31.01.2008, 15:03

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •