#52 von
LeonFoucault
, 18.01.2021 15:02
Zitat
Die geplante Steuerung ist enorm komplex und es gibt sicher Stoff für eine jahrelange Diskussion ohne auch nur einen Schritt konkret weiterzukommen.
ich würde vorschlagen die bestehende kleine Testanlage zu nehmen und daran mit mehreren Arduino eine Reihe von übersichtlichen Aufgaben konkret zu lösen. Mehrere von Anfang an weil ein "Zentralrechner" nicht sehr wahrscheinlich ist und mit mehreren übersichtlichen Arduino die nötige Kommunikation von Anfang an geübt werden kann.
Beginne mit einem Arduino und übe die Programmierung um zwei Signale und zwei Weichen mittels Tastern und Belegtmeldern zu steuern.
Und was soll das dann für einen Sinn haben wenn man eine größere komplexe Anlage steuern will?
Irgendwann muss er es dann so erweitern, dass er die Daten des Arduino dann doch wieder zurück an eine Zentrale meldet. Lokale Lösungen OK, aber dann fehlt diesen lokalen Elementen wieder die "Übersicht" und das Gesamtbild. Ich verstehe diesen ganzen Arduino-Wahn nicht. Für kleine Sachen, OK, aber für komplexe Szenarien total ungeeignet, da nicht genug Speicher und nicht annähernd genug Leistung.
Nehmen wir mal als Beispiel die Z21 und die DR5000. Beide sind über das entsprechende Protokoll mit ein paar Grundsätzen recht einfach anzusprechen, dass man Meldungen empfängt und Schalt- / Steuerbefehle sendet. Da reicht sogar schon ein C++ für Dummies und die Doku über WSA.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
WSADATA wsaData;
int rval;
if (WSAStartup(0x202, &wsaData) != 0) {
fprintf(stderr, "WSA konnte nicht gestartet werdenn");
return -1;
}
hSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (hSocket == INVALID_SOCKET) {
fprintf(stderr, "Socket konnte nicht erstellt werdenn");
}
else {
printf("Socket erstelltn");
}
sockAddr.sin_family = AF_INET;
if ((rval = inet_pton(AF_INET, "192.168.178.221", &sockAddr.sin_addr)) == 0) {
fprintf(stderr, "inet_pton - Adresse ungültig");
}
sockAddr.sin_port = htons(21105);
ZeroMemory(&message, sizeof(message));
// fahrbefehl
unsigned char tempMessage[10] = { 0x0A, 0x00, 0x40, 0x00, 0xE4, 0x13, 0xC0, 0x17, 0x8F,(unsigned char)(0xE4 ^ 0x13 ^ 0xC0 ^ 0x17 ^ 0x8F) };
memcpy(message, tempMessage, sizeof(tempMessage));
rc = sendto(hSocket, message, sizeof(message), 0, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR_IN));
Mehr ist für einen össeligen Fahrbefehl nicht notwendig. Erweitern um Threads zum lesen und schreiben und für Eingaben, dazu dann noch die passenden Befehle aus dem Protokoll rausgesucht und man kommt schnell zum Ergebnis. Warum also den Umstand über einen Arduino?
H0 - Weinert MeinGleis - Z21,DR5000 - Railcom - Lokdecoder: ESU, Zimo und Lenz - RM und Dec: Roco, Digikeijs - Weichenantriebe Weinert, Digikeijs - Rollmaterial Roco, Liliput, Weinert, Brawa, Tillig - Szenerie Woodland Scenics - Steuerung: Multimaus & Software (eigene)