SDS-C: popis jazyka: Porovnání verzí

(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,…“)
 
Řádek 20: Řádek 20:
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
#define RELE sys[231]
 
#define RELE sys[231]
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
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).
 
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).
Řádek 27: Řádek 27:
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
RELE = 1; //zapne rele
 
RELE = 1; //zapne rele
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
Všechny názvy musí být kompletně velkými písmeny.
 
Všechny názvy musí být kompletně velkými písmeny.
Řádek 51: Řádek 51:
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
  var pocet;
 
  var pocet;
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
Definuje proměnnou ''pocet'', typ 32-bitů signed (to znamená: 1 bit pro znaménko a 31 bitů pro číslo).
 
Definuje proměnnou ''pocet'', typ 32-bitů signed (to znamená: 1 bit pro znaménko a 31 bitů pro číslo).
Řádek 79: Řádek 79:
  
 
echo('vysledek = ',celaCast,'.',desetinnaCast);  //-> vypise: vysledek = 2.5
 
echo('vysledek = ',celaCast,'.',desetinnaCast);  //-> vypise: vysledek = 2.5
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
  
Řádek 93: Řádek 93:
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
smtp_send('joe@foo.bar', 'subject', 'Další definovaný text, hodnota i=', i, ' a další text...');
 
smtp_send('joe@foo.bar', 'subject', 'Další definovaný text, hodnota i=', i, ' a další text...');
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
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.
 
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.
Řádek 110: Řádek 110:
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
if (i % j == 0) return;
 
if (i % j == 0) return;
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
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.
 
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.
Řádek 126: Řádek 126:
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
  -název-:
 
  -název-:
<syntaxhighlight lang="c">
+
</syntaxhighlight>
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
  label -název-:
 
  label -název-:
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
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á).
 
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á).
Řádek 136: Řádek 136:
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
  goto -název-;
 
  goto -název-;
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
Pozor! Definice bodu návěstí lze provést pouze '''nad''' všemi skoky (goto) na konkrétní návěst.
 
Pozor! Definice bodu návěstí lze provést pouze '''nad''' všemi skoky (goto) na konkrétní návěst.
Řádek 152: Řádek 152:
 
Příklad:
 
Příklad:
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
if (sys[24] < 23) posliSMS();
+
if (sys[24] < 23) posliSMS();
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
if (i % 10 == 0) goto neni10 else jinaFunkce();    //pokud i je nasobek 10, pak se skoci na label neni10, jinak se vola jinaFunkce
+
if (i % 10 == 0) goto neni10 else jinaFunkce();    //pokud i je nasobek 10, pak se skoci na label neni10, jinak se vola jinaFunkce
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
if (q & 2 && z != u) neco() else necoJineho();
+
if (q & 2 && z != u) neco() else necoJineho();
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
if (teplota < 10 && chci_alarm != 0) hlas_alarm() else return;  //priklad vyuziti return
+
if (teplota < 10 && chci_alarm != 0) hlas_alarm() else return;  //priklad vyuziti return
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
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.  
 
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.  
Řádek 187: Řádek 187:
 
   
 
   
 
  // dalsi kod...
 
  // dalsi kod...
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
  
Řádek 219: Řádek 219:
 
     //...
 
     //...
 
}
 
}
<syntaxhighlight lang="c">
+
</syntaxhighlight>
  
 
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.
 
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.

Verze z 18. 3. 2021, 15:10

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.