Skip to content

Dokumentace: Společné funkce

papouch.com edited this page Jun 15, 2018 · 7 revisions

Hlavní části této stránky:

Funkce popsané na této stránce jsou společné pro téměř všechna zařízení, která komunikují protokolem Spinel. Mohou nastat určité výjimky, ale spíše jen u zakázkových aplikací nebo úzce specializovaných zařízení.

Níže uvedené příklady používají objekt MyDevice tak, jak je definován v Základním příkladu použití. Funkce, které nejsou v knihovně implementovány můžete snadno sestavit pomocí této funkce SendAndReceive().

Verze a sériové číslo

CmdGetInfo() - čtení verze zařízení

Deklarace:

public bool CmdGetInfo(out SpinelDeviceVersion version);

Příklad:

if (MyDevice.CmdGetInfo(out SpinelDeviceVersion ver))
    Console.WriteLine($"Description: {ver.Description}\nProductId: {ver.ProductId}\nHardwareId: {ver.HardwareId}\nFirmwareId: {ver.SoftwareId}");
else
    Console.WriteLine("CmdGetInfo: Error");

Výstup:

Description: Quido ETH 4/4
ProductId: 254
HardwareId: 3
SoftwareId: 35

CmdGetSN() - čtení sériového čísla

Deklarace:

public bool CmdGetSN(out SpinelDeviceSN dev_sn);

Příklad:

if (MyDevice.CmdGetSN(out SpinelDeviceSN sn) && sn.Valid)
    Console.WriteLine($"S/N: {sn.SerialNumber}\nType: {sn.DeviceType}\nFactory data: {sn.FactoryData}");
else
    Console.WriteLine("CmdGetSN: Error");

Výstup:

S/N: 254
Type: 3569
Factory data: 538444585

Status zařízení

Status je uživatelsky definované číslo, které lze využít k zjištění stavu přístroje. Po zapnutí přístroje, nebo po resetu (i softwarovém) je automaticky nastaven status 0x00. Pokud je instrukcí CmdSetStatus přestaven na jinou hodnotu, lze později snadno identifikovat, v jakém stavu se přístroj nachází.

CmdGetStatus() - čtení statusu zařízení

Deklarace:

public Boolean CmdGetStatus(out int dev_status)

dev_status Int s platným rozsahem 0 až 255. Pokud je -1, čtení se nepodařilo a i výstupem instrukce je false.

Příklad:

if (MyDevice.CmdGetStatus(out int sts))
    Console.WriteLine($"Status is {sts}");
else
    MessageBox.Show("Error");

Výstup:

Status is 42

CmdSetStatus() - nastavení statusu zařízení

Deklarace:

public Boolean CmdSetStatus(byte dev_status)

Příklad:

if (MyDevice.CmdSetStatus(42))
    Console.WriteLine("Ok");
else
    MessageBox.Show("Error");

Výstup:

Ok

Adresování

Adresování je využitelné většinou jen u zařízeních připojených přes sériové rozhraní (sériový port RS232, RS485, RS422). Použití některých funkcí z této části není u Ethernetových zařízení dovoleno. Ethernetová zařízení je vhodné vždy adresovat univerzální adresou 0xFE.

CmdGetCommParams() - čtení adresy a komunikační rychlosti

(Funkce má význam jen u zařízení komunikujících po sériovém rozhraní.)

Deklarace:

public Boolean CmdGetCommParams(out byte addr, out int baudrate)

addr Adresa.
baudrate Komunikační rychlost v Baudech. Pokud je číslo menší než 110, jde o neznámý kód komunikační rychlosti.

Příklad:

if (MyDevice.CmdGetCommParams(out byte adr, out int baudrate))
    Console.WriteLine($"Address is {adr} (0x{adr.ToString("X2")}), Baudrate is {baudrate}");
else
    Console.WriteLine("Error");

Výstup:

Address is 51 (0x33), Baudrate is 9600

CmdAllowConfiguration() - povolení konfigurace

Povoluje provedení konfigurace. Musí předcházet bezprostředně před voláním funkce pro nastavení komunikačních parametrů CmdSetCommParams. Po jakémkoli následujícím volání funkce (i neplatném) je konfigurace automaticky zakázána. (U této funkce není možné použít univerzální adresu 0xFE.)

Deklarace:

public Boolean CmdAllowConfiguration()

Příklad:

Kompletní příklad použití je u funkce CmdSetCommParams.

CmdSetCommParams() - nastavení adresy a komunikační rychlosti

Bezprostředně před voláním této funkce musí být povolena konfugurace pomocí funkce CmdAllowConfiguration. Po vykonání instrukce již zařízení komunikuje s novou adresou a komunikační rychlostí. (Funkce má význam jen u zařízení komunikujících po sériovém rozhraní.)

Deklarace:

public ResponseACK CmdSetCommParams(byte newaddr, int newbaudrate)

newaddr Nová adresa. Musí být z rozsahu 0 až 253.
newbaudrate Nová komunikační rychlost v Baudech. Musí být jednou ze standardních komunikačních rychlostí jak jsou uvedeny v poli MyDevice.Baudrates (110, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 Bd). Pokud jde o jinou nestandardní rychlost, uveďte přímo kód rychlosti. Rychlosti použitelné pro konkrétní zařízení jsou uvedeny v jeho dokumentaci. Obecně se dá uvést, že většinou zařízení umí rychlosti od 4800 do 115200 Bd.
ResponseACK Výčet kódů Potvrzení dotazu (ACK). Byte ACK informuje nadřazené zařízení jak dopadlo zpracování přijaté instrukce.

Příklad:

Před změnou adresy nebo komunikační rychlosti touto instrukcí je potřeba používat aktuální adresu zařízení a ne univerzální adresu (0xFE). Adresa 0x31 je definována v duchu ukázkového příkladu například takto:
MyDevice = new Papouch.Spinel.Spinel97.Device.Quido.Quido(ci, 0x31);
Příklad nastaví adresu 0x74 a rychlost 57 600 Bd.

if (MyDevice.CmdAllowConfiguration())
    Console.WriteLine("Configuration allowed");
else
    Console.WriteLine("Configuration not allowed!");

ResponseACK resp = MyDevice.CmdSetCommParams(0x74, 57600);
if (resp == ResponseACK.AllIsOk)
    Console.WriteLine("Ok");
else
    Console.WriteLine($"Error code is {resp}.");

Výstup:

Configuration allowed
Ok

CmdSetAddressBySerialNumber() - nastavení adresy pomocí sériového čísla zařízení

Instrukce umožňuje nastavit adresu podle unikátního sériového čísla zařízení. Tato instrukce je praktická v případě, že nadřazený systém nebo obsluha ztratí adresu zařízení, které je na stejné komunikační lince s dalšími zařízeními.

Deklarace:

public Boolean CmdSetAddressBySerialNumber(byte newaddr, UInt16 devicenumber, UInt16 serialnumber)

newaddr Nová adresa. Musí být z rozsahu 0 až 253.
devicenumber Typ zařízení. Kompletní S/N zařízení má tvar 1234/5678. Typ zařízení je číslo před lomítkem.
serialnumber Sériové číslo. Kompletní S/N zařízení má tvar 1234/5678. Sériové číslo je číslo za lomítkem.

Příklad:

Nastavení adresy 0x33 do zařízení se S/N 1255/1234:

if (MyDevice.CmdSetAddressBySerialNumber(0x33, 1255, 1234))
    Console.WriteLine("Ok");
else
    Console.WriteLine("Error");

Výstup:

Ok