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

Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 37

Thema: Fragen zum SCL-Code

  1. #21
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Es geht fast immer auch anders. Die Frage ist halt, wieviel Aufwand es bedeutet.

    Wie ist denn der bisherige Stand, wo Du nicht weiter kommst?

  2. #22
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Ich habe jetzt vor mir kein TIA erst morgen wieder.


    Bisher konnte ich die Spalten und Zeilenauswertung

    Bei denn diagonalen habe ich noch keine Plan. Ich wollte es mit einer For-Schleife aber das geht irgendwie nicht.
    Ich denke ich werde es mit einer While schleife oder einer If abfrage machen.

    Schlechte Idee??

    gruss

  3. #23
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Kommt auf das Grundgerüst an.
    Und es gibt auch noch andere Schleifen/Möglichkeiten. Auch mal über'n Tellerrand schauen. Dafür machst Du doch das Ganze - um Dich weiter zu entwickeln, oder?


    Und übrigens nochmal - man muss nicht nach jedem Spielzug alle Spalten auf Gewinn prüfen, man muss nicht jedem Spielzug alle Zeilen auf Gewinn prüfen und man muss nicht nach jedem Spielzug alle Diagonalen auf Gewinn prüfen!
    Es reicht aus, diejenigen zu prüfen, die das Feld kreuzen, in das der letzte Spielstein gefallen ist. Und welche das sind, sagen Dir bei Deinem Code die Variablen #x und #y. Das spart einiges an Code und Laufzeit.
    Z.B:
    Zitat Zitat von bkizilkaya Beitrag anzeigen
    Code:
    ...
    FOR #a := 1 TO 7  BY 1 DO
     FOR #b := 0 TO 5 BY 1 DO
       IF #Rot_Speicher[#a,#b] = 1 THEN
         #Sieg_Rot := #Sieg_Rot + 1;
       ELSE
         #Sieg_Rot := 0;
       END_IF;
     END_FOR;
    END_FOR;
    ...
    Die rot markierte FOR-Zeile brauchst Du eigentlich nicht. Du weißt doch bereits, das der letzte Stein in Spalte #x geworfen wurde. Dann reicht es auch aus, diese Spalte auf einen Gewinn zu prüfen:
    Code:
    ...
    #a := #x;
     FOR #b := 0 TO 5 BY 1 DO
       IF #Rot_Speicher[#a,#b] = 1 THEN
         #Sieg_Rot := #Sieg_Rot + 1;
       ELSE
         #Sieg_Rot := 0;
       END_IF;
     END_FOR;
    ...
    (Oder gleich #x anstelle von #a einsetzen.)


    Was mir jetzt noch aufgefallen ist - wenn bei Dir ein Spielstein in eine bereits volle Spalte geworfen wird, wird der oberste einfach überschrieben:
    Zitat Zitat von bkizilkaya Beitrag anzeigen
    Code:
    #y:=0;
    #Gefunden:= 0;
    
    WHILE #Gefunden = 0  DO
     IF  #Grün_Speicher[#x,#y] = 0 AND #Rot_Speicher[#x,#y] = 0 THEN
          #Grün_Speicher[#x,#y] := 1;
             #Gefunden:= 1;
        ELSE
          #y:=#y+1;
          IF #y = 5 THEN
            #Gefunden:= 1;
          END_IF;
        END_IF; 
      END_WHILE;
    Das kann nicht richtig sein. Bediener machen Fehler - und der Programmierer muss diese möglichst abfangen und entsprechend behandeln!


    Ebenso finde ich es nicht besonders schön, dass Du bei den Spalten von 1 bis 7 zählst, während Du bei den Zeilen mit 0 beginnst. Es ist eigentlich relativ egal, wofür Du Dich entscheidest, aber ohne besonderen Grund sollte man möglichst bei einer Logik bleiben. Ist was für's nächste Programm.


    Und wie gesagt, das Du alles doppelt machst, würde ich als Lehrer überhaupt nicht durchgehen lassen. Auch wenn Du (warum auch immer) 2 Spielfelder brauchst, kann man die Abfrage der gewählten Spalte, die Suche nach dem leeren Feld, die Gewinnauswertung ... gemeinsam machen.
    Ich kann schon verstehen, dass Du nicht nochmal anfangen willst, aber auch sowas gehört zum Lernprozess. Und man muss ja nicht alles verwerfen, sondern nur schauen, wo macht man eigentlich genau das Gleiche, nur mit einem anderen Variablenwert.

  4. #24
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo hucki

    Ich weiss es gehört zum Lernprozess, weil ich keine Zeit habe neu anzufangen werde ich es einfach so zu verursachen.

    Das war mein erstes programm mit SCL und es hat mir sehr viel Spass gemacht mir SCL zu arbeiten.
    Für das nächste mal werde ich besser planen das habe ich bei diesem Projekt gelernt.

    Gruss

  5. #25
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Zitat Zitat von bkizilkaya Beitrag anzeigen
    Für das nächste mal werde ich besser planen das habe ich bei diesem Projekt gelernt.
    Na, das ist doch schon mal was.

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

    Standard

    Bei denn diagonalen habe ich noch keine Plan. Ich wollte es mit einer For-Schleife aber das geht irgendwie nicht.
    schau dir doch einfach meinen Code an:

    -alle Strecken-Tests mit der selben Funktion abgedeckt (test_strecke)
    -jeweils nur 1 Schleife (durchlaufe_belegung)
    -kein Test von unnötigen Strecken (distanz check in test_strecke)
    -Test für nicht erlaubtes Setzen (setzen_moeglich)
    -keine Rand-Tests nötig (wird vor dem test geklärt)

    und ob SCL, C, C++ usw. ist doch bei der Codemenge auch irgendwie egal - aka Hukis Tellerrand-Spruch
    Geändert von LowLevelMahn (11.11.2013 um 09:53 Uhr)

  7. #27
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    @LowLevelMahn,
    ich persönlich wüßte jetzt mangels C-Kenntnissen auch nicht bei allen Stellen, wie ich Deinen Code zu SCL umsetzen soll.
    Vlt. kannst Du das ja mal in einer ruhigen "Minute" übernehmen?

    Wenn bkizilkaya sein Projekt für sich abgeschlossen und hier komplett vorgestellt hat, können wir unsere kompletten Programme dann ja auch mal posten.
    Ich bin immer interessiert an anderen Lösungswegen.
    Wobei wir das theoretisch auch jetzt schon machen könnten, denn er will ja eh' nicht nochmal neu beginnen.

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

    Standard

    ich persönlich wüßte jetzt mangels C-Kenntnissen auch nicht bei allen Stellen, wie ich Deinen Code zu SCL umsetzen soll.
    Vlt. kannst Du das ja mal in einer ruhigen "Minute" übernehmen?
    geht mir genau so mit SCL - da habe ich gar keine Ahnung (wie bei den meisten SPS-Sachen, bin nur "kommunikativ" in dem Umfeld unterwegs - sonst nur C/C++...)
    aber du könntest ja Aufzeigen welche Teile dir "Probleme" bereiten - dann lerne ich in der ruhigen "Minute" auch gleich noch was - und du auch

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

    Standard

    wenn dieser SCL Code richtig nach C konvertiert ist würde ich behaupten das aus den funtionen: setzen_moeglich, belegung_durchlaufen, test_strecke, minimum und setzen
    direkt "funktionsbloecke" werden koennen - ich weiss nur nicht wo die globalen variablen fuellhoehe, spielfeld und die konstanten BREITE, HOEHE, GEWINN_ANZAHL hingehoeren


    Code:
    in SCL
    
    FUNCTION QUADRAT : INT 
    VAR_INPUT 
      wert : INT; 
    END_VAR 
    VAR 
      ergebnis : INT;
    END_VAR
    VAR_OUTPUT
      ausgabe : INT;
    END_VAR
    BEGIN 
      ergebnis := 0;
      IF wert <= 181 THEN 
        ergebnis := wert * wert;
      ELSE 
        ergebnis := 32_767;
      END_IF; 
      ausgabe := 10;
      QUADRAT := ergebnis;
    END_FUNCTION
    
    
    in C/C++
    
    
    int QUADRAT(int wert, int& ausgabe)
    {
      int ergebnis = 0;
      if( wert <= 181 ){
        ergebnis = wert * wert;
      }else{
        ergebnis = 32767;
      }
      ausgabe = 10;
      return ergebnis;
    }
    
    Aufruf:
    int die_ausgabe = 0;
    int das_ergebnis = QUADRAT(10, die_ausgabe);
    
    Ergebnis:
    das_ergebnis == 100
    die_ausgabe == 10
    Geändert von LowLevelMahn (12.11.2013 um 08:23 Uhr)

  10. #30
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    hallo zusammen
    bin heute wieder an meinem Projekt an der reihe.
    Ich habe immer noch folgende Fehler: Die diagonale funktionieren immer noch nicht.

    Ein ausschnitt von meinem Programm:
    Code:
    // Diagonale Auswertung 
    FOR #i := 4 TO 9 BY 1 DO
    FOR #j := 0 TO 5 BY 1 DO
        #i_j:= #i-#j;
      IF #Rot_Speicher[#i,#j] = 1 THEN
           #Sieg_Rot := #Sieg_Rot + 1;
        IF #Sieg_Rot = 4 THEN
           #Rot_Sieg := 1;
        END_IF;
      ELSE
           #Sieg_Rot := 0;
      END_IF;
    END_FOR;
    END_FOR;
    Ich habe das Array erweitert, weil man dann besser die diagonale-auswertung machen kann.
    Könnt ihr mir vielleicht weiterhelfen?

    Gruss

Ähnliche Themen

  1. TIA Fragen zum code
    Von bkizilkaya im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 21.10.2013, 12:21
  2. Exponent im SCL Code
    Von paula23 im Forum Simatic
    Antworten: 26
    Letzter Beitrag: 08.09.2013, 19:40
  3. Fehlersuche SCL-Code
    Von Sinix im Forum Simatic
    Antworten: 23
    Letzter Beitrag: 12.07.2011, 14:53
  4. Fehler im SCL Code
    Von Felse im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 18.06.2009, 12:33
  5. SCL code
    Von awl-scl im Forum Simatic
    Antworten: 21
    Letzter Beitrag: 14.01.2008, 17:02

Lesezeichen

Berechtigungen

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