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

Ergebnis 1 bis 10 von 10

Thema: Pointer Beckhoff Übersetzung

  1. #1
    Registriert seit
    19.03.2015
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo habe ein Problem ein Progamm von Beckhoff (ST) in Step7(SCL) zu übersetzen.

    Speziell wenn es um Pointer geht.
    Ein Codeausschnitt von Beckhoff sieht zB folgendermaßen aus:

    Code:
    FUNCTION FCxxx : STRING(80)
     VAR_INPUT     
         pStringInput: POINTER TO STRING(10000); 
    END_VAR 
    VAR
         ppStringVar : POINTER TO BYTE; 
    END_VAR
    
       ppStringVar := ADR(pStringInput^);  
    
    ... 
    FCxxx := '';  
    END_FUNCTION
    Wie kann man das in SCL umssetzen.

    Hoffe mir kann da jemand auf die Sprünge helfen.
    Zitieren Zitieren Pointer Beckhoff Übersetzung  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von danny_v1 Beitrag anzeigen
    Wie kann man das in SCL umssetzen.
    Gar nicht.
    - es gibt keine Pointer-Variablen
    - es gibt keine ADR-Operatoren und keine Pointer-Dereferenzierung
    - es gibt keine STRING(10000)

    Man kann höchstens höchst aufwändig etwas mit ANY-Pointern basteln, doch da geht die ganze Datentyp-Kontrolle verloren und es gibt bestimmt einfachere Lösungen.
    Da mußt Du Dir einen anderen Algorithmus einfallen lassen, der das gleiche Ergebnis wie der Beckhoff-Code liefert.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    danny_v1 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.03.2015
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke für die schnelle, aber ernüchternde Antwort.

    Gut anstatt STRING(10000) könnte man auch ein ARRAY[0..10000] OF CHAR verwenden.

    Wie könnte denn der Algorithmus aussehen. Könnte ja auch ein Baustein in AWL sein der dann das gewünschte Ergebnis liefert.

  4. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Was macht denn der Beckhoff-Baustein??

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    danny_v1 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.03.2015
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Das ist ein Teil einer Funktion, welche String Befehle einer externen Schnittstelle auswertet und prüft ob ein glültiger Befehl angekommen ist.

    Ich kann leider nicht viel größere Codeteile posten.

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Die Frage ist, brauchst du wirklich unbedingt 1000 Byte.
    Für Strings (max. 255 Byte bei S7), gibt es recht gute Funktionen in der Standard-Library von Siemens. (find, concat, mid, usw.)
    Evtl. könnte man den Input in mehrere Strings aufteilen.
    Wenn nicht:
    Hast du ein Array, ist die Frage, nach was ist im Array zu suchen, gibt es eine festgelegte Syntax, gibt es Texttrenner zwischen Befehlen etc.
    Ist das so, könnte man zuerst das Array nach dem ersten Buchstaben eines Befehls durchsuchen, hat man einen gefunden, nimmt man den 2., 3. usw. Buchstaben und vergleicht den mit der zu suchenden Befehlsfolge.
    Aber genaues kann man erst sagen, wenn man mehr weiß.
    So eine ähnliche (rel. einfache) Suchroutine hatten wir hier schon einmal, aber das ist locker 8-9 Jahre her und ob ich das noch finde???
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. #7
    danny_v1 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.03.2015
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    In mehrere Strings aufteilen ist wieder so eine Sache, da hat man ja wieder für jeden String einen Header.
    Die Befehle haben Trennzeichen, dadurch sollte das mit dem Array of Char eigentlich schon funktionieren. Und da eine Suchfunktion zu bauen sollte nicht das große Problem darstellen.
    Die Sache mit den Pointer stellt erstmal noch das größere Problem dar.

  8. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Um auf die einzelnen Elemente (Zeichen) eines Array of Char zuzugreifen braucht man keine Pointer. Man kann die Elemente auch indiziert ansprechen. Pointer sieht vielleicht intelligenter aus, indizierter Zugriff wird andererseits von jedem Programmierer "sofort" verstanden.

    Eine Pointer-Lösung für Zugriff auf ein Array kann man in eine Index-Lösung umformen und umgekehrt. Bei Index-Lösungen kann der Compiler überwachen, daß nicht auf Speicher außerhalb des Arrays zugegriffen wird. Bei Pointer-Lösungen kommt die Notbremse erst zur Laufzeit, wenn schon quer durch fremden Speicher gelesen/geschrieben wurde bis endlich auf eine nicht vorhandene oder unzulässige Adresse zugegriffen wird.

    Wenn Du etwas mehr von dem Code zeigen würdest, dann könnte man konkreter antworten. Hier mal ein allgemeines Beispiel:

    Mit Pointer (funktioniert Hardware-abhängig, in SCL nicht möglich):
    Code:
    ppCharBuf := ADR(inputCharBuffer^);
    FOR index := 0 TO 999 DO
      IF ppCharBuf^ = 'A' THEN  //Zeichen 'A' gefunden
        ... ;
      END_IF;
      ppCharBuf := ppCharBuf + 1;  //Pointer auf nächstes Array-Element setzen
    END_FOR;
    Ohne Pointer (funktioniert in jedem ST und SCL):
    Code:
    FOR index := 0 TO 999 DO
      IF inputCharBuffer[index] = 'A' THEN  //Zeichen 'A' gefunden
        ... ;
      END_IF;
    END_FOR;
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Ulfhildr (11.05.2016)

  10. #9
    danny_v1 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.03.2015
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vielen Dank für das Beispiel, hab es jetzt auch erstmal so umgesetzt

    Code:
    FUNCTION FINDCHAR: VOID
    
    VAR_INPUT
        ENABLE          : BOOL;
        IN_ARRAY        : ARRAY [0..999]OF CHAR;
        IN_FIND         : ARRAY [0..79] OF CHAR;
        IN_FIND_ENDCHAR : CHAR;
    END_VAR
    
    VAR
        INDEX_IN_ARRAY  : INT;
        INDEX_IN_FIND   : INT;
        
    END_VAR
    
    VAR_OUTPUT
      POSITION        : INT;
    END_VAR
      
    
    BEGIN
    
            FOR INDEX_IN_ARRAY:= 0 TO 999 DO
                 IF INDEX_IN_FIND< 80 THEN
                    
                    IF IN_FIND[INDEX_IN_FIND]=IN_FIND_ENDCHAR THEN
                        POSITION:=POSITION;
                        EXIT;
                    END_IF;
                         
                      IF IN_ARRAY[INDEX_IN_ARRAY] = IN_FIND[INDEX_IN_FIND] THEN
                            
                            IF POSITION=0 THEN
                                POSITION:=INDEX_IN_ARRAY+1;
                            END_IF;
    
                            INDEX_IN_FIND:=INDEX_IN_FIND+1;
                      
                      ELSIF IN_ARRAY[INDEX_IN_ARRAY] <> IN_FIND[INDEX_IN_FIND] THEN
                          POSITION:=0;
                          IF INDEX_IN_FIND>0 THEN
                            INDEX_IN_FIND:=0;
                          END_IF;
                      END_IF;
                        
                  END_IF;  
            END_FOR;
    
    IF ENABLE=TRUE THEN
        INDEX_IN_ARRAY:=0;
        INDEX_IN_FIND:=0;
    END_IF;
    END_FUNCTION
    Es funktioniert so auch erstmal ganz gut

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von danny_v1 Beitrag anzeigen
    Es funktioniert so auch erstmal ganz gut
    Das täuscht gewaltig.

    Was mir auf die Schnelle auffällt:
    • VAR in FUNCTION ist VAR_TEMP! Du liest INDEX_IN_FIND ohne vorher was reinzuschreiben - der Inhalt ist unbestimmt, quasi zufällig
    • OUTPUT rücklesen ist Pfui. OUTPUT mehrmals beschreiben ist ganz großes Pfui. Das kann in Multitasking-Prozessen oder in Verbindung mit HMI Probleme machen.
      Benutze für POSITION eine TEMP-Variable und kopiere erst am Ende auf den OUTPUT
    • was soll so eine Operation: "POSITION:=POSITION;" ?
    • realisiere die FUNCTION besser als FUNCTION_BLOCK und übergebe die Arrays an IN_OUT --> das übergibt nur einen Pointer auf die Arrays anstatt die Arrays zu kopieren (außer S7-1200/1500, da kenne ich mich nicht so aus, da könnte es sein, daß trotzdem eine Kopie des Arrays übergeben wird)


    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. Sonstiges S5->S7 Übersetzung
    Von denero im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 17.09.2015, 08:00
  2. Beckhoff Zusammenhang ADR BITADR Pointer etc
    Von pezi179 im Forum CODESYS und IEC61131
    Antworten: 10
    Letzter Beitrag: 02.02.2015, 18:34
  3. WinCC Facplate Übersetzung
    Von joergel im Forum HMI
    Antworten: 0
    Letzter Beitrag: 16.01.2015, 11:52
  4. SCL Übersetzung
    Von qpec_hagen im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 22.05.2012, 13:31
  5. Übersetzung stoßfrei
    Von Kniffo im Forum Stammtisch
    Antworten: 23
    Letzter Beitrag: 19.10.2007, 13:49

Stichworte

Lesezeichen

Berechtigungen

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