Brauche Hilfe bei Ansteuerung einer Relaiskarte

Hi umbrasaxum,

was die meinen ist ein ASCII Protokoll über die serielle Schnittstelle. Das ist ziemlich verbreitet auch bei industriellen I/O-Modulen wenn die kein Feldbus-Interface haben.

Dabei wird über die einzelnen Bytes der Nachricht eine Checksumme gebildet und die einzelnen Bytes der Nachricht + Checksumme werden zu einem String zusammengesetzt:

strncat(telegramm, start, kartenadresse, funktion, relaisadresse, checksumme, stringlänge);

"telegramm" ist dann der String, welcher gesendet wird.

"start" ist ASCII-Code 13, daran wird ein neues Telegramm erkannt.

(ob das mit strncat in einem Aufruf so geht weiß ich nicht, oder ob man nur 2 Strings miteinander verketten kann. Notfalls müßte man es in mehreren Schritte verketten)

Als checksum wollen die ein 2er-Komplement aus

start+ kartenadresse+ funktion+ relaisadresse+1 haben.

Lade mal die Demo Software runter, ist zwar VBasic, aber wenn Du den Quellcode anschaust wird es Dir klar werden.

Gruß napstix
 
übrigens schreiben die noch, Du sollst den String 2x hintereinander senden bzw. sogar 5x wenn die Verbindung über Funk läuft.

Scheint wohl beim ersten mal nicht immer zu funktionieren.

Viel Spaß noch mit dem Teil
 
moin


Jo danke für die Antowrt, mir gings zwar nur ums aussehen des String aber trotzdem danke.
Und strcat kann man nur 2 Parameter übergeben werden.
Das mit dem 2 mal senden hab ich verstanden.


mfg
umbrasaxum
 
Zuletzt bearbeitet:
moin


So, hab es jetzt getestet und hat wunderbar funktioniert!

Für alle die mal die K8056 Relaiskarte ansteuern möchten hier ein simpler Beispielcode:
Code:
#include <windows.h>
#include <iostream>

using namespace std;

int i=0;

int main()
{
	DCB           dcb;
	HANDLE hCom = CreateFile ("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
	dcb.DCBlength = sizeof(DCB);
	GetCommState (hCom, &dcb); 
	dcb.BaudRate  = 2400;
	dcb.ByteSize  = 8;   
	dcb.Parity    = NOPARITY;    
	dcb.StopBits  = ONESTOPBIT;  
	SetCommState (hCom, &dcb);

	DWORD iBytesWritten;
	unsigned char ucMsg[5];

	ucMsg[0] = (char)13;
	ucMsg[1] = (char)1;
	ucMsg[2] = 'S';
	ucMsg[3] = (char)49 + i;
	ucMsg[4] = ucMsg[0] ^ ucMsg[1] ^ ucMsg[2] ^ ucMsg[3];

	WriteFile (hCom, ucMsg, 5, &iBytesWritten, NULL);
	//WriteFile (hCom, ucMsg, 5, &iBytesWritten, NULL); //nicht unbedingt nötig es 2 mal zusenden!
	
	CloseHandle (hCom);

	return 0;
}

ucMsg[0] enthällt den Startcode, der ist immer gleich.
ucMsg[1] enthällt die Adresse der Karte.
ucMsg[2] enthällt den Befehl.
ucMsg[3] enthällt die Adresse des Relais das den Befehl erhalten soll.
ucMsg[4] enthällt die Checksumme, die per XOR aus ucMsg[0-3] errechnet wird.


mfg
umbrasaxum
 
Hey, ich weiß dein beitrag ist schon was älter, wie würde den der code verändert werden, wenn ich parameter an das script übergeben will? also dass ich im parameter sage welches relais angesprochen werden soll und zweitens was das relais machen soll. also ob es anziehen soll oder abfallen? kann mir das vielleicht jemand verraten? wäre super nett. hab nämlich vor per php ne homepage zu gestalten und hab von jemand gehört, dass wenn ich an meinem linuxserver die relaiskarte anschließe ich über c++ die karte steuern kann. also skript per php starten nur da ist bei mir die frage, wie kann ich konkret ein bestimmtes relais ansprechen, ihm sagen was es zu tun hat.

das ganze soll per eine homepage passieren, die mit einem login auf dem webserver läuft, damit nicht jeder hanz und franz das ein und ausschalten kann. aber per homepage, damit ich von egal wo was zuhause ein bzw ausschalten kann, wenn ich das will. gibts da vielleicht ne möglichkeit mir da das script so zu erweitern, dass ich das vll für ein relais sehe, wie das aussehen muss damit ich bei der übergabe des einen parameters relais1 anziehen lasse und über nen anderen parameter relais1 abfallen lasse. denke das weitere bekomme ich dann hin.

den eigentlich programmiere ich etwas in VB oder halt php aber an c++ wollte ich mich nich so wirklich dran trauen, da mir eigentlich dafür so bischen leider wegen der arbeit die zeit fehlt.

kann mir trotzdem vielleicht jemand helfen?


Michael
 
Zurück