Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Stromzählermodul PZEM-004T auslesen
Gehe zu Seite Zurück  1, 2, 3, 4
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 52
Wohnort: Herzogenaurach

BeitragVerfasst am: 29.12.2017, 20:07    Titel: Antworten mit Zitat

Hallo dreael,

Windows-Gerätemanager unter "Anschlüsse" bei mir „Hardware“

Bei „Ressourcen“ kommt auch beim Gerätemanager bei COM1.
E/A-Bereich 03F8-03FF
IRQ 04

Bei COM4 gibt es „Ressourcen“ gar nicht.

######

Hallo grindstone,

das mit dem Programm von Sebastian hab ich ja mit COM4 schon ausprobiert und das hat ja auch geklappt.
Die Eingänge CDS, DSR, RING (RI) und RLSD (DCD) kann man geschmeidig abfragen.

Für das EIN und AUS schalten von RTS und DTR ist ja noch etwas an „Veränderungen“ nötig.

Zumindest geht das LED an RTS zu GND est mal AUS nach Programmstart und nach Programm Ende wieder EIN, also schaltet das IC auf dem USB Pegelwandler zu TTL den RTS.

Jetzt braucht am noch eine „Eingabe“ für RTS und auch für DTR, EIN oder AUS.

Gruß
Code:

' Programm von Sebastian 29.12.2017, 12:23
' Testet dem USB zu COM4 ZU TTL Umsetzer und ist auch OK
' Die Eingänge CDS, DSR, RING (RI) und RLSD (DCD) kann man abfragen.
' Ausgabe am Monitor
' 1 = Verbindung zu GND
' 0 = keine Verbindung zu GND



#Include Once "windows.bi"

Dim hCom As handle
Dim PortNr As String = "COM4" ' COM1, COM2, COM3 oder COM4
Dim modemStat As Dword

'Serielle Schnittstelle öffnen:
hCom = CreateFile(PortNr, GENERIC_READ Or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)
Print "Handle = "; hCom

'Fehlerbehandlung, falls Öffnen fehlschlägt:
If hCom = INVALID_HANDLE_VALUE Then
  Print "Fehler beim Oeffnen von "; PortNr
  Sleep
  End
 Else
  Print PortNr; " geoeffnet"
Endif

'Alle Ausgangsleitungen auf positive Spannung setzen:
EscapeCommFunction(hCom, SETRTS)    'RTS +12V
EscapeCommFunction(hCom, SETDTR)    'DTR +12V
EscapeCommFunction(hCom, SETBREAK)  'TxD +12V (Break)

Print
Print
Print "Ende mit [Esc]"
Print "Verbindung zu GND = 1       keine Verbindung zu GND = 0"

'Eingangsleitungen per Polling abfragen:
Do
  GetCommModemStatus(hCom, @modemStat)
  Locate 8,1
  If modemStat And MS_CTS_ON  Then Print "CTS  (USB=CTS 8) = 1" Else Print "CTS  (USB=CTS 8) = 0"
  If modemStat And MS_DSR_ON  Then Print "DSR  (USB=RSD 6) = 1" Else Print "DSR  (USB=RSD 6) = 0"
  If modemStat And MS_RING_ON Then Print "RING (USB=R1  9) = 1" Else Print "RING (USB=R1  9) = 0"
  If modemStat And MS_RLSD_ON Then Print "RLSD (USB=DCD 1) = 1" Else Print "RLSD (USB=DCD 1) = 0"
  Sleep 5
Loop Until Inkey = Chr(27)

'Alle Ausgangsleitungen auf negative Spannung zurücksetzen:
EscapeCommFunction(hCom, CLRRTS)    'RTS -12V
EscapeCommFunction(hCom, CLRDTR)    'DTR -12V
EscapeCommFunction(hCom, CLRBREAK)  'TxD -12V

'Serielle Schnittstelle schließen:
CloseHandle(hCom)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 29.12.2017, 20:26    Titel: Antworten mit Zitat

Hehe, da muss ich den Ruhm aber ein bisschen abtreten. Das Code-Beispiel zum Auslesen/Setzen der Statusleitungen im FreeBASIC-Portal ist nicht von mir. Ich habe es dir nur verlinkt. Der Autor ist jemand anderes (Steini). Steht im Portal auch so angegeben.

Zitat:
Bei COM4 gibt es „Ressourcen“ gar nicht.

Das klingt für mich einleuchtend. Wie sollte ein Knoten bzw. Busteilnehmer, der am USB hängt, auch eine x86-I/O-Bus-Port-Basisadresse haben. neutral
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 52
Wohnort: Herzogenaurach

BeitragVerfasst am: 29.12.2017, 20:47    Titel: Antworten mit Zitat

Zitat:
Frage 1 von grindstone : Gibt es zu dem Adapter irgendeine Dokumentation, wo solche Details beschrieben sind?


Am IC steht CN480661
Das IC ist von der Firma FTDI mit der Bezeichnung FT232RL

Auf der Rückseite von der Platine steht YP-05 da findet man auch einige Sachen und Bilder.

Ehrlich gesagt wenn man das bei google überfliegt was da so alles bei FT232RL angezeigt wir ist man verwirrender als vorher.


Zitat:
Frage 2 von grindstone : Gehört zu dem Adapter ein Treiber, den du zusätzlich installieren musstest?

Treiber ist keiner nötig, so hab ich das von den Chinesen verstanden.

############

Hallo Sebastian,

da steht was von Autor: Steini63.
O.K.
Nur gefunden hätte ich das nicht ohne deine Hilfe, Danke.

Gruß
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 875
Wohnort: Ruhrpott

BeitragVerfasst am: 30.12.2017, 11:09    Titel: Antworten mit Zitat

eeg-grimm hat Folgendes geschrieben:
Am IC steht CN480661
Das IC ist von der Firma FTDI mit der Bezeichnung FT232RL
Hmmm...
http://www.rudiswiki.de/wiki/FTDIWildWest

Nach dem Datenblatt des FT232RL müsste sich der USB - Adapter direkt (ohne Pegelwandler / Inverter) an das Messmodul anschliessen lassen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 52
Wohnort: Herzogenaurach

BeitragVerfasst am: 31.12.2017, 11:31    Titel: Antworten mit Zitat

Hallo grindstone,

den USB - Adapter schließe ich direkt (ohne Pegelwandler an) an das Stromzählermodul PZEM-004T und das auslesen der z.B. Spannung geht ja einwandfrei, mit dem Programm von Sebastian (16.12.2017, 01:30) mit COM1 und auch mit USB=COM4.

Die Anfrage wegen RTS und auch für DTR als Ausgang schalten mit FreeBASIC hab ich ja nur gestellt weil ich eine Verbindung zur Außenwelt brauch um was EIN und AUS zu schalten.
Bei erreichen oder unterschreiten von Messwerten soll ja was geschalten werden.

#

Mit dem Eingebauten COM1 geht ja die Messung mit dem PZEM-004T und auch das schalten von RTS und DTR, alles mit FreeBASIC.

Bei Verwendung vom FreeBASIC und USB (COM4) geht das PZEM-004
aber nicht das schalten von RTS, DTR.

Nur mit dem „Spezialprogramm“ von Sebastian 29.12.2017, 12:23 zeigt RTS, DTR zumindest eine Reaktion.
Die Eingänge CDS, DSR, RING (RI) und RLSD (DCD) kann man abfragen an der USB Platine.

#

volta, hat am 19.12.2017, 16:39 (Seite 1) noch ein Programm eingestellt für:
Volt, Anper, Watt und kWh

Ist mir aber mir noch nicht klar wie das komplette Programm dann aussieht um V, A, W und kWh zu bekommen von Stromzählermodul PZEM-004T.


Gruß
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Steini63



Anmeldungsdatum: 11.11.2004
Beiträge: 28
Wohnort: 30926 Seelze

BeitragVerfasst am: 31.12.2017, 15:48    Titel: Statusleitungen per WinAPI schalten Antworten mit Zitat

eeg-grimm hat Folgendes geschrieben:

Bei Verwendung vom FreeBASIC und USB (COM4) geht das PZEM-004
aber nicht das schalten von RTS, DTR.


Doch, das machen doch die folgenden Zeilen:

Code:
'Alle Ausgangsleitungen auf positive Spannung setzen:
EscapeCommFunction(hCom, SETRTS)    'RTS +12V
EscapeCommFunction(hCom, SETDTR)    'DTR +12V

Code:
'Alle Ausgangsleitungen auf negative Spannung zurücksetzen:
EscapeCommFunction(hCom, CLRRTS)    'RTS -12V
EscapeCommFunction(hCom, CLRDTR)    'DTR -12V


Das kannst du beliebig oft im Programm durchführen, so lange der entsprechende COM-Port geöffnet ist. Der Unterschied beim TTL USB-seriell Wandler ist, dass die Spannungen 0V (statt -12V) und 5V (statt 12V) betragen; TTL-Pegel eben.
_________________
Viele Grüße Steini
http://www.FrankSteinberg.de +++++++ Planung ist das Ersetzen des Zufalls durch den Irrtum +++++++
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 875
Wohnort: Ruhrpott

BeitragVerfasst am: 31.12.2017, 20:11    Titel: Antworten mit Zitat

Steini63 hat Folgendes geschrieben:
...dass die Spannungen 0V (statt -12V) und 5V (statt 12V) betragen; TTL-Pegel eben.
Achtung: Das gilt nur für die Steuerleitungen (DTR und RTS). Bei TxD und RxD ist es umgekehrt: L - Pegel (0V / TTL) entspricht +12V / RS232, H - Pegel (5V / TTL) entspricht -12V / RS232. Entschuldigung, wenn ich hier etwas besserwisserisch erscheine, aber hinter genau diesem Fehler (oder besser: Irrtum) habe ich einmal fast 2 Wochen hergesucht. mit dem Kopf durch die Mauer wollen

Allerdings lassen sich beim FT232R die TTL - Pegel bei Bedarf invertieren (siehe Datenblatt, Seite 35).

Gruß und guten Rutsch
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 52
Wohnort: Herzogenaurach

BeitragVerfasst am: 01.01.2018, 12:34    Titel: Antworten mit Zitat

Hallo,
erst ein gesundes neues Jahr.

Der Kopf brummmmmmt noch aber alle Finger sind noch dran.

######

grindstone schreibt:
Entschuldigung, wenn ich hier etwas besserwisserisch erscheine

Das ist nicht besserwisserisch, mein wissen ist nicht besser, meine Fragen sind ja auch manchmal etwas komisch, verwirrend.


Hab ja nur Basiswissen bei QBasic, so für den Hausgebrauch und da bin ich für jeden Tipp dankbar.
Deshalb auch nur Basic = Basiswissen.

Auch auf der Internetseite von Steini63 hol ich mir seit Jahren immer wieder mal den einen oder anderen Tipp.
Ich bin ja noch nicht in der Hochgeschwindigkeit-Datenverarbeitung angekommen aber nur mit COM am PC ist ja auch ein Auslaufmodell.

Die Ausgänge RTS und DTR sind genau umgedreht bei der Spannungsausgaben an der USB Platine.

„EscapeCommFunction(hCom, SETRTS) 'RTS +12V“
RTS +12V = L (RTS mit einem LED verbunden mit GND LED=AUS)

„EscapeCommFunction(hCom, SETDTR) 'DTR +12V“
DTR +12V = L (DTR mit einem LED verbunden mit GND LED=AUS)

„EscapeCommFunction(hCom, CLRRTS) 'RTS -12V“
RTS -12V = +5V H (RTS mit einem LED verbunden mit GND, LED=EIN )

„EscapeCommFunction(hCom, CLRDTR) 'DTR -12V“
DTR -12V = +5V H (DTR mit einem LED verbunden mit GND LED=EIN)

Ich hab ja jetzt zwei Leitungen die H und L Signale liefern über einem I2C-Bus mit einem IC PCF8574 dann verschiedene Sachen EIN und AUS schalten.

Gruß
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 52
Wohnort: Herzogenaurach

BeitragVerfasst am: 12.11.2018, 08:48    Titel: Antworten mit Zitat

Hallo Sebastian,
ich mach zurzeit mal was mit deinem Programm vom 16.12.2017, 01:30

Diese Zeile habe ich geändert
Dim KommandoA As String = Chr( &HB0, &HC0, &HA8, &H01, &H01, &H00 )
NEU
Dim KommandoA As String = Chr( &HB0, &HC0, &HA8, &H01, &H01, &H1A )

Nun habe ich da einen super Modernen Laptop der vermutlich 10 mal schneller als mein Windows XP Rechner und da müsste man nach dem Senden und Empfangen eine klein Pause machen.

Es kommt mir so vor als ob die Leertaste etwas „prellt“ also irgendwie manchmal 2 mal sendet und aber die Rückmeldung vom PZEM-004T Modul noch nicht da ist.

Ich hab jetzt mit „Sleep“ einige Sachen ausprobiert, nur dann ist das beenden vom Programm mit der Taste „Esc“ irgendwie ein Glücksspiel.

Können Sie einen Tipp geben wie ich nach dem drücken der Leertaste nur 1 mal die Anfrage sende, also eine kleine Zeitverzögerung bis zur nächsten Leertastenabfrage.
.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 875
Wohnort: Ruhrpott

BeitragVerfasst am: 12.11.2018, 10:11    Titel: Antworten mit Zitat

Hallo eeg-grimm.

Das 'Sleep 1' in der Schleife ist nicht fürs Timing, sondern dient dazu, Ressourcen zu schonen, indem es den Rest der dem Programm vom Betriebssystem zugeteilten Zeitscheibe (bei WinXP ca. 15 ms) freigibt. Ohne dieses Sleep würde die Schleife eine Prozessor(kern)auslastung von 100% verursachen.

Das Timing (wenn man es so nennen will) der Schleife erfolgt durch Abfragen der Länge des Empfangspuffers. Hier kann es zu Problemen kommen, wenn die Übertagung langsamer ist als die Wiederholdauer der Schleife. Abhilfe schafft ein Warten auf das Ende der Datenübertragung:
Code:
Dim As String Tastatur="", Datenpuffer=""
Dim As Integer puffervor, zaehler

Do
   ' Hat das angeschlossene Geraet inzwischen Daten gesendet?
   If Loc( 1 ) > 0 Then
      If LOC(1) > puffervor Then 'wartet, bis der Datenpuffer nicht mehr größer wird
         puffervor = LOC(1) 'Füllstand des Datenpuffers merken
         zaehler = 0
      Else
         If zaehler >= 10 Then 'seit 10 Schleifendurchläufen keine neuen Daten
            Datenpuffer = Space( Loc( 1 ) )
            Get #1, , Datenpuffer
            Print "Daten empfangen! Hex-Ansicht: ";
            Color 10
            Print getHexString( Datenpuffer )
            Color 7
            puffervor = 0
            zaehler = 0
         Else
            zaehler += 1
         EndIf
      EndIf
   End If
   ' Hat der Benutzer eine Taste gedrueckt?
   Tastatur = Inkey
   If( Tastatur = Chr(32) ) Then 'Leertaste
      Print "Sende Daten! Hex-Ansicht: ";
      Color 12
      Print getHexString( KommandoA )
      Color 7
      Put #1, , KommandoA
   End If
   Sleep 1
Loop Until Tastatur = Chr(27) 'Escape

Eventuell muß der Vergleichswert für "zaehler" angepasst werden.

Oder (@Sebastian) hast du eine bessere Idee?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 52
Wohnort: Herzogenaurach

BeitragVerfasst am: 12.11.2018, 19:37    Titel: Antworten mit Zitat

Danke grindstone,

das ist jetzt wesentlich besser mit der Leertaste und das „prellen“ ist verschwunden, nur wenn man auf der Leertaste bleibt, macht das auch nichts, werden nur immer wieder

Sende Daten! Hex-Ansicht: B0 C0 A8 01 01 00 1A
Sende Daten! Hex-Ansicht: B0 C0 A8 01 01 00 1A
Sende Daten! Hex-Ansicht: B0 C0 A8 01 01 00 1A

gesendet an das PZEM-004T Modul.

Code:

' Code-Schnipsel ohne Funktionsgarantie. Verwendung nur auf eigene Gefahr!

Declare Function getHexString( Daten As String ) As String

' TODO: Hier Parameter einstellen:
' COM1 = RS232   COM4 = USB
Const COMPortParameter = "COM4:9600,N,8,1,ME,CS0,DS0,RS"
   
' Kommandos hinterlegen:
Dim KommandoA As String = Chr( &HB0, &HC0, &HA8, &H01, &H01, &H00, &H1A )

' COM-Port oeffnen:
Print "Versuche COM-Port zu oeffnen: "; COMPortParameter
If ( Open Com ( COMPortParameter For Binary As #1 ) <> 0 ) Then
    Print "Der COM-Port konnte leider nicht geoeffnet werden."
    GetKey
    End 1
End If


Print
Print "COM-Port geoeffnet."
Print "Bitte [Leertaste] druecken zum Senden des Befehls und [Esc] zum Beenden."
Print

Dim As String Tastatur="", Datenpuffer=""
Dim As Integer puffervor, zaehler

Do
   ' Hat das angeschlossene Geraet inzwischen Daten gesendet?
   If Loc( 1 ) > 0 Then
      If LOC(1) > puffervor Then 'wartet, bis der Datenpuffer nicht mehr größer wird
         puffervor = LOC(1) 'Füllstand des Datenpuffers merken
         zaehler = 0
      Else
         If zaehler >= 10 Then 'seit 10 Schleifendurchläufen keine neuen Daten
            Datenpuffer = Space( Loc( 1 ) )
            Get #1, , Datenpuffer
            Print "Daten empfangen! Hex-Ansicht: ";
            Color 10
            Print getHexString( Datenpuffer )
            Color 7
            puffervor = 0
            zaehler = 0
         Else
            zaehler += 1
         EndIf
      EndIf
   End If
   ' Hat der Benutzer eine Taste gedrueckt?
   Tastatur = Inkey
   If( Tastatur = Chr(32) ) Then 'Leertaste
      Print "Sende Daten! Hex-Ansicht: ";
      Color 12
      Print getHexString( KommandoA )
      Color 7
      Put #1, , KommandoA
   End If
   Sleep 3
 
 
Loop Until Tastatur = Chr(27) 'Escape

Print
Print "Schliesse Schnittstelle..."

' Schnittstelle schliessen:
Close #1

Print "Programm beendet."

GetKey
End 0



' String mit irgendwelchen Daten in Hex-Form ausgeben, um auch nicht-druckbare
' Zeichen einfach lesen zu koennen.
Function getHexString( Daten As String ) As String
    Dim Laenge As Integer = Len( Daten )
    If( Laenge < 1 ) Then
        Return ""
    End If
    Dim HexAusgabe As String = ""
    For i As Integer = 1 To Laenge
        HexAusgabe &= Hex( Asc( Mid( Daten, i, 1 ) ), 2 ) & " "
    Next i
    Return HexAusgabe
End Function
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 875
Wohnort: Ruhrpott

BeitragVerfasst am: 12.11.2018, 23:16    Titel: Antworten mit Zitat

Da ist kein Prellen. Die Antwort des Moduls wurde vorher lediglich in mehrere Teile zerlegt.

Liefert das Modul denn sinnvolle Messwerte?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 52
Wohnort: Herzogenaurach

BeitragVerfasst am: 13.11.2018, 08:59    Titel: Antworten mit Zitat

Zitat:
Da ist kein Prellen. Die Antwort des Moduls wurde vorher lediglich in mehrere Teile zerlegt.


Hallo grindstone,
das kann auch sein, nur das manchmal eben mehr als die 7 Hex und manchmal weniger als die 7 Hex ausgegeben wurden bei ungeschickter Betätigung der Leertaste hat mich zu den Vermutung geführt das da das Programm eine mehrfach EIN/AUS von der Leertaste erkannt hat.

Zitat:
Liefert das Modul denn sinnvolle Messwerte?


Angezeigt werden 7 Hex Zahlen in grün ist erst mal die Netzspannung z.B.
A0 00 E6 04 00 00 8A (Ausgabe in grün als Hex)
160 0 230 4 0 0 138 (230,4V)

Jetzt muss ich erst mal die Messwerte von Hex in Dezimalzahlen umwandeln.
Mir ist aber noch nicht ganz klar ob das jetzt 230,4V sind oder 230,04V die da anliegen und ausgegeben werden.
Vermutlich, zu 99% ist die 4. Hex Zahl die erste Kommastelle, da nur 00 bis 09 ausgegeben wurden.

Das umwandeln der Hex in einen sinnvolle Messwert ist auch noch nicht erledigt, da hab ich etwas mit VALIT und VAL herumgemacht aber das ist aber nichts geworden.

Auch ist das mit der 7. Hex Zahl nicht so schlüssig, das soll ja sowas wie eine Prüfsumme, Checksumme sein, wenn ich das richtig verstanden habe beim Messmodul PZEM004T mit dem IC-SD3004 .

Da sollte man erst mal prüfen ob die Prüfsumme Okay ist, das klar ist ob die empfangenen Werte vom PZEM004T, IC-SD3004 überhaupt Sinn machen.
.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 875
Wohnort: Ruhrpott

BeitragVerfasst am: 13.11.2018, 23:36    Titel: Antworten mit Zitat

Zitat:
das kann auch sein, nur das manchmal eben mehr als die 7 Hex und manchmal weniger als die 7 Hex ausgegeben wurden bei ungeschickter Betätigung der Leertaste hat mich zu den Vermutung geführt das da das Programm eine mehrfach EIN/AUS von der Leertaste erkannt hat.
Ich denke eher, daß die verfrühte Abfrage die Kommunikation durcheinanderbringt. Man sollte eventuell dafür sorgen, daß das Programm nach einer Abfrage wartet, bis das Modul geantwortet hat (mit Timeout, damit sich es sich bei einer missglückten Antwort nicht aufhängt).

Schau mal, ob das hier funktioniert:
Code:
' Code-Schnipsel ohne Funktionsgarantie. Verwendung nur auf eigene Gefahr!

Declare Function getHexString( Daten As String ) As String
Declare Function pruefsumme(t As String) As String

' TODO: Hier Parameter einstellen:
' COM1 = RS232   COM4 = USB
Const COMPortParameter = "COM4:9600,N,8,1,ME,CS0,DS0,RS"

' Kommandos hinterlegen:
Dim KommandoA As String = Chr( &HB0, &HC0, &HA8, &H01, &H01, &H00, &H1A )

' COM-Port oeffnen:
Print "Versuche COM-Port zu oeffnen: "; COMPortParameter
If ( Open Com ( COMPortParameter For Binary As #1 ) <> 0 ) Then
   Print "Der COM-Port konnte leider nicht geoeffnet werden."
   GetKey
   End 1
End If


Print
Print "COM-Port geoeffnet."
Print "Bitte [Leertaste] druecken zum Senden des Befehls und [Esc] zum Beenden."
Print

Dim As String Tastatur="", Datenpuffer=""
Dim As Integer puffervor, zaehler

Do
   ' Hat das angeschlossene Geraet inzwischen Daten gesendet?
   If Loc( 1 ) > 0 Then
      If LOC(1) > puffervor Then 'wartet, bis der Datenpuffer nicht mehr größer wird
         puffervor = LOC(1) 'Füllstand des Datenpuffers merken
         zaehler = 0
      Else
         If zaehler >= 10 Then 'seit 10 Schleifendurchläufen keine neuen Daten
            Datenpuffer = Space( Loc( 1 ) )
            Get #1, , Datenpuffer
            Print "Daten empfangen! Hex-Ansicht: ";
            Color 10
            Print getHexString( Datenpuffer )

            If pruefsumme(Left(Datenpuffer, 6)) = Mid(Datenpuffer, 7, 1) Then
               Select Case Left(Datenpuffer, 1)
                  Case Chr(&HA0) 'Spannung
                     Print "Spannung"; Datenpuffer[1] * 256 + Datenpuffer[2] + (Datenpuffer[3] / 10);" Volt"
                  Case Chr(&HA1) 'Strom
                     Print "Strom"; Datenpuffer[1] * 256 + Datenpuffer[2] + (Datenpuffer[3] / 100);" Ampere"
                  Case Chr(&HA2) 'Leistung
                     Print "Leistung"; Datenpuffer[1] * 256 + Datenpuffer[2];" Watt"
                  Case Chr(&HA3) 'Energie
                     Print "Leistung"; Datenpuffer[1] * 256^2 + Datenpuffer[2] * 256 + Datenpuffer[3];" Wh"
                  Case Chr(&HA4) 'Moduladresse
                     Print "Moduladresse";
                     If Datenpuffer[1] Or Datenpuffer[2] Or Datenpuffer[3] Or Datenpuffer[4] = 0 Then
                        Print " OK"
                     Else
                        Print " FEHLER"
                     EndIf
                  Case Chr(&HA5) 'Alarmschwelle
                     Print "Alarmschwelle";
                     If Datenpuffer[1] Or Datenpuffer[2] Or Datenpuffer[3] Or Datenpuffer[4] = 0 Then
                        Print " OK"
                     Else
                        Print " FEHLER"
                     EndIf
               End Select
            Else
               Print "Prüfsummenfehler"
            EndIf

            Color 7
            puffervor = 0
            zaehler = 0
         Else
            zaehler += 1
         EndIf
      EndIf
   End If
   ' Hat der Benutzer eine Taste gedrueckt?
   Tastatur = Inkey
   If( Tastatur = Chr(32) ) Then 'Leertaste
      Print "Sende Daten! Hex-Ansicht: ";
      Color 12
      Print getHexString( KommandoA )
      Color 7
      Put #1, , KommandoA
   End If
   Sleep 3


Loop Until Tastatur = Chr(27) 'Escape

Print
Print "Schliesse Schnittstelle..."

' Schnittstelle schliessen:
Close #1

Print "Programm beendet."

GetKey
End 0



' String mit irgendwelchen Daten in Hex-Form ausgeben, um auch nicht-druckbare
' Zeichen einfach lesen zu koennen.
Function getHexString( Daten As String ) As String
   Dim Laenge As Integer = Len( Daten )
   If( Laenge < 1 ) Then
      Return ""
   End If
   Dim HexAusgabe As String = ""
   For i As Integer = 1 To Laenge
      HexAusgabe &= Hex( Asc( Mid( Daten, i, 1 ) ), 2 ) & " "
   Next i
   Return HexAusgabe
End Function

Function pruefsumme(t As String) As String
   Dim As Integer summe

   If Len(t) < 6 Then
      Return "FEHLER"
   EndIf

   For x As Integer = 0 To 5
      summe += t[x]
   Next
   Return Chr(summe And &HFF)

End Function


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 52
Wohnort: Herzogenaurach

BeitragVerfasst am: 14.11.2018, 10:04    Titel: Antworten mit Zitat

Hallo grindstone,
das werde ich mal testen heute Abend.

Mein Versuchsaufbau sieht jetzt so aus für die Spannung:
https://www.bilder-upload.eu/bild-9ff44c-1542186562.jpg.html
https://www.bilder-upload.eu/bild-8eeb58-1542186109.jpg.html
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 52
Wohnort: Herzogenaurach

BeitragVerfasst am: 14.11.2018, 18:32    Titel: Antworten mit Zitat

Hallo grindstone,

ich bin beeindruckt, das man das machen kann ohne das man die beiden Platine zur Verfügung hat.
https://www.bilder-upload.eu/bild-7df8a9-1542215413.png.html

Machst du das mit den programmieren Hauptberuflich oder nur nebenbei?

Ich hab ja vor 25 Jahren mal mit GW-Basic angefangen und da war die Welt noch in Ordnung, schön durchnummerierte Zeilen und immer mit GOTO gesprungen, dann Q-Basic und in den vergangen 10 Jahren nichts mehr gemacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 875
Wohnort: Ruhrpott

BeitragVerfasst am: 14.11.2018, 21:59    Titel: Antworten mit Zitat

eeg-grimm hat Folgendes geschrieben:
ich bin beeindruckt, das man das machen kann ohne das man die beiden Platine zur Verfügung hat.
Na ja, daß das Modul auf die Anfrage reagiert -also zumindest im Prinzip arbeitet-, geht ja aus deinem Beitrag hervor, und das Übertragungsprotokoll ist in dem Link am Anfang dieses Threads ausreichend genau beschrieben.

Zitat:
Machst du das mit den programmieren Hauptberuflich oder nur nebenbei?
Ist nur ein Hobby, allerdings schon seit Anfang der 80er. Zuerst ein programmierbarer Taschenrechner (TI59), dann C64, dann PC. Abgesehen vom Programmeschreiben haben es mir selbstgebaute oder umgebaute Peripheriegeräte angetan.

Sind das auf dem Screenshot echte Messwerte?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 52
Wohnort: Herzogenaurach

BeitragVerfasst am: 15.11.2018, 08:38    Titel: Antworten mit Zitat

Zitat:
Sind das auf dem Screenshot echte Messwerte?


JA

Genau so ist die Bildschirmausgabe wenn man das Modul an 230V AC anschließt, Stromwandler ist nicht, noch nicht angeschossen.
Die angezeigte Spannung stimmt auch.


Am Ende der Veranstaltung sollen ja auch die Watt usw. angezeigt werden.
.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4
Seite 4 von 4

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz