mikrocontroller.net

Forum: PC-Programmierung C# Programm zum Steuern eines Sensornetzwerks


Autor: Soma-web (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi MC Community,
ich muss in C# ein Programm entwerfen welches ein Sensornetz verwaltet.

Hardware: Cypress First Touch Starter Kit bestehend aus
- Cypress PC Bridge
- Cypress RF Expansion Card (Identifizierbar über eine MID)

Für die Kommunikation zwischen dem USB Dongle und dem RF Sensorboard 
wird das CyFi_portokoll verwendet.

Es gibt noch eine Besonderheit: Die normale Anmeldung eines RF Sensors 
geschieht normalerweise über einen auf beiden Seiten ausgeführten Bind 
Befehl (hierzu muss auf dem USB Dongle ein Button geklickt werden (oder 
per SW der Befehl gestartet werden) und auf der Sensorplatine auch ein 
Button gedrückt werden. Nun weißt der USB Dongle dem RF-Board eine DevID 
zu und spricht ab diesem zeitpunkt immer über die DevId mit dem 
jeweiligen Sensor (so ist er also identifizierbar) bei mir geschieht das 
aber über eine eigen gebaute Induktive Datenübertragung. Sprich sobald 
der Sensor an die Induktive Kopplung angehängt wird weißt der USB Dongle 
dem Board eine Dev Id zu. So sparrt man sich lässtiges Buttongedrücke.

Die Aufgabe des Programms besteht nun darin dem Sensor eine spezielle 
Position zuzuordnen (es werden bis zu 255 Sensoren verwendet). Um im 
Ausfall sofort zu wissen an welcher Position der Sensor spinnt.

Über USB kann ich die DevID und MID des gerade induktiv gekoppelten 
Sensors auslesen.

Ich habe mir gedacht dazu ein Struct Array zu erstellen:

Struct Sensor
{
int pos;
int DevId;
int MID;
}

Struct[] Sesnor = new Sensor[255];

for(int i = 0; i < 255; ++i)
{
Sensor[i].pos = i+1;
}

und ab da an mit dem Sensor über das Struct Array zu kommunizieren.

D.H. Wenn der gerade eben ind. gekoplte Sensor auf pos 12 installiert 
wird sagt man im Programm:

Sensor[12].DevID = getcurrentDevID();

Das Problem sehe ich jetzt nur, wenn man z.b. den Sensor erst auf Pos11 
angibt
Sensor[11].DevID = getcurrentDevID();
sich es aber dann anders überlegt und doch Pos31 machen will.
Sensor[31].DevID = getcurrentDevID();
Dann ist der Sensor ja doppelt gelistet!

Habt ihr irgendwelche Verbesserungsvorschläge oder ein anderen Geadnken 
mit dem es sich besser realisieren lässt.

Danke und Grüße
Soma

Autor: Soma Web (soma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder sollte ich einfach mit einem Zeiger auf eine Stelle in einem DevID 
Array arbeiten?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soma Web schrieb:
> Oder sollte ich einfach mit einem Zeiger auf eine Stelle in einem DevID
> Array arbeiten?

zeiger gibt es in c# nicht mehr, es sind alles nur referenzen.

Warum nicht ein Dictionary verwenden, mit den Index auf die ID?

Autor: Soma Web (soma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dictonray werd ich mir mal anschaun danke erstmal

Autor: Oliver Punk (Firma: UAS Merseburg) (olipunk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nicht gleich eine Klasse "Sensor" entwerfen, die sich dann über 
Methoden selbst verwalten kann? Und dann in eine generische Liste 
schreiben? Oder eben (besser => Peter) in einem Dict verwalten? Warum 
ein struct? Oder gleich einen SensorManager als Klasse implementieren, 
der die Ausfallsicherheit managed?
C# (ich vermute mal .NET) ist mächtig ;-)

Autor: Soma Web (soma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ganz ehrlich ich bin noch nicht soooo firm in C# bitte füttert mich 
mal mit googlebaren begriffen. Klasse die sich selbst verwaltet? Versteh 
ich gerade nich (ok es sind auch schon eineige Biere ;) Dict ist doch in 
der art eine ArrayList oder?

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soma Web schrieb:
> Dict ist doch in
> der art eine ArrayList oder?

Nein! Eine Dict ist KEY -> Value
Eine ArrayList ist  Object

Für was speichert du überhaupt pos? Das ist doch schon der Index des 
Elements?

Mit Referenzen kann man auch viel machen. Sie entsprechen Zeigern. Wenn 
man sich damit aber nicht auskennt können komische Fehler entstehen.
Ein Beispiel für die tückischen Referenzen:
class Program
{
    static void Main(string[] args)
    {
        A a1 = new A(13);
        A a2 = a1;
        a1.I = 7;
        System.Console.WriteLine(a1.I + "," + a2.I);
        a2 = new A(a1.I);
        System.Console.WriteLine(a1.I + "," + a2.I);
        a1 = new A(4);
        System.Console.WriteLine(a1.I + "," + a2.I);
    }
}
class A
{
    int i;
    public A(int i)
    {
        this.i = i;
    }
    public int I
    {
        get { return i; }
        set { i = value; }
    }
}


Ein paar Begriffe: Event, Delegate, je nach Anwendung Indexer und 
Vererbung

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch was zu deinem Problem:

Bessere Idee

Nimm eine List<T>
Bei einem neuen Sensor trägst du ihn ein. Sollte er seine pos verändern, 
änderst du nur die pos in der Struct.

Noch ein Begriff um Klassen zu sortieren (z.b. nach pos): IComparable

Autor: Soma Web (soma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Samuel K. schrieb:
> Noch was zu deinem Problem:
>
> Bessere Idee
>
> Nimm eine List<T>
> Bei einem neuen Sensor trägst du ihn ein. Sollte er seine pos verändern,
> änderst du nur die pos in der Struct.
>
> Noch ein Begriff um Klassen zu sortieren (z.b. nach pos): IComparable

Verstehe ich das richtig eine List<int pos, int DevID, string MID> und 
wenn er nun die Position ändert einfach die pos übeschreiben?
Wie spreche ich denn dann eine bestimmte position an? Ich muss ja dann 
in meinem Programm auch sagen können GetTemp_posX?

Danke für alles ich werde es jetzt mal mit einer Klasse versuchen. Für 
Vorschläge in ich immer dankbar.

grüße Soma

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soma Web schrieb:
> List<int pos, int DevID, string MID>

Das gibt es nicht.

Am besten wäre Dictionary<int DevID, *deiner struct*>

Wenn ein Gerät es sich anders überlegt, suchst du es über den Key (ID) 
und setzt die Position in deiner struct.

Mit einer List kannst du es auch machen, allerdings müsstest du sie nach 
dem richtigen Eintrag durchsuchen.


Wenn du nur 256 Sensoren hast macht es nichts, mal alle Einträge 
durchzugehen und die Position abzufragen. Bei Dictonary macht man das 
mit foreach.

Autor: Soma Web (soma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Samuel K. schrieb:
> Soma Web schrieb:
>> List<int pos, int DevID, string MID>
>
> Das gibt es nicht.
>
> Am besten wäre Dictionary<int DevID, *deiner struct*>
>
> Wenn ein Gerät es sich anders überlegt, suchst du es über den Key (ID)
> und setzt die Position in deiner struct.
>
> Mit einer List kannst du es auch machen, allerdings müsstest du sie nach
> dem richtigen Eintrag durchsuchen.
>
>
> Wenn du nur 256 Sensoren hast macht es nichts, mal alle Einträge
> durchzugehen und die Position abzufragen. Bei Dictonary macht man das
> mit foreach.

Hi Samuel, danke für die Hilfe!
Das klingts ehr gut, was du da schreibst. Ich würde es dann 
folgendermaßen umsetzen. Bitte sag bescheid, wenn es besser, schöner 
etc. pp geht.
Ist jetzt nurmal ne Überlegung also kein funktionierender Code.

struct sensor
{
int pos;
int DevID;
int MID;
}

Dictionary Nodes <int DevID, struct sensor>

public void new_sensor()
{
if(get_DevID =! Eintrag in Liste) //muss ich iwie durchchecken krieg ich 
                                  //aber hin denk ich
{
struct newsensor = new sensor;
newsensor.pos = get_pos();
newsensor.DevID = get_DevID();
newsoensor.MID = get_MID();

Add.Nodes(get_DevID(), newsensor)
}
else
{
WrietOutput("DevId schon vorhanden, trotzdem einfügen? Ja/Nein")
... //in Liste einfügen wie oben nur davor den alten Sensor mit selber
    //DevID entfernen
if(get_DevID() == Eintrag in Liste)
{Remove.Nodes(DevID);}
}
}

So in etwa hab ich mir das dann vorgestellt? Richtig?

P.S. wie füge ich hier denn code ein?
danke und Grüße Soma

Autor: Soma Web (soma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie komm ich denn dann bitte auf einen Struct Wert in meinem Value der 
Dictionary?

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Ansatz stimmt.

Es müsste korrekt so aussehen:
struct sensor
{
int pos;
int DevID;
int MID;
}

Dictionary<int, sensor> Nodes;


Man schreibt nur den Typ in die <> Klammern
nimm [c]...[/c] für code

Autor: Soma Web (soma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public struct Sensor
        {
            public int pos;
            public int DevID;
            public string MID;
        }

       // Sensor newsensor = new Sensor();

        Dictionary<int, Sensor> network = new Dictionary<int, Sensor>();
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
        }

        private void newsensor()
        {
            Sensor newsensor = new Sensor();
            newsensor.pos = Convert.ToInt32(textpos.Text);
            newsensor.DevID = Convert.ToInt32(textdev.Text);
            newsensor.MID = textmid.Text;

            network.Add(Convert.ToInt32(textdev.Text), newsensor);

        }

        private void add_Click(object sender, EventArgs e)
        {
            newsensor();
        }

        private void list_Click(object sender, EventArgs e)
        {
            foreach(KeyValuePair<int, Sensor> kvp in network)
            {
                textBox1.Text = "" + Convert.ToString(kvp.Key) + " " + Convert.ToString(kvp.Value.DevID) + " " + Convert.ToString(kvp.Value.MID) + "\n\r";
            }

                       
        }

        private void remove_Click(object sender, EventArgs e)
        {
            Sensor newsensor = new Sensor();
            newsensor.pos = Convert.ToInt32(textpos.Text);
            newsensor.DevID = Convert.ToInt32(textdev.Text);
            newsensor.MID = textmid.Text;

            network.Remove(Convert.ToInt32(textdev.Text));
        }


    }
}


So hab ich das jetzt mal testhalber gemacht.

ERSTMAL 1000 DANK!

Grüße Soma

Autor: Soma Web (soma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine letzte Frage hätte ich noch.
Und zwar hab ich jetzt mehrmals gelesen, dass man in einem Dict die 
Values nicht verändern darf. Heißt das, dass ich die zu bearbeitende 
Position entfernen muss und dann neu einpflege in dem Dict?

Danke

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soma Web schrieb:
> Eine letzte Frage hätte ich noch.
> Und zwar hab ich jetzt mehrmals gelesen, dass man in einem Dict die
> Values nicht verändern darf. Heißt das, dass ich die zu bearbeitende
> Position entfernen muss und dann neu einpflege in dem Dict?
>
> Danke

Das geht (abhängig vom Kontext)...
dict[...] = newValue;
was nicht geht ist beim Iterieren den Wert direkt zu verändern
foreach (... kvp in dict) {
    kvp.Value = newValue;
}
da kvp.Value readonly ist. Ist Value aber eine Referenz und kein 
Wert(etyp) wie in deinem Fall, kann man deren Inhalte durchaus verändern 
(also statt struct class verwenden)
    kvp.Value.irgendwas = newValue;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.