SDS-C: intro

Verze z 18. 3. 2021, 14:07, kterou vytvořil Adamn (diskuse | příspěvky)
(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í SDS používají FULL-C, pro který máme návody jinde na této WiKi.


Co je SDS-C ?

SDS-C umožňuje vám - uživatelům (majitelům) výrobků SDS, si dodatečně naprogramovat (upravit) chování těchto výrobků. Napíšete tedy program (text) a ten se po nahrání do zařízení SDS začne provádět.

Zařízení je tedy PLC (Programmable Logic Controller), přesněji PAC (Programmable Automation Controller), programovatelný v SDS-C jazyce.

Chybí vám něco v SDS-C, nebo si nevíte rady? Využijte fórum, což je preferovaný postup (a navíc naleznete řadu odpovědí na již položené otázky ostatních uživatelů).


Informace

SDS-C je zjednodušená verze FULL-C. Zjednodušená proto, aby se do programování mohli pustit začátečníci, a také proto, že nejmenší zařízení SDS plný FULL-C nezvládnou.


Kde SDS-C vezmu?

SDS-C je součástí firmware pro všechny výrobky první řady SDS (OnlineTechnology.cz). Když si takové zařízení zakoupíte, tak SDS-C už v něm máte.

Dále ještě potřebujete program pro komfortní zápis, ověření funkčnosti a upload konkrétních SDS-C programů do svého zařízení (a proto je zde aplikace, dostupná pro Windows® 32bit, kterou lze spustit i pod Linuxem ve WinE, nebo VMware atd.).

Aplikaci pro zápis programu v SDS-C (a nahrání programu do zařízení SDS) zdarma stáhnete ze stránky pro nejaktuálnější firmware.


Naprogramujte si vlastní chování všech výrobků SDS

Použijete SDS-C, jednoduchý PLC skriptovací jazyk, který je zjednodušenou variantou FULL-C, který je odvozen od ANSI C programovacího jazyka.

Každý, kdo umí v C programovat, si může snadno vytvořit libovolný program, který bude v zařízení SDS spuštěn a který bude SDS ovládat v reálném čase.

Takto získáte plnohodnotné, ethernetové, opakovatelně programovatelné PLC za výbornou cenu.

Laicky řečeno: přímo online si naťukáte jakýkoliv vlastní program pro kterékoliv zařízení SDS, a tento program se bude na zařízení okamžitě vykonávat.

POPIS SDS-C PRO ZAČÁTEČNÍKY

Pro SDS-C je k dispozici je i plnohodnotný komfortní simulátor (běží v systému Windows®, lze pod WinE) - lze si odladit (krokování) program bez nutnosti mít fyzický přístup k zařízení řady SDS.

Ukázkové programy pro SDS-C naleznete ZDE.

Ve výchozím stavu je každou 1 milisekundu provedena jedna celá instrukce programu (celý hi-level příkaz C jazyka). To dává 1000 vykonaných hi-level příkazů (celých příkazů) za vteřinu, což je dostatečná rychlost pro nejširší množství běžných aplikací. Pojmem celý příkaz přesně odpovídá jednomu CELÉMU řádku, který vidíte v debuggeru v simulátoru (toto je důležitá informace, protože to znamená, že skutečná rychlost je opravdu velká - nepleťte si to s low-level instrukcemi apod., skutečně se jedná o celé příkazy).

Pokud máte oprávněný požadavek na rychlejší činnost (tj. neomezení na 1msec krokování), je zde možnost - viz příslušné nastavení pro konkrétní položku v sys[], která odstraní 1msec zámek kroku.

Program je sestaven z jednotlivých:

SDS-C: uživatelských a systémových proměnných 
   - sys[index]
   - ram[index]
   - text[index]
   - share[index]
SDS-C: základních funkcí a prvků
   - var
   - label
   - #define
   - main()
   - init()
   - return
SDS-C základních funkčních příkazů:
   - echo()
   - echoclear()
   - echoinline()
   - wait()
   - sprintf()
   - textcmp()
   - atoi()
   - itoa()
   - itoh()
   - smtp_send()
   - ping()
   - dns_resolv()
   - http_get()
   - http_post()
   - snmp_send_trap()
   - send_udp()
   - lcd_echo()
   - lcd_clear()
   - lcd_newline()
   - lcd_setpixel()
   - serial1_set()
   - serial6_set()
   - serial1_text_out()
   - serial6_text_out()
   - serial1_write()
   - serial6_write()
   - read_dataflash()
   - write_dataflash()
   - read_dataflash_page_to_ram()
   - write_ram_block_to_dataflash_page()
   - onewire_rescan()
   - sdsc_reset_program()
   - sdsc_set_wdg()
   - sdsc_kick_wdg()
   - mqtt_connect()
   - mqtt_disconnect()
   - mqtt_publish()
   - mqtt_subscribe()
   - mqtt_unsubscribe_index()
   - mqtt_unsubscribe_name()
   - modbus_tcp_connect()
   - modbus_tcp_disconnect()
   - modbus_tcp_read()
   - modbus_tcp_writesingle()
   - modbus_tcp_writemultiple()
Vnější přístup k proměnným je popsán ZDE.

SDS-C program je definován (zapsán) programátorem (to jste vy) jako text, ve kterém jsou uvedeny ve správném pořadí jednotlivé příkazy.

SDS-C program se tedy skládá z těchto zapsaných příkazů, které jsou postupně prováděny (tak jak to programátor zapsal).

SDS-C program je neustále opakován (pokud "opustí" (dokončí) funkci main(), spustí se main() automaticky znovu a znovu . . .), a to tak dlouho, dokud je zařízení SDS zapnuto.

Kromě základních funkcí si můžete definovat své vlastní (v textu programu).

Od SDS-C verze 08 je možné používat i nezávislý systém hlídání běhu programu (watchdog), který umí program spustit znovu od začatku, nedojde-li ze strany programu k pravidelnému nulování tohoto hlídače.


Historie

SDS-C bylo historicky uvedeno jako programovací jazyk, odvozený od FULL-C, který je odvozený od jazyka C.

První nasazení SDS-C bylo pro zařízení SDS MICRO LIGHT osazené pouze 2kB pamětí EEPROM (tolik let zpátky byly ceny pamětí jinde (dražší) než dnes).

Toto představilo úvodní omezení celého SDS-C jazyka, který se teprve postupně rozšiřoval - tak jak byly vydávány nové výrobky první řady SDS, s použitou větší pamětí pro program.

Je důležité si uvědomit původní podmínky, pro které byl SDS-C připravován - především to, že přeložený program se musel vejít do minimálního prostoru v malé EEPROM.

Nové SDS druhé řady (jako je SDS-BIG nebo SDS-STSW) už nabízejí pokročilou verzi FULL-C, která nemá jakékoliv z těchto omezení. Podle toho, jaké zařízení si zakoupíte, pak budete používat buď SDS-C nebo FULL-C.


Verze

SDS-C je nasazeno na výrobcích SDS První Produktové Řady.

Postupně jsou možnosti SDS-C rozšiřovány, především na základě konkrétních požadavků uživatelů a nahlášených chyb (vše zadáváné přes forum).

V současné době je SDS-C již ve své šesté verzi. Zpětná kompatibilita zde je, tzn. programy ze starších verzí lze bez úpravy použít pro nové verze.

Problém nastává v opačném směru, kdy nové verze mají nové funkce a systémové proměnné, které se ve starších verzích nevyskytovaly.

Naštěstí je přechod na novou verzi SDS-C pouze otázkou update firmware, který je v nejnovější verzi k dispozici zadarmo na této WiKi.


Existující verze:

verze 01 první verze, vydáno 2.6.2010, zastaralá verze
verze 02 druhá verze, vydáno koncem roku 2010, zastaralá verze
verze 03 třetí verze, vydáno konecem února 2011, zastaralá verze
verze 04 čtvrtá verze, vydáno na začátku června 2011, zastaralá verze
verze 05 pátá verze, vydáno v listopadu 2011, zastaralá verze
verze 06 šestá verze, od března 2012, dostává průběžně další doplňky, zastaralá verze
verze 07 sedmá verze, od července 2017, zvýšený maximální počet použitelných prvků programu, zastaralá verze
verze 08 osmá verze, od prosince 2018, nové SDS-C funkce, zastaralá verze
verze 09 osmá verze, od července 2020, nové SDS-C funkce, aktuální verze


Spolu s novým firmware je potřeba vždy použít nový překladač/simulátor/uploader, který je ke stáhnutí ze stejné stránky jako nový firmware.

Program v SDS-C lze spustit jen na stejné nebo novější verzi, v jaké byl konkrétní program napsán - tzn. program SDS-C fungující ve verzi např. 03 bude fungovat i pro 04, 05, atd., ale už ne pro 01 nebo 02.


Popis jazyka SDS-C

Tento jazyk je odvozen od ANSI C, přičemž došlo k řadě významných zjednodušení.

Cílem je bezpečný, nepřerušený chod programu na embedded zařízení. Nejdůležitějším omezením je velikost volné paměti, určené pro uchování definice programu.

Program je provozován kompletně na staticky alokované paměti, nepracuje se s dynamickými daty - takže se nemá co pokazit.

Nepoužívá se dynamický zásobník, pouze statický s pevným počtem úrovní, s kontrolou na podtečení (nejdříve kontrola úrovně, pak provedení kroku), a nepředávají se údaje (lze použít pouze globální proměnné).

Program je ze zadání (textová forma) přeložen do interního pseudokódu (tj. strojové instrukce), a není tedy pomalu vykonáván algoritmickým interpretrem (tj. žádné zásobníkové rozklady operátorů apod.).

Poznámka: naopak FULL-C poskytuje všechny tyto vlastnosti jazyka C, které jsou v SDS-C odebrány (z důvodů zjednodušení a z důvodu aby se program "vlezl" do hardware které je k dispozici).

Omezení a poznámky pro SDS-C programy:

  • lze použít jen globální proměnné, všechny proměnné jsou globální, i ty definované uvnitř funkcí !!!
  • funkce jsou definovány vždy jako void (tj. nevracejí hodnotu, ani nemají vstupní proměnné, použijte globální proměnné)
  • zápis (deklarace) funkce je jen pomocí názvu funkce, bez parametrů - automaticky je předpokládáno (void)
  • funkce tedy nevracejí hodnotu a nepřebírají parametry (ve FULL-C: void funkce(void) { ... }; se v SDS-C píše: funkce { ... };
  • funkce se volají jen svým názvem, např. mojefunkce(); (nezapomeňte na závorky (), i když nepředáváte jakékoliv parametry)
  • názvy návěstí (pro goto skoky) musí začínat písmenkem, a mohou být (pro přehlednost) uvedeny klíčovým slovem label (ale nemusí !)
  • jediné povolené proměnná typu "pole" jsou: sys[] (reflektuje fyzický stav zařízení, navíc jako parametr lze zapsat jen přímo číslo) a ram[] a text[].
  • pro IF je možné použít podbloky kódu ohraničené { a } (pouze pro výsledky IF, viz detaily)
  • podmínky lze testovat pomocí if, s běžným C zápisem, vykonány jsou vždy všechny podmínky (nezkracuje se test !)
  • cyklus for není k dispozici (realizaci proveďte pomocí if a skoků)
  • cyklus while není k dispozici (opět - lze nahradit návěstím a if)
  • všechny proměnné jsou typu signed 32-bit (tj. v rozsahu -2147483647 až +2147483648)
  • všechny proměnné musí být deklarovány (příklad: var i,j;) předtím než se někde v programu použijí
  • řetězce lze použít jen jako konstanty (pevné vstupy do funkcí), nebo si lze pomoct pomocí pole text[]
  • řetězce se uvozují jednoduchou čárkou ' (oproti znaku uvozovky " který je použit ve FULL-C)

VERZE 03: NOVINKY

  • možnost použít #define, název musí být velkými písmeny, možnosti viz příklady (pozor #define je pouze jednoúrovňový)
  • možnost zápisu čísel v binárním tvaru, např. 0b10101010 což odpovídá dekadickému číslu 170
  • pozn. samozřejmě můžete použít i zápis v hexadecimálním tvaru (např. 0x31)
  • label lze zapsat pouze jako name: , tj. bez předpony label jak to bylo vyžadováno ve starší verzi
  • parametrem pro index pole může být i uživatelská proměnná - příklad: sys[i] - doteď šlo použít jen číselnou konstantu (sys[64])
  • k dispozici je pole ram[], které slouží pro obecné účely (neuchovává se v pevné paměti, obsah nepřežije reset)
  • při zápisu programu použít podbloky ohraničené { a } pro výsledky IF - příklad: if (i==1) { a=2; b=3; } else { c = 4; };

VERZE 04: NOVINKY

  • rozšíření pole ram[] (více indexů - větší pole)
  • rozšíření maximální možné velikosti programu (jak pro eeprom paměť, tak pro dataflash paměť)

VERZE 05: NOVINKY

  • přístup do data-flash paměti (info zde)

VERZE 06: NOVINKY

  • přidáno pole text[] (info zde)
  • (mimo SDS-C) možnost využít uživatelské webové stránky jako indexové stránky zařízení

VERZE 07: NOVINKY

  • zvětšen prostor pro některé prvky programu (např. velikosti polí)

VERZE 08: NOVINKY

  • přidány nové SDS-C funkce (druhá sériová linka, funkce itoa, itoh, wdg, textcmp, atd.)
  • přidáno pole share[] (info zde)

VERZE 09: NOVINKY

  • další SDS-C funkce


INFORMACE:

Systémové proměnné (sys[]) a funkce (např. odeslání emailu) pro SDS-C jsou vypsány zde.

POZOR: zařízení používající FULL-C mají jiné systémové proménné a jiné systémové funkce !

DOPORUČENÍ: Stáhněte si simulátor-debugger a naučte se programovat SDS-C na svém počítači, na základě vzorových programů které naleznete na této WiKi - nejlépe se naučíte používat SDS-C tak, že budete upravovat již existující ověřené programy.

DOTAZY? Napište je na naše fórum, budeme se jim věnovat.


Rychlost SDS-C

Detaily viz stránka: rychlost vykonávání SDS-C programu.


Jak pracovat s desetinnými čísly

Protože SDS-C podporuje pouze 32-bit signed long, musí se použít matematický trik.

Nejlepším příkladem je způsob prezentace teploty z teploměrů. Zařízení SDS předává tyto hodnoty do SDS-C vynásobené 100, čímž se dosahuje preciznosti na dvě desetinná místa (třetí a další místo z původní hodnoty je zahozeno).

Příklad: Teplota je 15.67°C, SDS-C tedy dostane hodnotu 1567. Pokud chcete číslo, které bylo původně před desetinnou tečkou, vydělíte to 100 (vše je celočíselné, takže dostanete 1567 / 100 = 15) a pokud chcete číslo, které bylo původně za desetinnou tečkou, použijte funkci modulo, tj. v našem příkladě 1567 % 100 = 67.

Pokud by jste chtěli větší preciznost, zvyšte počet nul v násobiči při vytváření čísla (místo např. 100 se dá 1000 pro třimístnou přesnost).

Dále pozor, pokud máte záporná čísla, tak je potřeba si uvědomit, že (příklad) -1234 / 100 = -12 a teď pozor: -1234 % 100 = -34 . Toto přináší nepříjemnost např. v případě zobrazování teplot, kdy vstupní údaj -1234 je při nepohlídání znaménka při převodu na text přepsán na "-12.-34" (místo "-12.34"). Řešení je snadné, stačí do programu doplnit hlídání záporného čísla a následně upravit znaménko u (původně desetinné) části. Taky pozor na nutnost ručního doplnění čísla nula při vypisování hodnoty za desetinnou tečkou, pokud je tato hodnota 0 až 9 (tj. menší než 10).


K čemu je SDS-C dobré?

Sami si uděláte přesně to, co potřebujete, tak, jak to potřebujete.

  • Home IoT
  • Industrial IoT
  • realizujte vlastní IP watchdog, s takovým chováním, jaké si přesně představujete
  • realizujte řízení klimatizace a vytápění
  • realizujte EZS/EPS zabezpečovací zařízení
  • realizujte vzdálený dohled s automatickým odesíláním alarmových zpráv (email, sms přes email, ...)
  • realizujte inteligentní řízení osvětlení
  • dohled nad záložními zdroji či jinými technologiemi
  • řízení VO v obci, včetně měření spotřeby, hlídání poruch, časování, dálkového ovládání
  • řízení topných kabelů podle venkovní teploty
  • řízení podle aktuálního odběru energie (využijte převodník PWM na 0-10V a ovládejte např. SSR)
  • malá domácí automatizace, využijte sběrnici RS485
  • odečty z elektroměrů se sběrnicí RS485
  • komunikace se střídači fotovoltaický elektráren, dohled a automatizace FVE
  • automatické odesílání údajů na centrální sběrné místo (na jakýkoliv server)
  • automatické krmítko
  • sběr dat z čidel - SDS jako internetová gateway
  • cokoliv co vás napadne a jste to schopni naprogramovat pomocí SDS-C
  • cokoliv s MQTT
  • komunikace s PLC a měřiči přes MODBUS

Výhodou je i možnost vzájemné komunikace zařízení SDS mezi sebou, a tím se dá vytvořit distribuovaná řídící soustava.

Dalším přínosem je možnost majitele zařízení SDS si do zařízení nahrát svou webovou stránku, kterou si celou sám vytvoří. Tato stránka může mít libovolný obsah a design. Praktické využití této funkce je v tom, že si můžete realizovat vlastní ovládací panel pro konkrétní aplikaci (příkladem, program v SDS-C bude řídit termostat, a na vlastní stránce bude možnost si změnit hodnotu cílové teploty, takže s výsledkem bude moct bez problémů pracovat i úplný laik).