SDS-C: sdsc rsvdf
Tato stránka popisuje programovací jazyk SDS-C, který je dostupný na vybraných zařízeních SDS. Některá zařízení používají FULL-C, pro který máme návody jinde na této WiKi.
Jazyk SDS-C má vyhrazené proměnné a příkazy. Přes tyto proměnné a příkazy ovládá váš SDS-C program zařízení SDS.
Funkce
Seznam systémových funkcí (které poskytuje zařízení SDS-C) naleznete zde.
Samozřejmě že si můžete definovat své vlastní uživatelské funkce (pokud jejich název nebude kolidovat s vyhrazenými slovy).
#define
Můžete si zpřehlednit program a především centralizovat řadu funkcí, a to pomocí deklarace #define.
Zejména pokud máte často se opakující odkaz v celém programu (např. často ovládáte např. třetí relé z mnoha míst v programu), pak je výborné si program zpřehlednit, a zejména, pokud se pak rozhodnete ve zmíněném příkladu přejít z třetího na první relé, mít možnost tuto změnu provést jediným zásahem na jediném místě.
#define RELE sys[231]
Takto teď kdekoliv v programu, kam napíšete RELE (pozn. kromě ohraničených textů a komentářů), bude automaticky vloženo sys[231] (nebo cokoli jiného co si pak sami definujete).
Příklad:
RELE = 1; //zapne rele
Všechny názvy musí být kompletně velkými písmeny.
Pozor - lze použít jen jednu úroveň (tzn. nelze vnořit define do define).
Vyhrazené proměnné SDS-C
Vyhrazené proměnné v SDS-C jsou tzv. systémové proměnné. Jejich obsah odpovídá aktuálnímu fyzickému stavu systému, tj. HW zařízení. Stejně tak lze pomocí specifických systémových proměnných zasahovat i do konfigurace, měnit textové údaje ve webovém rozhraní atd.
Kompletní seznam naleznete zde.
Uživatelské proměnné
Programátor si může v SDS-C definovat své vlastní proměnné.
Použije se pro tento účel klíčové slovo var. Toto je jediný možný definiční typ pro proměnnou, akceptovaný v SDS-C.
Příklad:
var pocet;
Definuje proměnnou pocet, typ 32-bitů signed (to znamená: 1 bit pro znaménko a 31 bitů pro číslo).
V této verzi je možné používat pouze 32-bit/signed. Proto se do programu nepíše typ proměnné, ale jen var a zvolený název.
Co a jak když chcete pracovat s desetinnými čísly? Snadná pomoc:
var a,b,x, celaCast, desetinnaCast, preciznost;
a = 5;
b = 2;
// ted chci x = a/b, tj x=5/2, tj. x=2.5
// ale mam jen celociselne deleni...
preciznost = 10; // nebo 100, 1000, ... jak moc je potreba
x = (a * preciznost) / b; // posuneme tedy desetinnou carku nasobenim
// x je ted 25, takze
celaCast = x / preciznost;
desetinnaCast = x % preciznost;
// vysledek -> celaCast = 2, desetinnaCast = 5
echo('vysledek = ',celaCast,'.',desetinnaCast); //-> vypise: vysledek = 2.5
Texty
Jazyk SDS-C umožňuje pracovat pouze s pevně definovanými, konstantními (tj. dále neměnnými) texty.
Jazyk SDS-C má tedy z hlediska práce s texty řadu omezení, vůči jazyku FULL-C.
Všechny texty (jako konstanty) si definuje programátor. Definice lze provést kdekoliv.
Např.
smtp_send('joe@foo.bar', 'subject', 'Další definovaný text, hodnota i=', i, ' a další text...');
Texty lze předat pouze jako parametry funkcí a do některých systémových proměnných, a dále už nikam jinam.
Vyhrazené klíčové slova
V jazyku SDS-C je řada vyhrazených slov, které mají pevně přiřazenou funkci. Jejich znalost je pro programovaní v SDS-C naprosto nezbytná.
- return
Umožňuje předčasný návrat ze zavolané funkce. Příklad:
if (i % j == 0) return;
Pokud zavoláte return přímo v main, pak je main předčasně ukončen a vzápětí znovu spuštěn od svého začátku.
- label
Definuje bod v programu (návěstí), kam je možné odkudkoliv odjinud skočit. V současné verzi SDS-C není vyžadován (byl to původně vyžadováno v prvních starých verzích).
Využívá se např. pro vytváření smyček.
Definice cílového bodu (tj. kam lze skočit):
lze použít dvě varianty:
-název-:
label -název-:
Všimněte si, že si můžete zvýšit přehlednost programu tím, že před samotný název návěstí dáte slovo label. Pak lze v editoru snadněji najít pohledem místa, kam se bude skákat (pozn. jiný význam to prakticky nemá).
Skok se provede takto:
goto -název-;
Pozor! Definice bodu návěstí lze provést pouze nad všemi skoky (goto) na konkrétní návěst. Pokud bude tedy skok (goto) nad místem definice cíle (label), bude to bráno jako chyba.
- if
Pomocí if se provádí větvení programu dle aktuálního stavu. Provede se test zadané podmínky, a na základě výsledku (pravda/nepravda) se provede příslušná zadaná akce. Lze provést pouze jediné volání funkce nebo jediný skok (label), přičemž pro pravdivý výsledek lze definovat takovouto akci a stejně tak i pro nepravdivý výsledek.
POZOR Vždy jsou vykonány kompletně všechny testované vstupy v podmínce if - ať pak nejste překvapeni !
Příklad:
if (sys[24] < 23) posliSMS();
if (i % 10 == 0) goto neni10 else jinaFunkce(); //pokud i je nasobek 10, pak se skoci na label neni10, jinak se vola jinaFunkce
if (q & 2 && z != u) neco() else necoJineho();
if (teplota < 10 && chci_alarm != 0) hlas_alarm() else return; //priklad vyuziti return
Takže viz poslední příklad - i když bude platit, že teplota < 10, vždy bude otestován i chci_alarm != 0, a až pak na základě všech výsledků se rozhodne, který příkaz se provede.
Jak pomocí if pracovat s bloky kódu, když nechcete volat funkce:
if (i != 0)
{
echo(' i neni nula ');
// atd...
} else
{
echo(' i je nula ');
}
// dalsi kod...
- var
Pomocí var se definují uživatelské proměnné.
Funkce v SDS-C
Funkce jsou ohraničené části programu, které mají svůj specifický název, zadaný programátorem.
Všechny tyto funkce nevracejí hodnotu, lze je pouze zavolat. Po svém provedení pokračuje běh programu v místě, odkud byla funkce zavolána.
Využití funkcí - nejčastěji pro opakované kusy programu, aby se nemuselo plýtvat s volným místem pro zápis programu.
Příklad definice funkce test a jejího zavolání z jiné funkce funkceX:
test
{
i += 10; //nejaky obsah funkce...
}
funkceX
{
//zavolame test()
test();
//...
}
Všimněte si rozdílu definice funkce v SDS-C, ve srovnání s FULL-C. Pro SDS-C funkce nevrací hodnoty a nepřebírá parametry.
Takže pro SDS-C je definice: test { . . . }; kdežto pro FULL-C je odpovídající definice: void test(void) { . . . };
Funkce lze volat odkudkoliv, včetně klíčového slova if (pouze jako reakci na vyhodnocení podmínky, nikoliv v podmínce samotné).
Některé funkce jsou definovány jako vyhrazené, a některé jsou definovány jako interní pro daný výrobek SDS - viz seznam. Nesmíte použít názvy těchto funkcí pro své vlastní (uživatelské). Celkový počet funkcí je omezen.
Vyhrazené funkce v SDS-C
Jsou definovány tři základní vyhrazené funkce, které lze použít jedině k definovánému účelu.
Funkce main obsahuje hlavní program. Pokud si nevytvoříte vlastní smyčku, je po provedení všech instrukcí v main tato opět spuštěna od začátku (toto se dějě stále dokola po celou dobu kdy je zařízení zapnuto). Z této funkce lze volat jakékoliv podfunkce. Je povinnost mít funkci main v programu definovanou.
Funkce init je zavolána jen při resetu zařízení. Není povinnost mít funkci init v programu definovanou. Pozn. funkci init je možné znovu zavolat odkudkoliv.
Příkaz return je speciální funkce/příkaz - jedná se pouze o návrat (viz zásobník, tj. předčasné ukončení funkce ve které je return zavolán). return se nikde v programu nedefinuje, je to totiž vyhrazené slovo, které se jen používá.
Další poznámky
Návod pro SDS-C je rozdělen do více stránek na této WiKi.