Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • viteks/nsi-lectures
1 result
Show changes
Commits on Source (5)
Showing
with 1269 additions and 0 deletions
lec05/figs/GPIO.jpg

119 KiB

lec05/figs/Raspberry-Pi-Pico-rp2040-core-block-diagram-scaled.jpg

237 KiB

lec05/figs/Sequential-Code-Execution.webp

21.9 KiB

lec05/figs/clock_tree.png

126 KiB

lec05/figs/cortex.jpg

179 KiB

File added
lec05/figs/iot-12.png

277 KiB

lec05/figs/pico_addresses.png

42.6 KiB

lec05/figs/pico_pinout.png

182 KiB

lec05/figs/pio-diagram.jpg

49.5 KiB

lec05/figs/state-machine.jpg

77.6 KiB

---
marp: true
paginate: true
style: |
img[alt~="right"] {
position: relative;
top: -120px;
float: right;
}
img[alt~="center"] {
display: block;
margin: 0 auto;
padding-top: 20px;
}
section{
}
strong {color: #455a64; font-weight: 600;}
div.twocols {
margin-top: 35px;
column-count: 2;
}
div.twocols p:first-child,
div.twocols h1:first-child,
div.twocols h2:first-child,
div.twocols ul:first-child,
div.twocols ul li:first-child,
div.twocols ul li p:first-child {
margin-top: 0 !important;
}
div.twocols p.break {
break-before: column;
margin-top: 0;
}
---
<!-- _paginate: false -->
# Návrh systémů IoT
## 5. IoT zařízení, Raspberry Pi Pico.
Stanislav Vítek
Katedra radioelektroniky
České vysoké učení technické v Praze
---
# IoT zařízení
![height:450px center](figs/iot-12.png)
**Počítače:** k všeobecnému použití (general purpose) nebo dedikované
---
# Obecné procesory
* Programovatelné zařízení
* mikroprocesor
* mikrokontrolér
* Hlavní části
* Programová a datová paměť
* Obecná datová cesta
* Výbava registry
* Obecná ALU
* Aplikačně-specifické procesory (ASIC)
* Optimalizovaná datová cesta
* Speciální funkční bloky
---
# Dedikované procesory
* Jednoúčelový digitální obvod
* Hlavní části
* Komponenty nutné k provádějí jednoho programu
* Nemá programovou paměť
* Výhody
* Malý
* Rychlý
* Nízká spotřeba
---
# Vestavné systémy
* Dedikovaná funkcionalita
* Provoz v reálném čase
* Malé rozměry a nízká hmotnost
* Nízká spotřeba energie
* Drsné prostředí
* Provoz kritický z hlediska bezpečnosti
* Cenově výhodné
---
# Raspberry Pi Pico
* Všechny předchozí desky Raspberry Pi, jako například Raspberry Pi 3 Model B+, Raspberry Pi 4 Model B nebo menší Raspberry Pi Zero, byly vybaveny procesory Broadcom (BCM2835, BCM2836, BCM2711 atd.).
* Raspberry Pi Pico je vybaven RP2040, což je mikrokontrolér navržený Raspberry Pi, první vlastní procesor od Raspberry Pi Foundation.
* RP2040 je založen na dvou jádrech ARM Cortex-M0+ s taktovací frekvencí až 133 MHz a je vyráběn 40 nm technologií.
* MCU RP2040 má také port MicroPython a zavaděč UF2 v paměti ROM pro snadné nahrání programu.
---
![ h:700px center](figs/pico_pinout.png)
---
# Raspberry Pi Pico
* Mikrokontrolér RP2040
* 2 MB paměti SPI Flash
* Port Micro-USB typu B pro napájení a programování
* 40 vstupních a výstupních pinů typu DIP s okrajovým zalisováním
* 3pinové rozhraní ARM pro sériové ladění (SWD)
* 12 MHz krystalový oscilátor
* Tlačítko pro výběr bootování
* Jedna uživatelská LED dioda (připojená ke GPIO 25, na modelu **W** k wi-fi řadiči)
* 3,3V Buck-Boost SMPS převodník
---
# Mikrokontrolér RP2040
* Dvě jádra ARM Cortex-M0+
* Taktovací frekvence až 133 MHz
* 264 KB vestavěné paměti SRAM
* 30 pinů GPIO
* Až 16 MB paměti Flash mimo čip
* Čtyřkanálový ADC s 12bitovým rozlišením
* Programovatelné IO (PIO)
* Další periferie - 2x UART, 2x SPI řadič, 2x I2C řadič, 16 PWM kanálů, USB 1.1 řadič
---
![h:700px center](figs/Raspberry-Pi-Pico-rp2040-core-block-diagram-scaled.jpg)
---
# ARM Cortex-M0+
* Komunikační rozhraní jádra
* Externní AHB-Lite interface -> busfabric
* Debug Access Port (DAP)
* Single-cycle I/O Port -> [SIO periferie](https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf#section_sio)
* Konfigurace jádra
* 32bitový, Little Endian, 8 MPU (Memory Protection Unit)
* Podpora ladění (2 drátové rozhraní SWD)
* 26 ext. přerušení, 34 WIC (Wake-up Interrupt Controller)
* Všechny registry resetovány po restartu
---
# ARM Cortex-M0+ architektura
![height:500px center](figs/cortex.jpg)
---
# Zdroje hodinového kmitočtu
### clk_ref
* Interní Ring Oscilator (ROSC), může být přepnutý na externí krystalový (XOSC)
* 6-12MHz
### clk_sys
* Během reset napájen z clk_ref, pak většinou přepnutý na PLL
* 125MHz
### clk_peri
* Typicky napájen z clk_sys, ale umožńuje periferiím být nezávislé (clk_sys je možné softwarově změnit)
* 12-125MHz
---
# Zdroje hodinového kmitočtu
### clk_usb, clk_adc
* Referenční hodiny pro USB a ADC
* 48MHz
### clk_rtc
* RTC dělí knitočet pro získání 1s reference
* 46875Hz
<br>
Další podrobnosti v [dokumentaci](https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf#reg-clocks-CLK_SYS_CTRL).
---
![height:700px center](figs/clock_tree.png)
---
# Paměť
![h:550px center](figs/pico_addresses.png)
---
# PIO
* Implementuje řadu protokolů na HW úrovni
* Může pracovat nezávisle na CPU
* Každý RP2040 má dvě PIO instance
![bg h:700px right:65%](figs/GPIO.jpg)
---
# PIO State machine
* Každý PIO má 4 **stavové stroje**. Tyto stavové stroje fungují jako malé, velmi omezené procesory schopné spouštět instrukce, které se nacházejí ve sdílené paměti instrukcí.
* Paměť instrukcí může pojmout celkem až **32 instrukcí**. Každý stavový stroj však může čerpat instrukce odkudkoli z této paměti.
* Můžete například vytvořit 4 samostatné programy, každý s 8 instrukcemi, které se spustí samostatně na stavových strojích. Případně můžete mít jeden program s 16 instrukcemi, který poběží na všech 4 stavových strojích (a zbylých 16 míst pro instrukce nebude dělat nic).
---
# PIO State machine
* Každý stavový stroj má přístup ke 2 FIFO, které můžete použít k odesílání a přijímání dat do/z hlavního procesoru
* Ve výchozím nastavení je jedna FIFO určena pro odchozí data a druhá pro data příchozí.
* Lze je však nastavit tak, aby se obě používaly pro odchozí nebo obě pro příchozí data, pokud by bylo třeba zdvojnásobit velikost vyrovnávací paměti.
![bg h:380px right:50%](figs/state-machine.jpg)
---
# PIO State machine
* Kromě toho má každý stavový stroj přístup ke sdílené bance 8 příznaků přerušení. Ty mají různé využití, například pro synchronizaci stavových strojů nebo upozornění procesoru, že jsou některá data připravena ke spotřebování.
* A konečně, každý stavový stroj může ovládat kterýkoli z 32 pinů GPIO RP2040. Aby však stavový stroj mohl ovládat skupinu pinů, musí být tyto piny seskupeny do souvislé sady.
* Každý stavový stroj (nezapomeňte: v RP2040 je celkem 8 stavových strojů - 4 v každém PIO) se skládá ze sady registrů a určité řídicí logiky.
---
# Micropython
* https://docs.micropython.org/en/latest/rp2/general.html
* https://docs.micropython.org/en/latest/rp2/tutorial/intro.html
<br>
<hr>
Micropython není jedinou implementací Pythonu pro mikrokontroléry
* [CircuitPython](https://circuitpython.org/), derivát Micropythonu, udržuje Adafruit, [rozdíly](https://github.com/adafruit/circuitpython#differences-from-micropython)
* MicroPython pro [BBC micro:bit](https://python.microbit.org/v/3)
---
# Obecná kontrola RPi
## Modul [machine](https://docs.micropython.org/en/latest/library/machine.html#module-machine)
* Abstraktní vrstva pro komunikaci s HW (shodná pro více kontrolérů)
```python
import machine
machine.freq() # get the current frequency of the CPU
machine.freq(240000000) # set the CPU frequency to 240 MHz
```
## Modul [rp2](https://docs.micropython.org/en/latest/library/rp2.html#module-rp2)
* funkcionalita specifická pro RP2040
```python
import rp2
```
---
# Modul machine
* Modul obsahuje specifické funkce související s hardwarem na konkrétní desce.
* Většina funkcí modulu umožňuje přímý a neomezený přístup k hardwarovým blokům systému (jako je procesor, časovače, sběrnice atd.) a jejich ovládání.
* Při nesprávném použití může dojít k poruše, zablokování, v krajním případě i k poškození hardwaru.
* Na vhodném hardwaru nabízí MicroPython možnost psát obsluhy přerušení v jazyce Python. Obsluhy přerušení - známé také jako rutiny obsluhy přerušení (ISR) - jsou definovány jako [callback funkce](https://docs.micropython.org/en/latest/reference/isr_rules.html#isr-rules). Ty se provádějí v reakci na událost, jako je spuštění časovače nebo změna napětí na pinu.
---
# Přístup do paměti
* Modul definuje tři objekty pro přímý přístup do paměti
### machine.mem8
* Zápis/čtení 8 bitů paměti
### machine.mem16
* Zápis/čtení 16 bitů paměti
### machine.mem32
* Zápis/čtení 32 bitů paměti
---
# Příklad přístup do paměti
* Příklad specifický pro platformu **STM32**
```python
import machine
from micropython import const
GPIOA = const(0x48000000)
GPIO_BSRR = const(0x18)
GPIO_IDR = const(0x10)
# set PA2 high
machine.mem32[GPIOA + GPIO_BSRR] = 1 << 2
# read PA3
value = (machine.mem32[GPIOA + GPIO_IDR] >> 3) & 1
```
---
# Reset zařízení 1/2
### machine.reset()
* Reset zařízení se stejným efektem jako externím Reset signálem
### machine.soft_reset()
* Soft reset interpretu, odstraní všechny objekty Pythonu a resetuje haldu Pythonu.
* Pokusí se zachovat způsob, kterým je uživatel připojen k MicroPython REPL (např. sériový, USB, Wifi).
### machine.reset_cause()
* Vrátí příčinu resetu
* Příčinu popisují [konstanty](https://docs.micropython.org/en/latest/library/machine.html#machine-constants)
---
# Reset zařízení 2/2
### machine.bootloader([value])
* Resetuje zařízení a vstoupí do jeho zavaděče.
* Obvykle se používá k uvedení zařízení do stavu, kdy je možné naprogramovat nový firmware.
* Některé porty podporují předání volitelného argumentu value, který může řídit, do kterého zavaděče se má vstoupit nebo co se mu má předat.
---
# Přerušení
* Přerušení zpracovávají části softwaru nazývané Interrupt Service Routine(ISR).
* Když dojde k přerušení, procesor začne provádět kód v rámci této rutiny.
* Po dokončení úkolu v rutině pokračuje procesor ve vykonávání kódu od místa, kde skončil.
![bg right:55% height:500px](figs/Sequential-Code-Execution.webp)
---
# Přerušení
* přerušení lze zakázat (vypnout) a opětovně povolit.
* Některé subsystémy vyžadují přerušení ke správnému fungování, takže jejich dlouhodobé vypnutí může ohrozit funkčnost jádra (např. watchdog).
* Přerušení by měla být zakázána pouze na minimální dobu a poté opět povolena do předchozího stavu.
```python
import machine
# Disable interrupts
state = machine.disable_irq()
# Do a small amount of time-critical work here
# Enable interrupts
machine.enable_irq(state)
```
---
# Přerušení
### machine.disable_irq()
* Zakáže požadavky na přerušení.
* Vrací předchozí stav IRQ, který by měl být považován za neprůhlednou hodnotu.
* Tato návratová hodnota by měla být předána funkci enable_irq() pro obnovení přerušení do původního stavu před voláním disable_irq().
### machine.enable_irq(state)
* Znovu povolí požadavky na přerušení.
* Parametrem state by měla být hodnota, která byla vrácena z posledního volání funkce disable_irq().
---
# Napájení
### machine.freq([Hz])
* Vrací frekvenci procesoru v Hz. Na některých portech lze tuto funkci použít také k nastavení frekvence procesoru zadáním Hz.
### machine.idle()
* Zastaví takt procesoru, což je užitečné pro snížení spotřeby energie kdykoli během krátkých nebo dlouhých období.
* Periferie pokračují v práci a provádění se obnoví, jakmile je vyvoláno jakékoli přerušení (na mnoha portech to zahrnuje přerušení systémového časovače, ke kterému dochází v pravidelných intervalech v řádu milisekund).
---
# Napájení
### machine.lightsleep([time_ms])
### machine.deepsleep([time_ms])
* Zastaví provádění programu a pokusí se o přechod do stavu nízké spotřeby.
* Pokud je zadáno **time_ms**, bude to maximální doba v milisekundách, po kterou bude uspání trvat. Jinak může uspání trvat neomezeně dlouho.
* S časovým limitem nebo bez něj se může provádění programu kdykoli obnovit, pokud dojde k událostem, které vyžadují zpracování. Takové události nebo zdroje probuzení by měly být nakonfigurovány před uspáním, jako je změna pinu nebo časový limit RTC.
---
# Napájení 3/4
Přesné chování a možnosti úspory energie u režimů **lightsleep** a **deepsleep** jsou velmi závislé na základním hardwaru, ale obecné vlastnosti jsou následující:
* **lightsleep** zachovává RAM a stav.
* Po probuzení se pokračuje v provádění od bodu, kde byl požadován spánek, všechny subsystémy jsou funkční.
* **deepsleep** nesmí zachovat paměť RAM ani žádný jiný stav systému (např. periferie nebo síťová rozhraní).
* Po probuzení je provádění obnoveno z hlavního skriptu, podobně jako při tvrdém nebo zapnutém resetu.
* Funkce reset_cause() vrátí hodnotu machine.DEEPSLEEP, kterou lze použít k rozlišení probuzení v hlubokém spánku od jiných resetů.
---
# Napájení 4/4
### machine.wake_reason()
* Vrací důvod probuzení ze spánku
* Zdroj popisují [konstanty](https://docs.micropython.org/en/latest/library/machine.html#machine-constants)
## Další funkce
Další užitečné funkce jsou shrnuty na této [stránce](https://docs.micropython.org/en/latest/library/machine.html#miscellaneous-functions).
---
# Časovač
* Periferie systémového časovače RP2040 poskytuje globální mikrosekundovou časovou základnu a generuje pro ni přerušení.
* Současně je k dispozici softwarový časovač, kterých je k dispozici neomezený počet (pokud to paměť dovolí).
* Časovač je popsán třídou [machine.Timer](https://docs.micropython.org/en/latest/library/machine.Timer.html#machine.Timer)
```python
from machine import Timer
tim = Timer(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(1))
tim.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(2))
```
---
# GPIO
* GPIO popisuje třída [machine.Pin](https://docs.micropython.org/en/latest/library/machine.Pin.html#machine-pin)
```python
from machine import Pin
p0 = Pin(0, Pin.OUT) # create output pin on GPIO0
p0.on() # set pin to "on" (high) level
p0.off() # set pin to "off" (low) level
p0.value(1) # set pin to on/high
p2 = Pin(2, Pin.IN) # create input pin on GPIO2
print(p2.value()) # get value, 0 or 1
p4 = Pin(4, Pin.IN, Pin.PULL_UP) # enable internal pull-up resistor
p5 = Pin(5, Pin.OUT, value=1) # set pin high on creation
```
---
# GPIO s přerušením
```python
import time
from machine import Pin
pin_button = Pin(14, mode=Pin.IN, pull=Pin.PULL_UP)
pin_led = Pin(16, mode=Pin.OUT)
def button_isr(pin):
pin_led.value(not pin_led.value())
pin_button.irq(trigger=Pin.IRQ_FALLING, handler=button_isr)
while True:
...
```
---
# ADC
* ADC je popsán třídou [machine.ADC](https://docs.micropython.org/en/latest/library/machine.ADC.html)
```python
from machine import ADC
import utime
sensor_temp = ADC(4)
conversion_factor = 3.3 / (65535)
while True:
reading = sensor_temp.read_u16() * conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
print(temperature)
utime.sleep(2)
```
---
# UART
* UART je popsán třídou [machine.UART](https://docs.micropython.org/en/latest/library/machine.UART.html)
* RP2040 má dvě UART periférie (UART0 a UART1)
* Programovatelná délka dat (5-8 bitů) a počtu stop bitů (1 nebo 2)
* FIFO v obou směrech až 32 bytů
* Přerušením lze sledovat příchod nebo odchod dat, status zařízení, chybu komunikace nebo timeout příjmu dat
* Obě zařízení lze konfigurovat na různých dvojicích TX a RX pinů
* UART0: GP0-GP1, GP12-GP13, GP16-GP17
* UART1: GP4-GP5, GP8-GP9
---
# UART
```python
from machine import Pin, UART
import time
uart = UART(1, baudrate=9600, tx=Pin(4), rx=Pin(5))
uart.init(bits=8, parity=None, stop=2)
led = Pin("LED", Pin.OUT)
while True:
uart.write('t')
if uart.any():
data = uart.read()
if data== b'm':
led.toggle()
time.sleep(1)
```
---
# PIO
* PIO MCU RP2040 je požné i v rámci Micropythonu programovat na nižší úrovni
* PIO assembler: JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, a SET
* instrukce jsou zaměřené na manipulaci s bity
* trvají právě jeden strojový cyklus
* neimplementují žádné aritmetické operace
* jediná logická operace je přesun s bitovým doplňkem
* Modul [rp2](https://github.com/micropython/micropython/blob/master/ports/rp2/modules/rp2.py) implementuje wrapper pro instrukce v assembleru
* Např. funkce **set()** vytváří wrapper pro instrukcí **SET**, která přepíná stav GPIO pinu nezávisle na hlavním procesoru.
* Příklady na [gihub.com](https://github.com/raspberrypi/pico-micropython-examples/tree/master/pio)
---
# PIO
* Instrukce jsou vysoce optimalizovány na následující operace
* pro serializaci a deserializaci proudů bitů do/ze slov,
* posun slov do FIFO a vybírání slov z FIFO.
* Kromě lze vložit instrukce z externích zdrojů k provedení v libovolném hodinovém cyklu.
* Každá instrukce má navíc vyhrazeno několik bitů pro postranní nastavení (side-set) a/nebo zpoždění instrukce.
* Side-set umožňuje další přímou manipulaci s bity na pinech GPIO a provádí se paralelně a nezávisle na vlastní instrukci.
---
# Příklad - generování obdélníkového signálu
* Cílem je vygenerovat signál na pinu 28
* Stavový stroj pracuje na frekvenci **clk_sys** - 125 MHz
* Každá instrukce trvá právě jeden hodinový takt, lze prodloužit na 32 (1+31)
* 32 cyklů trvá 256 ns -> frekvence signálu bude 1.953 MHz
```python
import time
import rp2
from machine import Pin
@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW)
def blink():
wrap_target()
set(pins, 1) [31]
set(pins, 0) [31]
wrap()
sm = rp2.StateMachine(0, blink, set_base=Pin(28))
sm.active(1)
```
---
# Příklad - generování obdélníkového signálu
* Program pro PIO je implementován ve funkci **blink()**
* Pro použití s PIO je třeba použít dekorátor **@rp2.asm_pio**
* Parametry dekorátoru jsou např. nastavení pinu a FIFO
* Funkce **wrap()** a **wrap_target()** označujcí začátek kódu pro state machine, umožňují realizovat automaticky cyklus bez použití instrukce **JMP**
* Frekvenci signálu lze měnit
* změnou délky trvání instrukce
* změnou frekcence stavového stroje
```python
sm = rp2.StateMachine(0, blink, freq=2500,set_base=Pin(28))
```
lec06/figs/SPI-protocol-wiring-one-master-multiple-slave.jpg

29.4 KiB

lec06/figs/i2c-protocol-wiring-multiple-master-multiple-slave.jpg

17.8 KiB

lec06/figs/iot-1.png

75.6 KiB

File added
lec06/figs/iot-15.png

74.9 KiB

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg2"
xml:space="preserve"
width="933.52386"
height="429.5238"
viewBox="0 0 933.52386 429.5238"
sodipodi:docname="iot-15.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs6"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath20"><path
d="M 0,2.02 H 308.125 V 322.27 H 0 Z"
id="path18" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath30"><path
d="M 0,0 H 701 V 323 H 0 Z"
id="path28" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath72"><path
d="M 392.02,0 H 700.27 V 320.125 H 392.02 Z"
id="path70" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath82"><path
d="M 0,0 H 701 V 323 H 0 Z"
id="path80" /></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1404"
inkscape:window-height="480"
id="namedview4"
showgrid="false"
inkscape:zoom="1.4729136"
inkscape:cx="466.76193"
inkscape:cy="214.7619"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="g10" /><g
id="g10"
inkscape:groupmode="layer"
inkscape:label="iot-15"
transform="matrix(1.3333333,0,0,1.3333333,0,6.738095e-6)"><g
id="g12" /><g
id="g14"><g
id="g16"
clip-path="url(#clipPath20)"><g
id="g22"><g
id="g24"><g
id="g26"
clip-path="url(#clipPath30)"><g
id="g32"><g
id="g34"><path
d="M 0.625,162.145 C 0.625,74.121 69.293,2.77 154,2.77 238.707,2.77 307.375,74.121 307.375,162.145 307.375,250.164 238.707,321.52 154,321.52 69.293,321.52 0.625,250.164 0.625,162.145 Z"
style="fill:#99ff99;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path36" /></g><g
id="g38"><path
d="m 49.375,162.145 c 0,-57.372 46.676,-103.875 104.25,-103.875 57.574,0 104.25,46.503 104.25,103.875 0,57.367 -46.676,103.875 -104.25,103.875 -57.574,0 -104.25,-46.508 -104.25,-103.875 z"
style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path40" /></g><g
id="g42"><path
d="m 89.125,162.145 c 0,-33.348 28.879,-60.375 64.5,-60.375 35.621,0 64.5,27.027 64.5,60.375 0,33.343 -28.879,60.375 -64.5,60.375 -35.621,0 -64.5,-27.032 -64.5,-60.375 z"
style="fill:#800080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path44" /></g><text
transform="translate(113.25025,171.51787)"
style="font-variant:normal;font-weight:normal;font-size:22.5px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text50"><tspan
x="0 14.0175 24.795 32.310001 44.122501 59.939999 70.717499 78.254997"
y="0"
sodipodi:role="line"
id="tspan46">Hardware</tspan><tspan
x="0 14.895 26.7075 37.889999 45.247501"
y="-77.249992"
sodipodi:role="line"
id="tspan48">Opera</tspan></text><text
transform="translate(169.07275,94.267882)"
style="font-variant:normal;font-weight:normal;font-size:22.5px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text54"><tspan
x="0"
y="0"
id="tspan52"></tspan></text><text
transform="translate(181.60525,94.267882)"
style="font-variant:normal;font-weight:normal;font-size:22.5px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text60"><tspan
x="0 11.8125"
y="0"
sodipodi:role="line"
id="tspan56">ng</tspan><tspan
x="-60.542484 -50.484982 -40.517483 -31.989983 -24.699982 -13.517483"
y="152.25002"
sodipodi:role="line"
id="tspan58">System</tspan></text><text
transform="translate(89.500226,50.767877)"
style="font-variant:normal;font-weight:normal;font-size:22.5px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text64"><tspan
x="0 14.4225 23.219999 34.4025 42.232498 47.317501 58.927502 66.397499 78.254997 88.830002 96.1875 106.965 124.92"
y="0"
sodipodi:role="line"
id="tspan62">User Programs</tspan></text></g></g></g></g></g></g><g
id="g66"><g
id="g68"
clip-path="url(#clipPath72)"><g
id="g74"><g
id="g76"><g
id="g78"
clip-path="url(#clipPath82)"><g
id="g84"><g
id="g86"><path
d="M 392.77,160 C 392.77,71.98 461.438,0.625 546.145,0.625 630.848,0.625 699.52,71.98 699.52,160 c 0,88.02 -68.672,159.375 -153.375,159.375 C 461.438,319.375 392.77,248.02 392.77,160 Z"
style="fill:#99ff99;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path88" /></g><g
id="g90"><path
d="m 481.27,160 c 0,-33.344 28.875,-60.375 64.5,-60.375 35.621,0 64.5,27.031 64.5,60.375 0,33.344 -28.879,60.375 -64.5,60.375 -35.625,0 -64.5,-27.031 -64.5,-60.375 z"
style="fill:#800080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path92" /></g><text
transform="translate(501.95511,169.375)"
style="font-variant:normal;font-weight:normal;font-size:22.5px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text96"><tspan
x="0 14.0175 24.795 32.310001 44.122501 59.939999 70.717499 78.254997"
y="0"
sodipodi:role="line"
id="tspan94">Hardware</tspan></text><text
transform="translate(454.76759,92.125)"
style="font-variant:normal;font-weight:normal;font-size:22.5px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text100"><tspan
x="0 5.6475 17.459999 26.955 32.107498 43.919998 55.732498 60.884998 72.697502 83.272499 88.357498 103.2525 115.065 126.2475 133.605"
y="0"
sodipodi:role="line"
id="tspan98">Including Opera</tspan></text><text
transform="translate(598.94759,92.125)"
style="font-variant:normal;font-weight:normal;font-size:22.5px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text104"><tspan
x="0"
y="0"
id="tspan102"></tspan></text><text
transform="translate(611.48009,92.125)"
style="font-variant:normal;font-weight:normal;font-size:22.5px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text112"><tspan
x="0 11.8125"
y="0"
sodipodi:role="line"
id="tspan106">ng</tspan><tspan
x="-159.99367 -149.93617 -139.96867 -131.44118 -124.15118 -112.96867 -95.013672 -89.928673 -77.936172 -66.078674 -48.123676 -36.311176 -24.453674 -12.641175 -1.458675 10.128825 17.643826"
y="164.25"
sodipodi:role="line"
id="tspan108">System Components</tspan><tspan
x="-129.83745 -115.41494 -106.61744 -95.434944 -87.604942 -82.519943 -70.909943 -63.439941 -51.582443 -41.007442 -33.649944 -22.872442"
y="-43.499992"
sodipodi:role="line"
id="tspan110">User Program</tspan></text></g></g></g></g></g></g></g></svg>
lec06/figs/iot-2.png

36.7 KiB

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="272.9819mm"
height="142.40416mm"
viewBox="0 0 272.9819 142.40416"
version="1.1"
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="iot-4.svg">
<defs
id="defs2">
<marker
style="overflow:visible"
id="marker1667"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#11ad0d;fill-opacity:1;fill-rule:evenodd;stroke:#11ad0d;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1665" />
</marker>
<marker
style="overflow:visible"
id="marker1581"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1579" />
</marker>
<marker
style="overflow:visible"
id="marker1507"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1505" />
</marker>
<marker
style="overflow:visible"
id="marker1455"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1453" />
</marker>
<marker
style="overflow:visible"
id="marker1407"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1405" />
</marker>
<marker
style="overflow:visible"
id="marker1367"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1365" />
</marker>
<marker
style="overflow:visible"
id="marker1333"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1331" />
</marker>
<marker
style="overflow:visible"
id="marker1311"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1309" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Mend"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Mend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.4,0,0,-0.4,-4,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1040" />
</marker>
<rect
x="185.20833"
y="127"
width="74.083336"
height="52.916668"
id="rect914" />
<rect
x="105.83333"
y="137.58333"
width="63.5"
height="37.041668"
id="rect908" />
<rect
x="179.91667"
y="132.29167"
width="68.791664"
height="52.916668"
id="rect902" />
<rect
x="31.75"
y="116.41667"
width="259.29166"
height="68.791664"
id="rect896" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.71"
inkscape:cx="359.37422"
inkscape:cy="357.08658"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid10"
originx="23.790576"
originy="-53.687509" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(23.790576,-53.68751)">
<rect
style="fill:none;stroke:#1831d6;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect12"
width="42.333332"
height="21.166666"
x="42.333332"
y="142.875" />
<text
xml:space="preserve"
style="font-size:9.87778px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="47.382172"
y="156.20235"
id="text839"><tspan
sodipodi:role="line"
id="tspan837"
x="47.382172"
y="156.20235"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87778px;font-family:Arial;-inkscape-font-specification:Arial;stroke-width:0.264583">senzor</tspan></text>
<rect
style="fill:none;stroke:#1831d6;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect12-8"
width="42.333332"
height="21.166666"
x="116.41666"
y="142.875" />
<text
xml:space="preserve"
style="font-size:9.87778px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="123.32585"
y="156.20235"
id="text839-7"><tspan
sodipodi:role="line"
id="tspan837-1"
x="123.32585"
y="156.20235"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87778px;font-family:Arial;-inkscape-font-specification:Arial;stroke-width:0.264583">objekt</tspan></text>
<rect
style="fill:none;stroke:#1831d6;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect12-8-6"
width="42.333332"
height="21.166666"
x="190.5"
y="-164.04167"
transform="scale(1,-1)" />
<text
xml:space="preserve"
id="text894"
style="font-size:10.5833px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect896);" />
<text
xml:space="preserve"
id="text900"
style="font-size:10.5833px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect902);" />
<text
xml:space="preserve"
id="text906"
style="font-size:10.5833px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect908);" />
<text
xml:space="preserve"
id="text912"
style="font-size:10.5833px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect914);" />
<rect
style="fill:none;stroke:#1831d6;stroke-width:0.866025;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect12-8-6-0"
width="31.749989"
height="21.166666"
x="195.79167"
y="84.666664" />
<text
xml:space="preserve"
style="font-size:9.87777px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="203.04532"
y="97.994011"
id="text839-7-6-3"><tspan
sodipodi:role="line"
id="tspan837-1-3-8"
x="203.04532"
y="97.994011"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87777px;font-family:Arial;-inkscape-font-specification:Arial;stroke-width:0.264583">D/A</tspan></text>
<rect
style="fill:none;stroke:#1831d6;stroke-width:0.866025;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect12-8-6-0-3"
width="31.75"
height="21.166666"
x="47.625"
y="100.54167" />
<text
xml:space="preserve"
style="font-size:9.87777px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="54.878651"
y="113.86902"
id="text839-7-6-3-6"><tspan
sodipodi:role="line"
id="tspan837-1-3-8-8"
x="54.878651"
y="113.86902"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87777px;font-family:Arial;-inkscape-font-specification:Arial;stroke-width:0.264583">A/D</tspan></text>
<rect
style="fill:none;stroke:#1831d6;stroke-width:0.866025;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect12-8-6-0-3-1"
width="31.75"
height="21.166666"
x="47.625"
y="68.791664" />
<text
xml:space="preserve"
style="font-size:9.87777px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="54.878651"
y="82.119011"
id="text839-7-6-3-6-3"><tspan
sodipodi:role="line"
id="tspan837-1-3-8-8-6"
x="54.878651"
y="82.119011"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87777px;font-family:Arial;-inkscape-font-specification:Arial;stroke-width:0.264583">A/D</tspan></text>
<rect
style="fill:none;stroke:#1831d6;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect981"
width="74.083336"
height="63.5"
x="100.54166"
y="63.499992" />
<text
xml:space="preserve"
style="font-size:9.87777px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="193.5751"
y="156.95511"
id="text839-7-1"><tspan
sodipodi:role="line"
id="tspan837-1-9"
x="193.5751"
y="156.95511"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.87777px;font-family:Arial;-inkscape-font-specification:Arial;stroke-width:0.264583">aktuátor</tspan></text>
<text
xml:space="preserve"
style="font-size:11.2889px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';letter-spacing:0px;word-spacing:0px;stroke-width:0.264583"
x="137.7735"
y="90.889046"
id="text839-7-2"><tspan
sodipodi:role="line"
id="tspan837-1-7"
x="137.7735"
y="90.889046"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.2889px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-anchor:middle;stroke-width:0.264583">řídicí</tspan><tspan
sodipodi:role="line"
x="137.7735"
y="105.36012"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.2889px;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;text-anchor:middle;stroke-width:0.264583"
id="tspan1015">systém</tspan></text>
<rect
style="fill:none;stroke:#f27460;stroke-width:0.966;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:3.864, 1.932;stroke-dashoffset:0;stroke-opacity:1"
id="rect1017"
width="222.25"
height="74.083328"
x="26.458332"
y="58.208332" />
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1333)"
d="M 211.66667,105.83333 V 142.875"
id="path1023" />
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1367)"
d="M 190.5,153.45833 H 158.75"
id="path1025" />
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1407)"
d="M 116.41667,153.45833 H 84.666667"
id="path1027" />
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
d="m 79.375,111.125 h 21.16667"
id="path1029" />
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1311)"
d="m 79.375,79.375 h 21.16667"
id="path1307" />
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1455)"
d="m 174.625,95.25 h 21.16667"
id="path1451" />
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1507)"
d="M 63.5,142.875 V 121.70833"
id="path1569" />
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1581)"
d="M 5.291668,79.375 H 47.625001"
id="path1577" />
<text
xml:space="preserve"
style="font-size:7.76111px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;stroke-width:0.264583"
x="102.47095"
y="176.42523"
id="text839-7-1-6"><tspan
sodipodi:role="line"
id="tspan837-1-9-5"
x="102.47095"
y="176.42523"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111px;font-family:Arial;-inkscape-font-specification:Arial;text-align:end;text-anchor:end;stroke-width:0.264583">externí</tspan><tspan
sodipodi:role="line"
x="102.47095"
y="186.37408"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111px;font-family:Arial;-inkscape-font-specification:Arial;text-align:end;text-anchor:end;stroke-width:0.264583"
id="tspan1661">vlivy</tspan></text>
<path
style="fill:none;stroke:#11ad0d;stroke-width:0.547723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1667)"
d="m 95.250001,190.5 c 26.458329,0 42.333329,0 42.333329,-26.45833"
id="path1663"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:7.7611px;line-height:1.25;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS';text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;stroke-width:0.264583"
x="22.574186"
y="64.927589"
id="text839-7-1-6-0"><tspan
sodipodi:role="line"
id="tspan837-1-9-5-8"
x="22.574186"
y="64.927589"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.7611px;font-family:Arial;-inkscape-font-specification:Arial;text-align:end;text-anchor:end;stroke-width:0.264583">referenční</tspan><tspan
sodipodi:role="line"
x="22.574186"
y="74.876434"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.7611px;font-family:Arial;-inkscape-font-specification:Arial;text-align:end;text-anchor:end;stroke-width:0.264583"
id="tspan1661-0">vstup</tspan></text>
</g>
</svg>