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 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).


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.


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:

ReceiveSMS_fbd.st
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ě:


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.


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.


Tím se blok vloží do prostoru programu:


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:


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:


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.

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.