Software für Ansteuerung einer Relaiskarte

Gast #1176117
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:
1
oeffnen(); //alle relais öffnen
2
schliessen(); //alle relais schließen
3
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?
Gast #1176124
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 
:)
Gast #1176127
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.
#1176129
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);
Gast #1182310
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:
1
//init array
2
int contact_mask_1[] = {Relais_X...Relais_Y};
3
...
4
//Andi:"[...] um maske per array zu übergeben"
5
close_contact(contact_mask_1);

Unschön finde ich, dass man contact_mask_1[] nur beim Initialisieren 
ohne Schleife beschreiben kann.
Persönliche Seite #1182646
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren