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.

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

      Hallo Leute.

      In der Hoffnung, dass mir jemand auf die Sprünge helfen kann, wende ich mich im Forum um Hilfe.

      Ich besitze ein Easy-Steuerrelais von Moeller bzw. Eaton (DC-RCX) und möchte mir per Visual-Basic eine Bedienoberfläche für Windows gestalten. Dazu möchte ich die easy_com.dll zur Hilfe nehmen.

      Link

      Anhand der Dokumentation und dem Beispielprogramm habe ich es soweit geschafft, die verschiedenen Ausgänge zu schalten.

      Hier der Befehl:

      ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 3, 0, bMarkerByte(0))

      Interpretiere ich die Doku richtig, steht
      - die 0 für den Com-Port
      - die 4 für "einzelne Bit-Merker"
      - die 3 für den jeweiligen Merker (in meinem Beispiel M3)
      - die 0 für die Länge?
      - und das bMarkerByte(0) für den Wert, der in den Merker geschrieben werden soll.

      Natürlich möchte ich für einen Ausgang nicht einen separaten Ein- und Ausschalt-Button erstellen, sondern nur einen Button verwenden, mit dem ich den Ausgang ein- und ausschalten und wenn möglich gleichzeitig noch den Zustand anzeigen kann.

      Dazu habe ich folgendes geschrieben:

      Quellcode

      1. im bRawByte(0) As Byte
      2. Dim bMarkerByte() As Byte = {1, 2, 3, 4, 5, 6, 7, 8}
      3. Private Sub btn_Run_Test_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Run_Test.Click
      4. ComError = easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 1, 0, bRawByte(0))
      5. MsgBox(bRawByte(0))
      6. If bRawByte(0) = 0 Then
      7. bMarkerByte(0) = 1
      8. Else : bMarkerByte(0) = 0
      9. End If
      10. MsgBox(bMarkerByte(0))
      11. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 3, 0, bMarkerByte(0))
      12. End Sub
      Alles anzeigen
      Demnach sollte der erste Befehl den Wert aus dem Merker auslesen und durch das "If-Then-Else-Verfahren" den gegenteiligen Wert in den Merker schreiben.

      Mein Problem besteht jedoch darin, dass mir nicht nur die beiden Werte 1 und 0 ausgegeben werden, sondern steht beispielsweise in der Variable bMarkerByte(0) bei eingeschalteten Ausgang der Wert 5 und wenn er ausgeschaltet wird den Wert 4.
      Diese Werte ändern sich sporadisch und ich konnte noch nicht herausfinden, weshalb sich diese Werte ändern.

      Kann mir jemand weiterhelfen und mir erklären, weshalb ein Wert 4 oder 5 statt 0 und 1 ausgegeben wird?
      Welche Bedeutung hat eigentlich die 0 vom bMarkerByte(0)?

      Leider muss ich mich noch in der Stufe "Beginner" einteilen, da ich mich erst seit ein paar Tagen mit VisualBasic auseinandersetze.

      Falls mir jemand mit einigen Tipps weiterhelfen kann, bedanke ich mich bereits im Voraus dafür. :wink:

      Gruss
      ADB
    • ADB;938342 schrieb:


      Mein Problem besteht jedoch darin, dass mir nicht nur die beiden Werte 1 und 0 ausgegeben werden, sondern steht beispielsweise in der Variable bMarkerByte(0) bei eingeschalteten Ausgang der Wert 5 und wenn er ausgeschaltet wird den Wert 4.
      Diese Werte ändern sich sporadisch und ich konnte noch nicht herausfinden, weshalb sich diese Werte ändern.

      Kann mir jemand weiterhelfen und mir erklären, weshalb ein Wert 4 oder 5 statt 0 und 1 ausgegeben wird?
      Welche Bedeutung hat eigentlich die 0 vom bMarkerByte(0)?


      bMarkerByte ist ein Array, also eine Liste. bMarkerByte(0) bezeichnet das erste Element in dieser Liste.

      Eine Sache, die zumindest falsch aussieht ist:

      Quellcode

      1. dim bRawByte(0) As Byte

      Denn das Array hat die Länge von 1, aber die Funktion MC_Read_Object_Value versucht, 2 Werte hineinzuschreiben. Also mach mal bRawByte größer und schau ob es hilft.
    • sollte es so stimmen?

      Quellcode

      1. Dim bRawByte() As Byte = {1, 2, 3, 4, 5, 6, 7, 8}
      2. Dim bMarkerByte() As Byte = {1, 2, 3, 4, 5, 6, 7, 8}
      3. Private Sub btn_Run_Test_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Run_Test.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(2))
      6. If bRawByte(2) = 13 Then
      7. btn_Run_Test.BackColor = Color.Yellow
      8. Else : btn_Run_Test.BackColor = Color.Transparent
      9. MsgBox(bRawByte(2))
      10. End If
      Alles anzeigen
      Dieses Mal soll sich der Button mit Gelb einfärben, wenn der Ausgang eingeschaltet ist...

      Bisher haben sich die Werte noch nicht geändert. Mal sehen...


      Wieso versucht denn die Funktion zwei Werte hineinzuschreiben? Eigentlich muss doch nur ein Wert übermittelt werden...
    • Du übergibst an MC_Read_Object_Value als dritten Parameter eine 1. In der Dokumentation steht Object 1 hat die Größe von 2 Byte. Also muss der Data-Parameter, den du übergibst, auch 2 Byte aufnehmen können.

      Bei dem neuen Programm hast du jetzt mehrere Dinge geändert, die eig garnicht falsch waren. Könntest du mal das erste Programm testen, aber eben mit größerem bRawByte? Also z.B.

      Quellcode

      1. dim bRawByte(10) As Byte

      Wäre interessant, ob er dann immernoch 4 oder 5 anzeigt.
    • Quellcode

      1. Dim bRawByte(15) As Byte
      2. Dim bMarkerByte() As Byte = {1, 2, 3, 4, 5, 6, 7, 8}
      3. Private Sub btn_Run_Test_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Run_Test.Click
      4. ComError = easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 1, 0, bRawByte(15))
      5. MsgBox(bRawByte(15))
      6. If bRawByte(15) = 12 Then
      7. bMarkerByte(15) = 13
      8. Else : bMarkerByte(15) = 12
      9. End If
      10. MsgBox(bMarkerByte(15))
      11. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 3, 0, bMarkerByte(15))
      12. End Sub
      Alles anzeigen
      Jetzt wird beispielsweise 12 und 13 herausgelesen, doch beim Compilieren wird folgender Fehler angezeigt:

      Der Index war außerhalb des Arraybereichs.

      Was sagt dir das?
    • Du sagst: bMarkerByte(15)
      Das geht nicht, weil bMarkerByte ja nur 8 Elemente enthält.

      Die Änderung, die ich meinte, bezog sich nur auf die erste Zeile, also das mit "dim bRawByte(10) As Byte". Alles andere kannst du so lassen wie in deinem ersten Post.
    • Quellcode

      1. Dim bRawByte(10) As Byte
      2. Dim bMarkerByte() As Byte = {1, 2, 3, 4, 5, 6, 7, 8}
      3. Private Sub btn_Run_Test_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Run_Test.Click
      4. ComError = easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 1, 0, bRawByte(0))
      5. MsgBox(bRawByte(0))
      6. If bRawByte(0) = 44 Then
      7. bMarkerByte(0) = 1
      8. Else : bMarkerByte(0) = 0
      9. End If
      10. MsgBox(bMarkerByte(0))
      11. ComError = easyCOM.MC_Write_Object_Value(MyComHandle, 0, 4, 3, 0, bMarkerByte(0))
      12. End Sub
      Alles anzeigen
      So sieht der Code jetzt aus, doch gerade eben haben sich die Zahlen von 44/45 auf 8/9 geändert...

      Kennst du die Lösungs Rätsels?
    • die Werte vom nachfolgenden Code haben sich jedoch bisher nicht geändert:

      Quellcode

      1. Dim bRawByte() As Byte = {1, 2, 3, 4, 5, 6, 7, 8}
      2. Dim bMarkerByte() As Byte = {1, 2, 3, 4, 5, 6, 7, 8}
      3. Private Sub btn_Run_Test_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Run_Test.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(2))
      6. If bRawByte(2) = 9 Then
      7. btn_Run_Test.BackColor = Color.Yellow
      8. Else : btn_Run_Test.BackColor = Color.Transparent
      9. End If
      Alles anzeigen
      Natürlich ohne Gewähr...

      Kann es evtl. daran liegen:

      Dim bRawByte() As Byte = {1, 2, 3, 4, 5, 6, 7, 8}


    • Jep, sorry!!

      Im Schaltplan schaltet der Merker M1 anschliessend den Ausgang Q1. Der Merker M1 wird gleichzeitig wieder zurückgesetzt. Jeder Impuls von M1 ändert den Zustand von Q1.

      Es ist mir klar, dass sich der eingelesene Wert bei jedem Schalten ändert, dies ist jedoch nicht ganz mein Problem.
      Es liegt mehr daran, dass für eine gewisse Zeit wird bei

      - ausgeschaltetem Ausgang -> 0 angezeigt
      - eingeschaltetem Eingang -> 1 angezeigt

      Einige Zeit später (ohne Eingriffe in das Programm) wird bei

      - ausgeschaltetem Ausgang -> 8 ausgegeben
      - eingeschaltetem Ausgang -> 9 ausgegeben

      Wiederum etwas später wird bei

      - ausgeschaltetem Ausgang -> 13 übermittelt
      - eingeschaltetem Ausgang -> 14 übermittelt

      Kannst du mir folgen?
    • Aber durch:

      ComError = easyCOM.MC_Read_Object_Value(MyComHandle, 0, 1, 1, 0, bRawByte(0))
      1 = Digitale Ausgänge Basisgerät (Laut Doku)
      1 = Digitaler Ausgang Q1 (Laut Doku)
      sollte doch nur der Ausgang Q1 ausgelesen werden. Sehe ich dies falsch??

      -----------------------------
      Sofern ich dies beurteilen kann, wird bei der zweiten Code-Variante immer dieselben beiden Werte zurückgeben.
    • Nein er liest immer alle Ausgänge ein und speichert das Ergebnis in 2 Bytes, also in bRawByte(0) und bRawByte(1). Der 4te Parameter wird ignoriert, wenn der 3te Parameter 1 ist. Zumindest verstehe ich die Doku so.

      Ich verstehe nur nicht, wieso er 2 Bytes (also 16 Bit) benötigt, wenn es nur 8 Ausgänge gibt.
    • cx01;938396 schrieb:

      Nein er liest immer alle Ausgänge ein und speichert das Ergebnis in 2 Bytes, also in bRawByte(0) und bRawByte(1). Der 4te Parameter wird ignoriert, wenn der 3te Parameter 1 ist. Zumindest verstehe ich die Doku so.

      Ich verstehe nur nicht, wieso er 2 Bytes (also 16 Bit) benötigt, wenn es nur 8 Ausgänge gibt.


      Nun ja... dann könnte es schon stimmen, denn pro Ausgang gibt es ja immer einen Zustand "EIN" und einen Zustand "AUS" -> 2 x 8 = 16, oder?

      Wie kann ich denn den Zustand von Ausgang Q1 auslesen??
    • Ein Bit kann ja 0 oder 1 sein, daher würden 8 Bit eigentlich ausreichen.

      Es steht leider nirgends, wie der Zustand der Ausgänge auf die 2 Bytes aufgeteilt wird. Hier müsstest du also rumprobieren. Du kannst die von deinem Programm ausgegebenen Zahlen in den Windows Taschenrechner kopieren und in Binärform umwandeln lassen. Eventuell entdeckst du dann ein Schema; also dass ein bestimmtes Bit immer dann 1 ist, wenn auch der Ausgang aktiv ist.
    • ADB;938394 schrieb:


      Sofern ich dies beurteilen kann, wird bei der zweiten Code-Variante immer dieselben beiden Werte zurückgeben.


      Leider stimmt es auch mit dem zweiten Code nicht. Jedoch blicke ich bereits etwas weiter...

      Die zurückgegebene Zahl hängt wirklich von den jeweiligen geschalteten Eingängen ab. D.h. wird ein zweiter Ausgang zusätzlich eingeschaltet, ändert sich auch der zurückgegebene Wert. Leider habe ich damit nicht gerechnet, denn ich war zu sehr auf den einzelnen Ausgang fixiert.

      Nur... diese Erkenntnis entfernt mich weiter von meinem Ziel. Hast du evtl. eine andere Lösung, wie ich den Zustand der einzelnen Ausgänge überprüfen kann? Die Sache mit dem binären System wird wohl nicht klappen, oder?
    • Am wahrscheinlichsten ist, dass der Wert vom Ausgang 1 im geringwertigsten Bit gespeichert ist. Du könntest mal folgendes in dein Programm einbauen:

      Quellcode

      1. MsgBox(bRawByte(0) And 1)

      Das dürfte jetzt nurnoch entweder 1 oder 0 anzeigen, hoffentlich genau dann, wenn der Ausgang aktiv/inaktiv ist.