Wago 750 Modbus Eingang abfragen/auswerten

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wago 750 Modbus Eingang abfragen/auswerten

    Guten Morgen zusammen,

    ich wollte ein neues Project starten und hätte dazu eine kleine Frage.
    zum Vorhaben: Ich möchte mit einer Wago 750-352 und einigen I/O Modulen eine Steuerung bauen die per PC ansteuerbar ist.

    Die verbindung wird per Modbus TCP aufegbaut und ich habe von wago die "wago.dll" erhalten.

    Das schreiben der Ausgänge funktioniert über das mitgelieferte Beispielprogramm auch da verstehe ich auch wie ich die Ausänge setzten kann.
    z.B.
    der Wert 1 Enstpricht Ausgang 1
    der Wert 2 Enstpricht Ausgang 2
    der Wert 4 Enstpricht Ausgang 3
    der Wert 8 Enstpricht Ausgang 4
    der Wert 16 Enstpricht Ausgang 5
    der Wert 32 Entspricht Ausgang 6
    der Wert 64 Entspricht Ausgang 7
    der Wert 128 Entspricht Ausgang 8
    der Wert 2048 Entspricht Ausgang 12
    usw.

    zum Setzen der Ausgänge ist es ja denkbar einfach wenn ich eine Variable nehme und den wert des ausgangs eifach addiere / subtrahiere z.B.

    Quellcode

    1. Dim Ausgang as Integer = 0
    2. Const Ausgang1 As Integer =1
    3. Const Ausgang5 As Integer =16
    4. "" ich möchte Ausgang 1 und 5 schalten
    5. Ausgang = Ausgang + Ausgang1 + Ausgang5
    6. ( 0 = 0 + 1 + 16 ) = 17
    7. "" schalte nur den Ausgang 1 aus
    8. Ausgang = Ausgang - Ausgang1
    9. ( 17 = 17 - 1 ) =16

    Nachdem gleichen System erhalten ich auch den Rückgabewert für die Eingänge zurück

    z.B. Ich erhalte als Rückgabewert 3 somit wäre Eingang 1 und 2 aktiv.

    Nun die Frage wie könnte ich es lösen das ich anhand dem Rückgabewert einen Rückschluss auf den Augnag machen kann ? ?(

    Wie würde der Code dazu aussehen bzw. wonach müsste ich googlen um mich darin einzulesen. :/


    Vielen Dank und schonmal ein schönes Wochenende :thumbup:
    @Andy112

    Da die Ausgänge Power 2 sind, kann man mit OR und AND arbeiten.

    Z.b.
    Rechne Ausgang a1 Or a2 = a1a2 und beide Ausgänge sind im Resultat vorhanden
    Beweis rechne a1a2 AND a2 und du hast die Bestätigung.

    Schau dir das an

    VB.NET-Quellcode

    1. Dim a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 As Int32
    2. a1 = 1 : a2 = 2 : a3 = 4 : a4 = 8 : a5 = 16
    3. a6 = 32 : a7 = 64 : a8 = 128 : a9 = 256 : a10 = 1024
    4. Dim a4a7a10 = a4 Or a7 Or a10
    5. Dim res = a4a7a10 And a4 'ergibt wieder a4
    6. Dim f = a4a7a10 And a5 'ergibt 0


    Edit:Korrigiert

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim a% = 3 '1 + 2 an
    4. Dim t$
    5. For i As Integer = 0 To 15
    6. If a And Math.Pow(2, i) = i + 1 Then
    7. t = "Ausgang " & (i + 1).ToString & " ist an"
    8. Else
    9. t = "Ausgang " & (i + 1).ToString & " ist aus"
    10. End If
    11. Debug.Print(t)
    12. Next
    13. End Sub
    14. End Module

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Eierlein“ ()

    Eierlein schrieb:

    VB.NET-Quellcode

    1. Math.Pow(2, i)
    What :?:
    @Andy112 Mach Dir ein Flag-Enum.

    VB.NET-Quellcode

    1. <Flags>
    2. Enum ModBusWerte
    3. Leerr = 0
    4. Ausgang1 = 1
    5. Ausgang2 = 2
    6. Ausgang3 = 4
    7. Ausgang4 = 8
    8. Ausgang5 = 16
    9. Ausgang6 = 32
    10. Ausgang7 = 64
    11. Ausgang8 = 128
    12. Ausgang12 = 2048
    13. End Enum
    und dann

    VB.NET-Quellcode

    1. Dim DER_ENUM_WERT = CType(DER_INPUT_WERT, ModBusWerte)
    2. MessageBox.Show(DER_ENUM_WERT.ToString())
    3. If DER_ENUM_WERT.HasFlag(Ausgabg4) Then
    4. MessageBox.Show("Ausgabg4")
    5. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!