Ahh also macht die Funktion btn_Connect_Load garnix mit dem Button. Das hab ich jetzt natürlich übersehen.
Im Grunde hast du doch ganz oben schon die Funktion Form1_Load, die beim Start des Programms aufgerufen wird. Wenn du den Code von btn_Connect_Load dort einfach reintust, sollte es gehen.
Merker/Ausgänge Moeller Easy auslesen und schreiben (easy_com.dll)
-
-
-
ok... sehr gut, hat soweit funktioniert.
Habe den Code etwas ausgeschlachtet und den ComPort und die Baudrate direkt eingegeben.
Der angepasste Code sieht so aus:Code
Alles anzeigenPublic Class Form1 Dim MyComHandle As Integer Dim ComError As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load MyComHandle = 0 btn_Connect.Enabled = True btn_Disconnect.Enabled = False Venti_Dusche.Enabled = False Venti_WC.Enabled = False WC_Licht.Enabled = False Licht_Esstisch.Enabled = False Licht_Couch.Enabled = False Licht_Zimmer.Enabled = False Beleuchtung_aus.Enabled = False Dim baud As Integer Dim sBaud As String Dim waittime As Integer easyCOM.MC_Get_UserWaitingTime(waittime) easyCOM.MC_Set_UserWaitingTime(1000) easyCOM.MC_Get_UserWaitingTime(waittime) textBox1.Text = "Connecting..." textBox1.Refresh() ComError = easyCOM.MC_Open_ComPort(MyComHandle, com_port_nr:=4, baudrate:=9600) If ComError = easyCOM.easy_COM_Err_Success Then easyCOM.MC_GetCurrent_Baudrate(MyComHandle, baud) sBaud = baud.ToString() textBox1.Text = "Online!" Venti_Dusche.Enabled = True Venti_WC.Enabled = True WC_Licht.Enabled = True Licht_Esstisch.Enabled = True Licht_Couch.Enabled = True Licht_Zimmer.Enabled = True Beleuchtung_aus.Enabled = True btn_Connect.Enabled = False btn_Disconnect.Enabled = True Else textBox1.Text = "Connection failed. Error " + ComError.ToString() End If End Sub Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed easyCOM.MC_CloseAll() End Sub Private Sub btn_Connect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Connect.Click End Sub Private Sub btn_Disconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Disconnect.Click ComError = easyCOM.MC_Close_ComPort(MyComHandle) btn_Connect.Enabled = True btn_Disconnect.Enabled = False Venti_Dusche.Enabled = False Venti_WC.Enabled = False WC_Licht.Enabled = False Licht_Esstisch.Enabled = False Licht_Couch.Enabled = False Licht_Zimmer.Enabled = False Beleuchtung_aus.Enabled = False textBox1.Text = "Offline!" End Sub 'Ausgelagerte Funktion für die Bedienung der verschiedenen Ausgänge per Tastendruck auf einen Button. Private Function Lese_Ausgang(ByVal nummer As Integer) As Long Dim bRawByte(10) As Byte easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 0, 0, bRawByte(0)) Return bRawByte(0) And (2 ^ (nummer - 1)) End Function 'Durch einen Klick auf den Button wird in den Merker 1 geschrieben (Siehe Doku Seite 37). Der Merker wird gleichzeitig im Schaltplan zurückgesetzt. Private Sub Venti_Dusche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_Dusche.Click ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 1, 0, 1) End Sub 'Durch einen Klick auf den Button wird in den Merker 11 geschrieben. In den Merker wird der Wert 1 geschrieben. Private Sub Venti_WC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_WC.Click ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 11, 0, 1) End Sub 'Der Wert If Lese_Ausgang(3) = 4 Then muss stets angepasst werden Private Sub WC_Licht_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles WC_Licht.Click ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 31, 0, 1) End Sub Private Sub Licht_Esstisch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Licht_Esstisch.Click ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 51, 0, 1) End Sub Private Sub Licht_Couch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Licht_Couch.Click ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 61, 0, 1) End Sub Private Sub Licht_Zimmer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Licht_Zimmer.Click ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 71, 0, 1) End Sub Private Sub Beleuchtung_aus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Beleuchtung_aus.Click ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 81, 0, 1) End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If Lese_Ausgang(1) = 1 Then Venti_Dusche.BackColor = Color.GreenYellow Else : Venti_Dusche.BackColor = Color.Transparent End If If Lese_Ausgang(2) = 2 Then Venti_WC.BackColor = Color.GreenYellow Else : Venti_WC.BackColor = Color.Transparent End If If Lese_Ausgang(3) = 4 Then WC_Licht.BackColor = Color.GreenYellow Else : WC_Licht.BackColor = Color.Transparent End If If Lese_Ausgang(4) = 8 Then Licht_Esstisch.BackColor = Color.GreenYellow Else : Licht_Esstisch.BackColor = Color.Transparent End If If Lese_Ausgang(5) = 16 Then Licht_Couch.BackColor = Color.GreenYellow Else : Licht_Couch.BackColor = Color.Transparent End If If Lese_Ausgang(6) = 32 Then Licht_Zimmer.BackColor = Color.GreenYellow Else : Licht_Zimmer.BackColor = Color.Transparent End If End Sub End Class
Auch der Timer funktioniert mittlerweilen.
Zwar habe ich das Gefühl, dass das Programm etwas träge funktioniert, doch wird wohl an der ständigen Kommunikation mit dem Steuergerät liegen. Ach ja, den Timer habe ich auf eine halbe Sekunde gesetzt. Wird eigentlich von kürzeren Zeiten abgeraten (betreffend Stabilität, Auslastung usw.)? -
Musst du probieren, was der ideale Wert für den Timer ist. Gut möglich, dass die Kommunikation so langsam ist, dass niedrige Werte keinen Vorteil bringen.
Ein Grund könnte sein, dass er momentan 6mal Lese_Ausgang aufruft und diese Funktion jedesmal mit dem Steuergerät kommuniziert, was dann vermutlich etwas ausbremst. -
Ich nehme an, dass man die Sache mit einer Select-Case-Anweisung vereinfachen könnte, oder?
Muss mich dann morgen damit mal befassen... -
Ich nehme mal an, dass mir die Select Case-Anweisung auch keine Vorteil bringen wird, stimmts?
Dies habe ich mir einfacher vorgestellt... -
Wo genau willst du hier Select anwenden?
-
nun ja... du hast recht. Wie bereits erwähnt, bin noch blutiger Anfänger im Bereich Visual Basic.
Ich belasse den Code vorläufig so. Falls ich in den nächsten Wochen eine bessere Möglichkeit erlernen sollte, werde ich mich nochmals damit befassen.
Bedanke mich nochmals für deine Hilfsbereitschaft!
-
Hallo...
betreffend dieser Sache bereitet mir noch eine Kleinigkeit etwas Kopfschmerzen.
Meine Installation sieht mittlerweilen so aus:Notebook -> Lan -> Switch -> Dlan-Adapter -> Stromnetz -> Dlan-Adapter -> Lan/RS-232-Adapter -> Eaton Easy Steuerelais.
Es ist mir bewusst, dass das Signal ziemlich "misshandelt" wird, doch es funktioniert. Als Konverter wird ein "ExSys EX-6030 Ethernet to RS-232 - Adapter" eingesetzt. Über eine Virtualisierungssoftware wird ein Com-Port simuliert.
Das Verbinden und Trennen funktioniert einwandfrei und auch das Lesen und Bestätigen der Ein- und Ausgänge ist in Ordnung. Wird die Verbindung jedoch "unabsichtig" getrennt (sei es durch trennen der Verbindung, Abstürzen des Programms, Standby des Notebooks usw.) bleibt wohl der der Konverter EX-6030 hängen. Startet man das geschriebene Programm neu, kann es keine Verbindung mehr herstellen. Auf den EX-6030 kann man jedoch über das Web-Interface noch zugreifen.
Erst nach Neustart des EX-6030 funktioniert die ganze Sache wieder.Gibt es evtl. eine gute Lösung für dieses Problem?
Besten Dank.
-
Hm da wüsste ich jetzt keine Lösung. Wenn es tatsächlich an diesem Konverter liegt, kann vermutlich nur der Hersteller helfen.
-
Gibt es auch keine Möglichkeit, zu überprüfen, ob das Betriebssystem in den Standby geschalten wird, damit man dabei die Form automatisch schliessen und somit die Verbindung trennen kann?
-
Habe über Google folgendes gefunden: In die Form_Load Methode baust du ein:
Und definierst ausserdem folgende neue Funktion:
CodePublic Sub OnPowerMode(ByVal sender As Object, ByVal e As Microsoft.Win32.PowerModeChangedEventArgs) If e.Mode = PowerModes.Suspend Then End If If e.Mode = PowerModes.Resume Then End If End Sub
Dort kannst du dann auf Suspend und Resume reagierren. -
Klingt gut, doch leider wird bei mir das SystemEvents und das OnPowerMode blau unterstrichen. Die Sache mit den "Imports" bereitet mir leider noch Mühe.
Woher weiss ich denn jetzt, was ich genau importieren muss? Gibt es irgendwo eine Auflistung? -
Importieren musst du
Bei mir zeigt Visual Studio so einen kleinen roten Kasten unter nicht erkannten Funktionen an und wenn man draufklickt, bietet er einem an, das korrekte Modul zu importieren.Die Funktion OnPowerMode definierst du ja selbst. Die müsste er also eigentlich erkennen.
-
Stimmt, den richtigen Import habe ich gestern schlussendlich doch noch gefunden (MSDN), doch die Sache hat noch nicht so funktioniert, wie ich es wollte. Danke für den Tipp mit dem roten Kasten -> dies hätte mir eigentlich selbst auffallen sollen.
Das OnPowerMode war unterstrichen, weil ich den zweiten Code-Teil noch nicht eingefügt hatte -> sorry!Heute bin ich bereits einen Schritt weiter und die Sache scheint fast zu funktionieren.
Mein Steuerrelais ist über einen Ethernet2Serial-Konverter angeschlossen. Auf meinen Notebook ist also ein virtueller ComPort installiert worden:
[Blockierte Grafik: http://img3.fotos-hochladen.net/uploads/serialtoetherqi92e6yd80.jpg]Beim Wechseln in den Standby wird die Verbindung zum Steuerrelais korrekt getrennt, jedoch wird beim "Aufwachen" die Verbindung erst wieder hergestellt, wenn ich in der Virtualisierungssoftware von CENTOS auf den Button "Update all" klicke, um den Port zu aktualisieren.
Ich nehme mal an, dass es zu aufwendig wäre, im eigenen Programmcode so einen virtuellen ComPort zu programmieren, damit kein externes Programm mehr benötigt wird, oder?
P.S. Ist OnPowerMode wirklich eine Funktion? Eigentlich gibt sie doch gar keinen Wert zurück...
-
Zitat von ADB;952511
Ich nehme mal an, dass es zu aufwendig wäre, im eigenen Programmcode so einen virtuellen ComPort zu programmieren, damit kein externes Programm mehr benötigt wird, oder?
Ja selbst programmieren dürfte nicht ganz einfach werden. Allerdings fällt mir auf, dass in deinem Programmfenster Telnet erwähnt wird. Anscheinend gibt es einen offenen Standard, wie RS232 über Telnet angeboten werden kann: RFC 2217 - Telnet Com Port Control Option
Es könnte also sein, dass du einfach den Treiber eines anderes Com-Zu-Ethernet Adapters benutzen kannst, der vlt korrekt mit Standby umgehen kann.
Das hier scheint so ein anderer Treiber zu sein: Latest version of the Lantronix CPR (Com Port Redirector)
Kann aber nicht garantieren, dass das funktioniert.Zitat
P.S. Ist OnPowerMode wirklich eine Funktion? Eigentlich gibt sie doch gar keinen Wert zurück...
Naja das ist Definitionssache. Das ist dann in jeder Programmiersprache anders, ob man es als Funktion, Methode, Prozedur, Sub oder irgendwas anderes bezeichnet. -
Scheint so, als würde nur der ELTIMA (von Centos) Treiber funktionieren, doch es kann natürlich auch eine Einstellungssache sein. Die richtigen Einstellungen habe ich jedoch noch nicht gefunden.
Gibt es evtl. die Möglichkeit, über das Programm "Recource Hacker" etwas zu machen. Im folgenden Printscreen ist das Centos-Programm geöffnet. Doch weiter weiss ich nicht mehr...
http://img3.fotos-hochladen.net/uploads/centos…uqie342wdxs.jpg
Kennst du dich damit aus?
Kann ich evtl. das Drücken der "Update-Taste" im Centos-Programm aus meinem Code automatisieren lassen? -
Ja ich glaube das müsste gehen, dass dein Programm eine Art Click-Nachricht an diesen Knopf schickt. Habe hier 2 Anleitungen gefunden:
[VB.NET] SendMessage Tutorial
vb.net - Window - click ok button by code - Stack OverflowAls erstes müsstest du mal in Spy++ schauen, ob du den Knopf finden kannst. (Wird in dem ersten Link oben auch erklärt)
-
Ja ich glaube das müsste gehen, dass dein Programm eine Art Click-Nachricht an diesen Knopf schickt. Habe hier 2 Anleitungen gefunden:
[VB.NET] SendMessage Tutorial
vb.net - Window - click ok button by code - Stack OverflowAls erstes müsstest du mal in Spy++ schauen, ob du den Knopf finden kannst. (Wird in dem ersten Link oben auch erklärt)
-
Danke für deinen Einsatz!!
Das Programm habe ich bereits einmal gefunden und kurz ausprobiert:
MDB Blog: Microsoft Spy++ or Spyxx for download
Leider ist in diesen Tagen die Zeit wohl etwas knapp, doch werde mich der Sache bald einmal widmen und mich wieder melden...Eine angenehme Nachtruhe...
-
So... einige Tage sind vergangen und jetzt hatte ich endlich wieder Zeit, um mich mit meinem Problem zu beschäftigen.
Folgender Code wurde erstellt, um den Buttonclick im Programm "Serial to Ethernet Utility" zu betätigen:
[PHP][CODE]
Imports System.Runtime.InteropServices<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowTitle As String) As IntPtr
End Function'FindWindowEx
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, _
ByVal childAfter As IntPtr, _
ByVal lpClassName As String, _
ByVal lpWindowTitle As String) As IntPtr
End Function'SendMessage-API, um den Button anzuklicken
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
(ByVal hWnd As IntPtr, _
ByVal uMsg As Integer, _
ByVal wParam As Integer, _
ByVal lParam As Integer) As Int32'Konstante
Const BM_Click As Integer = &HF5Dim Hauptfenster As IntPtr = FindWindow("#32770", "Serial to Ethernet Utility R-1.01 2011(c) Centos Inc.")
Dim UpdateButton As IntPtr = FindWindowEx(Hauptfenster, IntPtr.Zero, "Button", "Update all")
[/PHP]Und schlussendlich der Aufruf über:[PHP]SendMessage(UpdateButton, BM_Click, 0, 0)
[/PHP]Hier die Einträge im Spy++ Programm:
[Blockierte Grafik: http://img4.fotos-hochladen.net/uploads/spyka74rt6lpz.jpg]Meine ersten Test verliefen fast problemlos. Ich werde die Sache noch etwas weitertesten, da es diesen Button nach einem "Aufwachen aus dem Standby" drücken soll und es seither zwei Mal nicht auf Anhieb geklappt hat...
Bedanke mich an cx01 nochmals für den Einsatz und den hilfreichen Link!
P.S. Sorry, das Bild wird aus noch unerklärlichen Gründen nicht korrekt angezeigt...
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!