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


von Brooks (Gast)


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?

von markus (Gast)


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 
:)

von Brooks (Gast)


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.

von TestX .. (xaos)


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);

von Brooks (Gast)


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?

von Brooks (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.