programmering av tidursfunktion

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
MadModder
Co Admin
Inlägg: 31166
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

programmering av tidursfunktion

Inlägg av MadModder »

I serverskåpet har jag en gammal 486:a som gör diverse saker. Nu ska den få en till funktion: programmerbart tidur.

Men jag har lite huvudbry.

Jag har nu dimensionerat en variabel, tid$(1000,4)
Det är alltså 1000 programplatser, den andra dimensionen är: 0=starttid 1=stopptid 2=port (vad som ska styras) 3=typ (dagligen, månatligen, engångs mm.) 4=flagga (0=inget har hänt, 1=startat, 2=stoppat)

I huvudloopen stegar jag fram en programpunkt per loop, och kollar av mot systemtiden. Är det starttid startas rätt port, och flaggan sätts till 1. Är det stopptid och flaggan är 1, stoppas porten och sätt flaggan till 2.

När klockan slår om till 00:00 sätts flaggan till 0 igen om typen är 0.
Så långt är allt ok.

Men om jag startar datorn och klockan är mitt mellan start och stopp, startar inte den punkten förrän nästa dygn.
Ok tänkte jag och kollade helt enkelt om klockan är lika med eller mer än programpunkten. Då funkar det.
Nackdelen med den lösningen är att om klockan är mer än stopp också, kommer porten i fråga slå på och av igen direkt jag startar datorn. Inte bra.

Hmm... jag kollar helt enkelt i startrutinen om klockan är mer än stopptiden, och hoppar över det hela. Nackdelen med det här är att det går inte att ha en starttid och stopptid på varsin sida om midnatt!

Hur i hela helsingland ska jag lösa det här?

Jag vill ju att det ska funka precis som ett vanligt mekaniskt tidur, men det är klurigt när det inte kan sitta pinnar utefter hela tidsaxeln. Det går åt lite för mycket minne då :P
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

En lösning kan vara att definiera att en tid inte kan vara kortare än x sekunder på samma "pinne". Därnäst kollar man "om högre än eller lika med SAMT inom x-1 tidsluckan) = off/on".

Jag kan nog komma på en klurigare grej om jag tänker till lite men det beror ju på om burken hinner med.

Jag har gjort ung. samma funktion en gång men då hade varje utgång en pekare som pekade på nästa händelse och när den blev nådd körde den vidare till nästa. Det var en veckofunktion och det fungerade kanon.

Kruxet med detta sätt är att man måste kolla om tiden är "lika med" och det kräver i sin tur att man MÅSTE VARA TOTALSÄKER på att burken hinner med i tid.
Användarvisningsbild
MadModder
Co Admin
Inlägg: 31166
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Inlägg av MadModder »

Det är nog inga problem. Jag kör med minutprecision :) och den hinner kolla av alla 1000 poster på nån sekund.

Det är ju bara det att föregående tidsangivelser inte behöver köras klart förrän nästa startar.
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Men varför tusan nollar du flaggan vid midnatt? Porten är väl likt förbannat av/på eller hur?
Användarvisningsbild
MadModder
Co Admin
Inlägg: 31166
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Inlägg av MadModder »

Flaggan nollas endast om den är 2. Gör jag inte det kommer den förtsätta vara 2 förevigt, och inget händer.

en port startas endast om flaggan är 0, stoppas endast om flaggan är 1 osv.

Jag tänkte också på att helt enkelt kolla om klockan är mellan start och stopp, men eftersom tiden blir 00:00 vid midnatt kan jag inte kolla om klockan befinner sig mellan t.ex start 23:00 och stopp 01:00, då den kommer fatta det som att det är 23 och 01 samma dygn.
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Men.... varför så besvärligt?
Om vi nu håller oss till 1 port (kallat "porten") och ett program som bara omfattar denna port.

Varje minut utförs följande:
* om porten är ON: om OFF-tid == tid nu -> porten = OFF;
* annars: om ON-tid == tid nu -> porten = ON;

Detta medför att tider där porten ska stängas av och den redan är avstängd bara "glömmas" och vice-versa.

Om du lägger in en händelse på 1 gg i månaden att den ska vara på mellan 23:00 och 02:00 får du ju testa start och sluttid gentemot varandra, om start är högre än slut måste sluttiden ju vara under nästa dygn.

Hmmmmm.... läser och tänkar (nåja..... låtsas...)
Jag ser problemet: för varje time-tick kör du genom hela listan och utför de kommandon som finns där.

Jag funderar mest på om det egentligen är så vettigt sätt att göra det på, du kanska ska fundera lite på ditt upplägg av dessa funktioner.

När typen är månadligt.... hur gör du då? Är det den första i varje månad, är det en månad efter programstart eller hur?
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Jag blir inte riktigt klok på vad dina flaggor gör för nytta. :)

Det sätt som jag har gjort liknade saker i husstyrsystemet här, är att definiera tider ungefär motsvarande som du har gjort. Sedan finns det en utgångsvariabel (en bit) för varje tidprogram som anger senaste utskickade status till utgången, alltså nuvarande läge på reläet. Varje gång jag kollar av ett tidprogram så jämför jag tiderna med nuvarande tid och ser om tiden ligger inom till-intervallet. Då får jag ut 0 eller 1 som talar om hur status _skall_ vara just nu. Jämför det med senaste utskickade status i variabeln och agera därefter. Ändras utgångens status och detta skickas ut så ändrar man även statusvariabeln.

Styr man utgångarna direkt så kan man naturligtvis skippa utgångsvariabeln också och alltid sätta utgången direkt efter resultatet på tidsjämförelsen, men skall det skickas någonstans, t.ex över en kommunikationslänk så vill man kanske bara skicka förändringar och då är den bra att ha. Det var det här jag antog att du på något sätt använde din flagga till även om jag inte riktigt greppade hur.

Edit: Insåg nu att din flagga nog behövs till engångsfunktionen då jag inte har någon sån. Men lägg till den och ignorera tidprogrammet om den flaggan är satt (=redan använd en gång och därmed färdig).
Användarvisningsbild
MadModder
Co Admin
Inlägg: 31166
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Inlägg av MadModder »

Jag har en "tidskod" som ligger i en variabel.
Den ser ut typ "200612031824" för 2006-12-03 kl 18:24
Väljer jag dagligen, kollas endast de fyra sista siffrorna, vilket är tiden.
Väljer jag en gång i månaden, kollar jag de sex sista siffrorna, vilket är tid och dag. :)
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag hade ju gjort det annorlunda.

Kod: Markera allt

Först definiera en 'typedef':
typedef struct
  {
  unsigned int Year : 12;
  unsigned int Month : 4;
  unsigned char Date;
  unsigned char Hour;
  unsigned char Minute;
  unsigned Flag_Repeats : 3; // Daily, weekly, monthly, once....
  unsigned Flag_On : 1; // '0' = Off, '1' = On
  unsigned char Port : 4; // 0 - 15
  } T_TIMEPOINT;

T_TIMEPOINT Timetabel[1000]; // Fyller 6000 bytes
Men vänta.... du kör BASIC eller sånt?
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Borde inte detta gå att lösa på ett enkelt sätt med cron? De flesta tänker nog på linux/unix men det finns nog någon windows-variant också...
Men det kanske är andra faktorer som gör att du inte kan använda cron?
Användarvisningsbild
MadModder
Co Admin
Inlägg: 31166
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Inlägg av MadModder »

Ja... faktorerna heter DOS6.22 och Quick Basic 4.5... ;)
ie
EF Sponsor
Inlägg: 1368
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Inlägg av ie »

Har inte läst tråden så noggrant, men...

Om du varje gång du ändrar någon port (sker ju inte så vansinnigt ofta om jag förstod saken rätt) så skriver du ner tidpunkten och portarnas status i en fil. Om du sen startar om datorn så börjar du med att läsa in status och den senaste kända tidpunkten. Sen "snabbspolar" du klockan och testar dina villkor tills du når fram till aktuell tidpunkt. Då vet du vilket status portarna ska ha och lägger ut det på porten och går in i vanliga moden.
Användarvisningsbild
MadModder
Co Admin
Inlägg: 31166
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Inlägg av MadModder »

Jag var lite trött igår, och försökte snabbt få fram nånting som fungerade.
I morse när jag vaknade och satt på sängkanten fortfarande lite dimmig i ögonen, tänkte jag först att jag skiter i det där med att det ska funka exakt som ett mekaniskt tidur. Jag sätter helt enkelt ut enkla händelser i listan. En tidpunkt, och en händelstyp. T.ex propgrampunkt 1: 1600, port A på. programpunkt 2: 2100, port A av.
Men sen tänkte jag igen, att jag vill nog iaf ha funktionen så som jag tänkte från början. Men som det är nu är rutinen lite baklänges...

OM typ är 0
OM flagga är 0
OM tiden är programtid
gör si och så.

inte bra alls...

Jag ska helt enkelt börja med att först räkna ut om nuvarande tidpunkt befinner sig inom PÅ-intervallet för en programpunkt, rätt och slätt.
Om ja och flagga är noll, slå på port, annars ingenting.
Om nej och flagga är ett, slå av port, annars ingenting.
Om typ är engångsföreteelse, sätt flagga till två så att den programpunkten är förbrukad.
Enkelt. Tror jag :P
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Precis! Det var ungefär så jag försökte beskriva det, men jag vet inte om det gick fram eller du räknade ut det själv. Spelar egentligen ingen roll heller, huvudsaken är att du har en lösning.

Prova!
Användarvisningsbild
MadModder
Co Admin
Inlägg: 31166
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Inlägg av MadModder »

Jag räknade ut det själv. Men när jag läste genom din text några gånger nu så var det väl ungefär så. Mitt undermedvetna kanske snappade upp nånting där. ;)

Men flaggan har du rätt om. Hade jag inte haft en engångs, så hade jag inte behövt den. Bara att läsa av portstatusen. Lite omständligt iofs pga att det är knöligt att kolla av enstaka bitar i basic. And och OR och hej å hå hit och dit. Känns som om det går snabbare att kolla flaggan bara. :)

[edit]
Jag blev så jäkla less på att STÅ upp och koda, så jag åkte till Jysk och inhandlade en barstol för 400 pix. Hah! :mrgreen:

Bild
hmm... det blev ett blundfoto...

Det finns säkert trådlösa KVM-switchar eller för nätverk, men det här var den snabbaste och billigaste lösningen. ;)

ps.
Klaga inte på städningen. Det är stökigare än vad det ser ut. :lol:
Det är väl dags för en julstädning antar jag :P
Skriv svar