SDS-C: sdsc rsvdf

Verze z 18. 3. 2021, 21:36, kterou vytvořil Adamn (diskuse | příspěvky) (Založena nová stránka s textem „ 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,…“)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
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.