AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OnChangeValue ?

Ein Thema von akurka · begonnen am 13. Jan 2016 · letzter Beitrag vom 18. Jan 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#1

AW: OnChangeValue ?

  Alt 15. Jan 2016, 08:25
Hallo Perlsau
ja ok, ich meine ich habe mein Problem genügend erklärt (siehe Antwort an Dich und Dejan Vu), vollständigkeits halber zitiere ich es noch einmal :

Zitat:
------------------------------------------------
Zitat von Dejan Vu
Habe ich das jetzt so verstanden, dass STATUS.CNC.ZBETR irgendwo außerhalb gesetzt wird und man auf die Änderung dieses Speicherbereiches reagieren will? Das kann mit der Lösung von Perlsau nicht funktionieren.
Laut Variable ist das der Status irgendeiner CNC-Maschine. Und dieser Wert ändert sich dann, wenn die CNC-Maschine ihren Status ändert. In der SPS-Welt pollt man den Wert (alle paar ms) und reagiert dann auf Änderungen.
------meine Antwort-----------------------------------------
Ja das ist so, der STATUS.CNC.ZBETR ist ein Byte aus einer 16 Byte Meldung die in unregelmässigen Abständen über RS232 in einem Thread empfangen wird.
Die Meldung selber kommt relativ häufig aber der STATUS.CNC.ZBETR ändert sich nur dann, wenn der Benützer das Betriebswahlschalter wechselt.Und das kann Stunden dauern. Ausserdem gibt es ganzer Menge andere Meldungen.

Bis jetzt habe ich es mit Polling gelöst was aber nicht gerade sauber ist. Der Grund warum ich es anders machen will ist, dass bei einem BW Wechsel das aktuelle Menü komplett neu aufgebaut wird.
Sonst bleibt das Menue bestehen und es werden nur Anzeigen geändert.
Aber auch das stösst an Grenzen mit Polling.

Eigentlich suchte ich eine Komponente die auf Aenderung einer Variable
reagiert (OnChangeValue).
Dieser Komponente möchte ich dann für verschiedene Variablen
anwenden (OnChangeBWStellung, OnChangeIstwert, OnchangeAchsenWahl usw.)

Die Polling Lösung hat ein gewichtige Nachteil, es verbraucht sehr viel Rechenzeit(bei allen diesen Meldungen).

Im übrigem ist mir klar, dass wenn die neue Lösung funktioniert ich mich auch mit "kritische Region" befassen muss, das aber später,eines nach dem anderem.

Die RS232 ist sowieso nur vorläufige (alte) Lösung , im Zukunft möchte ich auf EtherCAT(oder OpenCAN) umstellen, schon deswegen möchte ich die Resourcen sparen.
Nun muss ich auch die setter Methode immer wieder aufrufen
was dem Polling eigentlich gleich kommt, ist das nicht so ?

Nun ich verstehe, dass Du genug hast Dich mit OOP Anfänger
zu plagen. Trotzdem vielen Dank für Deine Hilfe, ich habe
wieder einiges gelernt.
Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: OnChangeValue ?

  Alt 15. Jan 2016, 09:59
Lies dir mal hier den 2ten Abschnitt: Prozedurale Typen und Objekte durch.

Da geht es auch um ein TNotifyEvent und wie man eine entsprechende Prozedur definiert, erzeugt und benutzt. Oder informiere dich einmal zum Stichwort "Methodenzeiger".


Musst du eigentlich mehrere verschiedene Werte überwachen (du würdest dann für jeden ein entsprechendes Objekt von TMeineKlasse brauchen) oder geht es nur um einen Wert? Im letzteren Fall könntest du dir den ganzen Aufwasch ja sparen und mit einer Variablen + Setter + Property direkt in Form2 arbeiten.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#3

AW: OnChangeValue ?

  Alt 15. Jan 2016, 11:07
Hallo Jumpy
Besten Dank für Dein Tipp.
Ja nach der ersten Durchsicht ist es genau das was mir fehlt.
Habe es augedrückt und werde es genau studieren.

Zu Deiner Frage:

Ja es sind mehrere Werte aus den Meldungen die von der CNC über RS232
kommen. Die Wichtigste ist die Status.CNC Meldung(16 Byte,Array) und daraus das ZBETR(BetriebswahlSchalterStellung=BWStellung= 1 Byte).

Aber es soll aber auch bei der IstWertMeldung
( Anzahl Bytes variert,je nach Anzahl Achsen,pro Achse 24bit)
festgestellt werden ob sich irgend ein Istwert(24bit =>Integer) verändert hat.
Jetzt mache ich es mit Polling und Vergleich AltWert <> NeuWert und nur wenn eine Aenderung da ist, wird es Angezeigt.
Ziemlich umständlich und ein Resourcen Fresser.

Im grossen Ganzen sind es (je nach Betriebswahl) 2 bis 4 unterschiedliche Meldungen die permanent überwacht werden müssen.

Andrererseits muss ich sagen, dass die bisherige Lösung eigentlich nicht schlecht läuft.
Eleganter wäre natürlich eine Lösung wie bei
Tasten z.Bsp. OnKeyPress, darum meine Idee mit OnChangeValue.

Nur wenn sich ein Wert ändert wird entsprechender Erreigniss ausgelöst und der Wert Angezeigt.
Ob es dann weniger Rechenzeit braucht kann ich nicht beurteilen, aber ich will es probieren und testen.
Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: OnChangeValue ?

  Alt 15. Jan 2016, 11:10
Eleganter wäre natürlich eine Lösung wie bei
Tasten z.Bsp. OnKeyPress, darum meine Idee mit OnChangeValue.

Nur wenn sich ein Wert ändert wird entsprechender Erreigniss ausgelöst und der Wert Angezeigt.
Ob es dann weniger Rechenzeit braucht kann ich nicht beurteilen, aber ich will es probieren und testen.
Gruss Anton
Hast Du eigentlich meine Antwort gelesen?
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#5

AW: OnChangeValue ?

  Alt 15. Jan 2016, 11:22
Hallo TiGü
Besten Dank, das " MeineKlasse.OnvalueChange := Self.OnValueChange;"
hat gefehlt.

Ja mit der Polling, dass ist genau das Problem, das mache ich jetzt schon:
Zitat:
Delphi-Quellcode:
MeineKlasse.BWStellung := ... // Die Zuweisung des neuen Wertes
// Das musst du ja irgendwie durch Pollen im Timer oder Thread umgesetzt haben?!
siehe meine vorherige Antwort an Jumpy und an Perlsau.

Wird es punkto Rechenzeit überhaupt etwas bringen mit dem setter, wenn ich den Wert der Variable pollen muss ??
Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: OnChangeValue ?

  Alt 15. Jan 2016, 12:12
Wird es punkto Rechenzeit überhaupt etwas bringen mit dem setter, wenn ich den Wert der Variable pollen muss ??
Gruss Anton
Hast Du eigentlich meine Antwort gelesen?
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#7

AW: OnChangeValue ?

  Alt 15. Jan 2016, 15:32
Hallo Mavarik
Entschuldige die späte Antwort. Ich musste nach den ersten Antworten
schnell weg.
Du hast es richtig angesprochen, woher soll der Event kommen ?

Leider bringt es nichts auf Empfang der Meldungen vom RS232 zu triggern.

Der Grund ist, dass es z.Bsp mehrere Status oder Istwert Meldungen die genau gleich sind, also müssen gar nicht berücksichtigt werden.

Du kanst Dir das so vorstellen wenn z.Bsp die CNC Achsen gar nicht in
Bewegung sind wird im Prinzip immmer der gleiche Istwert öbermittelt.
Ab un zu mal bedingt durch Regelung gibt es ein Unterschied +/-1 um
dies aber u.U.in Abständen von Sekunden. Die Status-, Istwert-, Endlage- usw. werden aber in Abständen von ca. 50 - 100 mS empfangen.Es gibt also ganze menge Meldungen die nicht relevant sind.

Auf der andere Seite gibt es Situationen wo eine sehr schnelle Reaktion notwendig ist, darum die relativ kurzen Zeitabstände.

Die jetztige Polling Rate bei 4 Achsen ist ca. 50 mS, es ist ein Kompromiss.

Wenn man eine Taste drückt hat man die Methode OnKeyPress, ohne das
man die Taste ständig abtasten muss.
So etwas stelle ich mir vor aber für die Aenderung einer Variable.

Soviel ich weiss werden die Tastaur-Nachrichten im Supervisor Modus des uP's abgearbeitet, und damit sind auch die Windows Message verfügbar.

Ob so etwas auch für Memory ànderungen gibt entzieht sich meiner Kenntnis.

Vermutlich ist das bestehende, zugegeben etwas holprige Lösung
gleich das optimale.
Aber ich will es genau abklären ob es der Wahrheit letzter Schluss Schluss ist.
Gruss Anton
Anton Kurka
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
263 Beiträge
 
Delphi XE5 Professional
 
#8

AW: OnChangeValue ?

  Alt 15. Jan 2016, 16:21
Ich mische mich jetzt auch mal kurz ein:
das mit dem OnKeyPress ist recht einfach zu erklären:
Wenn du eine Taste drückst generiert deine Tastatur einen Interrupt. Dieser wird von diversen Treibern "aufgefangen" und dann als Windows Message versendet...und auf dies Message reagieren dann halt entsprechende Komponenten.

Ist aber eine gaaannnzz doll abstahierte Darstellung.

Wenn du nun deine CNC dazu bringen könntest Nachrichten über die RS232 nur dann zu senden, wenn sich auch was geändert hat hättest du auch ein "event" auf das du reagieren könntest.
Ansonsten bleibt dir halt nur übrig die Infos von der CNC "kontinuierlich" auszulesen und das ist dann halt Polling....
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: OnChangeValue ?

  Alt 15. Jan 2016, 17:47
Leider bringt es nichts auf Empfang der Meldungen vom RS232 zu triggern.
Selbstverständlich... Du scheinst etwas wirre Vorstellungen zu haben... Event vom Memory usw... alles Quark!

Die Kommunikation mit der CNC-Maschine läuft über die RS-232 Schnittstelle. PUNKT.

Also muss man die eingehenden Daten - je nach Baudrate - mit für heutige Rechner wenig CPU Last - SOWIESO einlesen...

Das ist der einzige Kommunikations-Kanal hier werden dann die Datenpakete auseinander genommen... Wenn dann eine Änderungen eintritt, die für die Software relevant ist, sendet der RS-232 Treiber eine Windows-Message. Bingo damit hast Du Deinen Event-Trigger... Ohne zu pollen!

Geändert von Mavarik (15. Jan 2016 um 18:05 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: OnChangeValue ?

  Alt 15. Jan 2016, 13:16
Wird es punkto Rechenzeit überhaupt etwas bringen mit dem setter, wenn ich den Wert der Variable pollen muss ??
Gruss Anton
Eigentlich nicht, denn dein Hauptproblem ist ja nicht das Aktualisieren des Formulars.
Da scheinst du ja mit den Vergleich von Alt- zu Neuwert nur zu erneuern, wenn du es musst.

Das Pollen scheint dein eigentliches Problem zu sein.
Hier wären mal konkrete Zahlenwerte gefragt.

Verbraucht dein Abfragethread ungewöhnlich viel CPU-Arbeit im Task-Manager?
Wenn ja, wieviel Prozent?

Wie oft pollst du denn? Mit welcher Frequenz oder im welchen Intervall?
Wenn du das nicht beantworten kannst, dann hast du einen Abfragethread, der stumpf im Execute die serielle Schnittstelle ausliest.
Dann erklärt sich der Ressourcenhunger.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz