RS232 USV gebrückte Pins abfragen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von T.S..

    RS232 USV gebrückte Pins abfragen

    Guten Morgen Zusammen,


    ich steh mal wieder vor einer ganz tollen Aufgabe:
    Hier im Rack steht eine USV die zwar ziemlich alt ist aber
    neue Akkus hat, daher soll sie nicht ersetzt werden.

    Die Kommunikation läuft über eine COM Schnittstelle, die Software vom Hersteller ist aber leider ziemlich bescheiden.
    Aus dem Manual geht heraus, dass der Ground-Pin 4 und der Pin 3 sich brücken wenn die USV auf Batteriebetrieb umstellt.

    Ich hab schon was ähnliches gefunden, siehe Zitat unten.
    Leider bin ich mir nicht ganz sicher wie ich die Abfrage für den (Pin 3 gebrückt mit 4) gestalte.
    Hab mein "5 Minuten Wissen" von hier arcelect.com/rs232.htm

    Vielleicht kann mir ja einer nen Denkanstoß geben

    Edit: Auch wenn es unsauber ist, würde ich gerne ohne COM Kabel arbeiten, das heißt nur die zwei Adern werden angeschlossen

    flexy1994 schrieb:

    Hier mein Quellcode hab ihn halt ein bischen verändert rest ist unwichtig...

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. If SerialPort1.CtsHolding Then
    3. '' Damit der Taster erst wieder geöffnet werden muss
    4. If ctsholding = "0" Then
    5. ctsholding = "1"
    6. MsgBox("Taster gedrückt")
    7. End If
    8. Else
    9. ctsholding = "0"
    10. End If
    11. End Sub


    Insgesamt kann man bis zu 3 Taster/Schalter anhängen.

    dazu muss lediglich:
    Serialport.ctsholding
    durch
    .cdholding oder
    .dsrholding ersetzt werden.

    hoffe das hilft weiter sonst nochmal fragen.

    M.f.G.: Flexy1994

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „T.S.“ ()

    T.S. schrieb:

    Insgesamt kann man bis zu 3 Taster/Schalter anhängen.
    Dann frag in einem separaten Testprogramm mit einem Timer permanent alle möglichen Zustände ab und zeige sie an.
    Dann legst Du an die Pins die richtigen (!) Brücken (Kurzschlüsse) und siehst, welche Bits wackeln.
    ----
    Und gib Deinem Projekt Option Strict On. ctsholding sollte kein Sring sein.
    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!
    Mir würden jetzt nur in einem Timer ein haufen Abfragen wie SerialPort1.CtsHolding usw einfallen.
    Wie ich direkt die Bits rauslese wüsste ich jetzt nicht

    Gerade weil es ja keine handshake und nichts gibt. Ich hab einfach nur die zwei Adern

    T.S. schrieb:

    Insgesamt kann man bis zu 3 Taster/Schalter anhängen.

    T.S. schrieb:

    Ich hab einfach nur die zwei Adern
    Interessante Verteilung.
    Probier mal so was:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. Dim cd = Me.SerialPort1.CDHolding
    3. Dim cts = Me.SerialPort1.CtsHolding
    4. Dim dsr = Me.SerialPort1.DsrHolding
    5. Dim dtr = Me.SerialPort1.DtrEnable
    6. Dim rts = Me.SerialPort1.RtsEnable
    7. Dim txt = String.Format("cd = {0}; cts = {1}; dsr = {2}; dtr = {3}; rts = {4}", cd, cts, dsr, dtr, rts)
    8. Me.TextBox1.Text = txt
    9. 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 dir für den Tipp; Ich hab mir dazu mal was gebastelt:



    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    3. If CheckBox1.Checked = True Then
    4. Check()
    5. End If
    6. End Sub
    7. Private Sub Check()
    8. SerialPort1.PortName = ComboBox1.SelectedItem
    9. SerialPort1.Open()
    10. TextBox1.Text = SerialPort1.CDHolding
    11. TextBox2.Text = SerialPort1.CtsHolding
    12. TextBox3.Text = SerialPort1.DsrHolding
    13. TextBox4.Text = SerialPort1.DtrEnable
    14. TextBox5.Text = SerialPort1.RtsEnable
    15. SerialPort1.Close()
    16. Label7.Text = "[" & Format(Now, "hh:mm:ss") & "] Checked: " & Me.SerialPort1.PortName
    17. End Sub
    18. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    19. 'Suche COM Ports
    20. For Each sp As String In My.Computer.Ports.SerialPortNames
    21. ComboBox1.Items.Add(sp)
    22. Next
    23. End Sub
    24. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    25. Check()
    26. End Sub
    27. End Class


    Leider passiert nichts wenn ich die Pins brücke, vielleicht mache ich es auch falsch?

    Grüße

    Verlinkten Code eingefügt. ~Thunderbolt

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

    T.S. schrieb:

    vielleicht mache ich es auch falsch?
    Verstehe dies:

    RodFromGermany schrieb:

    T.S. schrieb: schrieb:

    Insgesamt kann man bis zu 3 Taster/Schalter anhängen.

    T.S. schrieb: schrieb:

    Ich hab einfach nur die zwei Adern
    Interessante Verteilung.
    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!

    T.S. schrieb:

    Was ja einem Taster gleich kommt.
    Was hat das mit einem SerialPort zu tun?
    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!
    Der Taster kommt von der Schaltung her den zwei Adern der USV gleich.
    Drück man den Taster bildet er einen Durchgang, das gleiche machen die zwei Adern der USV wenn Sie auf Batteriebetrieb umschaltet.

    Der Plan ist die zwei Adern an die COM Schnittstelle anzuklemmen und via VB zu prüfen ob ein Durchgang vorhanden ist oder nicht.


    Edit:

    Also C++ Konsolenanwendung funktioniert es perfekt:
    C++ Anwendung

    C-Quellcode

    1. #include <stdafx.h>
    2. #include <iostream>
    3. #include <stdio.h>
    4. #include <windows.h>
    5. #include <conio.h>
    6. #include <winioctl.h>
    7. using namespace std;
    8. int main(void)
    9. {
    10. DWORD dwfreq=800, dwDuration=200;
    11. DWORD dwEvtMask;
    12. int anzahl=0;
    13. BOOL succ;
    14. ///////////////////////////////////////////////////
    15. DCB dcb;
    16. memset(&dcb, sizeof(dcb), 0);
    17. dcb.DCBlength = sizeof(dcb);
    18. dcb.BaudRate = CBR_600;
    19. dcb.fBinary = TRUE;
    20. dcb.fParity = TRUE; // enable parity checking
    21. dcb.fOutxCtsFlow = FALSE; // CTS output flow control
    22. dcb.fOutxDsrFlow = FALSE; // DSR output flow control
    23. dcb.fDtrControl = DTR_CONTROL_ENABLE; // DTR flow control type
    24. dcb.fDsrSensitivity = FALSE; // DSR sensitivity
    25. dcb.fTXContinueOnXoff = FALSE; // XOFF continues Tx
    26. dcb.fOutX = FALSE; // XON/XOFF out flow control
    27. dcb.fInX = FALSE; // XON/XOFF in flow control
    28. dcb.fErrorChar = FALSE; // enable error replacement
    29. dcb.fNull = 0; // enable null stripping
    30. dcb.fRtsControl = RTS_CONTROL_ENABLE; // RTS flow control
    31. dcb.fAbortOnError = FALSE; // abort on error
    32. dcb.fDummy2 = 0; // reserved
    33. dcb.wReserved = 0; // not currently used
    34. dcb.XonLim = 0; // transmit XON threshold
    35. dcb.XoffLim =0; // transmit XOFF threshold
    36. dcb.ByteSize = 8; // number of bits/byte, 4-8
    37. dcb.Parity = NOPARITY; // 0-4=no,odd,even,mark,space
    38. dcb.StopBits = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2
    39. dcb.XonChar = 0; // Tx and Rx XON character
    40. dcb.XoffChar = 0; // Tx and Rx XOFF character
    41. dcb.ErrorChar = 0; // error replacement character
    42. dcb.EofChar = 0; // end of input character
    43. dcb.EvtChar = 0; // received event character
    44. dcb.wReserved1 =0; // reserved; do not use
    45. ///////////////////////////////////////////////////
    46. HANDLE hCOM = CreateFileA ("COM4",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    47. //////////////////////////////
    48. start:
    49. //////////////////////////////
    50. //warteschelife - damit das signal nicht gleich 2 mal abgegriffen wird
    51. system("cls");
    52. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    53. cout <<"Status : Initialisiere COM-PORT"<<endl;
    54. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    55. Sleep(2000);
    56. system("cls");
    57. //warteschleife ende
    58. //////////////////////////////
    59. succ= SetCommState(hCOM, &dcb);
    60. //////////////////////////////
    61. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    62. cout <<"Status : Bereit"<<endl;
    63. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    64. SetCommMask(hCOM,EV_DSR);
    65. WaitCommEvent(hCOM,&dwEvtMask,NULL);
    66. if(dwEvtMask & EV_DSR)
    67. {
    68. system("cls");
    69. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    70. cout <<"Status : Signal erkannt!"<<endl;
    71. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    72. Beep (dwfreq,dwDuration);
    73. }
    74. goto start;
    75. //////////////////////////////
    76. CloseHandle(hCOM);
    77. return 0;
    78. }[/spoiler]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „T.S.“ ()

    T.S. schrieb:

    die zwei Adern an die COM Schnittstelle anzuklemmen
    Stelle sicher, dass das funktioniert.
    Du willst also die RS232 als digitales Input-Interface benutzen.
    Dann solltest Du Dir mal bei Dir einen Elektroniker greifen, mit dem Du die hardware-relevanten Details lösen kannst, z.B. ob da eine Spannung anliegt oder lediglich ein potenzialfreier Kurzschluss detektiert werden soll.
    Wenn dann irgendein Signal am Port ankommt, ist Dein Problem gelöst.
    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!

    T.S. schrieb:

    guck dir mal
    diese Bemerkung an:

    RodFromGermany schrieb:

    ob da eine Spannung anliegt oder lediglich ein potenzialfreier Kurzschluss detektiert werden soll
    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:

    T.S. schrieb:

    die zwei Adern an die COM Schnittstelle anzuklemmen
    Stelle sicher, dass das funktioniert.
    Du willst also die RS232 als digitales Input-Interface benutzen.
    Dann solltest Du Dir mal bei Dir einen Elektroniker greifen, mit dem Du die hardware-relevanten Details lösen kannst, z.B. ob da eine Spannung anliegt oder lediglich ein potenzialfreier Kurzschluss detektiert werden soll.
    Wenn dann irgendein Signal am Port ankommt, ist Dein Problem gelöst.


    petaod schrieb:

    Der C-Code überprüft aber DSR und nicht CTS.


    Das heißt für mich Konkret was?

    T.S. schrieb:

    Konkret
    dies:

    RodFromGermany schrieb:

    Dann solltest Du Dir mal bei Dir einen Elektroniker greifen, mit dem Du die hardware-relevanten Details lösen kannst, z.B. ob da eine Spannung anliegt oder lediglich ein potenzialfreier Kurzschluss detektiert werden soll.
    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!
    Für was denn??

    In dem C++ Programm funktioniert es so wie es ist nur mit nem Schraubenzieher am COM Port(zum testen) wenn ich die PINS kurzschließe dann gibt das Programm laut.
    Da brauch ich doch keine Elektriker dafür um das irgendwie umzumodeln.
    Wenn ich den Quellcode ins VB.NET übersetze dann sollte es ja laufen

    T.S. schrieb:

    ins VB.NET
    Poste mal bitte den kompletten VB-Code.
    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 ist der funktionierende C++ Code:

    Spoiler anzeigen

    C-Quellcode

    1. ​#include <stdafx.h>
    2. #include <iostream>
    3. #include <stdio.h>
    4. #include <windows.h>
    5. #include <conio.h>
    6. #include <winioctl.h>
    7. using namespace std;
    8. int main(void)
    9. {
    10. DWORD dwfreq=800, dwDuration=200;
    11. DWORD dwEvtMask;
    12. int anzahl=0;
    13. BOOL succ;
    14. ///////////////////////////////////////////////////
    15. DCB dcb;
    16. memset(&dcb, sizeof(dcb), 0);
    17. dcb.DCBlength = sizeof(dcb);
    18. dcb.BaudRate = CBR_600;
    19. dcb.fBinary = TRUE;
    20. dcb.fParity = TRUE; // enable parity checking
    21. dcb.fOutxCtsFlow = FALSE; // CTS output flow control
    22. dcb.fOutxDsrFlow = FALSE; // DSR output flow control
    23. dcb.fDtrControl = DTR_CONTROL_ENABLE; // DTR flow control type
    24. dcb.fDsrSensitivity = FALSE; // DSR sensitivity
    25. dcb.fTXContinueOnXoff = FALSE; // XOFF continues Tx
    26. dcb.fOutX = FALSE; // XON/XOFF out flow control
    27. dcb.fInX = FALSE; // XON/XOFF in flow control
    28. dcb.fErrorChar = FALSE; // enable error replacement
    29. dcb.fNull = 0; // enable null stripping
    30. dcb.fRtsControl = RTS_CONTROL_ENABLE; // RTS flow control
    31. dcb.fAbortOnError = FALSE; // abort on error
    32. dcb.fDummy2 = 0; // reserved
    33. dcb.wReserved = 0; // not currently used
    34. dcb.XonLim = 0; // transmit XON threshold
    35. dcb.XoffLim =0; // transmit XOFF threshold
    36. dcb.ByteSize = 8; // number of bits/byte, 4-8
    37. dcb.Parity = NOPARITY; // 0-4=no,odd,even,mark,space
    38. dcb.StopBits = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2
    39. dcb.XonChar = 0; // Tx and Rx XON character
    40. dcb.XoffChar = 0; // Tx and Rx XOFF character
    41. dcb.ErrorChar = 0; // error replacement character
    42. dcb.EofChar = 0; // end of input character
    43. dcb.EvtChar = 0; // received event character
    44. dcb.wReserved1 =0; // reserved; do not use
    45. ///////////////////////////////////////////////////
    46. HANDLE hCOM = CreateFileA ("COM4",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    47. //////////////////////////////
    48. start:
    49. //////////////////////////////
    50. //warteschelife - damit das signal nicht gleich 2 mal abgegriffen wird
    51. system("cls");
    52. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    53. cout <<"Status : Initialisiere COM-PORT"<<endl;
    54. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    55. Sleep(2000);
    56. system("cls");
    57. //warteschleife ende
    58. //////////////////////////////
    59. succ= SetCommState(hCOM, &dcb);
    60. //////////////////////////////
    61. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    62. cout <<"Status : Bereit"<<endl;
    63. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    64. SetCommMask(hCOM,EV_DSR);
    65. WaitCommEvent(hCOM,&dwEvtMask,NULL);
    66. if(dwEvtMask & EV_DSR)
    67. {
    68. system("cls");
    69. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    70. cout <<"Status : Signal erkannt!"<<endl;
    71. cout <<"*-----------------------------------------------------------------------------*"<<endl;
    72. Beep (dwfreq,dwDuration);
    73. }
    74. goto start;
    75. //////////////////////////////
    76. CloseHandle(hCOM);
    77. return 0;
    78. }



    Der VB Code dazu bereitet mir noch Kopfweh da ich es eigentlich nicht genauso wollte sondern bisschen anders.
    Es soll im VB in einem Timer alle paar Sekunden abgefragt werden ob die PINS gebrückt sind oder nicht.
    Code habe ich bis jetzt im VB nur den von dir

    T.S. schrieb:

    C++ Code:
    Den hatten wir bereits.

    RodFromGermany schrieb:

    VB-Code.
    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!
    Kannst du mir hier zur Hand gehen?

    C-Quellcode

    1. SetCommMask(hCOM,EV_DSR); //
    2. WaitCommEvent(hCOM,&dwEvtMask,NULL); // auf tastendruck warten
    3. printf("%d",dwEvtMask);
    4. cout <<"<--->"<<endl;
    5. printf("%d",EV_DSR);
    6. if(dwEvtMask & EV_DSR)
    7. {

    Den Rest habe ich schon (Com port öffnen, baud rate usw...)