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

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

Thema: Programmierwettbewerb 6. Aufgabe - Quine in AWL

  1. #1
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    die letzte Aufgabe des Programmierwettbewerbs ist schon wieder 3 Jahre her.
    Durch ein Gespräch mit einem Bekannten gestern abend, bin ich auf eine hoffentlich interessante Programmieraufgabe gekommen:

    Erstellen Sie ein möglichst kurzes Quine-Programm in S7-AWL.

    Was ist denn ein Quine?

    Ein Quine ist ein Programm das seinen eigenen Quelltext ausgeben kann. Eigentlich ganz einfach...

    Beispiel (in C):
    Code:
    printf("Hallo Welt");
    Ach, das ist ja einfach:
    Code:
    printf("printf(\"Hallo Welt\");");
    Ja, das ist dann aber nicht mehr das gesamte Programm.
    Aber gut, geht auch:
    Code:
    printf("printf(\"printf(\"Hallo Welt\");\");");
    Oh, ähem....

    Das Problem ist also die Selbstbezüglichkeit.
    Es gibt aber eine Lösung für das Problem, das ist unter anderem im Wikipedia-Artikel gezeigt:
    https://de.wikipedia.org/wiki/Quine_...terprogramm%29


    Wie kann diese Aufgabe aber in einer SPS gelöst werden?

    Eine SPS hat keine printf Funktion um Texte auszugeben.
    Darum habe ich mir als Zielausgabe ein Datenbaustein mit einem Char-Array überlegt, in dem das Programm landen muss.
    Zur Verfügung gestellt wird dazu die Funktion "putc", die als Parameter ein Zeichen übernimmt und es hinten an die Ausgabe anhängt. Das ist die eigentliche Ausgabefunktion.

    Das Quine-Programm soll innerhalb eines FCs realisiert werden, und auch nur der reine Code dieses FCs ausgegeben werden.
    D.h. ohne Variablendeklaration, Netzwerke, Kommentare etc.

    Tipps
    Ich habe eine Lösung in 517 Zeilen AWL. Es gibt also auf jeden Fall eine Lösung, falls jemand meint das geht nicht

    Prinzipiell lässt sich der gleiche "Trick" verwenden wie er auch in anderen Programmiersprachen angewendet wird und auch im Wikipedia-Artikel gezeigt wird.
    Nur lassen sich in S7-AWL nicht so einfach lange Strings zusammenbauen, darum muss man sich da etwas anderes überlegen. Etwas "um die Ecke denken" und kreativ sein ist angesagt.

    --------------------
    Bausteine:

    DB1 "Ausgabe" (wer mehr als 10000 Zeichen benötigt kann sich diese vergrößern...)
    Code:
    DATA_BLOCK "Ausgabe"
      STRUCT 	
       act_len : INT ;	//Länge der Zeichenkette
       s : ARRAY  [0 .. 10000 ] OF //Zeichenkette
       CHAR ;	
      END_STRUCT;
    BEGIN
    END_DATA_BLOCK
    Die FC1 Funktion "putc"
    Code:
    FUNCTION "putc" : VOID
    TITLE =Schreibt ein Zeichen
    
    VAR_INPUT
      c : CHAR ;	//zu schreibendes Zeichen
    END_VAR
    VAR_TEMP
      ptr : DWORD ;	
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
          L     "Ausgabe".act_len; 
          L     2; // Startoffset des Arrays
          +I    ; 
          SLD   3; 
          T     #ptr; 
          AUF   "Ausgabe"; 
          L     #c; 
          T     DBB [#ptr]; 
          L     "Ausgabe".act_len; 
          +     1; 
          T     "Ausgabe".act_len; 
    END_FUNCTION
    Und das eigetliche Quine Programm im FC100 "Quine":
    Code:
    FUNCTION "Quine" : VOID
      // hier eigenen Code einfügen
    END_FUNCTION
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)
    Zitieren Zitieren Programmierwettbewerb 6. Aufgabe - Quine in AWL  

  2. Folgende 4 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    LargoD (14.02.2016),Onkel Dagobert (14.02.2016),rostiger Nagel (14.02.2016),vollmi (15.02.2016)

  3. #2
    Avatar von Thomas_v2.1
    Thomas_v2.1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Zusatz:

    Es ist nicht erlaubt das Programm in einem anderen DB abzulegen und dann daraus zu lesen und auszugeben. Wenn das gemacht wird, dann muss die Deklaration dieses DBs auch mit ausgegeben werden. Gleiches gilt für einen FB und statische Variablen. Ansonsten darf alles was die SPS-Programmierung hergibt verwendet werden.
    Ich habe keine anderen Funktionen benötigt, aber vielleicht gibt es ja noch einen anderen Lösungsweg.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  4. #3
    Avatar von Thomas_v2.1
    Thomas_v2.1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Ist die Aufgabe zu abstrakt?

    Lösungen in SCL/ST oder Codesys STL werden auch angenommen, oder Graph, CFC, ...
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  5. #4
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.737
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Ist die Aufgabe zu abstrakt?
    Sorry, nichts für ungut, aber in meinen Augen eher unnütz.

    Wozu soll ich ein Programm schreiben, das nur den einzigen Zweck hat, wie sein Ausdruck auszusehen? Ich bevorzuge andere Masturbationsvorlagen.
    Da helf' ich lieber irgendwelchen Einsteigern und verschwende so meine Zeit.


    Meine Meinung, nichts Persönliches.

  6. #5
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.255
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Ich bin zu blöd oder zu müde....
    ein FC soll so programmiert sein, seinen AWL-Code in einen DB in ASCII zu schreiben?

  7. #6
    Registriert seit
    05.11.2004
    Ort
    Schweiz
    Beiträge
    1.137
    Danke
    224
    Erhielt 127 Danke für 85 Beiträge

    Standard

    Zitat Zitat von borromeus Beitrag anzeigen
    ein FC soll so programmiert sein, seinen AWL-Code in einen DB in ASCII zu schreiben?
    Ja!

    Aber ich stimme hucki zu. Wenn ich im Lotto gewinnen würde und vor Langeweile sterbe, könnte ich mir die Zeit dafür nehmen.
    Aber mit Job, Familie und erholsame Freizeit ist das aktuell nicht vereinnehmbar

    Außer ich bekomme einen Auftrag dazu. Sagen wir 58€/h bei 400h Aufwand

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Lösungen in SCL/ST oder Codesys STL werden auch angenommen, oder Graph, CFC, ...
    Bitte Thomas, ich möchte von dir den Code in Graph haben, so dass im DB die gezeichnete Graph-Kette sichtbar wird!
    Geändert von Krumnix (19.02.2016 um 08:20 Uhr)
    Kommt Zeit.... Kommt Rat.... In der Tat.
    Gartenlampe mit Windenergie anstelle von Solar? Bei Interesse -> PN

  8. #7
    Registriert seit
    06.10.2003
    Beiträge
    3.445
    Danke
    453
    Erhielt 509 Danke für 411 Beiträge

    Standard

    Zitat Zitat von borromeus Beitrag anzeigen
    Ich bin zu blöd oder zu müde...
    Ich bin beides. Manchmal habe ich im Schlaf Eingebungen, bin auch schon mal mitten in der Nacht aufgestanden und habe etwas zu Papier gebracht. Aber hierfür fehlt mir bis jetzt die passende Idee.
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  9. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.255
    Danke
    537
    Erhielt 2.705 Danke für 1.954 Beiträge

    Standard

    Zitat Zitat von Onkel Dagobert Beitrag anzeigen
    Ich bin beides. Manchmal habe ich im Schlaf Eingebungen, bin auch schon mal mitten in der Nacht aufgestanden und habe etwas zu Papier gebracht. Aber hierfür fehlt mir bis jetzt die passende Idee.
    Da haben wir eine Gemeinsamkeit, ging mit auch schon oft so.
    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

  10. #9
    Avatar von Thomas_v2.1
    Thomas_v2.1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Also Gehirntraining hat für mich schon ein Nutzen. Und ich finde es durchaus entspannend ein kniffliges Rätsel zu lösen.

    Und so völlig abstrakt ist das auch nicht, denn immerhin hat die Selbstbezüglichkeit schon die ganze Mathematik zum Einsturz gebracht - Gödelscher Unvollständigkeitssatz. Meiner Meinung nach steckt da noch viel mehr drin, z.B. ob ein Mensch jemals verstehen kann wie sein eigenes Gehirn funktioniert, ob (oder was) künstliche Intelligenz möglich ist usw.
    Ein passendes Bild von M.C.Escher gibt es dazu auch (noch mehr im Buch Gödel, Escher, Bach).

    Das Problem bin ich zumindest so angegangen:
    1. Ein Minimalprogramm sieht so aus:
    CALL "putc"
    c:=#c

    2. Programm 1. in den Speicher laden
    3. Lösung finden, wie die Anweisungen welche den Code in den Speicher laden wieder entfernt werden können. Das ist quasi das Animpf-Programm.

    Vielleicht gibt es aber auch einen anderen Ansatz als meinen.
    Angehängte Grafiken Angehängte Grafiken
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  11. #10
    Avatar von Thomas_v2.1
    Thomas_v2.1 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Code:
          L     'L B#'
          T     LD     0
          L     '16#2'
          T     LD     4
          L     '7$RT '
          T     LD     8
          L     '#q$RL'
          T     LD    12
          L     ' B#1'
          T     LD    16
          L     '6#D$R'
          T     LD    20
          L     'T #n'
          T     LD    24
          L     '$RL B'
          T     LD    28
          L     '#16#'
          T     LD    32
          L     '4C$RT'
          T     LD    36
          L     ' #L$R'
          T     LD    40
          L     'L B#'
          T     LD    44
          L     '16#5'
          T     LD    48
          L     '4$RT '
          T     LD    52
          L     '#T$RL'
          T     LD    56
          L     ' B#1'
          T     LD    60
          L     '6#44'
          T     LD    64
          L     '$RT #'
          T     LD    68
          L     'D$RL '
          T     LD    72
          L     'B#16'
          T     LD    76
          L     '#20$R'
          T     LD    80
          L     'T #A'
          T     LD    84
          L     '$RLAR'
          T     LD    88
          L     '1 P#'
          T     LD    92
          L     '#s$RC'
          T     LD    96
          L     'LR$R='
          T     LD   100
          L     ' #e$R'
          T     LD   104
          L     'L 0$R'
          T     LD   108
          L     'T #i'
          T     LD   112
          L     '$Rn: '
          T     LD   116
          L     'U #e'
          T     LD   120
          L     '$RSPB'
          T     LD   124
          L     ' o$RC'
          T     LD   128
          L     'ALL '
          T     LD   132
          L     '"put'
          T     LD   136
          L     'c"$Rc'
          T     LD   140
          L     ':=#L'
          T     LD   144
          L     '$RCAL'
          T     LD   148
          L     'L "p'
          T     LD   152
          L     'utc"'
          T     LD   156
          L     '$Rc:='
          T     LD   160
          L     '#A$RC'
          T     LD   164
          L     'ALL '
          T     LD   168
          L     '"put'
          T     LD   172
          L     'c"$Rc'
          T     LD   176
          L     ':=#q'
          T     LD   180
          L     '$Ro: '
          T     LD   184
          L     'L B '
          T     LD   188
          L     '[AR1'
          T     LD   192
          L     ',P#0'
          T     LD   196
          L     '.0]$R'
          T     LD   200
          L     'T #c'
          T     LD   204
          L     '$RCAL'
          T     LD   208
          L     'L "p'
          T     LD   212
          L     'utc"'
          T     LD   216
          L     '$Rc:='
          T     LD   220
          L     '#c$RL'
          T     LD   224
          L     ' B ['
          T     LD   228
          L     'AR1,'
          T     LD   232
          L     'P#1.'
          T     LD   236
          L     '0]$RT'
          T     LD   240
          L     ' #c$R'
          T     LD   244
          L     'CALL'
          T     LD   248
          L     ' "pu'
          T     LD   252
          L     'tc"$R'
          T     LD   256
          L     'c:=#'
          T     LD   260
          L     'c$RL '
          T     LD   264
          L     'B [A'
          T     LD   268
          L     'R1,P'
          T     LD   272
          L     '#2.0'
          T     LD   276
          L     ']$RT '
          T     LD   280
          L     '#c$RC'
          T     LD   284
          L     'ALL '
          T     LD   288
          L     '"put'
          T     LD   292
          L     'c"$Rc'
          T     LD   296
          L     ':=#c'
          T     LD   300
          L     '$RL B'
          T     LD   304
          L     ' [AR'
          T     LD   308
          L     '1,P#'
          T     LD   312
          L     '3.0]'
          T     LD   316
          L     '$RT #'
          T     LD   320
          L     'c$RCA'
          T     LD   324
          L     'LL "'
          T     LD   328
          L     'putc'
          T     LD   332
          L     '"$Rc:'
          T     LD   336
          L     '=#c$R'
          T     LD   340
          L     'U #e'
          T     LD   344
          L     '$RSPB'
          T     LD   348
          L     ' x$RC'
          T     LD   352
          L     'ALL '
          T     LD   356
          L     '"put'
          T     LD   360
          L     'c"$Rc'
          T     LD   364
          L     ':=#q'
          T     LD   368
          L     '$RCAL'
          T     LD   372
          L     'L "p'
          T     LD   376
          L     'utc"'
          T     LD   380
          L     '$Rc:='
          T     LD   384
          L     '#n$RC'
          T     LD   388
          L     'ALL '
          T     LD   392
          L     '"put'
          T     LD   396
          L     'c"$Rc'
          T     LD   400
          L     ':=#T'
          T     LD   404
          L     '$RCAL'
          T     LD   408
          L     'L "p'
          T     LD   412
          L     'utc"'
          T     LD   416
          L     '$Rc:='
          T     LD   420
          L     '#A$RC'
          T     LD   424
          L     'ALL '
          T     LD   428
          L     '"put'
          T     LD   432
          L     'c"$Rc'
          T     LD   436
          L     ':=#L'
          T     LD   440
          L     '$RCAL'
          T     LD   444
          L     'L "p'
          T     LD   448
          L     'utc"'
          T     LD   452
          L     '$Rc:='
          T     LD   456
          L     '#D$RC'
          T     LD   460
          L     'ALL '
          T     LD   464
          L     '"put'
          T     LD   468
          L     'c"$Rc'
          T     LD   472
          L     ':=#A'
          T     LD   476
          L     '$RL #'
          T     LD   480
          L     'i$RT '
          T     LD   484
          L     '#j$RL'
          T     LD   488
          L     ' #j$R'
          T     LD   492
          L     'L 10'
          T     LD   496
          L     '0$R/I'
          T     LD   500
          L     '$RSPZ'
          T     LD   504
          L     ' z$R+'
          T     LD   508
          L     ' 48$R'
          T     LD   512
          L     'T #c'
          T     LD   516
          L     '$RSRD'
          T     LD   520
          L     ' 16$R'
          T     LD   524
          L     'T #j'
          T     LD   528
          L     '$RCAL'
          T     LD   532
          L     'L "p'
          T     LD   536
          L     'utc"'
          T     LD   540
          L     '$Rc:='
          T     LD   544
          L     '#c$RL'
          T     LD   548
          L     ' #j$R'
          T     LD   552
          L     'L 10'
          T     LD   556
          L     '$R/I$R'
          T     LD   560
          L     '+ 48'
          T     LD   564
          L     '$RT #'
          T     LD   568
          L     'c$RSR'
          T     LD   572
          L     'D 16'
          T     LD   576
          L     '$RT #'
          T     LD   580
          L     'j$RCA'
          T     LD   584
          L     'LL "'
          T     LD   588
          L     'putc'
          T     LD   592
          L     '"$Rc:'
          T     LD   596
          L     '=#c$R'
          T     LD   600
          L     'SPA '
          T     LD   604
          L     'e$Rz:'
          T     LD   608
          L     ' L #'
          T     LD   612
          L     'j$RL '
          T     LD   616
          L     '10$R/'
          T     LD   620
          L     'I$RSP'
          T     LD   624
          L     'Z e$R'
          T     LD   628
          L     '+ 48'
          T     LD   632
          L     '$RT #'
          T     LD   636
          L     'c$RSR'
          T     LD   640
          L     'D 16'
          T     LD   644
          L     '$RT #'
          T     LD   648
          L     'j$RCA'
          T     LD   652
          L     'LL "'
          T     LD   656
          L     'putc'
          T     LD   660
          L     '"$Rc:'
          T     LD   664
          L     '=#c$R'
          T     LD   668
          L     'e: L'
          T     LD   672
          L     ' #j$R'
          T     LD   676
          L     '+ 48'
          T     LD   680
          L     '$RT #'
          T     LD   684
          L     'c$RCA'
          T     LD   688
          L     'LL "'
          T     LD   692
          L     'putc'
          T     LD   696
          L     '"$Rc:'
          T     LD   700
          L     '=#c$R'
          T     LD   704
          L     'CALL'
          T     LD   708
          L     ' "pu'
          T     LD   712
          L     'tc"$R'
          T     LD   716
          L     'c:=#'
          T     LD   720
          L     'n$Rx:'
          T     LD   724
          L     ' +AR'
          T     LD   728
          L     '1 P#'
          T     LD   732
          L     '4.0$R'
          T     LD   736
          L     'L #i'
          T     LD   740
          L     '$R+ 4'
          T     LD   744
          L     '$RT #'
          T     LD   748
          L     'i$RL '
          T     LD   752
          L     '812$R'
          T     LD   756
          L     '<I$RS'
          T     LD   760
          L     'PB n'
          T     LD   764
          L     '$RU #'
          T     LD   768
          L     'e$RBE'
          T     LD   772
          L     'B$RSE'
          T     LD   776
          L     'T$R= '
          T     LD   780
          L     '#e$RL'
          T     LD   784
          L     ' 0$RT'
          T     LD   788
          L     ' #i$R'
          T     LD   792
          L     'LAR1'
          T     LD   796
          L     ' P##'
          T     LD   800
          L     's$RSP'
          T     LD   804
          L     'B n$R'
          T     LD   808
          L     B#16#27
          T     #q
          L     B#16#D
          T     #n
          L     B#16#4C
          T     #L
          L     B#16#54
          T     #T
          L     B#16#44
          T     #D
          L     B#16#20
          T     #A
          LAR1  P##s
          CLR   
          =     #e
          L     0
          T     #i
    n:    U     #e
          SPB   o
          CALL  "putc"
           c:=#L
          CALL  "putc"
           c:=#A
          CALL  "putc"
           c:=#q
    o:    L     B [AR1,P#0.0]
          T     #c
          CALL  "putc"
           c:=#c
          L     B [AR1,P#1.0]
          T     #c
          CALL  "putc"
           c:=#c
          L     B [AR1,P#2.0]
          T     #c
          CALL  "putc"
           c:=#c
          L     B [AR1,P#3.0]
          T     #c
          CALL  "putc"
           c:=#c
          U     #e
          SPB   x
          CALL  "putc"
           c:=#q
          CALL  "putc"
           c:=#n
          CALL  "putc"
           c:=#T
          CALL  "putc"
           c:=#A
          CALL  "putc"
           c:=#L
          CALL  "putc"
           c:=#D
          CALL  "putc"
           c:=#A
          L     #i
          T     #j
          L     #j
          L     100
          /I    
          SPZ   z
          +     48
          T     #c
          SRD   16
          T     #j
          CALL  "putc"
           c:=#c
          L     #j
          L     10
          /I    
          +     48
          T     #c
          SRD   16
          T     #j
          CALL  "putc"
           c:=#c
          SPA   e
    z:    L     #j
          L     10
          /I    
          SPZ   e
          +     48
          T     #c
          SRD   16
          T     #j
          CALL  "putc"
           c:=#c
    e:    L     #j
          +     48
          T     #c
          CALL  "putc"
           c:=#c
          CALL  "putc"
           c:=#n
    x:    +AR1  P#4.0
          L     #i
          +     4
          T     #i
          L     812
          <I    
          SPB   n
          U     #e
          BEB   
          SET   
          =     #e
          L     0
          T     #i
          LAR1  P##s
          SPB   n
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

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

    Onkel Dagobert (14.05.2016)

Ähnliche Themen

  1. Antworten: 116
    Letzter Beitrag: 25.12.2013, 19:53
  2. Programmierwettbewerb, 4. Aufgabe
    Von Onkel Dagobert im Forum Stammtisch
    Antworten: 6
    Letzter Beitrag: 15.12.2011, 18:57
  3. Programmierwettbewerb, 3. Aufgabe
    Von Chräshe im Forum Stammtisch
    Antworten: 7
    Letzter Beitrag: 05.12.2011, 20:43
  4. Programmierwettbewerb, 2. Aufgabe
    Von LargoD im Forum Stammtisch
    Antworten: 14
    Letzter Beitrag: 02.08.2011, 22:27
  5. AWL -> Problem bei einer gegebenen Aufgabe
    Von PHANTOMIAS im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 12.04.2008, 14:22

Lesezeichen

Berechtigungen

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