Skip to content

Dokumentace: THT2, TH2E

papouch.com edited this page Jul 3, 2018 · 8 revisions

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

Může se hodit:

Základní příklad použití

Nejjednodušší příklad C# WPF aplikace s tlačítkem Měřit.

using Papouch.Communication;
using Papouch.Spinel.Spinel97;
using Papouch.Spinel.Spinel97.Device.Tht2Th2e;
using System;
using System.Windows;

namespace TestApp
{
    public partial class MainWindow : Window
    {
        private ICommunicationInterface ci;
        public Tht2Th2e MyDevice;

        public MainWindow()
        {
            InitializeComponent();

            // Příklad pro THT2 ("sériový port" RS485):
            ci = new CiSerialPort();
            ci.ConfigString = "provider=SERIAL_PORT;PortName=COM4;BaudRate=9600;";

            // Příklad pro TH2E na adrese 192.168.1.124 s datovým portem 10001:
            // Upozornění: TH2E musí být v režimu TCP server!
            //ci = new CiTcpClient();
            //ci.ConfigString = "provider=TCP_CLIENT;Host=192.168.1.124;Port=10001;";

            if (!ci.Open(true))
            {
                MessageBox.Show("Spojení se nepodařilo otevřít!");
                Application.Current.Shutdown();
            }

            // 0x31 je výchozí adresa z výroby
            // 0xFE je univerzální adresa pokud je na lince jen jedno zařízení
            MyDevice = new Tht2Th2e(ci, 0xFE);
            if (MyDevice == null)
            {
                MessageBox.Show("Zařízení se nepovedlo inicializovat!");
                Application.Current.Shutdown();
            }
        }

        private void Measure_Click(object sender, RoutedEventArgs e)
        {
            ResponseACK MeasureAck = MyDevice.CmdGetMeasure(out Tht2Th2e.MeasuredValues values);
            string output = "";
            if (MeasureAck == ResponseACK.AllIsOk)
            {
                output += $"Statusy teploty: {values.TemperatureStatus} \n";
                if (values.TemperatureStatus.HasFlag(Tht2Th2e.FlagsStatus.Valid))
                    output += $"Teplota: {values.Temperature:0.0} ° \n";

                output += $"Statusy vlhkosti: {values.HumidityStatus} \n";
                if (values.HumidityStatus.HasFlag(Tht2Th2e.FlagsStatus.Valid))
                    output += $"Vlhkost: {values.Humidity:0.0} % \n";

                output += $"Statusy rosného bodu: {values.DewPointStatus} \n";
                if (values.DewPointStatus.HasFlag(Tht2Th2e.FlagsStatus.Valid))
                    output += $"Rosný bod: {values.DewPoint:0.0} ° \n";
            }
            else
                output += $"Chyba: {MeasureAck}";

            TxtOutput.Text = output.Trim();
        }

    }
}

...a definice jednoduchého rozhraní ve WPF:

<Window x:Class="TestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:QuidoApp"
        mc:Ignorable="d"
        Title="TestApp" Height="152" Width="400" ResizeMode="NoResize">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>
        <TextBox x:Name="TxtOutput" Text="?" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="12" />
        <Button Grid.Column="1" Content="Měřit" Margin="20" Click="Measure_Click"/>
    </Grid>
</Window>

Funkce

CmdGetMeasure() - měření

Provede jeden odměr aktuálních hodnot ze senzoru.

Deklarace:

public ResponseACK CmdGetMeasure(out MeasuredValues values)

values Třída MeasuredValues se statusy a hodnotami jednotlivých veličin.

Příklad:

ResponseACK MeasureAck = MyDevice.CmdGetMeasure(out Tht2Th2e.MeasuredValues values);
string output = "";
if (MeasureAck == ResponseACK.AllIsOk)
{
    output += $"Statusy teploty: {values.TemperatureStatus} \n";
    if (values.TemperatureStatus.HasFlag(Tht2Th2e.FlagsStatus.Valid))
        output += $"Teplota: {values.Temperature:0.0} ° \n";

    output += $"Statusy vlhkosti: {values.HumidityStatus} \n";
    if (values.HumidityStatus.HasFlag(Tht2Th2e.FlagsStatus.Valid))
        output += $"Vlhkost: {values.Humidity:0.0} % \n";

    output += $"Statusy rosného bodu: {values.DewPointStatus} \n";
    if (values.DewPointStatus.HasFlag(Tht2Th2e.FlagsStatus.Valid))
        output += $"Rosný bod: {values.DewPoint:0.0} ° \n";
}
else
    output += $"Chyba: {MeasureAck}";

Console.WriteLine(output.Trim());

Výstup pro senzor TH3X (měří teplotu, vlhkost a rosný bod):

Statusy teploty: Valid
Teplota: 23,9 °
Statusy vlhkosti: Valid
Vlhkost: 30,4 %
Statusy rosného bodu: Valid
Rosný bod: 5,5 °

Výstup pro senzor DS (měří jen teplotu):

Statusy teploty: Valid, UnderLimit
Teplota: 24,1 °
Statusy vlhkosti: None
Statusy rosného bodu: None

Pokud je odpojený senzor:

Chyba: DeviceMalfunction

CmdGetSensorType() - zjištění typu připojeného senzoru

Vrací typ připojeného senzoru. (Nejedná se o autodetekci typu aktuálně připojeného senzoru. Typ senzoru se detekuje jen při zapnutí, resp. po resetu.)

Deklarace:

public ResponseACK CmdGetSensorType(out SensorType sensor)

sensor Typ senzoru, který byl detekován při zapnutí. Jeden z výčtu SensorType.

Příklad:

if (MyDevice.CmdGetSensorType(out Tht2Th2e.SensorType sensor) == ResponseACK.AllIsOk)
    Console.WriteLine(sensor.ToString());
else
    Console.WriteLine("error");

Výstup:

TH3X

Deklarace

Zjednodušené přehledy výčtů, případně dalších datových typů deklarovaných v knihovně pro toto zřízení.

MeasuredValues - třída s naměřenými hodnotami

Třída obsahující statusy a naměřené hodnoty všech veličin. Tuto třídu vrací funkce měření CmdGetMeasure().

Deklarace:

public class MeasuredValues
{
    public FlagsStatus TemperatureStatus;
    public float Temperature;
    public FlagsStatus HumidityStatus;
    public float Humidity;
    public FlagsStatus DewPointStatus;
    public float DewPoint;
}

FlagsStatus - výčet možných stavů veličin

Každá z veličin v MeasuredValues je popsána proměnnou Status, která může mít nahozený některý z následujících flagů (jeden nebo více), podle stavu a velikosti měřené hodnoty.

Deklarace:

public enum FlagsStatus : byte
{
    None,
    UnderLimit,    // Hodnota je pod uživatelsky nastaveným limitem
    OverLimit,     // Hodnota je nad uživatelsky nastaveným limitem
    UnderFlow,     // Hodnota je pod dolní hranicí měřitelného rozsahu
    OverFlow,      // Hodnota je nad horní hranicí měřitelného rozsahu
    Valid          // Hodnota je platná
}

SensorType - výčet možných typů senzoru

Deklarace:

public enum SensorType : byte
{
    None,
    TH15,   // teplota, vlhkost, rosný bod
    DS,     // teplota
    TH3X,   // teplota, vlhkost, rosný bod
    TMP,    // teplota
    Other   // neznámý typ
}