Gå til innhold

Noen spm. angående et program som skal "huske"


Anbefalte innlegg

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
Videoannonse
Annonse

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

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 av chrml
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...