Moin Jungs,
der eine oder andere erinnert sich vielleicht an das Projekt mit den Schranken, das mich bei der Arbeit beschäftigt hat.
-> Ja! Ich bin immernoch dran, weil Kommunikation mit Kunden ja dann doch häufig schief läuft...
Nun gibt es ein weiteres Gate mit einer völlig anderen Schranke (
). Diese wird per Modbus Protokoll angesprochen.
Ich hatte wenig Lust - und eigentlich auch nicht viel Zeit - ein eigenes Modbus Paket aufzusetzen und bin daher auf die Suche nach Bibliotheken gegangen und dabei unter anderem auf DIESE HIER gestoßen.
Sah ganz so aus, als hätte sie alles was ich brauche und als würde sie noch maintained werden.
Da bin ich dann nun auf folgendes Problem gestoßen:
Jetzt gibt es Funktionen, die auf einen Rückgabewert verzichten. Wodurch sie zwar tun was sie sollen, aber mir nicht direkt eine Rückmeldung darauf geben, was der Modbus Server dazu sagt.
Siehe HIER: void WriteSingleRegister(int StartingAddress, int Value)
Nun hat der Mann glücklicher Weise einen Beispiel Client geschrieben und den Code dazu auf GitHub veröffentlicht, sodass es mir möglich war mal nachzugucken, wie er denn mit dem Response des Servers umgeht.
Dort bin ich auf folgende Zeilen gestoßen:
Code:
modbusClient = new EasyModbus.ModbusClient();
modbusClient.ReceiveDataChanged += new EasyModbus.ModbusClient.ReceiveDataChangedHandler(UpdateReceiveData);
modbusClient.SendDataChanged += new EasyModbus.ModbusClient.SendDataChangedHandler(UpdateSendData);
modbusClient.ConnectedChanged += new EasyModbus.ModbusClient.ConnectedChangedHandler(UpdateConnectedChanged);
Da hab ich doch Interesse halber mal in den Code des Clients geschaut und folgendes entdeckt:
Code:
public delegate void ReceiveDataChangedHandler(object sender);
public event ReceiveDataChangedHandler ReceiveDataChanged;
public delegate void SendDataChangedHandler(object sender);
public event SendDataChangedHandler SendDataChanged;
public delegate void ConnectedChangedHandler(object sender);
public event ConnectedChangedHandler ConnectedChanged;
Er scheint also mittels Events darauf hinzuweisen(oder so ähnlich), dass sich was an den Daten geändert hat. Sprich, daher krieg ich die Response des Servers. Vermute ich jedenfalls.
Ich hab versucht in meinem VB.NET Code genauso an die Events zu kommen, was mir leider überhaupt nicht gelungen ist.
Einige Recherche hat ergeben, dass das so ohne weiteres nicht ganz so einfach möglich ist, wenn man versucht von VB auf C# Events/Delegates zuzugreifen.
Leider kenne ich mich mit Delegates und Event orientierter Programmierung nicht so gut aus. Mir sind Funktionszeiger (was die Delegates ja gewissermaßen darstellen) aus C bekannt, leider bin ich aber bisher nicht so sehr in die Materie abgetaucht.
Nun zu meiner Frage:
Hat da jemand evtl. Erfahrung mit und kennt einen Weg oder kann mich zumindest soweit zu den technischen Hintergründen aufklären, dass ich mir da was zusammen fummeln kann?
Bei meiner Recherche bin ich auf DIESEN Artikel von Microsoft gestoßen, konnt' den aber nicht ganz nachvollziehen und bin mir nicht mal richtigen sicher, ob es das richtige ist.
Greetz,
sontyp
//EDIT:
Eine Quick'n'Dirty Lösung hab ich bereits im Kopf: Eine C# DLL erstellen, die diese Events genauso anspricht, wie er in seinem Beispiel und sie dann entsprechend weiter gibt, sodass ich sie dann aus VB heraus ansprechen und abrufen kann.
Ist aber wie gesagt Dirty und eigentlich nicht Sinn der Sache.