Conrad Relaiskarte über RS232 ansteuern

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von silu.

    Conrad Relaiskarte über RS232 ansteuern

    Guten Abend,

    ich komme hier mit folgendem Problem zu euch: Ich möchte gerne die 8-fach Conrad Relaiskarte(conrad.de/ce/de/product/197720…austein-8-Relaisausgaenge) per RS232 ansteuern.

    Das Ziel ist es, dass das Programm beim Starten des Rechners (Autostartordner), nacheinander alle Relais anschaltet, sich beendet und ein weiteres beim Herunterfahren alle aufeinmal wieder aus macht (und sich ebenfalls beendet).

    Die Karte kann ich mit dem SerialPort1 Befehl ansteuern und den Kommandorahmen per Array senden. (Quellcode kann ich auf Anfrage auch posten)

    Nun zu meinem Problem: Ich kann zwar die Arrays senden, aber das Programm führt sich nicht automatisch aus. Bislang hab ich es mit der Sub Main() probiert (was msdn(msdn.microsoft.com/de-de/library/vstudio/ms235406.aspx) auch empfielt). Ich hab das Ganze wie auf der Seite beschrieben in ein Module gepackt, aber das macht aus dem Ganzen eine Konsolenanwendung. Das sollte mich nicht weiter stören, nur muss ich um den SerialPort1 Befehl nutzen zu können, das Tool aus der Toolbox auf die Form ziehen. Tja, nur ist ja da keine Form sondern nur eine Konsolenanwendung...

    Msdn empfahl für Form-Anwendungen, die Sub Main() durch ein Shared zu ergänzen, was aber dazu führte, das letztendlich mein Quellcode rot unterkringelt war und die Fehlermeldungsleiste quasi explodiert ist...


    Gibt es eine Möglichkeit, Tools auf Konsolenanwendungen zu ziehen? Wenn nein, wie funktioniert dann das Shared?

    Vielen Dank im Voraus

    MfG ErrorProgram
    Willkommen im Forum. :thumbup:
    Das Vorhandensein eines Programms im

    ErrorProgram83 schrieb:

    Autostartordner
    startet es noch nicht, es muss auch in die Registry eingetragen sein.
    Gugst Du z.B. hier.
    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 :D

    Ich sehe gerade, dass meine Frage etwas mehrdeutig gestellt ist.

    Ich meinte eher, wenn man die exe per Doppelklick ausführt, dass sofort eine Sequenz abgearbeitet werden sollte und man nicht erst irgendwelche Buttons drücken muss.

    Es geht leider nicht anders, denn wenn ich es beim Herunterfahren starte(bei XP klappt das noch :D), hat man als User keine Zeit irgendwelche Buttons zu drücken bevor das Programm geschlossen wird, daher die automatische Ausführung.


    MfG ErrorProgram
    Bei VB6 nutze ich den Form_Query_Unload. Da lässt sich dann auch den Grund für das Entladen ermitteln. Ein Problem kann es geben, wenn Dein Programm zwar noch Befehle schicken will, die Schnittstelle aber schon nicht mehr zur Verfügung steht. Soll es jedesmal beim Herunterfahren ausgeführt werden, dann starte das Herunterfahren aus Deinem Programm heraus nachdem die Sequenz abgespielt wurde. Alternativ lass Dein Programm einfach im Hintergrund laufen, bis das System sagt: "Beenden, weil runterfahren"

    Befindet sich ein Programm im Autostart-Ordner, dann wird es auch ausgeführt. Packt man es zusätzlich in die Registry unter HKLM oder HKCU>Software>Microsoft>Windows>Currentversion>run (Ausm Kopf, sollte aber stimmen), dann wird es beim Systemstart von beiden Punkten aus gestartet und läuft evtl. zweimal. Wobei der schnellere dann die Schnittstelle bkommt.

    RS232 kann man auch ohne Form ansprechen. Statt des Steuerlementes z.B. die Schnittstelle als Datei öffnen oder eine andere Bibliothek nutzen, welche keine Form braucht. Evtl. lässt sich das ActiveX Steuerlement auch per Object im Code hinzufügen und ansprechen. Habe ich aber so noch nicht probiert. Oder du nimmst eine Form und zeigst diese nur nicht an.


    PS/Edit:
    Man kann das herunterfahren auch abbrechen. Nutzt nur nicht immer was, wenn andere benötigte Ressourcen wie Schnittstellen schon beendet wurden.
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    ErrorProgram83 schrieb:

    dass sofort eine Sequenz abgearbeitet werden sollte
    Pack den Code in eine separate Routine und ruf diese Routine von der Form_Load aus auf.
    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!
    @peterfido:
    Ich hab leider kA wie man eine Schnittstelle als Datei öffnet. :S MSDN ist da so hilfreich wie immer...

    Ich habs auch mal mit VB6 probiert, da gibt es ja die MSCOMM.ocx, aber der Compiler vermeldet eine fehlende Lizenz. Eine Debug-tool von Microsoft soll Abhilfe schaffen und die Lizensen hinzufügen, aber das Programm beendet sich mit einem Errorcode Bibliothek nicht gefunden(die aber eindeutig vorhanden ist). Selbstverständlich hat die msdn-Bibo die Bedeutungen der Errorcodes parat, aber nicht wie man sie aus der Welt schafft...

    @Rod:
    Wenn ich das richtig verstehe soll ich per Konsolenanwendung eine Methode in einer Form aufrufen und dort die Sequenz abspielen lassen.
    Was willst Du mit einer

    ErrorProgram83 schrieb:

    Konsolenanwendung
    :?:
    Die RS232 ist ein ereignis-behaftetes Gerät, WinForms-Anwendungen sind ereignisbehaftete Rahmenprogramme. Für eine Konsolenanwendung ist hier kein Platz.
    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!
    Ich will nur ein einfaches Programm, dass nach dem Start (und ohne Buttons etc drücken) sofort Bytes an die Schnittstelle sendet.

    Und das wiederum geht nach meiner aktuellen Weltanschauung nur wenn ich eine Main() habe... Die wiederum fordert eine Konsolenanwendung. Daher...

    Kann man eine Main() auch in einer Formanwendung einsetzen bzw gibt es irgendein Event, das beim Ausführen des Programms ausgeführt wird?

    ErrorProgram83 schrieb:

    Daher...
    gehe ich mal davon aus, dass Du keine Daten empfangen willst.
    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!
    Das würde funktionieren, sofern die Console so lange stehen bleibt, wie das Senden dauert.
    Da Du aber übermorgen Daten von der Karte empfangen willst, empfehle ich Dir eine WinForms-Anwendung.
    Dort kannst Du im Form_Load-Event Deine Sequenz absenden.
    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!
    Hallo zusammen
    ich würde diesen thread gerne mal wieder ein wenig auffrischen.
    ich habe mir vor kurzem auch die besagte relaiskarte besorgt.
    ich will sie verwenden um bei einem etwas spezielen moddingcomputer die beleuchtungen via software zu steuern.

    zu diesem zweck habe ich buttons die die einzelnen relais ein und ausschallten sollen.benutzen will ich jeweils den befehl 6 für einschalten und den befehl7 zum ausschalten.
    das relais sol angesteuert werden wen die button farbe grün wird und ausgeschaltet werden wen die buttonfarbe rot wird.

    mittlerweile habe die portliste zur auswahl des ports realisiert und die buttons wechseln bereits die farbe.
    nun zum problem.

    da ich kein relais schalten kan würde ich gerne wissen was mir die karte antwortet.
    zu diesem grund habe ich diesen code programmiert.

    VB.NET-Quellcode

    1. Public Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. CheckForIllegalCrossThreadCalls = False
    3. Dim input As String
    4. input = SerialPort1.ReadExisting
    5. TextBox2.Text = input
    6. End Sub

    allerdings spuckt mir die textbox nur komische zeichen aus nichts das ich verwenden kan...
    was kan ich machen??
    ps der code wurde in visual studio ultimate 2010 erstellt

    silu schrieb:

    VB.NET-Quellcode

    1. CheckForIllegalCrossThreadCalls = False
    :thumbdown:
    -------------------------
    Sendet das Ding Strings oder Bytes (bitte in der Anleitung nachlesen.
    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:

    silu schrieb:

    VB.NET-Quellcode

    1. CheckForIllegalCrossThreadCalls = False
    :thumbdown:
    -------------------------
    Sendet das Ding Strings oder Bytes (bitte in der Anleitung nachlesen.

    hallo danke für die antwort.die klausel wird danach noch entfernt da dies nur erstellt wurde um zu sehen wo das porblem liegt.
    je nachdem wird die zeile in eine invoke umgearbeitet oder die textbox mit der antwort der karte bleibt ganz weg ( bin mir noch nicht ganz sicher).
    soweit ich aus der anleitung lesen konte besteht die antwort aus einem frame mit 4 bytes....wer lesen kan ist eindeutig im vorteil).
    nun leiter bekomme ich es nicht gebacken mir das frame anzuzeigen..

    silu schrieb:

    4 bytes
    Dann solltest Du auch 4 Bytes lesen und keinen String:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim nb = SerialPort1.BytesToRead
    3. Dim by() = New Byte(nb) {}
    4. SerialPort1.Read(by, 0, nb)
    5. ' mit by was tun
    6. End Sub
    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 für deine antwort...und entschuldige dies ist mein erstets projekt in richtung serialport programmierung.
    meine vorherigen programme waren alles rudimentäre if, else programme.

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim nb = SerialPort1.BytesToRead
    3. Dim by() = New Byte(nb) {}
    4. SerialPort1.Read(by, 0, nb)
    5. ' mit by was tun
    6. End Sub

    zum verständnis, hier lege ich wie ich das sehe einen array aus bytes an. dabei ist nb die anzahl der bytes, die direkt vom port ausgelesen werden.
    das 0 stellt das offset dar bei dem byte soll die auflistung beginnen. mit dem befehl serialport1.read......wird also dem array seine bytes zugewiesen.
    ist das soweit schon mal korrekt?
    für was sind den die {} hinter dim by??
    nun jetzt heisst es wohl diesen array in die textbox zu bekommen, da die texbox einen string ausgiebt muss ich also den array in einen string umwandel?
    wen ich den befehl

    VB.NET-Quellcode

    1. ​ TextBox2.Text = SerialPort1.Read(by, 0, nb)

    anwende gibt er mir in der textbox eine 3 aus allerdings sollte die antwort 254-adr-info-xor sein..
    was mache ich falsch??

    silu schrieb:

    ist das soweit schon mal korrekt?
    für was sind den die {} hinter dim by??
    1. Ja.
    2. Das will VB so haben, wenn ein Array dynamisch angelegt wird.

    silu schrieb:

    VB.NET-Quellcode

    1. TextBox2.Text = SerialPort1.Read(by, 0, nb)
    1. Mach bitte Option Strict On.
    2. Klick mal auf Read, drück auf F1 und lies, was diese Funktion eigentlich zurückgibt. ;)
    3. Vderwende den Inhalt des Arrays by.
    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!
    haha...da hast du aber meine beschränkten kentnise gerade ein wenig ausgereitzt.... ;(
    hab da so meine mühe mit dem option strict befehl.
    als fehler bekomme ich wie immer das ich den bytearray nicht in einen string convertieren kan...

    versucht habe ich desshalb mal die methode getstring..

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. CheckForIllegalCrossThreadCalls = False
    3. Dim nb = SerialPort1.BytesToRead
    4. Dim by() = New Byte(nb) {}
    5. Dim input As String
    6. input = System.Text.Encoding.Default.GetString(by, 0, nb)
    7. SerialPort1.Read(by, 0, nb)
    8. TextBox2.Text = input
    9. End Sub

    somit erhalte ich keine fehler dafür habe ich auf der textbox auch keine ausgabe

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „silu“ ()