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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Nochmals umwandlung von MC7 Code in Calls...

  1. #1
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich bin jetzt in meiner Bibliothek nochmals dran UC in Calls umzuwandeln.

    Jezd ist das ganze bei den FBs schon etwas komplizierter und schlägt mit meiner bisherigen Methode öfters Fehl.

    Code:
          BLD   3
          =     L23.0
          TDB   
          L     DBW[AR2,P#0.0]
          T     LW24
          AUF   DI[LW24]
          TAR2  LD19
          L     DBW[AR2,P#2.0]
          T     DIW10
          CLR   
          =     DIX12.1
          CLR   
          =     DIX12.2
          SET   
          =     DIX12.3
          U     DBX[AR2,P#20.1]
          =     DIX12.4
          U     DBX[AR2,P#21.1]
          =     DIX12.5
          L     #h.Bits[1]
          T     DIW16
    
    
          L     #h.Bits[2]
          T     DIW18
          L     0
          T     DIW20
          L     P#V 4.0
          T     DID22
          L     0
          T     DIW26
          L     P#V 0.0
          T     DID28
          UC    "blabla"
          L     DIW16
          T     #h.Bits[1]
          L     DIW18
          T     #h.Bits[2]
          TDB   
          BLD   4
    Jetzt muss z.B. aus diesem Code ausgelesen werden, das der aktuelle DI in DB umgespeichert wird, über " L DBW[AR2,P#0.0]" indirekt der erste Parameter ausgelesen wird. Dieser wird in ein Lokalwort gespeichert und das dann als DI geöffnet.

    D.h. der erste an den FB übergebene Parameter ist der DI für diesen Call.

    Nun hatte ich mir gedacht einen Parser für jede Zeile ab dem BLD bis zum UC zu bauen, und immer die aktuellen werte der Register zu speichern. z.b.

    Register DI = DI
    Register DB = ""
    dann kommt TDB
    Register DI = ""
    Register DB = DI
    dann kommt
    L DBW[AR2,P#0.0]
    d.h.
    Akku1 = DBW[AR2,P#0.0] da aber in DB Register DI steht muss ich in die Parameter des DI schauen...

    oder hat jemand andere gute Ideen das zu lösen?
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren Nochmals umwandlung von MC7 Code in Calls...  

  2. #2
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    Ich hab mir deinen http://www.sps-forum.de/showthread.p...-Code-erzeugen... Post angeschaut und ich denke du solltest das ein wenig mehr abstrahieren - wenn ich das richtig verstehe machst du die Fluss und Befehlsanalyse alles irgendwie zusammen - das macht es nicht wirklich leichter/stabiler weil du viel Code dafür brauchst

    ich würde aus dem ganzen AWL-Code erst mal einen AST machen (oder hast du den schon?), und dann vielleicht darauf einen Control und Data-Flow Graphen setzen - dann weisst du was was ist, an wem es hängt, und welche Daten da rumfließen
    das vereinfacht deinen Code schon mal weil Konvertierungen und Detailbeurteilungen kleiner Ausfallen - leichter ist das ganze aber nur am Ende - der Anfang macht sicher keinen Spass

    btw: hat mal eine darüber nachgedacht einen LLVM AWL(eher SCL)->MC7 Kompiler zu bauen - oder wir der fehlende Stack ein Abbildungsproblem in LLVM?
    Geändert von LowLevelMahn (10.01.2013 um 12:33 Uhr)
    Zitieren Zitieren wie wärs mit einem Control/Data Flow Graph?  

  3. #3
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Flussanalyse brauch Ich ja nicht wirklich zu machen, Sprünge oder ähnliches kommen ja nicht vor!

    AWL in MC7 muss ja nicht wirklich compiliert werden, da der AWL Code ja 1=1 dem MC7 Code entspricht (außer bei den Calls) von daher wäre der Compiler für AWL unnötig.
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  4. #4
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    Flussanalyse brauch Ich ja nicht wirklich zu machen
    ich meinte auch Datenfluss-Analyse - also wo geht was hin

  5. #5
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    Hallo,
    ich bin zur Zeit dran einen SCL Decompiler zu schreiben. Da habe ich genauso wie von Jochen vorgeschlagen eine Analyse der Registerinhalte pro Anweisung drin, denke mal das ist der richtige Weg.
    Die Zurückübersetzung von Funktionsaufrufen lasse ich mir aber bis zum Schluss übrig, das wird nämlich ziemlich noch ein gutes Stück Arbeit.

    Bei einem MC7 nach AWL Übersetzer ist bis auf das Problem bei den Aufrufmakros meiner Meinung nach keine großartige Abstraktionsebene notwendig. Das Decompilieren beschränkt sich ja auf die Anweisungen zwischen den entsprechenden BLD Anweisungen. Und sind diese nicht wohlgeformt so streikt der Step7 Editor ebenfalls und zeigt dann MC7 an.

    Mein Decompiler hat hingegen mehrere Zwischenebenen, so ganz grob:
    1. Einlesen, Registerverfolgung, aus AWL die grundlegende Statements in Form eines AST bilden
    2. Basic Blocks finden
    3. Kontrollflussanalyse, Schleifenerkennung
    4. Umstrukturierung und auflösen von Gotos

  6. #6
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.493
    Danke
    1.142
    Erhielt 1.243 Danke für 974 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    ich bin zur Zeit dran einen SCL Decompiler zu schreiben.
    Fingerübung oder hast du dafür einen praktischen Einsatzzweck?

    Gruß
    Dieter

  7. #7
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    Zitat Zitat von Blockmove Beitrag anzeigen
    Fingerübung oder hast du dafür einen praktischen Einsatzzweck?
    Beweislastumkehr falls Siemens mal wieder zickt Das Programm malt auch schöne Grafiken der Kontrollstrukturen (s. Anhang).

    Ansonsten mehr oder weniger nur weil mich das interessiert, und hatte mitte letzten Jahres etwas Zeit mich da einzulesen.
    Einen rudimentären SCL Compiler habe ich mit Coco/R als Parser Generator mal programmiert, der kann aber wirklich nur die elementaren Anweisungen.
    Angehängte Grafiken Angehängte Grafiken

  8. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Blockmove (11.01.2013)

  9. #8
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Beweislastumkehr falls Siemens mal wieder zickt Das Programm malt auch schöne Grafiken der Kontrollstrukturen (s. Anhang).

    Ansonsten mehr oder weniger nur weil mich das interessiert, und hatte mitte letzten Jahres etwas Zeit mich da einzulesen.
    Einen rudimentären SCL Compiler habe ich mit Coco/R als Parser Generator mal programmiert, der kann aber wirklich nur die elementaren Anweisungen.
    Wenn dus später als Open Source veröffentlichst, kann Ichs ja vielleicht in meine ToolBox einbauen
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  10. Folgender Benutzer sagt Danke zu Jochen Kühner für den nützlichen Beitrag:

    gravieren (12.01.2013)

  11. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    Mit der Registerverfolgung habe ich das beim Einlesen so in der Art gelöst.
    Schnippsel:
    Code:
    if (instr.op == "U" or instr.op == "O" or instr.op == "X" or
    	instr.op == "UN" or instr.op == "ON" or instr.op == "XN"):
    	if not er_instr_flag:
    		left = Identifier(instr.address, instr.arg)
    	else:
    		right = Identifier(instr.address, instr.arg)
    		left = BinExpr(instr.address, left, instr.op, right)
    		er_instr_flag = True
    elif instr.op == "SET":
    	er_instr_flag = False
    	left = Identifier(instr.address, "TRUE")
    elif instr.op == "TAK":
    	helpvar = akku1
    	akku1 = akku2
    	akku2 = helpvar
    elif instr.op == "L":
    	akku2 = akku1
    	akku1 = Identifier(instr.address, instr.arg)	
    elif instr.op == "T":
    	arg = Identifier(instr.address, instr.arg)
    	assign = Assign(instr.address, arg, akku1)
    	ast.append(assign)
    Eleganter wäre es wohl für jede Operation eine eigene Klasse anzulegen, die eine Methode bekommt in der die Verarbeitung der Register hinterlegt wird.

  12. #10
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Wenn dus später als Open Source veröffentlichst, kann Ichs ja vielleicht in meine ToolBox einbauen
    Ist momentan noch in Python geschrieben.
    Aber da ich ganz ohne GUI wohl nicht auskomme werde ich es evtl. nochmal nach C# umschreiben.
    Z.B. gibt es einige Dinge für die ein manueller Eingriff notwendig wird weil sich diese nicht mehr automatisch zurückübersetzen lassen (AT-Sichten, Switch/Case).

  13. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    gravieren (12.01.2013)

Ähnliche Themen

  1. MC7-Code in AWL umzuwandeln
    Von SPS_PC im Forum Hochsprachen - OPC
    Antworten: 70
    Letzter Beitrag: 24.12.2015, 17:22
  2. Umwandlung von DI in I
    Von Blueglasstalisman im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 18.05.2011, 10:13
  3. CALLs aus AWL Code erzeugen...
    Von Jochen Kühner im Forum Hochsprachen - OPC
    Antworten: 1
    Letzter Beitrag: 04.02.2011, 22:27
  4. LibnodaveConnection Library mit MC7 Umwandlung
    Von Jochen Kühner im Forum Hochsprachen - OPC
    Antworten: 12
    Letzter Beitrag: 25.08.2010, 23:29
  5. Umwandlung/aufsplitten von Datentypen???
    Von Anonymous im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 11.11.2005, 00:29

Lesezeichen

Berechtigungen

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