Relaismodul über Bits ansteuern und schalten - Auslesen des Bits

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von DannyDee.

    Relaismodul über Bits ansteuern und schalten - Auslesen des Bits

    Hallo Leute , ich habe mich hier angemeldet da ich mir von euch ein wenig Hilfe erhoffe.

    Ich habe gerade meine Ausbildung angefangen und soll nun ein Programm schreiben , welches ein Relaismodul ansteuert und einzelne Relais anspricht ,damit diese Schalten.

    Das Modul hat 5 Relais ,die wie folgt belegt sind.

    Bitwert in Dezimal :



    Relais 0 - 1



    Relais 1 - 2



    Relais 2 - 4



    Relais 3 - 8



    Relais 4 - 16

    Bisher habe ich das Programm soweit , dass ich die Relais einzeln ansteuern kann , entweder indem ich in eine Textbox den zu schreibenden Wert eintrage , oder über einen Button ,welcher das ihm zugeteilte Relais schaltet.

    Da ich aber mit meinem Code über diese Buttons immer nur 1 Relais anschalten kann , hab ich überlegt wie ich es am raffiniertesten mache ,dass ich beliebig durch erneuten Click auf einen der Buttons das jeweilige Relais dazuschalte , oder ausschalte.

    Hier mal mein Code ( und bitte nicht wegen der Select - Case Aktion flamen :) Soll nicht schön sein , es soll erstmal funktionieren. Auf Diät kann ich den Code immernoch stellen ,wenn er voll Funktionsfähig ist. )







    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class RM5Tester
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. TimerStatus.Enabled = True
    4. TimerRead.Enabled = True
    5. End Sub
    6. Private Sub cmd_WriteReg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_WriteReg.Click
    7. writeReg(TB_ShortAdr.Text, TB_Reg.Text, TB_WriteReg.Text)
    8. End Sub
    9. Private Sub cmd_ReadReg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_ReadReg.Click
    10. TB_ReadReg.Text = readReg(TB_ShortAdr.Text, TB_Reg.Text)
    11. End Sub
    12. Private Sub cmd_zyklRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_zyklRead.Click
    13. If TimerRead.Enabled = False Then
    14. cmd_zyklRead.Text = "Lesen aktiv"
    15. TimerRead.Enabled = True
    16. TB_ShortAdr.ReadOnly = True
    17. TB_Reg.ReadOnly = True
    18. Else
    19. TimerRead.Enabled = False
    20. cmd_zyklRead.Text = "Zyklisches Lesen"
    21. TB_ShortAdr.ReadOnly = False
    22. TB_Reg.ReadOnly = False
    23. End If
    24. End Sub
    25. Private Sub cmd_rel0_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_rel0.Click
    26. writeReg(TB_ShortAdr.Text, 0, 1)
    27. End Sub
    28. Private Sub cmd_rel1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_rel1.Click
    29. writeReg(TB_ShortAdr.Text, 0, 2)
    30. End Sub
    31. Private Sub cmd_rel2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_rel2.Click
    32. writeReg(TB_ShortAdr.Text, 0, 4)
    33. End Sub
    34. Private Sub cmd_rel3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_rel3.Click
    35. writeReg(TB_ShortAdr.Text, 0, 8)
    36. End Sub
    37. Private Sub cmd_rel4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_rel4.Click
    38. writeReg(TB_ShortAdr.Text, 0, 16)
    39. End Sub
    40. Private Sub TimerStatus_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerStatus.Tick
    41. Dim x As Integer
    42. x = readReg(TB_ShortAdr.Text, 0)
    43. Select Case x
    44. Case 1
    45. cmd_rel0.BackColor = Color.Green
    46. cmd_rel1.BackColor = Color.Red
    47. cmd_rel2.BackColor = Color.Red
    48. cmd_rel3.BackColor = Color.Red
    49. cmd_rel4.BackColor = Color.Red
    50. Case 2
    51. cmd_rel0.BackColor = Color.Red
    52. cmd_rel1.BackColor = Color.Green
    53. cmd_rel2.BackColor = Color.Red
    54. cmd_rel3.BackColor = Color.Red
    55. cmd_rel4.BackColor = Color.Red
    56. Case 3
    57. cmd_rel0.BackColor = Color.Green
    58. cmd_rel1.BackColor = Color.Green
    59. cmd_rel2.BackColor = Color.Red
    60. cmd_rel3.BackColor = Color.Red
    61. cmd_rel4.BackColor = Color.Red
    62. Case 4
    63. cmd_rel0.BackColor = Color.Red
    64. cmd_rel1.BackColor = Color.Red
    65. cmd_rel2.BackColor = Color.Green
    66. cmd_rel3.BackColor = Color.Red
    67. cmd_rel4.BackColor = Color.Red
    68. Case 5
    69. cmd_rel0.BackColor = Color.Green
    70. cmd_rel1.BackColor = Color.Red
    71. cmd_rel2.BackColor = Color.Green
    72. cmd_rel3.BackColor = Color.Red
    73. cmd_rel4.BackColor = Color.Red
    74. Case 6
    75. cmd_rel0.BackColor = Color.Red
    76. cmd_rel1.BackColor = Color.Green
    77. cmd_rel2.BackColor = Color.Green
    78. cmd_rel3.BackColor = Color.Red
    79. cmd_rel4.BackColor = Color.Red
    80. Case 7
    81. cmd_rel0.BackColor = Color.Green
    82. cmd_rel1.BackColor = Color.Green
    83. cmd_rel2.BackColor = Color.Green
    84. cmd_rel3.BackColor = Color.Red
    85. cmd_rel4.BackColor = Color.Red
    86. Case 8
    87. cmd_rel0.BackColor = Color.Red
    88. cmd_rel1.BackColor = Color.Red
    89. cmd_rel2.BackColor = Color.Red
    90. cmd_rel3.BackColor = Color.Green
    91. cmd_rel4.BackColor = Color.Red
    92. Case 9
    93. cmd_rel0.BackColor = Color.Green
    94. cmd_rel1.BackColor = Color.Red
    95. cmd_rel2.BackColor = Color.Red
    96. cmd_rel3.BackColor = Color.Green
    97. cmd_rel4.BackColor = Color.Red
    98. Case 10
    99. cmd_rel0.BackColor = Color.Red
    100. cmd_rel1.BackColor = Color.Green
    101. cmd_rel2.BackColor = Color.Red
    102. cmd_rel3.BackColor = Color.Green
    103. cmd_rel4.BackColor = Color.Red
    104. Case 11
    105. cmd_rel0.BackColor = Color.Green
    106. cmd_rel1.BackColor = Color.Green
    107. cmd_rel2.BackColor = Color.Red
    108. cmd_rel3.BackColor = Color.Green
    109. cmd_rel4.BackColor = Color.Red
    110. Case 12
    111. cmd_rel0.BackColor = Color.Red
    112. cmd_rel1.BackColor = Color.Red
    113. cmd_rel2.BackColor = Color.Green
    114. cmd_rel3.BackColor = Color.Green
    115. cmd_rel4.BackColor = Color.Red
    116. Case 13
    117. cmd_rel0.BackColor = Color.Green
    118. cmd_rel1.BackColor = Color.Red
    119. cmd_rel2.BackColor = Color.Green
    120. cmd_rel3.BackColor = Color.Green
    121. cmd_rel4.BackColor = Color.Red
    122. Case 14
    123. cmd_rel0.BackColor = Color.Red
    124. cmd_rel1.BackColor = Color.Green
    125. cmd_rel2.BackColor = Color.Green
    126. cmd_rel3.BackColor = Color.Green
    127. cmd_rel4.BackColor = Color.Red
    128. Case 15
    129. cmd_rel0.BackColor = Color.Green
    130. cmd_rel1.BackColor = Color.Green
    131. cmd_rel2.BackColor = Color.Green
    132. cmd_rel3.BackColor = Color.Green
    133. cmd_rel4.BackColor = Color.Red
    134. Case 16
    135. cmd_rel0.BackColor = Color.Red
    136. cmd_rel1.BackColor = Color.Red
    137. cmd_rel2.BackColor = Color.Red
    138. cmd_rel3.BackColor = Color.Red
    139. cmd_rel4.BackColor = Color.Green
    140. Case 17
    141. cmd_rel0.BackColor = Color.Green
    142. cmd_rel1.BackColor = Color.Red
    143. cmd_rel2.BackColor = Color.Red
    144. cmd_rel3.BackColor = Color.Red
    145. cmd_rel4.BackColor = Color.Green
    146. Case 18
    147. cmd_rel0.BackColor = Color.Red
    148. cmd_rel1.BackColor = Color.Green
    149. cmd_rel2.BackColor = Color.Red
    150. cmd_rel3.BackColor = Color.Red
    151. cmd_rel4.BackColor = Color.Green
    152. Case 19
    153. cmd_rel0.BackColor = Color.Green
    154. cmd_rel1.BackColor = Color.Green
    155. cmd_rel2.BackColor = Color.Red
    156. cmd_rel3.BackColor = Color.Red
    157. cmd_rel4.BackColor = Color.Green
    158. Case 20
    159. cmd_rel0.BackColor = Color.Red
    160. cmd_rel1.BackColor = Color.Red
    161. cmd_rel2.BackColor = Color.Green
    162. cmd_rel3.BackColor = Color.Red
    163. cmd_rel4.BackColor = Color.Green
    164. Case 21
    165. cmd_rel0.BackColor = Color.Green
    166. cmd_rel1.BackColor = Color.Red
    167. cmd_rel2.BackColor = Color.Green
    168. cmd_rel3.BackColor = Color.Red
    169. cmd_rel4.BackColor = Color.Green
    170. Case 22
    171. cmd_rel0.BackColor = Color.Red
    172. cmd_rel1.BackColor = Color.Green
    173. cmd_rel2.BackColor = Color.Green
    174. cmd_rel3.BackColor = Color.Red
    175. cmd_rel4.BackColor = Color.Green
    176. Case 23
    177. cmd_rel0.BackColor = Color.Green
    178. cmd_rel1.BackColor = Color.Green
    179. cmd_rel2.BackColor = Color.Green
    180. cmd_rel3.BackColor = Color.Red
    181. cmd_rel4.BackColor = Color.Green
    182. Case 24
    183. cmd_rel0.BackColor = Color.Red
    184. cmd_rel1.BackColor = Color.Red
    185. cmd_rel2.BackColor = Color.Red
    186. cmd_rel3.BackColor = Color.Green
    187. cmd_rel4.BackColor = Color.Green
    188. Case 25
    189. cmd_rel0.BackColor = Color.Green
    190. cmd_rel1.BackColor = Color.Red
    191. cmd_rel2.BackColor = Color.Red
    192. cmd_rel3.BackColor = Color.Green
    193. cmd_rel4.BackColor = Color.Green
    194. Case 26
    195. cmd_rel0.BackColor = Color.Red
    196. cmd_rel1.BackColor = Color.Green
    197. cmd_rel2.BackColor = Color.Red
    198. cmd_rel3.BackColor = Color.Green
    199. cmd_rel4.BackColor = Color.Green
    200. Case 27
    201. cmd_rel0.BackColor = Color.Green
    202. cmd_rel1.BackColor = Color.Green
    203. cmd_rel2.BackColor = Color.Red
    204. cmd_rel3.BackColor = Color.Green
    205. cmd_rel4.BackColor = Color.Green
    206. Case 28
    207. cmd_rel0.BackColor = Color.Red
    208. cmd_rel1.BackColor = Color.Red
    209. cmd_rel2.BackColor = Color.Green
    210. cmd_rel3.BackColor = Color.Green
    211. cmd_rel4.BackColor = Color.Green
    212. Case 29
    213. cmd_rel1.BackColor = Color.Red
    214. cmd_rel0.BackColor = Color.Green
    215. cmd_rel2.BackColor = Color.Green
    216. cmd_rel3.BackColor = Color.Green
    217. cmd_rel4.BackColor = Color.Green
    218. Case 30
    219. cmd_rel0.BackColor = Color.Red
    220. cmd_rel1.BackColor = Color.Green
    221. cmd_rel2.BackColor = Color.Green
    222. cmd_rel3.BackColor = Color.Green
    223. cmd_rel4.BackColor = Color.Green
    224. Case 31
    225. cmd_rel0.BackColor = Color.Green
    226. cmd_rel1.BackColor = Color.Green
    227. cmd_rel2.BackColor = Color.Green
    228. cmd_rel3.BackColor = Color.Green
    229. cmd_rel4.BackColor = Color.Green
    230. Case Else
    231. cmd_rel0.BackColor = Color.Red
    232. cmd_rel1.BackColor = Color.Red
    233. cmd_rel2.BackColor = Color.Red
    234. cmd_rel3.BackColor = Color.Red
    235. cmd_rel4.BackColor = Color.Red
    236. End Select
    237. End Sub
    238. Private Sub cmd_reset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_reset.Click
    239. writeReg(TB_ShortAdr.Text, 0, 0)
    240. TimerRead.Enabled = False
    241. cmd_zyklRead.Text = "Zyklisches Lesen"
    242. TB_ShortAdr.ReadOnly = False
    243. TB_Reg.ReadOnly = False
    244. End Sub
    245. Private Sub TimerRead_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerRead.Tick
    246. TB_ReadReg.Text = readReg(TB_ShortAdr.Text, TB_Reg.Text)
    247. End Sub
    248. End Class



    Kann mir da jemand einen kleinen Denkanstoß verpassen in welche Richtung ich mich da bewegen sollte?







    EDIT: Ich dachte da an eine Checkbox mit If-Verknüpfung.

    If CheckBox.checked = true then 'Einzelaktivierung

    Else

    ' Direkten Wert je nach Fall addieren oder subtrahieren.







    Wäre das denkbar?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „DannyDee“ () aus folgendem Grund: Geistesblitz? =D

    Willkommen im Forum. :thumbup:
    Du kannst Deinen Quellcode in Deinem Post (bitte noch mal editieren) mit dem [ VB ]-Tag codemäßig aussehen lassen.
    Außerdem ist es sinnvoll, um den Code einen Expander zu legen [ + ] neben dem [ VB ]
    Alles markieren, Expander und danach VB drücken.
    Und: Nimm bitte die vielen Leerzeilen raus.
    Nutze dazu die Vorschau.
    -----
    Wenn Du Deine Relais kombinieren willst, kannst Du die auszugebenden Werte logisch verknüpfen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim R0 As Integer = 1
    2. Dim R1 As Integer = 2
    3. Dim R2 As Integer = 4
    4. Dim R3 As Integer = 8
    5. Dim R4 As Integer = 16
    6. Dim rr As Integer = R0 Or R2 Or R4
    Anders herum kannst Du so die Bits abfragen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. If (rr And R0) = R0 Then
    2. ' etwas tun
    3. End If
    4. If (rr And R1) = R1 Then
    5. ' etwas tun
    6. End If
    7. If (rr And R2) = R2 Then
    8. ' etwas tun
    9. End If
    10. If (rr And R3) = R3 Then
    11. ' etwas tun
    12. End If
    13. If (rr And R4) = R4 Then
    14. ' etwas tun
    15. 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!
    Danke , habs mal gemacht wie du es gesagt hast. Aber hast du vielleicht eine Ahnung wie ich das programmieren kann ,damit das gewünschte Ziel erreicht wird? Ist mein Ansatz mit der

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If cb_Singleact.checked = True then writereg ( TB_ShortAdr.text , 0 , 'zugewiesener Wert)
    2. Else 'je nach Fall den Bitwert addieren / subtrahieren
    Mach Dir für jedes Relais eine CheckBox (hast Du ja wohl schon) und einen Button, der einen Schreibvorgang auslöst, nicht in den CheckChanged-Events.
    Im Button_Click setzt Du Dir den Wert so zusammen, wie ich es Dir oben gepostet habe:

    VB.NET-Quellcode

    1. Dim rr As Integer = 0
    2. If CheckBox1.Checked Then rr = rr Or R0
    3. If CheckBox2.Checked Then rr = rr Or R1
    4. If CheckBox3.Checked Then rr = rr Or R2
    5. If CheckBox4.Checked Then rr = rr Or R3
    6. If CheckBox5.Checked Then rr = rr Or R4
    7. ' rr ausgeben
    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!

    Dodo schrieb:

    Und überareite dein Code, der sieht ja schrecklich aus mit den Case gedöns ^^


    Das wird nicht so gemacht. Zumal 2 Timer und 2 mal den Status lesen? Irgendwie sinnlos oder?






    Ja hatte ich vor , es sollte nur erstmal funktionieren.



    Und die 2 Timer haben verschiedene Funktionen. Der TimerStatus , läuft permanent um den Status auszulesen , und der TimerRead ließt nur auf Befehl den Aktuellen Bitwert aus und schickt ihn als String an die TB_ReadReg.



    Wie meinst du das mit dem 2 mal Statusüberprüfen?

    DannyDee schrieb:

    Ja hatte ich vor , es sollte nur erstmal funktionieren.
    Das ist die falsche Herangehensweise.
    Wenn Du das nicht gleich tust, machst Du es normalerweise nicht mehr. :S
    Also:
    Code sofort ordentlich schreiben, immer aufräumen, denn wenn Du plötzlich den Code aus der Hand geben solltest, sieht er bescheiden aus.
    Gewöhne Dir an, den Code nach bestimmten Regeln zu erstellen. Halte diese ein und pflege sie.
    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!

    RodFromGermany schrieb:

    DannyDee schrieb:

    Ja hatte ich vor , es sollte nur erstmal funktionieren.
    Das ist die falsche Herangehensweise.
    Wenn Du das nicht gleich tust, machst Du es normalerweise nicht mehr. :S
    Also:
    Code sofort ordentlich schreiben, immer aufräumen, denn wenn Du plötzlich den Code aus der Hand geben solltest, sieht er bescheiden aus.
    Gewöhne Dir an, den Code nach bestimmten Regeln zu erstellen. Halte diese ein und pflege sie.



    Hm okeey , ja nur bin ich echt ein extremer Newbie. Wahrscheinlich hab ich nichtmal alle Basics drauf. Wie lerne ich das am besten direkt richtig zu schreiben? Gibts da ne passende Lektüre o.ä.?

    Das bisschen was ich kann , hab ich mal aus Langeweile daheim zusammengezimmert und darauf baue ich halt auf.

    Bin durch Zufall auf folgendes gestoßen
    Spoiler anzeigen
    http://openbook.galileocomputing.de/einstieg_vb_2010/


    taugt das was?
    Eher weniger, aber da kenn ich mich nicht aus.
    Such mal auf der Startseite nach "Literatur" und "Programmierstil" / "guter Programmierstil" / "schlechter Programmierstil", es gibt hier einen Thread dazu.
    In jedem Falle brauchst Du dazu Disziplin.
    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!
    Mach Dir für jedes in sich geschlossene Problemchen (kleine Parts!) je ein kleines separates Testprogramm, in dem Du dieses eine Problem vollständig abhandelst.
    Speichere und dokumentiere sie sorgfältig.
    Irgendwann brauchst Du so ein Snippet und greifst dann einfach in die wohlgefüllte Trickkiste. :D
    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!
    Danke , ein seeeehr gutes Tipp'chen ;) Das merk ich mir unbedingt!

    Aber da ich ja mein eigentliches Problem behoben habe (Wenn auch nciht ganz "sauber") markier ich diesen Thread mal als erledigt ;)

    Alles andere besprechen wir bei Bedarf meinerseits gerne unter einem anderen Thread nach dem Thema "OMG Newbie kommt nicht weiter" :P

    Vielen Dank für alle Antworten und Tipps ;)

    MfG Danny Dee