Seriellen Befehl an Relaiskarte senden

Hallo zusammen,

ich google seit Stunden durch die Gegend und werde leider nicht fündig… Ich hatte noch eine Relaiskarte von Conrad hier rumfliegen (http://www.conrad.de/ce/de/product/197720/8FACH-RELAISKARTE-24V7A) und möchte mit dieser eine Kreuzschiene ansteuern, die lediglich die Abhöre im Flur umschalten soll. Hohe Latenzen dieser Karte sind mir also egal!!
mAirList hat bis jetzt die Karte über den Com1 Port erfolgreich erkannt, ich schaffe es jedoch nicht über die Funktion “Senden an serielle Schnittstelle” ein Umschalten auszulösen. Hat jemand einen Tipp für mich?

Grüße

Hast du denn - anhand der Doku zu der Karte - herausgefunden, was man genau schicken muss, um das Relais zu schalten?

Hallo Torben,

danke für die schnelle Rückmeldung. Die Karte wird im mitgelieferten Steuerprogramm über Kommandos, wie “CMD:3, Adr:0, Data-byte:0, CRC:3” gesteuert. Ebenso wird der Binäre Wert angezeigt.
Mairlist schluckt das Kommando zwar, gibt aber in der Status-Leiste aus, dass der Port geschlossen ist.

Grüße

Aha, eine Fehlermeldung im Systemprotokoll! Sag das doch gleich!

Der Port muss vorher geöffnet werden - entweder durch ein kurzes Script, oder - am einfachsten - dadurch, eine Fernsteuerung vom Typ “serielle Schnittstelle” hinzuzufügen.

In der Fernsteuerung habe ich die Serielle Schnittstelle eingetragen. Daran dürfte es eigentlich nicht liegen. Laut Handbuch sind auch die Standardeinstellungen zu Baudrate und Co richtig.

Das ist in der Tat merkwürdig.

Um welche Programmversion geht es eigentlich?

Akut um die 2.2 weil die seit Jahren auf dem Rechner durchläuft. In den neueren Versionen (4.0 habe ich noch nicht getestet) funktioniert es jedoch auch nicht.
Wenn ich das richtig verstehe, sendet mAirList ja auch nur den BinärCode an die Karte, welcher dort dann in Schaltbefehlen ausgeführt wird, oder?

Das Problem scheint ja offenbar zu sein, dass der Port nicht geöffnet wurde. Normalerweise sollte das die Fernsteuerung übernehmen - warum das hier nicht klappt, keine Ahnung.

Probier mal, nach dem Programmstart folgendes Script (speichern als portopen.mls oder so) auszuführen:

begin
  ComPort('COM1').Open;
end.

(Portnummer entsprechend anpassen.)

Vermutlich funktioniert das nur unter v3.1 und v4. Für die alte v2.2 gibt es ohnehin keinen Support mehr.

Sooo, ich habe es gerade mal in der 3.1 versucht und als Meldung kommt “Type mismatch”. Die Karte scheint ja demnach wohl wirklich nicht ansteuerbar zu sein…
Danke

Ist ein Fehler im Script. Ich schick dir nachher ein korrigiertes.

Unter 3.1 und 4.0 funktioniert das Script wie oben angegeben. Gerade getestet.

Der “Type mismatch”-Fehler kommt, wenn man versucht, es unter 2.2 laufen zu lassen. Dort funktioniert es in der Tat nicht.

Ich habe die 3.1 gerade geöffnet, welchen Befehl sendest Du denn an die Schnittstelle?

Gar keinen.

Es geht mir erstmal darum sicherzustellen, dass der Port auch geöffnet ist. Oben schriebst du nämlich:

Mairlist schluckt das Kommando zwar, gibt aber in der Status-Leiste aus, dass der Port geschlossen ist.

Erscheint diese Meldung immernoch, wenn du vorher einmal das Script ausführst?

Der Port scheint in der Tat geöffnet zu sein, jedenfalls gibt mAirList keine Fehler-Meldung mehr aus, sobald ich einen Befehl sende. Danke schon einmal hierfür (:
Jetzt stellt sich mir halt wirklich nur noch die Frage, was ich falsch mache… ???

Wenn ich mir Kapitel 6 des Handbuchs so anschaue, musst du Binärpakete zusammenbauen, die jeweils aus vier Bytes bestehen: Kommando, Kartenadresse, Daten, Prüfsumme. Letzere ist das XOR der ersten drei Bytes.

In der Aktion “Senden an serielle Schnittstelle” kannst du Binärdaten in Hex angeben, indem du ein $-Zeichen davorschreibst, zum Beispiel so:

$12345678

Das würde dann die vier Bytes 0x12, 0x34, 0x56 und 0x78 rausschicken.

Jetzt musst du nur noch wissen, welchen Befehl du genau schicken willst (Relais schalten?), und dann das Datenpaket zusammenbauen.

Sorry, Torben,
ich glaube ich stehe gerade etwas auf dem Schlauch. Ich habe ein wenig mit den binären Angaben rumprobiert und es tut sich gar nichts.
Angenommen, ich möchte jetzt Relais 1 Schalten, dann hat dieses laut Kapitel 6 “Bit 0” und Relais 2 hätte “Bit 1”. Die Karte hat Adresse 1 und ich möchte über Toggle schalten. Wenn ich jetzt nur acht Stellen zur Verüfung habe, aber bereits die Schaltfunktion “toggle” (Wert 8) binär 1000 ergibt, fehlen mir doch Stellen.
Ich weiß, irgendwo ist bestimmt ein Denkfehler.

Du verwechselst Binär und Hex.

Nehmen wir als Beispiel folgendes:

  • Befehl “Toggle”
  • Adresse 1
  • nur Relais 1

Daraus ergibt sich:

  • Der Befehl “Toggle” hat die Nummer 8, das ist binär 00000100, und hex 08.

  • Adresse 1 ist binär 00000001 und hex 01.

  • Relais 1 ist das “Bit 0”, also das “ganz rechte” der acht Bits, also ebenfalls 00000001 bzw. hex 01.

Die ersten drei Hex-Werte lauten also 080101.

Nun noch die Prüfsumme. Für die sollst du das XOR der drei anderen Zahlen bilden. Das bekommt man am einfachsten, indem man die drei Binärwerte untereinanderschreibt und dann zählt, wie viele Einsen in jeder Spalte stehen. Ist es eine ungerade Anzahl, ist das entsprechende XOR-Bit 1, ist es eine gerade Anzahl Einsen, dann ist das XOR-Bit 0. Daraus ergibt sich dann die Prüfsumme.

00000100
00000001
00000001

00000100 <= XOR-Prüfsumme

Die Prüfsumme lautet also 00000100 bzw. hex 04. Daraus ergibt sich der Gesamt-String:

$08010104

So richtig viel Erfahrung hast du mit dem Informatik-Zeug nicht, oder? :wink:

Ja, jetzt habe ich den Denkfehler gefunden :wink: Danke!
Ne, mit Informatik habe ich als Mediengestalter B/T leider wirklich nicht viel zu tun^^ Das einzige, was ich viel in der Schule programmiert habe, war Simatic7 von Siemens, sprich Automatisierungsprozesse…

Ich habe das Ganze jetzt einmal so ausprobiert, auch mit richtiger Prüfsumme (nämlich hex8, du hattest aus Versehen binär 100 statt 1000 geschrieben), allerdings schaltet dort gar nichts.
Auch die Initialisierung über $01010101 bzw $01010001 erzeugt keine Veränderung, wenn ich den Steuerbefehl für Relais 1 im Anschluss sende.
Der Port dürfte eigentlich geöffnet sein, da beim Öffnen des Datei-Tag eine Meldung kommt, dass dieser bereits durch eine Anwendung (mAirList) bereits geblockt ist.

Grüße

Ist da eine Software dabei, mit der man die Relais steuern kann?

Es gibt ein Programm namens “Portmon”, mit dem sich die Daten der Schnittstelle mitscheiden und ansehen lassen. Damit könntest du nachschauen, was die mitgelieferte Software schickt - und den Befehl dann einfach kopieren.

http://technet.microsoft.com/de-de/sysinternals/bb896644

Achtung, muss als Administrator ausgeführt werden!

Das Programm ist ja klasse, hätte nicht gedacht, dass so viele Daten losgesandt werden, wür einen simplen Befehl :wink:
Je nachdem, welche Relais ich schalte, gibt mir das Programm zwei Hexa-Zeilen an. Wenn ich eine oder beide in mairlist angebe, wird, jedoch eine andere Ausgabe erzeugt…

Hier die Ausgabe der mitgelieferten Software, wenn ich alle acht Relais gleichzeitig schalte:


0	22:50:00	Conrad Relaiska	IRP_MJ_WRITE	      Serial0	SUCCESS	Length 4: 03 00 FF FC 	
1	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
2	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
3	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
4	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
5	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
6	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
7	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
8	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
9	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
10	22:50:00	Conrad Relaiska	IOCTL_SERIAL_PURGE	                Serial0	SUCCESS	Purge: TXABORT TXCLEAR 	
11	22:50:00	Conrad Relaiska	IOCTL_SERIAL_PURGE	   Serial0	SUCCESS	Purge: RXABORT RXCLEAR	
12	22:50:00	Conrad Relaiska	IRP_MJ_WRITE	               Serial0	SUCCESS	Length 4: 02 00 00 02 	
13	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
14	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
15	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
16	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
17	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
18	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
19	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
20	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
21	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
22	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
23	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
24	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
25	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
26	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
27	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
28	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
29	22:50:00	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0			
30	22:50:00	Conrad Relaiska	IOCTL_SERIAL_PURGE	      Serial0	SUCCESS	Purge: TXABORT TXCLEAR 	





Ab hier kommt das Gleiche, nur umgekehrt für das Ausschalten: 
0	22:59:45	Conrad Relaiska	IRP_MJ_WRITE	Serial0	SUCCESS	Length 4: 03 00 00 03 	
1	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
2	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
3	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
4	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
5	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
6	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
7	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
8	22:59:45	Conrad Relaiska	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: TXABORT TXCLEAR 	
9	22:59:45	Conrad Relaiska	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: RXABORT RXCLEAR	
10	22:59:45	Conrad Relaiska	IRP_MJ_WRITE	Serial0	SUCCESS	Length 4: 02 00 00 02 	
11	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
12	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
13	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
14	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
15	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
16	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
17	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
18	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
19	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
20	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
21	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
22	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
23	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
24	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
25	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
26	22:59:45	Conrad Relaiska	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
27	22:59:45	Conrad Relaiska	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: TXABORT TXCLEAR 	
29	22:59:47	Conrad Relaiska	IRP_MJ_FLUSH_BUFFERS	Serial0	SUCCESS		
30	22:59:47	Conrad Relaiska	IOCTL_SERIAL_SET_WAIT_MASK	Serial0	SUCCESS	Mask: 	
31	22:59:47	Conrad Relaiska	IOCTL_SERIAL_CLR_DTR	Serial0	SUCCESS		
32	22:59:47	Conrad Relaiska	IRP_MJ_FLUSH_BUFFERS	Serial0	SUCCESS		
33	22:59:47	Conrad Relaiska	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: RXABORT RXCLEAR	
34	22:59:47	Conrad Relaiska	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: TXABORT TXCLEAR 	
35	22:59:47	Conrad Relaiska	IRP_MJ_CLEANUP	Serial0	SUCCESS		
36	22:59:47	Conrad Relaiska	IRP_MJ_CLOSE	Serial0	SUCCESS		

Und hier das Ganze auch noch einmal für mAirList, nachdem ich die Ausgabe 02 00 00 02 angegeben habe:

0	23:02:04	mAirList.exe	IRP_MJ_WRITE	Serial0	SUCCESS	Length 4: 02 00 00 02 	
1	23:02:04	mAirList.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
2	23:02:04	mAirList.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
3	23:02:04	mAirList.exe	IOCTL_SERIAL_GET_MODEMSTATUS	Serial0	SUCCESS		
4	23:02:04	mAirList.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
6	23:02:04	mAirList.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
7	23:02:04	mAirList.exe	IOCTL_SERIAL_GET_MODEMSTATUS	Serial0	SUCCESS		
8	23:02:04	mAirList.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
9	23:02:04	mAirList.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0			
10	23:02:04	mAirList.exe	IOCTL_SERIAL_GET_MODEMSTATUS	Serial0	SUCCESS		

Die Frage ist halt wirklich, ob der Aufwand sich lohnt… Wenn man sie angebunden bekommt, wäre sie natürlich schon recht interessant, aufgrund des verhältnismäßig geringen Preises.