===== Příjem SMS ===== Funkční blok **receiveSMS** v základu **není určen pro** použití ve **FBD**, jelikož by se na zprávy dotazoval v každém cyklu programu. S patřičnou úpravou jej však ve FBD použít lze. Tento funkční blok nemá žádné vstupní proměnné, ale obsahuje 5 výstupů: * **channel:** proměnná typu string, obsahuje označení alarmového kanálu na kterém byla SMS přijata (pro případ více modemů) * **sender:** proměnná typu string, obsahuje telefonní číslo v mezinárodním formátu (tj. např. +420777666555) * **message:** proměnná typu string, obsahuje text samotné SMS zprávy * **receivetime:** proměnná typu DT, obsahuje čas, kdy byla zpráva přijata Posledním výstupem je výstup bez označení, který je typu integer a obsahuje číselný status s výsledkem operace. Více je popsno níže v textu (pro výstup result). ---- Jelikož je blok určen pouze pro použití v ST, je nutné pro jeho použití vytvořit vlastní funkční blok psaný v ST. To je možné pouze v **Plném módu** sestavy. Postup pro přepnutí do plného módu naleznete [[cs:sw:01-mervis:creating-new-project-hidden#prepnuti_do_plneho_modu|zde v úvodním článku]]. Pro příjem SMS vytvořte funkční blok kliknutím pravým tlačítkem myši na projekt (např. ve spustitelných projektech). {{ :cs:sw:01-mervis:sms_ide13.png?direct |}} ---- Zobrazí se dialogové okno, zde vyberte/vložte: * **Název:** ReceiveSMS_fbd * **Typ:** FunctionBlock * **Jazyk:** st * **Jmenný prostor:** v0_0 a potvďte kliknutím na OK. {{ :cs:sw:01-mervis:sms_ide14.png?nolink |}} ---- Otevře se Vám okno se základní kostrou funkčního bloku. Veškerý obsah bloku smažte a nahraďtě následujícím kódem: NAMESPACE v0_0 FUNCTION_BLOCK ReceiveSMS_fbd VAR trigger : R_TRIG; readPulse : bool := 0; END_VAR VAR_INPUT readSMS : bool := 0; END_VAR VAR_OUTPUT result : int := 31; sms_channel : string := ""; sender : string := ""; message : string := ""; receive_time : dt := dt#0001-01-01-00:00:00; END_VAR trigger(CLK:=readSMS,Q=>readPulse); IF readPulse THEN result := MESSAGING.RECEIVESMS( CHANNEL => sms_channel, SENDER => sender, MESSAGE => message, RECEIVETIME => receive_time ); END_IF; END_FUNCTION_BLOCK END_NAMESPACE Výsledek by měl vypadat následovně: {{ :cs:sw:01-mervis:sms_ide15.png?direct |}} ---- Okno funkčního bloku nyní můžete zavřít, následně sestavu uložte a kompilujte. Poté otevřete **main.program.fbd** a klikněte pravým talčítkém myši do prázdného prostoru a z kontextové nabídky zvolte: **Přidat blok knihovny -> Přidat blok knihovny**. {{ :cs:sw:01-mervis:sms_ide16.png?direct |}} ---- Otevře se dialogové okno pro vyhledávání funkcí a funkčních bloků. Do pole **Název** zadejte název bloku: //ReceiveSMS_fbd//, označte jej a klikněte na OK. {{ :cs:sw:01-mervis:sms_ide17.png?direct |}} ---- Tím se blok vloží do prostoru programu: {{ :cs:sw:01-mervis:sms_ide18.png?direct |}} ---- Nyní je třeba vytvořit několik testovacích proměnných. Nejprve vytvořte vstupní proměnnou **trigger** typu bool a jako její počáteční hodnotu zadejte **False**. Proměnnou propojte se vstupem **readSMS** bloku: {{ :cs:sw:01-mervis:sms_ide19.png?direct |}} ---- Dále vytvořte výstupní proměnné **channel**, **sender** a **message**, všechny jsou typu string. Jako poslední vytvořte proměnnou **receivetime** typu DT. Jelikož jsou všechny proměnné výstupní, není nutné nastavovat jejich počáteční hodnoty. Na závěr je propojte s blokem. Výsledek by měl vypadat přibližně takto: {{ :cs:sw:01-mervis:sms_ide20.png?direct |}} ---- Nahrajte sestavu a spusťte ladění. Při každé změně hodnoty proměnné **trigger** z **False** na **True** se přečte jedna zpráva z paměti SIM karty. {{ :cs:sw:01-mervis:sms_ide21.png?direct |}} Výstup **result** bude mít hodnotu **0**, pokud přečtění zprávy proběhlo v pořádku a hodnotu **31**, pokud není k dispozici žádná zpráva. Ostatní hodnoty indikují chybu, více se dozvíte v nápovědě (klávesa F1) k funkčnímu bloku **receivesms**.