Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Gra wąż na sterowniku PLC + HMI (MITSUBISHI)

tfx85 04 Jan 2016 09:18 6354 5
SterControl
  • Gra wąż na sterowniku PLC + HMI (MITSUBISHI)

    Witam.

    W czasie przerwy w pracy stworzyłem grę wąż. Gra została napisana w języku ST na sterownik Mitsubishi serii FX3GE bądź sterowniki seri L po konwersji. Do sterowania i wizualizacji grafiki użyłem panel HMI Mitsubishi GT2710. Bardzo prosto można zastosować praktycznie dowolne HMI, gdyż plansze stanowią obiekty typu lampa.
    Uważam że stworzenie tego typu gry to świetne ćwiczenie na zapoznanie się z strukturami. Poniżej przedstawiam kod gry oraz wideo, jak to wszystko wygląda.
    Pozdrawiam.



    Code:

    (*2015 tomekfx(malpa)o2.pl*)
    (*Inicjalizacja*)
    mov(SysInitialPulse OR KoniecGry, 1,DlugoscWeza);
    mov(SysInitialPulse OR KoniecGry, 4,snake[0].wsX);
    mov(SysInitialPulse OR KoniecGry,4,snake[0].wsY);
    (*CzyszczenieEkranu*)
    FOR  MyIndex1:= 0  TO  11  DO
        FOR MyIndex2 := 0 TO 11 DO
           TablicaEkranu[MyIndex1].OsX[MyIndex2] := 0;
        END_FOR;
    END_FOR;
    (*RestartGry*)
    IF KoniecGry=1 THEN
       KoniecGry :=0;
    END_IF;
    (*KoniecGryUdezrzenieWSciane*)
    IF ldp(TRUE, snake[0].wsX <1 OR Snake[0].wsX > 10) THEN
       FOR MyIndex5 :=   1 TO 39 DO
          Snake[MyIndex5].wsX := 0;
          Snake[MyIndex5].wsY := 0;
       END_FOR;
       DlugoscWeza := 2;
       KierunekGora := 0;
       KierunekLewo := 0;
       KierunekPrawo := 0;
       KierunekDol := 0;   
       KoniecGry:=1;    
    END_IF;   
    IF snake[0].wsY <1 OR Snake[0].wsY > 10 THEN
          FOR MyIndex6 :=   0 TO 39 DO
             Snake[MyIndex6].wsX := 0;
             Snake[MyIndex6].wsY := 0;
          END_FOR;
          DlugoscWeza := 3;
          KierunekGora := 0;
          KierunekLewo := 0;
          KierunekPrawo := 0;
          KierunekDol := 0;
    END_IF;   
    (*KoniecGryUdezrzenieWSamegoSiebie*)
    IF DlugoscWeza >3 THEN
       FOR MyIndex7 :=2 TO DlugoscWeza DO
          IF ruch AND ((Snake[1].wsX = Snake[MyIndex7].wsX) AND (Snake[1].wsY = Snake[MyIndex7].wsY)) THEN
             KoniecGry :=1;
          END_IF;
       END_FOR;
    END_IF;
    (*KoniecGryMaxDlugosc/GeneratorRuchu*)
    CTU_1(CU:= Sys100msClok ,RESET:= CTU_1.Q ,PV:= 2 );
    IF DlugoscWeza < 39 THEN
       Ruch := ldp(TRUE, CTU_1.Q);
    ELSE
       KoniecGry :=1;
    END_IF;   
    (*Obsluga klawiatury*)
    IF NOT Bezpieczenstwo THEN
       IF ldp(TRUE, INPGora) AND NOT  KierunekDol THEN   
          KierunekGora := 1;
          KierunekDol := 0;
          KierunekPrawo := 0;
          KierunekLewo := 0;
       END_IF;   
       IF ldp(TRUE, INPDol)  AND NOT  KierunekGora THEN
          KierunekGora := 0;
          KierunekDol := 1;
          KierunekPrawo := 0;
          KierunekLewo := 0;   
       END_IF;
       IF ldp(TRUE, INPPrawo) AND NOT  KierunekLewo THEN   
          KierunekGora := 0;
          KierunekDol := 0;
          KierunekPrawo := 1;
          KierunekLewo := 0;
       END_IF;
       IF ldp(TRUE, INPLewo)  AND NOT  KierunekPrawo THEN   
          KierunekGora := 0;
          KierunekDol := 0;
          KierunekPrawo := 0;
          KierunekLewo := 1;
       END_IF;
    END_IF;   
    (*WykonywanieRuchuGlowy*)
    IF ldp(TRUE, KierunekGora AND Ruch ) THEN
       Snake[0].wsX := Snake[0].wsX + 0;
       Snake[0].wsY := Snake[0].wsY - 1;
    END_IF;
    IF ldp(TRUE, KierunekDol AND Ruch) THEN
       Snake[0].wsX := Snake[0].wsX + 0;
       Snake[0].wsY := Snake[0].wsY +1;
    END_IF;
    IF ldp(TRUE, KierunekPrawo AND Ruch) THEN
       Snake[0].wsX := Snake[0].wsX + 1;
       Snake[0].wsY := Snake[0].wsY + 0;
    END_IF;
    IF ldp(TRUE, KierunekLewo AND Ruch) THEN
       Snake[0].wsX := Snake[0].wsX - 1;
       Snake[0].wsY := Snake[0].wsY + 0;
    END_IF;
    (*ZnajdowanieKlocka*)
    IF ldp(TRUE,Snake[0].wsX = KlocekX AND Snake[0].wsY = KlocekY) THEN
       DlugoscWeza := DlugoscWeza +1;
       NowyKlocek := 1;
    ELSE
       NowyKlocek := 0;   
    END_IF;
    (*Wstaw losowy klocek*)
    (*rnd(NowyKlocek OR SysInitialPulse, RndKlocekX);
    rnd(NowyKlocek OR SysInitialPulse, RndKlocekY);*)
    CASE DlugoscWeza OF
       1:
        KlocekX := 2;
        KlocekY := 2;
        2:
        KlocekX := 5;
        KlocekY := 5;
        3:
        KlocekX := 8;
        KlocekY := 9;
        4:
        KlocekX := 1;
        KlocekY := 5;
        5:
        KlocekX := 2;
        KlocekY := 6;
        6:
        KlocekX := 7;
        KlocekY := 2;
        7:
        KlocekX := 1;
        KlocekY := 9;
        8:
        KlocekX := 7;
        KlocekY := 5;
        9:
        KlocekX := 2;
        KlocekY := 1;
        10:
        KlocekX := 4;
        KlocekY := 4;
        11:
        KlocekX := 8;
        KlocekY := 4;
       12:
        KlocekX := 6;
        KlocekY := 1;
       13:
        KlocekX := 6;
        KlocekY := 6;
       14:
        KlocekX := 7;
        KlocekY := 2;
       15:
        KlocekX := 2;
        KlocekY := 7;
       16:
        KlocekX := 3;
        KlocekY := 6;
       17:
        KlocekX := 2;
        KlocekY := 5;
       18:
        KlocekX := 1;
        KlocekY := 4;
       19:
        KlocekX := 9;
        KlocekY := 9;
       20:
        KlocekX := 8;
        KlocekY := 7;
       21:
        KlocekX := 7;
        KlocekY := 7;
       22:
        KlocekX := 2;
        KlocekY := 9;
       23:
        KlocekX := 9;
        KlocekY := 2;
       24:
        KlocekX := 6;
        KlocekY := 9;
       25:
        KlocekX := 9;
        KlocekY := 6;
       26:
        KlocekX := 1;
        KlocekY := 1;
       27:
        KlocekX := 9;
        KlocekY := 9;
       28:
        KlocekX := 1;
        KlocekY := 5;
       29:
        KlocekX := 5;
        KlocekY := 5;
       30:
        KlocekX := 9;
        KlocekY := 6;
       31:
        KlocekX := 1;
        KlocekY := 1;
       32:
        KlocekX := 9;
        KlocekY := 9;
       33:
        KlocekX := 1;
        KlocekY := 5;
       34:
        KlocekX := 5;
        KlocekY := 5;
       35:
        KlocekX := 4;
        KlocekY := 4;
        36:
        KlocekX := 8;
        KlocekY := 4;
       37:
        KlocekX := 6;
        KlocekY := 1;
       38:
        KlocekX := 6;
        KlocekY := 6;
       39:
        KlocekX := 7;
        KlocekY := 2;
    END_CASE;
    (*KlocekX := (REAL_TO_INT((INT_TO_REAL(RndKlocekX)/3640.8))+1);*)
    (*KlocekY := (REAL_TO_INT((INT_TO_REAL(RndKlocekY)/3640.8))+1);*)
    TablicaEkranu[KlocekY] .OsX[KlocekX] :=1;
    (*RysowanieCialaWeza*)
    IF Ruch THEN
       AuxMyIndex4 := DlugoscWeza+1;
       FOR MyIndex4 :=   1 TO DlugoscWeza DO
          AuxMyIndex4 := AuxMyIndex4 - 1;
          Snake[AuxMyIndex4].wsX := Snake[AuxMyIndex4 - 1].wsX;
          Snake[AuxMyIndex4].wsY := Snake[AuxMyIndex4 - 1].wsY;      
       END_FOR;
    END_IF;
    (*Rzut tablicy na ekran*)
    FOR MyIndex3 := 0 TO DlugoscWeza DO
       TablicaEkranu[Snake[MyIndex3].wsY] .OsX[ Snake[MyIndex3].wsX] :=1;
    END_FOR;

    Cool! Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    tfx85
    Level 10  
    Offline 
    tfx85 wrote 70 posts with rating 28, helped 0 times. Been with us since 2010 year.
  • SterControl
  • SterControl
  • #4
    zaba90
    Level 7  
    Cześć chciałem zrobić podobny projekt tylko ze na s7-1500 tylko mi się nie udawało teraz znalazłem twój projekt i się na nim wzoruje troszkę. Mam pytanie ta co to jest ldp które występuje w kodzie nie wiem co podpiąć do tego żeby mi program zadziałał. albo jeśli masz projekt jeszcze i możesz podzielić się jakie adresy mają poszczególne zmienne był bym wdzięczny.