Werte alle 100ms umrechnen

Hallo zusammen,

ich habe ein kleines Problem!
Ich bekomme pro Sekunde mehrere Wert aus einer Steuerung in meinem VB-Projekt angezeigt. Diese Werte will ich aber in eine andere Einheit (z.B. Temperatur von °C in °F) umrechnen. Ich kriegs aber nicht gebacken!

Ich habe es so versucht (nur ein Beispiel):


Private Sub CmdUmrechnen_Click()

Timer1_Timer
Timer1.Enable = True
Timer1.Interval = 100

End Sub


Private Sub Timer1_Timer()

VariableAusSteuerung = (VariableAusSteuerung * 1.8) + 32

End Sub


Ich hatte mir gedacht, dass ich die Werte mit einem kleineren Intervall des Timers als das Intervall zum Anzeigen der Werte aus der Steuerung umrechnen könnte. Leider geht das aber nicht.
Ich muss aber gleich dazu sagen, dass dieses VB-Programm auf einem anderen Programm (iFIX 3.5) aufprogrammiert ist. Die Folge ist leider, dass ich im VB-Programm keine Text-Boxen oder Labels zur verfügung habe, sondern nur die Objekte, die mir von iFIX zur Verfügung gestellt werden.

Hat da vielleicht jemand eine Idee?

Gruß

Axel

Hi Axel,

ich habe ein kleines Problem!
Ich bekomme pro Sekunde mehrere Wert aus einer Steuerung in
meinem VB-Projekt angezeigt. Diese Werte will ich aber in eine
andere Einheit (z.B. Temperatur von °C in °F) umrechnen. Ich
kriegs aber nicht gebacken!

Ich habe es so versucht (nur ein Beispiel):


Private Sub CmdUmrechnen_Click()

Timer1_Timer
Timer1.Enable = True
Timer1.Interval = 100

End Sub

Hmmmm, Was soll Timer1_Timer bewirken? Nimm das mal raus. Dann stellst Du erst den Interval ein und danach startest Du erst den Timer.
Das nur am rande, hat mit Deinem Problem nichts zu tun.


Private Sub Timer1_Timer()

VariableAusSteuerung = (VariableAusSteuerung * 1.8) + 32

End Sub


Das wäre so richtig.

Ich hatte mir gedacht, dass ich die Werte mit einem kleineren
Intervall des Timers als das Intervall zum Anzeigen der Werte
aus der Steuerung umrechnen könnte. Leider geht das aber
nicht.

Stimmt, das geht nicht. Wenn die Anzeigeroutine länger braucht als Du Zeit zwischen zwei Werten hast, ist der Weg falsch. Du kannst den Timer nicht noch einmal starten, wenn er schon läuft. VB6 ist nicht Multithreadfähig.

Ich muss aber gleich dazu sagen, dass dieses VB-Programm auf
einem anderen Programm (iFIX 3.5) aufprogrammiert ist. Die
Folge ist leider, dass ich im VB-Programm keine Text-Boxen
oder Labels zur verfügung habe, sondern nur die Objekte, die
mir von iFIX zur Verfügung gestellt werden.

Hat da vielleicht jemand eine Idee?

Ich weiß nicht, wie Deine Anzeige aussieht. Eventuell könnte es helfen, die jeweils eine gewisse Zeit unsichtbar zu schlaten, wenn das geht, Werte eintragen und nur gelegentlich mal auf sichtbar zu schalten. Dein Zeitproblem könnte auch an einer ganz anderen Stelle stecken, das kann ich den vorhandenen Informmationen nicht ansehen.

Wenn Du aber eine Multithreadfähige Programmiersprache benötigst, bist Du bei VB6/VBA falsch, das geht mit .NET & C#, wenn ich recht informiert bin.

Gruß, Rainer

Hallo Rainer,

erstmal danke für die Antwort, ich muss mal sehen wie ich das mache, ich denke ich werde das gleich in der Steuerung umrechnen.

Weißt du vielleicht allgemein einen Counter programmieren kann, der jede Sekunde einen Wert um 1 hochzählt?

Gruß

Axel

Hi Axel,

Weißt du vielleicht allgemein einen Counter programmieren
kann, der jede Sekunde einen Wert um 1 hochzählt?

mehrere Möglichkeiten. Am Einfachsten mit dem Timer.

Option Explicit

Private Sub Command1\_Click()
 Timer1.Interval = 1000
 Timer1.Enabled = True
End Sub

Private Sub Timer1\_Timer()
 Static n As Long
 n = n + 1
 Me.Caption = n
End Sub

Der Wert beginnt hier bei 1 zu zählen und zählt in der Titelzeile jede Sekunde um 1 hoch.

Das ist sicher die bequemste Methode.

Gruß, Rainer

Hi Rainer,

das habe ich auch schon ausprobiert, geht bei mir aber nicht. Gibt es da noch einen anderen Weg?

Gruß

Axel

Hi Axel,

noch 'ne Idee. :smile:

wie wäre es mit zwei Programmen und einer Datenank?

Ein Programm liest die Daten, rechnet sie um und schreibt sie in eine Datenbank. Bis zu 100 mal pro Sekunde sollte das VB schaffen.

Das zweite Programm liest die Datenbank und übergibt die Werte zur Anzeige. Das darf dann ruhig langsamer sein, dann werden eben immer mehrere Werte aktualisiert.

Auf die Art stört es technisch nicht, wenn die Anzeige zu langsam ist, das ist höchstens optisch nicht so schön.

Gruß, Rainer

Hallo,

das habe ich auch schon ausprobiert, geht bei mir aber nicht.
Gibt es da noch einen anderen Weg?

ja, klar. Aber was bedeutet erst mal: ‚geht nicht‘?

Erst lasse ich n mal bis 10 zählen, ohne Timer.

Option Explicit

Private Sub Command1\_Click()
 lp
End Sub

Private Sub lp()
 Static n As Long
 While n 

Eine weitere Möglichkeit wäre Sleep, aber dann freirt das Programm ein und tut in der Wartezeit gar nichts mehr, das ist wohl nicht, was Du brauchst.

Gruß, Rainer

Hi Axel,

einen hab’ ich noch … :smile:

Mal einen Code, der an die Uhr gekoppelt ist, damit die Sekunden auch eingehalten werden.

Option Explicit

Private Sub Command1\_Click()
 Static n As Long, s As Byte
 While n Second(Time) Then
 s = Second(Time)
 n = n + 1
 Me.Caption = n
 End If
 DoEvents
 Wend
End Sub

Gruß, Rainer

Geil, das läuft!

Vielen Dank Rainer.

Gruß

Axel

Hi Axel,

Hallo Rainer,

warum eine Datenbank?
Wenn die Daten schneller ankommen, als sie verarbeitet werden, fallen mir spontan 2 Ideen ein :smile:

Idee 1:

wir erstellen einen Thread.
Das Progg liesst die Daten ein und schreibt sie in ein Array
Der Thread verarbeitet das Array in einer Schleife :wink:

Idee 2:

Wir basteln uns einen DDE Server und lassen ihn die Daten lesen
Schicken die Daten an den DDE Clienten der rechnet :wink:

MfG Alex

Hi Akex,

warum eine Datenbank?

weil ich da hätte helfen können, hat sich ja aber schon erledigt. :smile:

Wenn die Daten schneller ankommen, als sie verarbeitet werden,
fallen mir spontan 2 Ideen ein :smile:

Idee 1:

wir erstellen einen Thread.
Das Progg liesst die Daten ein und schreibt sie in ein Array
Der Thread verarbeitet das Array in einer Schleife :wink:

Multitreading? Du machst zu viel .NET. *fg* das klappt mit VB6 afaik nicht stabil.

Idee 2:

Wir basteln uns einen DDE Server und lassen ihn die Daten
lesen
Schicken die Daten an den DDE Clienten der rechnet :wink:

Wer? Was heißt DDE?

Gruß, Rainer

Hallo Rainer,

weil ich da hätte helfen können, hat sich ja aber schon
erledigt. :smile:

Och in den anderen Sachen sicherlich auch. Max.l haettest du einen Denkanstoss gebraucht :wink:

Multitreading? Du machst zu viel .NET. *fg* das klappt mit VB6
afaik nicht stabil.

Naja was heisst viel. Mehr lernen und fluchen als tippseln und Ergebnisse zu sehen. Aber man macht Fortschritte *zwinker*
Nein aber mal zurueck zum Thema. Kannst du dich daran erinnern, wo wir mal darueber geschrieben haben?
Wo ich es bei mir mal getestet habe, lief es stabil :smile:

Wer? Was heißt DDE?

Hmm, wie beschreib ich das mal?
Du hast 2 eigenstaendige Programme. Einen Server und einen Client. Diese koennen untereinander kommunizieren!
Das realisierst du mit den Ereignissen / methoden LinkRequest, Linkopen, Linkexequte , Linkmode etc.

Du stellst vom Prinzip her eine Verbindung zwischen den beiden Programmen über ein Textfeld oder ein Label her :wink:
Ist eigentlich rel. simple das zu bewerkstelligen :smile: Schaue dir mal die Methoden an. Also beim Server

Linkmode auf 1 und Linktopic zum Bsp. auf DDE
Über LinkExecute bekommst du mit wenn etwas angefordert wird und kannst darauf agieren :smile: Ueber CmdStr erhaelst du den Befehl!
Dann hast du ein Label oder ein Textfeld, welches mit dem Clienten „spricht“ Diesen weisst du dann einfach die Daten zu und schwups erhaelt sie der Client :smile:

Beim Clienten hast du dann ergo auch das Element was mit dem Server kommuniziert. Dort stellst du einfach den Timeout ein. Unter Linkmode auf 0!(keine) Linktopic gibst du den Server an! ( Zum Bsp. Server|DDE)
Und das Linkitem ist das Element im Server was darauf reagieren soll!

Dann kannst du mit dem Server „sprechen“ indem du einfach die Befehle alla LinkExecute schickst! Sprich

If DeinElement.Linkmode=0 then
 'Fehlerbehandlung -\> Server nicht verfügbar
else
 DeinElement.LinkExecute "DeinBefehl"
end if

Willst du dagegen Daten vom Server haben, so schickst du einfach einen Request rueber.

 DeinElement.LinkRequest

Es lässt sch schwer erklären Rainer. Ist aber wie gesagt ganz simple :smile: Am besten ist es wenn du es mal probierst :smile:

MfG Alex

PS:

http://www.activevb.de/tipps/vb6tipps/tipp0404.html
dort findest du auch ein Demo dazu :wink:

Hi Alex,

Kannst du dich daran
erinnern, wo wir mal darueber geschrieben haben?
Wo ich es bei mir mal getestet habe, lief es stabil :smile:

hmmm, ganz schön kitzlich, wenn ich mich recht erinnere, ein Tippfehler und die IDE ist abgestürzt. Für den Zweck hier auch komplett oversized. :smile: Wenn Du nicht weißt, was das Flexgrid tut, wirst Du kaum ein neues schreiben. Lass uns erst mal eine Basis schaffen, bevor wir uns um Subclassing kümmern.

Wer? Was heißt DDE?

Hmm, wie beschreib ich das mal?

Übersetzen hätte schon geholfen. ich weiß immer noch nicht, was es heißt, woger es kommt. BS? DLL? VB?

Dann hast du ein Label oder ein Textfeld, welches mit dem
Clienten „spricht“ Diesen weisst du dann einfach die Daten zu
und schwups erhaelt sie der Client :smile:

Das Handle suchen und ein Steuerelement beschreiben? Das ist ja nicht schwer. :smile:

Reinhard hat bei seinem Problem unten (ReadUrlFromBrowser) einen Code verlinkt, den ich dann auch verwendet habe. Da habe wird DDE verwendet, ich hab’s im Code, läuft, aber warum? Was? Ich habe nichts verstanden und die Intellisense versteht es auch nicht. :smile:

Es lässt sch schwer erklären Rainer. Ist aber wie gesagt ganz
simple :smile: Am besten ist es wenn du es mal probierst :smile:

Wenn ich nicht verstehe, was ich treibe, kann ich nichts eigenes damit machen.
In Reinhards Beispiel: Die aktuell verwendete URL des Browsers wird übergeben, ich erfahre nicht wie und warum. Würde ich es verstehen, wüsste ich, ob ich damit auch an den Fensterinhalt komme und wenn ja, wie. Code, den ich nicht verstehe, kann ich mir auch nicht merken und das Meiste tippe ich halt aus dem Kopf. :smile:

http://www.activevb.de/tipps/vb6tipps/tipp0404.html
dort findest du auch ein Demo dazu :wink:

Das sehe ich mir morgen an. :smile:

Gruß, Rainer

PS. .NET … bin noch nicht weiter, da fehlt Ruhe, Antrieb … die falsche Zeit und daß ich seit einiger Zeit scheinbar unter Migräne leide stört auch. :frowning:
Ich hoffe, das wird wieder anders.