Téma: Týdenní spínací hodiny s přímím určení spínaného výstupu
Dovolil jsem si použít části kódu ze spínacích hodin od Clouseau a od Jirsoft a upravit je k obrazu svému.
Důvodem bylo maximální využití uživatelských proměnných, tedy co jedna sys[14x], to kompletní zadání co se kdy sepne.
Zde je náhled programu:
// **********Týdenní spínací hodiny s určením relé které bude spínat**********
var REx,dow,den,pom,cas,on,off; //promenne pro spinaci hodiny
var spinacky_sys; //ukazatel sys
var thisminute; //flag že tuhle minutu už procedury proběhly
// ******* globalni procedury **********
echotime
{
ram[0]=sys[8] / 10;
ram[1]=sys[8] % 10;
ram[2]=sys[9] / 10;
ram[3]=sys[9] % 10;
ram[4]=sys[10] / 10;
ram[5]=sys[10] % 10;
echo(ram[0],ram[1]':',ram[2],ram[3]':',ram[4], ram[5]);
}
//procedury spínání relé a výstupů
relay1on
{
if (sys[231]==0) {
sys[231]=1;
echotime();
echo('RE1 zapnuto');
}
}
relay1off
{
if (sys[231]!=0) {
sys[231]=0;
echotime();
echo('RE1 vypnuto');
}
}
relay2on
{
if (sys[232]==0) {
sys[232]=1;
echotime();
echo('RE2 zapnuto');
}
}
relay2off
{
if (sys[232]!=0) {
sys[232]=0;
echotime();
echo('RE2 vypnuto');
}
}
D0on
{
if (sys[301]==0) {
sys[301]=1;
echotime();
echo('D0 zapnuto');
}
}
D0off
{
if (sys[301]!=0) {
sys[301]=0;
echotime();
echo('D0 vypnuto');
}
}
timecompare // procedura vyhodnocení
{
if (on!=off) {
if (cas==on && den == dow && REx == 0) D0on(); // pro konkretni den (0-6)
if (cas==off && den == dow && REx == 0) D0off();
if (cas==on && REx == 0 && (den == 7 && (dow > 0 && dow < 6))) D0on(); // pro vsedni den (7)
if (cas==off && REx == 0 && (den == 7 && (dow > 0 && dow < 6))) D0off();
if (cas==on && REx == 0 && (den == 8 && (dow == 0 || dow == 6))) D0on(); // pro vykend (8)
if (cas==off && REx == 0 && (den == 8 && (dow == 0 || dow == 6))) D0off();
if (cas==on && REx == 0 && (den == 9 && (dow >= 0 && dow < 7))) D0on(); // pro všechny dny (9)
if (cas==off && REx == 0 && (den == 9 && (dow >= 0 && dow < 7))) D0off();
if (cas==on && den == dow && REx == 1) relay1on(); // pro konkretni den (0-6)
if (cas==off && den == dow && REx == 1) relay1off();
if (cas==on && REx == 1 && (den == 7 && (dow > 0 && dow < 6))) relay1on(); // pro vsedni den (7)
if (cas==off && REx == 1 && (den == 7 && (dow > 0 && dow < 6))) relay1off();
if (cas==on && REx == 1 && (den == 8 && (dow == 0 || dow == 6))) relay1on(); // pro vykend (8)
if (cas==off && REx == 1 && (den == 8 && (dow == 0 || dow == 6))) relay1off();
if (cas==on && REx == 1 && (den == 9 && (dow >= 0 && dow < 7))) relay1on(); // pro všechny dny (9)
if (cas==off && REx == 1 && (den == 9 && (dow >= 0 && dow < 7))) relay1off();
}
}
spinaci_hodiny
{
dow = ((sys[4] / 86400) + 4) % 7; // určení dne v týdnu (výsledkem je 0-6)
cas = sys[8] * 100 + sys[9]; // připravíme čas HHMM
spinacky_sys=140;
spinacky1:
on = sys[spinacky_sys] / 10000; // rozebereme sys[14x] RDHHMMHHMM (on/off)
off = sys[spinacky_sys] % 10000; // výsledek je čas vypnutí
pom = on / 10000; // pomocný výpočet
on = on % 10000; // výsledek je čas zapnutí
REx = pom / 10; // výsledek je určení relé které se má sepnout
den = pom % 10; // výsledek je den v týdnu kdy budeme spínat ... 0-6=konkrétní den, 7=pracovní, 8=víkend, 9=každý den
timecompare(); // volání procedury vyhodnocení
spinacky_sys++;
if (spinacky_sys<148) goto spinacky1;
}
// ******* startovaci procedury **********
init
{
echotime();
echo('Start programu');
thisminute=0;
// ******* uzivatelsky nastavitelne promenne ***********
sys[140]=1110001200; // sepne rele 1 v pondělí v 10:00h - 12:00h
sys[141]=0708001200; // sepne výstup D0 každý všední den v 08:00h - 12:00h
sys[142]=1820152130; // sepne rele 1 každý víkend v 20:15h - 21:30h
sys[143]=0905300600; // sepne výstup D0 každý den v 05:30h - 06:00h
sys[144]=1411151300; // sepne rele 1 ve čtvrtek v 11:15h - 13:00h
sys[145]=0812021300; // sepne rele 1 v neděli v 15:00h - 16:00
sys[146]=0616031817; // sepne výstup D0 v sobotu v 16:03h - 18:17h
sys[147]=1323150000; // sepne rele 1 ve středu v 23:15h - 00:00h
}
main
{
// volani spinacich hodin
if (sys[10]==0 && thisminute!=sys[9]){
spinaci_hodiny();
thisminute=sys[9];
}
}