Nedward Skrevet 22. juli 2008 Del Skrevet 22. juli 2008 Jeg sitter å tenker på et program jeg har lyst å lage (det er til en PLS). Måten det skal fungere på er at man skal kunne trykke på et utvalg av knapper også skal programmet "huske" hvilke knapper du trykte på og hvor lang tid det tok mellom hvert enkelt trykk. Jeg har ingen kodeeksempel og jeg er ikke helt 100% sikker på hvordan dette kan gjøres, men jeg har en idé. I programeringssåket til PLSen (Strukturert tekst, som minner veldig mye om BASIC) finnes det flere funksjoner/instruksjoner som kan benyttets. Det er bla. en som heter P_On_0_02s (som er et bit som varierer mellom 1 og 0 hvert 0.02. sekund) også er det tellere og timere. Så tanken min var at jeg kunne telle hvor mange ganger P_On signalet endrer verdi for å huske hvor lang tid det tok i mellom hvert knappetrykk. Det eneste problemet jeg kan se med å bruke et signal som endrer seg hvert 20ms er at man ikke kan bruke tall som er større enn ca. 65k (unsigned integer heter det vel). Er det noen som har erfaringer fra lignende prosjekter som har noen gode idéer på løsninger?. Lenke til kommentar
Giddion Skrevet 22. juli 2008 Del Skrevet 22. juli 2008 P_On_0_02s er ingen IEC funksjon så jeg kjenner ikke den. Hvis ikke din PLS støtter høyere tall enn 16bit så er det bare en ting å gjøre og det er og overvåke den "tellende" variablen og når den går lavere enn verdien den var sist runde så har du en integer overflow og da teller du opp neste variabel. eks (*TellerLav,OldTellerLav og Tellerhøy er unsigned int (word)*) TellerLav := TellerLav +1; if (TellerLav < OldTellerLav) then Tellerhøy := Tellerhøy +1; end_if OldTellerLav := TellerLav; håper det hjalp. Lenke til kommentar
ChrML Skrevet 23. juli 2008 Del Skrevet 23. juli 2008 (endret) if ( StartInnspilling ) then Index := 0; TidenDetTok := 0; SpillerInn := TRUE; endif if ( SpillerInn ) then ; Loop igjennom alle knappene KnappTrykt = 1000; repeat ; Hvis knappen er inne if ( Knapper [Temp] ) then KnappTrykt := Temp; exit; endif Temp := Temp + 1; until Temp >= ANTALL_KNAPPER; ; Ble en knapp trykt? if ( KnappTrykt != 1000 ) then ; Lagre knappen som ble trykt og tiden det tok i lista våres ButtonArray [Index] = KnappTrykt; TimeArray [Index] = TidenDetTok; ; Gjør klar for lagring av neste knapp Index := Index + 1; TidenDetTok := 0; ; Er vi ferdig? Slutt å spille inn if ( Index >= ANTALL_KNAPPER ) then SpillerInn := FALSE; endif endif endif Jeg ville gjordt noe sånnt i den duren. Husker ikke syntaksen helt i dette språket, så kan hende du må gjøre om litt. Så må du selvfølgelig definere alle variablene i headeren. GX IEC Developer har støtte for arrays, men ganske primitiv, men lar seg jobbe med. ButtonArray blir da en array med INT variabler som lagrer hvem knapp som ble trykt. ButtonArray [0] - Første knapp ButtonArray [1] - Andre knapp osv... TimeArray blir da en array med DWORD (32-bit integere usignerte som skulle holde, blir 85899345,9 sekunder på 50hz nøyaktighet). De lagrer tiden fra forrige trykk. TimeArray [0] - Tiden før første trykk TimeArray [1] - Tiden til andre trykk etc.. Knapper blir da en array med BOOL fra X0 - X5 for eksempel hvis du har 6 knapper. Hvis du er lur så definerer du ANTALL_KNAPPER som en konstant i headeren så kan det enkelt endres til 100 knapper om du vil uten å endre koden. TidenDetTok blir da en helt seperat variabel som blir tellt på av kode lengre ned, som teller pulser og øker den med en for hver gang pulsen går fra 0 til 1. Logikken blir ca sånn for innspillingen. For avspillingen bare gjør du det motsatt enkelt nok, du looper igjennom lista på samme måte som vi gjør her og teller pulser på samme måte og resetter på samme måte. Når pulstelleren er lik eller mer enn det som er lagret i TimeArray så setter du LampeArray [buttonArray[index]] til høy, altså lampa lyser for den knappen. LampeArray blir da Y0 - Y5 for eksempel. Selvfølgelig i tillegg til denne innspillingen så må du ha en seperat array som husker om hver enkelt knapp var trykt, så du ikke registrerer samme knapper flere ganger. Bare lag en enkel array av BOOL og sett den til TRUE når knapp X var trykt, så sjekker du bare om den er TRUE hver gang før du godtar et knappetrykk. Skjønner? Hilsen en som programmerte en generell heismodell på skolen som støtta X antall heiser og X antall etasjer . Helt definerbart i headeren. Endret 23. juli 2008 av chrml Lenke til kommentar
Nedward Skrevet 23. juli 2008 Forfatter Del Skrevet 23. juli 2008 Takk for kodeeksemplene. Jeg tror jeg fikk med meg de grunnleggende prinsippene for å få noe slikt til. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå