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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: Vergleichen von Strukturen

  1. #11
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Chräshe Beitrag anzeigen
    Mein Wunsch wäre gewesen, dass ich bei Änderungen in der Struktur, das restliche Programm nicht anfassen muss.
    Dein Programm soll erkennen ob sich der Aufbau der Struktur geändert hat? Das ist nicht möglich, das wäre auch mit MEMCMP nicht möglich.


    Zitat Zitat von Chräshe Beitrag anzeigen
    Von einem „modernen“ Werkzeug könnte man aber erwarten, dass es einem bei der Arbeit etwas unterstützt.
    Wenn SPS-Programmieren modern und einfach aussieht, dann traut sich auch jedermann die Programmierung zu. Siehe das häufige ST- und SCL-Gestümpere.

    Im übrigen sind SPS-Programme in der Regel so stabil, weil sie eben nicht versuchen, sich automatisch auf Änderungen der Laufzeitumgebung anzupassen. Fast alles was schon der Compiler berechnen kann, das sollte nicht zur Laufzeit berechnet werden. Außerdem haben SPS-Programme nur sehr begrenzt Rechenzeit zur Verfügung und müssen anders programmiert werden als ein Wald- und Wiesen-Programmierer denkt. Wenn man versucht "moderne" Methoden einzuführen, dann bekommt man auch die anderen modernen Softwareeffekte wie massig Bugs und Abstürze und hochfrequent nötige Updates.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  2. #12
    Avatar von Chräshe
    Chräshe ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.05.2008
    Beiträge
    648
    Danke
    117
    Erhielt 136 Danke für 105 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Dein Programm soll erkennen ob sich der Aufbau der Struktur geändert hat?
    Nein, ich will nur in einem Array of Struct den Inhalt von zwei Elementen miteinander vergleichen. Ich brauche nur die Information „gleich“ oder „ungleich“.

    Wenn ich, weil ich im Voraus nicht an alles gedacht habe, nachträglich diese Struktur ändere, weiß ich, dass ich die Änderung besser nicht online bei laufender Maschine aufspielen sollte, weil sich Datenbereich verschieben.

    Bei der aktuellen TwinCAT- Version wäre meines Wissens sogar ein Online-Chance von geänderten Strukturen möglich. Wenn es vermeidbar ist, lasse ich aber solche Experimente lieber sein.

  3. #13
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard

    Zitat Zitat von Chräshe Beitrag anzeigen
    Von einem „modernen“ Werkzeug könnte man aber erwarten, dass es einem bei der Arbeit etwas unterstützt.
    Bei diesem Wunsch würde ich generell von Siemens-Produkten abraten.
    Sind einfach nicht anwenderfreundlich.
    z. B. gibt es noch immer Editoren, die Probleme mit Standardfunktionen wie Ctrl+C / Ctrl+V haben.

    Zu deinem Problem:
    Wenn sich die Struktur ändert, wirst du so oder so auch dein restliches Programm anpassen müssen.
    Oder ändert sich deine Struktur ohne irgendeine Auswirkung auf dein Programm?

  4. #14
    Registriert seit
    06.10.2003
    Beiträge
    3.406
    Danke
    448
    Erhielt 502 Danke für 406 Beiträge

    Standard

    Hallo Chräshe,

    Zitat Zitat von sps-concept Beitrag anzeigen
    ... Wenn man die Struktur symbolisch an ANY anparametriert zieht es auch Änderungen in der Grösse der Struktur automatisch nach...
    das wäre der richtige Weg. Woran hapert es denn?


    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  5. #15
    Avatar von Chräshe
    Chräshe ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.05.2008
    Beiträge
    648
    Danke
    117
    Erhielt 136 Danke für 105 Beiträge

    Standard

    Zitat Zitat von Onkel Dagobert Beitrag anzeigen
    Woran hapert es denn?
    Hallo Onkel,

    es hapert daran, dass ich keine Funktion finde, der ich zwei ANY übergeben kann und die mir diese auf Ungleichheit überprüft. Das bringt mich gerade auf die Idee, dass ich mir was basteln könnte, was die übergebenen Daten byteweise vergleicht. Bei der ersten Ungleichheit kann abgebrochen und TRUE ausgegeben werden.

    Mal schauen, ob ich morgen das Gegenstück zur Funktion ADR und SIZEOF finde, oder es da die nächste Einschränkung gibt...

    Gruß
    Chräshe

  6. #16
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    SIZEOF bzw. alle Infos die Du brauchst findest Du im ANY. Du kannst auch Word-weise vergleichen, das ist schneller.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #17
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Achja, Du mußt Deine Struktur so aufbauen/deklarieren, daß sie keine unsichtbaren Padding-Bits oder Padding-Bytes enthält, weil eine Byteweise/Wordweise Vergleichsfunktion nicht nur die Struktur-Member vergleicht, sondern den gesamten von der Struktur belegten Speicherbereich. Es wäre fatal, wenn da evtl. uninitialisierter Speicher mit zufälligem Inhalt mit-verglichen würde.

    Vielleicht ist das auch der Grund, warum es eine solche fertige Vergleichsfunktion bei Siemens nicht gibt, weil es für jede Struktur bzw. jeden Datentyp eine eigene Vergleichsfunktion geben müsste. Ähnlich den überladenen Vergleichsoperatoren in anderen Programmiersprachen.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #18
    Avatar von Chräshe
    Chräshe ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.05.2008
    Beiträge
    648
    Danke
    117
    Erhielt 136 Danke für 105 Beiträge

    Standard

    Hab mir gerade das Thema Any-Zeiger für Datentypen von Volker angesehen. Wow – das kann heiter werden. Nicht umsonst habe ich bei Siemens einen Bogen um Pointer & Co gemacht.

    Irgendwie erinnert das an „Als die Bilder laufen lernten“!

  9. #19
    Registriert seit
    06.10.2003
    Beiträge
    3.406
    Danke
    448
    Erhielt 502 Danke für 406 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    .. weil es für jede Struktur bzw. jeden Datentyp eine eigene Vergleichsfunktion geben müsste..
    Aus diesem Grund ist es empfehlenswert, die Struktur symbolisch zu übergeben. Geht das bei einem STRUCT eigentlich anders? Bei symbolischer Übergabe wird immer im Datenformat "Byte" übergeben. Vor der Bearbeitung sollte man Das Datenformat sicherheitshalber noch einmal überprüfen.

    Ich gebe mal etwas Starthilfe, falls es recht ist. Nichts Fertiges, nur das "Drumherum". Das Beispiel ist aus einem ähnlichem Sachverhalt. Wichtig, so wie hier programmiert muss es eine Funktion sein, kein Funktionsbaustein!
    Code:
    VAR_INPUT
      DATENBEREICH : ANY ;    //Datenbereich der auf Änderungen überwacht werden soll
      FLANKENMERKER : ANY ;    //Flankenmerker für Überwachung Datenbereich
    END_VAR
    VAR_OUTPUT
      POS_IMP : BOOL ;    //pos. Flanke im Datenbereich gefunden
      NEG_IMP : BOOL ;    //neg. Flanke im Datenbereich gefunden
      ENTRY : BOOL ;    //statisch: mind. ein Eintrag ist im Datenbereich vorhanden
      ERROR : INT ;    //0-kein Fehler, 1-Typ 1 nicht Byte, 2-Typ 2 nicht Byte, 3-Bereiche verschieden groß
    END_VAR
    VAR_TEMP
      AR1_TEMP : DWORD ;    
      TEMP_INT : WORD ;    
      TEMP_DINT : DWORD ;    
      LOOP : INT ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
    //*** AR1 sichern
          TAR1  #AR1_TEMP; 
          SET   ; 
          SAVE  ; 
    
    //*** Ergebnisse initialisieren
          L     B#16#0; 
          T     #ERROR; 
          SET   ; 
          R     #POS_IMP; 
          R     #NEG_IMP; 
          R     #RET_VAL; 
          R     #ENTRY; 
    
    //*** AR2 auf Datenbereich
          L     P##DATENBEREICH; 
          LAR2  ; 
    
    //*** AR1 auf Flankenmerker
          L     P##FLANKENMERKER; 
          LAR1  ; 
    
    //*** Prüfe, ob DATENBEREICH vom Typ=Byte
          L     W [AR2,P#0.0]; // Typ 
          L     W#16#1002; 
          ==I   ; 
          L     1; // Fehler 1: DATENBEREICH nicht vom Typ Byte
          SPBN  ERR; 
    
    //*** Prüfe, ob FLANKENMERKER vom Typ=Byte
          L     W [AR1,P#0.0]; // Typ 
          L     W#16#1002; 
          ==I   ; 
          L     2; // Fehler 2: FLANKENMERKER nicht vom Typ Byte
          SPBN  ERR; 
    
    //*** Prüfe, ob Datenbereiche gleich groß
          L     W [AR2,P#2.0]; // Anzahl Typ im DATENBEREICH
          L     W [AR1,P#2.0]; // Anzahl Typ im FLANKENMERKER
          T     #LOOP; // Schleifenzähler initialisieren
          ==I   ; 
          L     3; // Fehler 3: Bereiche unterschiedlich groß
          SPBN  ERR; 
    
    //*** DB's öffnen und Adressregister auf Bereichszeiger
          L     W [AR2,P#4.0]; 
          T     #TEMP_INT; 
          AUF   DB [#TEMP_INT]; 
          L     D [AR2,P#6.0]; 
          LAR2  ; // DATENBEREICH
    
          L     W [AR1,P#4.0]; 
          T     #TEMP_INT; 
          AUF   DI [#TEMP_INT]; 
          L     D [AR1,P#6.0]; 
          LAR1  ; // FLANKENMERKER
    
    //*** Schleife für was auch immer
          L     #LOOP; 
    LOOP: T     #LOOP; 
                                    
             .=======================ooooooo
     ___   ,'    \_________________________________________
    /   /-/   dP  /                           ////////////  ''--..._
    \___\-\  dP   \  hier schreibst du        \\\\\\\\\\\\  __..--'
           `---------------------------------''''''''''''''
    
          +AR1  P#1.0; // Pointer erhöhen
          +AR2  P#1.0; // Pointer erhöhen
          L     #LOOP; 
          LOOP  LOOP; 
    
    //*** AR1-Register wiederherstellen
          LAR1  #AR1_TEMP; 
          BEA   ; 
    
    //*** Fehler
    ERR:  T     #ERROR; 
    
    //*** AR1-Register wiederherstellen
          LAR1  #AR1_TEMP; 
          BE    ; 
    
    END_FUNCTION
    Geändert von Onkel Dagobert (22.05.2015 um 22:45 Uhr) Grund: Spässschen
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  10. #20
    Registriert seit
    06.10.2003
    Beiträge
    3.406
    Danke
    448
    Erhielt 502 Danke für 406 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Chräshe, kommst du mit dem Beispiel klar?
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford
    Zitieren Zitieren Schweigen im Walde?  

Ähnliche Themen

  1. SCL indirekte Adressierung von Strukturen
    Von Anonymous im Forum Simatic
    Antworten: 24
    Letzter Beitrag: 10.02.2016, 19:10
  2. SFF von elektromechanische Bauteilen in einkanaligen Strukturen
    Von acoo im Forum Maschinensicherheit - Normen und Richtlinien
    Antworten: 2
    Letzter Beitrag: 10.02.2015, 11:16
  3. Step 7 Zwei Strukturen [Bool] vergleichen
    Von Hausen im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 22.01.2014, 21:53
  4. Strukturen Vergleichen in denen Arrays vorkommen
    Von SteffenD im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 31.07.2013, 09:18
  5. TwinCAT V2.11: Vergleichen von Strukturen
    Von Chräshe im Forum CODESYS und IEC61131
    Antworten: 8
    Letzter Beitrag: 10.08.2011, 15:28

Stichworte

Lesezeichen

Berechtigungen

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