Merker/Ausgänge Moeller Easy auslesen und schreiben (easy_com.dll)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • du hast recht, jetzt wird nur noch 0 (inaktiv) und 1 (aktiv) ausgegeben. Das Programm hat sich jedoch einige Male verabschiedet. Jetzt läuft es zwar wieder normal... :|

      Welche Ideen hast du denn für den zweiten Ausgang?

      Quellcode

      1. Dim bRawByte(10) As Byte
      2. Dim bMarkerByte() As Byte = {1, 2, 3, 4, 5, 6, 7, 8}
      3. Private Sub Venti_Dusche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_Dusche.Click
      4. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 1, 0, 1)
      5. ComError = easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 1, 0, bRawByte(0))
      6. MsgBox(bRawByte(0) And 1)
      7. If bRawByte(0) = 1 Then
      8. Venti_Dusche.BackColor = Color.Yellow
      9. Else : Venti_Dusche.BackColor = Color.Transparent
      10. End If
      11. End Sub
      12. Dim bRawByte_1(10) As Byte
      13. Dim bMarkerByte_1() As Byte = {1, 2, 3, 4, 5, 6, 7, 8}
      14. Private Sub Venti_WC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_WC.Click
      15. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 11, 0, 1)
      16. ComError = easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 2, 0, bRawByte_1(0))
      17. MsgBox(bRawByte_1(0) And 1)
      18. If bRawByte_1(0) = 1 Then
      19. Venti_WC.BackColor = Color.Yellow
      20. Else : Venti_WC.BackColor = Color.Transparent
      21. End If
      Alles anzeigen
      Leider funktioniert es mit dem 2. Ausgang nicht wie erhofft. Ich habe eine neue Variable für den zweiten Ausgang definiert (bRawByte_1(0)).

      Edit: Leider funktioniert auch die Einfärbung der Buttons nicht mehr...
    • Man kann die Logik zum Einlesen eines bestimmten Ausgangs in eine eigene Funktion auslagern, das ist vlt lesbarer:

      Quellcode

      1. Private Function Lese_Ausgang(nummer As Integer) As Long
      2. Dim bRawByte(10) As Byte
      3. easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 0, 0, bRawByte(0))
      4. Return bRawByte(0) And (2 ^ (nummer - 1))
      5. End Function

      Da übergibst du die Nummer des Ausgangs und bekommst dann entweder 0 oder 1. Insgesamt würde das Programm dann so aussehen:

      Quellcode

      1. Private Sub Venti_Dusche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_Dusche.Click
      2. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 1, 0, 1)
      3. If Lese_Ausgang(1) = 1 Then
      4. Venti_Dusche.BackColor = Color.Yellow
      5. Else : Venti_Dusche.BackColor = Color.Transparent
      6. End If
      7. End Sub
      8. Private Function Lese_Ausgang(nummer As Integer) As Long
      9. Dim bRawByte(10) As Byte
      10. easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 0, 0, bRawByte(0))
      11. Return bRawByte(0) And (2 ^ (nummer - 1))
      12. End Function
      13. Private Sub Venti_WC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_WC.Click
      14. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 11, 0, 1)
      15. If Lese_Ausgang(2) = 1 Then
      16. Venti_WC.BackColor = Color.Yellow
      17. Else : Venti_WC.BackColor = Color.Transparent
      18. End If
      Alles anzeigen
    • klingt vielversprechend... aber die Färbung des Buttons 2 und 3 funktionieren nicht, obwohl (aus meiner Sicht) alle notwendigen Einträge vom Button 1 übernommen wurden.

      Siehst du noch irgendwo einen Fehler?

      Quellcode

      1. Private Sub Venti_Dusche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_Dusche.Click
      2. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 1, 0, 1)
      3. If Lese_Ausgang(1) = 1 Then
      4. Venti_Dusche.BackColor = Color.Yellow
      5. Else : Venti_Dusche.BackColor = Color.Transparent
      6. End If
      7. End Sub
      8. Private Function Lese_Ausgang(ByVal nummer As Integer) As Long
      9. Dim bRawByte(10) As Byte
      10. easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 0, 0, bRawByte(0))
      11. Return bRawByte(0) And (2 ^ (nummer - 1))
      12. End Function
      13. Private Sub Venti_WC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_WC.Click
      14. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 11, 0, 1)
      15. If Lese_Ausgang(2) = 1 Then
      16. Venti_WC.BackColor = Color.Yellow
      17. Else : Venti_WC.BackColor = Color.Transparent
      18. End If
      19. End Sub
      20. Private Sub WC_Licht_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles WC_Licht.Click
      21. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 31, 0, 1)
      22. If Lese_Ausgang(3) = 1 Then
      23. WC_Licht.BackColor = Color.Yellow
      24. Else : WC_Licht.BackColor = Color.Transparent
      25. End If
      26. End Sub
      Alles anzeigen
      Vorhin wurde nämlich für diese beiden Buttons jeweils 0 herausgegeben, egal welchen Zustand der Ausgang hatte.
    • Also der erste Knopf wird gelb, wenn der Ausgang aktiv ist? Und die anderen beiden Knöpfe sind immer transparent?

      UPDATE: Glaub ich hab den Fehler gefunden. Probiers mal so:

      Quellcode

      1. Private Sub Venti_Dusche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_Dusche.Click
      2. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 1, 0, 1)
      3. If Lese_Ausgang(1) = True Then
      4. Venti_Dusche.BackColor = Color.Yellow
      5. Else : Venti_Dusche.BackColor = Color.Transparent
      6. End If
      7. End Sub
      8. Private Function Lese_Ausgang(ByVal nummer As Integer) As Boolean
      9. Dim bRawByte(10) As Byte
      10. easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 0, 0, bRawByte(0))
      11. Return 0 <> (bRawByte(0) And (2 ^ (nummer - 1)))
      12. End Function
      13. Private Sub Venti_WC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_WC.Click
      14. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 11, 0, 1)
      15. If Lese_Ausgang(2) = True Then
      16. Venti_WC.BackColor = Color.Yellow
      17. Else : Venti_WC.BackColor = Color.Transparent
      18. End If
      19. End Sub
      20. Private Sub WC_Licht_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles WC_Licht.Click
      21. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 31, 0, 1)
      22. If Lese_Ausgang(3) = True Then
      23. WC_Licht.BackColor = Color.Yellow
      24. Else : WC_Licht.BackColor = Color.Transparent
      25. End If
      26. End Sub
      Alles anzeigen
    • Jep, genauso war es.
      Vor kurzem habe ich die nachfolgenden Werte angepasst und es scheint zu funktionieren.

      Quellcode

      1. Private Sub Venti_Dusche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_Dusche.Click
      2. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 1, 0, 1)
      3. If Lese_Ausgang(1) = [B][COLOR=Red]1[/COLOR][/B] Then
      4. Venti_Dusche.BackColor = Color.Yellow
      5. Else : Venti_Dusche.BackColor = Color.Transparent
      6. End If
      7. End Sub
      8. Private Function Lese_Ausgang(ByVal nummer As Integer) As Long
      9. Dim bRawByte(10) As Byte
      10. easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 0, 0, bRawByte(0))
      11. Return bRawByte(0) And (2 ^ (nummer - 1))
      12. End Function
      13. Private Sub Venti_WC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_WC.Click
      14. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 11, 0, 1)
      15. If Lese_Ausgang(2) = [COLOR=Red][B]2[/B][/COLOR] Then
      16. Venti_WC.BackColor = Color.Yellow
      17. Else : Venti_WC.BackColor = Color.Transparent
      18. End If
      19. End Sub
      20. Private Sub WC_Licht_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles WC_Licht.Click
      21. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 31, 0, 1)
      22. If Lese_Ausgang(3) = [COLOR=Red][B]4[/B][/COLOR] Then
      23. WC_Licht.BackColor = Color.Yellow
      24. Else : WC_Licht.BackColor = Color.Transparent
      25. End If
      26. End Sub
      Alles anzeigen
      Seltsam ist, dass meistens die ersten Testversuche das Programm zum Abstürzen bringen. Anschliessende Versuche funktionieren dann einwandfrei... :|

      Ich pröble noch etwas weiter und melde mich nochmals, falls weitere Probleme entstehen sollten :-)

      Bedanke mich nochmals für deinen Einsatz und Geduld!! ;-)

      Freundlich grüsst
      ADB
    • Komischer Weise ist es nicht beim Aufstarten abgeschmiert, sondern erst nachdem ich die Buttons einige Male gedrückt hatte.
      Ich hoffe stets noch an Zufälle... :-)

      Erweitere und teste das Programm noch weiter... ;-)

      Danke und angenehme Nachtruhe...
    • Hast du evtl. noch einen Tipp für mich, wie ich den Zustand der Ausgänge bei jedem Durchgang überprüfen kann? Ich konnte bisher keine Möglichkeit finden.
      Das Problem entsteht dann, wenn ich den Ausgang über eine Hardware-Taste drücke, ändert sich in meinem Programm die Button-Färbung nicht.

      Demnach müsste ich doch folgenden Teil aus dem "Click-Sub" entfernen, oder?

      Quellcode

      1. If Lese_Ausgang(0) = 1 Then
      2. Venti_Dusche.BackColor = Color.GreenYellow
      3. Else : Venti_Dusche.BackColor = Color.Transparent
      4. End If
      Die Frage ist nur "wie"?
    • Könnte rein theoretisch klappen.
      Beim Versuch, den Timer zu setzen, erhalte ich wieder folgende Fehlermeldung:

      FormatExeption wurde nicht behandelt.
      Die Eingabezeichenfolge hat das falsche Format.


      Dabei ist folgende Zeile markiert:
      ComError = easyCOM.MC_Open_ComPort(MyComHandle, CByte(comboBox_Port.SelectedIndex + 1), Int32.Parse(comboBox_Baudrate.Text))

      Bereits in den letzten Tagen hat sich diese Meldung schon gezeigt, doch nachdem ich etwas mit den Typen (String, Integer, UInteger...) "rumgespielt" habe, hat die Sache plötzlich funktioniert.
      Leider funktioniert das Programm auch nicht mehr, wenn ich den Timer-Eintrag entferne...

      Hier nochmals den kompletten Code:

      Quellcode

      1. Public Class Form1
      2. Dim MyComHandle As
      3. Dim ComError As Integer
      4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      5. comboBox_Port.SelectedIndex = 3
      6. comboBox_Baudrate.SelectedIndex = 1
      7. MyComHandle = 0
      8. btn_Connect.Enabled = True
      9. btn_Disconnect.Enabled = False
      10. Venti_Dusche.Enabled = False
      11. Venti_WC.Enabled = False
      12. End Sub
      13. Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
      14. easyCOM.MC_CloseAll()
      15. End Sub
      16. Private Sub btn_Connect_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      17. Dim baud As Integer
      18. Dim sBaud As String
      19. Dim waittime As Integer
      20. easyCOM.MC_Get_UserWaitingTime(waittime)
      21. easyCOM.MC_Set_UserWaitingTime(1000)
      22. easyCOM.MC_Get_UserWaitingTime(waittime)
      23. Venti_Dusche.Enabled = False
      24. Venti_WC.Enabled = False
      25. textBox1.Text = "Connecting..."
      26. textBox1.Refresh()
      27. ComError = easyCOM.MC_Open_ComPort(MyComHandle, CByte(comboBox_Port.SelectedIndex + 1), Int32.Parse(comboBox_Baudrate.Text))
      28. If ComError = easyCOM.easy_COM_Err_Success Then
      29. easyCOM.MC_GetCurrent_Baudrate(MyComHandle, baud)
      30. sBaud = baud.ToString()
      31. If (comboBox_Baudrate.Items.Contains(sBaud)) Then
      32. comboBox_Baudrate.SelectedIndex = comboBox_Baudrate.Items.IndexOf(sBaud)
      33. End If
      34. comboBox_Baudrate.Refresh()
      35. comboBox_Baudrate.Enabled = False
      36. comboBox_Port.Enabled = False
      37. textBox1.Text = "Online!"
      38. Venti_Dusche.Enabled = True
      39. Venti_WC.Enabled = True
      40. btn_Connect.Enabled = False
      41. btn_Disconnect.Enabled = True
      42. Venti_Dusche.Enabled = True
      43. Venti_WC.Enabled = True
      44. Else
      45. textBox1.Text = "Connection failed. Error " + ComError.ToString()
      46. End If
      47. End Sub
      48. Private Sub btn_Disconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Disconnect.Click
      49. ComError = easyCOM.MC_Close_ComPort(MyComHandle)
      50. btn_Connect.Enabled = True
      51. btn_Disconnect.Enabled = False
      52. Venti_Dusche.Enabled = False
      53. Venti_WC.Enabled = False
      54. comboBox_Baudrate.Enabled = True
      55. comboBox_Port.Enabled = True
      56. textBox1.Text = "Offline!"
      57. End Sub
      58. 'Ausgelagerte Funktion für die Bedienung der verschiedenen Ausgänge per Tastendruck auf einen Button.
      59. Private Function Lese_Ausgang(ByVal nummer As Integer) As Long
      60. Dim bRawByte(10) As Byte
      61. easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 0, 0, bRawByte(0))
      62. Return bRawByte(0) And (2 ^ (nummer - 1))
      63. End Function
      64. 'Durch einen Klick auf den Button wird in den Merker 1 geschrieben (Siehe Doku Seite 37). Der Merker wird gleichzeitig im Schaltplan zurückgesetzt.
      65. Private Sub Venti_Dusche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_Dusche.Click
      66. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 1, 0, 1)
      67. If Lese_Ausgang(0) = 1 Then
      68. Venti_Dusche.BackColor = Color.GreenYellow
      69. Else : Venti_Dusche.BackColor = Color.Transparent
      70. End If
      71. End Sub
      72. 'Durch einen Klick auf den Button wird in den Merker 11 geschrieben. In den Merker wird der Wert 1 geschrieben.
      73. Private Sub Venti_WC_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Venti_WC.Click
      74. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 11, 0, 1)
      75. If Lese_Ausgang(2) = 2 Then
      76. Venti_WC.BackColor = Color.GreenYellow
      77. Else : Venti_WC.BackColor = Color.Transparent
      78. End If
      79. End Sub
      80. 'Der Wert If Lese_Ausgang(3) = 4 Then muss stets angepasst werden
      81. Private Sub WC_Licht_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles WC_Licht.Click
      82. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 31, 0, 1)
      83. If Lese_Ausgang(3) = 4 Then
      84. WC_Licht.BackColor = Color.GreenYellow
      85. Else : WC_Licht.BackColor = Color.Transparent
      86. End If
      87. End Sub
      88. Private Sub Licht_Esstisch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Licht_Esstisch.Click
      89. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 51, 0, 1)
      90. If Lese_Ausgang(4) = 8 Then
      91. Licht_Esstisch.BackColor = Color.GreenYellow
      92. Else : Licht_Esstisch.BackColor = Color.Transparent
      93. End If
      94. End Sub
      95. Private Sub Licht_Couch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Licht_Couch.Click
      96. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 61, 0, 1)
      97. If Lese_Ausgang(5) = 16 Then
      98. Licht_Couch.BackColor = Color.GreenYellow
      99. Else : Licht_Couch.BackColor = Color.Transparent
      100. End If
      101. End Sub
      102. Private Sub Licht_Zimmer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Licht_Zimmer.Click
      103. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 71, 0, 1)
      104. End Sub
      105. Private Sub Beleuchtung_aus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Beleuchtung_aus.Click
      106. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 81, 0, 1)
      107. End Sub
      108. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      109. If Lese_Ausgang(6) = 32 Then
      110. Licht_Zimmer.BackColor = Color.GreenYellow
      111. Else : Licht_Zimmer.BackColor = Color.Transparent
      112. End If
      113. End Sub
      114. End Class
      Alles anzeigen
      Kann etwas spezielles enddeckt werden?
      Den Timer ist in den letzten Zeilen zu finden...
    • Diese Zeilen habe ich vom Beispielprogramm so übernommen.

      Die richtige Baudrate wird ja durch folgenden Eintrag festgelegt:

      Quellcode

      1. comboBox_Port.SelectedIndex = 3


      Jedoch sollte dies keine Rolle spielen, denn gestern hat dies ja ohne Probleme funktioniert, oder was denkst du?
    • Es lag anscheinend doch am Timer.
      Den Code vom Timer hatte ich vorhin entfernt und die Fehlermeldung erschien trotzdem noch. Erst als ich auch den "Timer-Button" gelöscht habe, hat das Programm wieder funktioniert.
      Anschliessend kann ich den Timer auch wieder in die Form hineinziehen, doch sobald ich den nachfolgenden Code beim Timer einfüge, erscheint wieder die Fehlermeldung:

      Quellcode

      1. If Lese_Ausgang(6) = 32 Then
      2. Licht_Zimmer.BackColor = Color.GreenYellow
      3. Else : Licht_Zimmer.BackColor = Color.Transparent
      4. End If
      5. End Sub
      Funktioniert dies so nicht? Sind noch weitere Einträge notwendig?
    • Also die folgende Zeile:

      Quellcode

      1. ComError = easyCOM.MC_Open_ComPort(MyComHandle, CByte(comboBox_Port.SelectedIndex + 1), Int32.Parse(comboBox_Baudrate.Text))

      wird doch eigentlich nur einmal bei Programmstart ausgeführt. Der Timer ruft diese Funktion ja nicht auf. Daher bin ich grad ziemlich verwirrt, wie der Timer den Fehler auslösen kann.
    • Um sicher zu gehen mach am besten mal foldendes:

      Quellcode

      1. MsgBox (comboBox_Baudrate.Text)
      2. ComError = easyCOM.MC_Open_ComPort(MyComHandle, CByte(comboBox_Port.SelectedIndex + 1), Int32.Parse(comboBox_Baudrate.Text))

      So dass er anzeigt, welche Baudrate in der Combobox ausgewählt ist. Dann sehen wir ja, ob es eine Zahl ist oder nicht.
    • Voraussichtlich ist dies der Fehler:

      Private Sub btn_Connect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Connect.Click

      habe ich vor einigen Tagen geändert auf:

      Private Sub btn_Connect_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

      Seltsam ist nur, dass es teilweise funktioniert hat... :|

      Der Grund für die Änderung war eigentlich, dass der Button automatisch aktiviert wird und die Verbindung zum Easy-Relais herstellt.

      Wie könnte ich dies denn realisieren?