www.mikrocontroller.net

Forum: PC-Programmierung Software für Ansteuerung einer Relaiskarte


Autor: Brooks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schreibe gerade eine Software für Host, um eine Relaiskarte anzusteuern.
Relaiskarte hat 24 Kanäle, und USB Schnittstelle. Ich möchte drei 
Funktionen implementieren:
oeffnen(); //alle relais öffnen
schliessen(); //alle relais schließen
kontakte(); // nur bestimmte/angegebene kontakte schließen

öffnen und schließen ist sehr einfach -> funktion muss keine 
argumente/parameter haben.

Funktion "kontakte()" wird schon schwieriger. Was meint ihr wie ist es 
von der !Benutzerseite! am besten zu gestalten, sodass die Funktion 
einfach und benutzerfreundlich wird?

Mit array oder einzelnen Kontakent als Parameter?
Hat jemand bessere Idee?

Autor: markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit man nicht durcheinander kommt, schreibe docheinfach 48Methoden, 
sowwas wie:

AnziehenRelais1(); und AbfallenRelais1();

Das ist wohl am einfachsten, ist nur einmal ein bisschen schreibarbeit 
:)

Autor: Brooks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo markus,

danke, das hört sich gut an. Hat nur den Nachteil, dass der Benutzer bis 
zu 48 Methoden für jede Aktion schreiben müsste.

Ich habe an so was gedacht wie:
dass der benutzer die kontakte auch selbs benennen kann:

z.B. LED1 = relais_1;  etc.

dann könnte man im Programmcode sowas angeben wie:
schalte_ein(LED1); oder
schalte_aus(LED1);

würde auf jeden falls zur besseren Lesbarkeit im Code beitragen.

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
markus wrote:
> Damit man nicht durcheinander kommt, schreibe docheinfach 48Methoden,
> sowwas wie:
>
> AnziehenRelais1(); und AbfallenRelais1();
>
> Das ist wohl am einfachsten, ist nur einmal ein bisschen schreibarbeit
> :)

schwachsinn....

wenn sowas, das am einfachsten...

setSingleRelais(int channel, bool state);
und das ganze nochmal um ne maske per array zu übergeben
setAllRelais(array dara);

Autor: Brooks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mal bei einer Relaiskarte gesehen, dass die so angesteuert werden 
kann:

CLOSE(@1,5); damit werden Relais 1 bis 5 geschlossen.

wie wird sowas gemacht?

Autor: Brooks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab es bis heute versucht es auf diese weise zu implementieren:

CLOSE(@1,5);

Werde es aber aufgeben, hab viele Probleme und kriege es nicht gescheit 
hin.
Hab auch in anderen Foren nichts besseres als ein Array gefunden, so wie 
Andi es vorher schrieb.

Wobei das  -> setSingleRelais(int channel, bool state); <-
zu umständlich wäre, wenn man 24 Kontakte schließen möchte.

Ich hab es so vor:
//init array
int contact_mask_1[] = {Relais_X...Relais_Y};
...
//Andi:"[...] um maske per array zu übergeben"
close_contact(contact_mask_1);

Unschön finde ich, dass man contact_mask_1[] nur beim Initialisieren 
ohne Schleife beschreiben kann.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du damit leben kannst, 32 Relais auf einmal anzusteuern, dann 
könntest Du einen uint32_t verwenden - jedes Bit davon entspricht dem 
(gewünschten) Zustand eines Relais.

set_relay_state(uint32_t state);

set_relay_state(0x80000000);

setzt das Relais 31 auf 1 und alle anderen auf 0.

set_relay_state(0x00000001);

setzt das Relais 0 auf 1 und alle anderen auf 0.

set_relay_state(0xFFFFFFFE);

setzt das Relais 0 auf 0 und alle anderen auf 1.


Das ganze ließe sich noch mit einer Maskierung kombinieren, mit der 
set_relay_state mitgeteilt wird, welche Bits des übergebenen Wertes zu 
beachten sind:

set_relay_state_mask(uint32_t mask, uint32_t state);

set_relay_state_mask(0x80000000, 0x80000000);

setzt Relais 31 auf 1 und lässt alle anderen unverändert.

set_relay_state_mask(0xC0000000, 0x80000000);

setzt Relais 31 auf 1, Relais 30 auf 0 und lässt alle anderen 
unverändert.

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.