QtVCP kann zur Erstellung von Bedienfeldern verwendet werden, die mit HAL verbunden sind.
1. Eingebaute virtuelle Bedienpulte (engl. virtual control panels)
Es sind mehrere integrierte HAL-Panels verfügbar.
Geben Sie in einem Terminal qtvcp list
ein, um eine Liste zu sehen.
1.1. copy
(engl. für kopieren)
Dient zum Kopieren von QtVCP’s eingebautem Screens/VCP Panels/QtVismach Code in einen Ordner, damit man ihn anpassen kann.
In einem Terminal ausführen:
qtvcp copy
1.2. spindle_belts
Dieses Panel dient zur Anzeige zusätzlicher RS485-VFD-Daten und zur Konfiguration eines Spindelantriebs mit 4 Scheiben und 2 Riemen über eine Reihe von Tasten.
Darüber hinaus ist es auch eine nützliche Vorlage für Ihr benutzerdefiniertes Panel, denn es enthält:
-
Anzeige von zusätzlichen HAL Daten
-
Schaltflächen (engl. buttons) und Schaltflächengruppen (engl. button groups)
-
Dynamische Änderungen des Aktivierungs-/Deaktivierungsstatus von Schaltflächen (engl. buttons) basierend auf dem Status anderer Schaltflächen
-
Speichern von Daten in die qtdragon.prefs Datei
-
Benutzerdefinierte Taste zum Zurücksetzen des VFD
Passen Sie dieses Panel an Ihre eigenen Anforderungen an. Die meisten gängigen Funktionen werden verwendet. Der Vorteil der Verwendung von Panels besteht darin, dass Ihr benutzerdefinierter Anzeigecode vom qtdragon-Kerncode getrennt wird, so dass ein Upgrade des Systems Ihre Anpassungen nicht zerstört.
1.2.1. Zusätzliche Anforderungen
-
Einen Spindelantrieb (z.B. VFDMOD)
-
Eine benutzerdefinierte Komponente zur Skalierung der Frequenz des VFD, um die gewünschte Spindeldrehzahl zu erhalten.
-
Eine riemengetriebene Spindel mit zwei Riemen und einer dazwischenliegenden Umlenkrolle, ähnlich wie bei einer Bohrmaschine.
-
Verbinden der Eingangspins qtdragon.belts.<pin-name> in Ihrer postgui HAL Datei.
1.2.2. Funktion
Die Bänder werden in zwei Gruppen von Buttons aufgeteilt, die Vordergurte (engl. front belts) und die Hintergurte (engl. rear belts) zerlegt. Diese sind je nach Platte auf der Maschine nummeriert. Buttons in einer Gruppe sind einander ausschließend, d.h. nur einer kann in der Gruppe ausgewählt werden.
Außerdem ist es bei dieser Art von Mechanismus nicht möglich, beide Riemen auf der gleichen Ebene zu haben, da man nicht zwei Riemen auf eine Umlenkrolle auflegen kann. Wenn also ein Riemen ausgewählt ist, ist die gegenüberliegende Taste deaktiviert. Wenn z. B. Riemen 3 ausgewählt ist, ist Riemen 7 deaktiviert.
1.2.3. Befehle einbetten
Fügen Sie diese Zeilen in den Abschnitt [DISPLAY] in Ihrer .ini-Datei ein
Das Beispiel tab_location ist für den QtDragon-Bildschirm.
EMBED_TAB_NAME=Spindle Extras
EMBED_TAB_COMMAND=qtvcp spindle_belts
EMBED_TAB_LOCATION=tabWidget_utilities
So laden Sie `spindle_belt ` aus einem HAL-Skript:
loadusr qtvcp spindle_belts
1.2.4. Hinweise zur Anpassung
Anpassen des Panels:
-
Kopieren Sie die Dateien in /user/share/qtvcp/qtdragon/panels/belts nach: ~/linuxcnc/configs/<Mein_Konfigurationsordner>/qtvcp/panels/belts (Sie können dazu das Kopierdialogfeld verwenden)
-
Bearbeiten Sie belts.ui mit Designer.
-
Bearbeiten Sie Belts_handler.py mit einem Texteditor
-
Verbinden Sie die relevanten Pins in der Datei postgui.hal
-
Stellen Sie sicher, dass Ihre Postgui-Datei von Ihrer .ini-Datei geladen wird.
Informationen zu den Feinheiten finden Sie in der QtVCP- und QtDragon-Dokumentation. Die Python-Handler-Datei bietet auch eine nützliche Vorlage für jedes benutzerdefinierte Panel.
1.3. test_dial
-
Dieses Panel hat ein * Einstellrad, das S32- und Float-HAL-Ausgangspins einstellt *.
-
Der Bereich des Zifferblatts kann über ein Dropdown-Menü eingestellt werden.
-
Die Ausgabe kann mit der
spinbox
skaliert werden. -
Eine
combobox
kann verwendet werden, um automatisch ein Signal auszuwählen und eine Verbindung herzustellen.
loadusr qtvcp test_dial
1.4. test_button
-
Dieses Panel hat eine Schaltfläche, die einen HAL-Pin setzt.
-
Die Schaltfläche kann als Momentan- oder als Umschalt-Schaltfläche ausgewählt werden.
-
A HAL pin will be created that follows the button state
-
Die Indikatorfarbe der Schaltfläche kann über ein Dropdown-Menü eingestellt werden.
-
A HAL pin or signal can be selected to follow the button state
-
Sie können weitere Schaltflächen über das Dropdown-Menü hinzufügen.
-
Sie können ein Halmeter aus dem Dropdown-Menü laden.
-
Sie können eine Test-LED aus dem Dropdown-Menü laden.
-
Die Schaltfläche kann von den Hauptfenstern abgetrennt werden.
So laden Sie test_button
aus einem HAL-Skript:
loadusr qtvcp test_button loadusr qtvcp -o 4 test_button
Der -o
Schalter legt fest, mit wie vielen Knöpfen das Panel startet.
Wenn Sie direkt von einem Terminal laden, lassen Sie das loadusr
weg.
1.5. test_led
-
Dieses Panel verfügt über eine *LED, die ausgewählt werden kann, um HAL-Bit-Pins / Signale * zu beobachten.
-
Die Farbe der LED kann über ein Dropdown-Menü eingestellt werden.
-
Das Textfeld und der Status können als Sprache ausgegeben werden, wenn Ton ausgewählt ist.
-
Eine
combobox
kann zur automatischen Auswahl und Verbindung mit einem Pin/Signal verwendet werden. -
Sie können weitere LEDs über das Dropdown-Menü hinzufügen.
-
Die LED kann von den Hauptfenstern abgenommen werden.
So laden Sie test_led
aus einem HAL-Skript:
loadusr qtvcp test_led loadusr qtvcp -o 4 test_led
Der -o-Schalter stellt ein, mit wie vielen LEDs das Panel startet.
Wenn Sie direkt von einem Terminal laden, lassen Sie den loadusr weg.
1.6. test_panel
Collection of useful widgets for testing HAL component, including speech of LED state.
loadusr qtvcp test_panel
1.7. cam_align
Ein Kamera-Display-Widget für die Rotationsausrichtung.
Fügen Sie der INI-Datei diese Zeilen hinzu:
[DISPLAY] EMBED_TAB_NAME = cam_align EMBED_TAB_COMMAND = halcmd loadusr -Wn qtvcp_embed qtvcp -d -c qtvcp_embed -x {XID} cam_align # The following line is needed if embedding in GMOCCAPY EMBED_TAB_LOCATION = ntb_preview
Anmerkung
|
All <options> must appear before the cam_align panel name. |
-
-c NAME
Name der HAL-Komponente. Standardmäßig wird der UI-Dateiname verwendet. -
-d
Debugging on. or remove for no minimum output -
-x {XID}
used for embedding into AXIS or Gmoccapy -
-o <option>
Options passed to cam_align
-
size=400,400
Size of the embedded window (width,height) -
imagesize=300,300
Size of the image inside the window (width,height) -
rotincr=5
Sets the increment of the crosshair rotation. (degrees) -
xscale=100
Scales the image in X. A negative value will flip the image in X (percent) -
yscale=100
Scales the image in Y. A negative value will flip the image in Y (percent) -
camnumber=1
Sets what system camera to use
Zu Beispiel können Breite und Höhe des Fensters, Drehung und Kameranummer in der INI mit der Option -o hinzugefügt werden.
EMBED_TAB_COMMAND = halcmd loadusr -Wn qtvcp_embed qtvcp -d -c qtvcp_embed -x {XID} -o size=400,400 -o rotincr=.2 -o camnumber=0 cam_align
Maussteuerung:
-
Linke Maus Einzelklick - Fadenkreuzrotation um einen Schritt erhöhen
-
Einfacher Mausklick mit der rechten Maustaste - Drehung des Fadenkreuzes um eine Stufe verringern
-
Einfacher Klick mit der mittleren Maustaste - zyklisch durch Rotationsschritte blättern
-
linke Maustaste gedrückt halten und scrollen - Kamerazoom scrollen
-
rechte Maustaste gedrückt halten und scrollen - Fadenkreuz-Drehwinkel scrollen
-
nur Mausbewegung - Scroll bestimmt Kreis-Durchmesser
-
Linker Maus-Doppelklick - Zoom zurücksetzen
-
Doppelklick mit der rechten Maustaste - Rotation zurücksetzen
-
Doppelklick mit der mittleren Maus - Kreisdurchmesser zurücksetzen
Um die oberen Schaltflächen zu verwenden, müssen Sie einen Befehl (oder eine Unterroutine) zuweisen. Dies könnte wie folgt aussehen:
[MDI_COMMAND_LIST] MDI_COMMAND_CAM_ALIGN1=G10 L20 P1 X0 Y0,Set XY\nOrigin MDI_COMMAND_CAM_ALIGN2=G0 X0 Y0,Go To\nOrigin
Dabei bezieht sich der erste Befehl auf die Schaltfläche "SET Ursprung" (engl. origin) und der zweite auf die Schaltfläche "GOTO Ursprung".
Beachten Sie, dass das Komma und der Text danach optional sind - sie überschreiben den Standardtext der Schaltfläche.
Diese Schaltflächen sind QtVCP-Aktionsschaltflächen und folgen diesen Regeln.
1.8. sim_panel
Kleines Bedienfeld, um Schnellauf Handsteuerungen für simulierte Konfigurationen zu simulieren.
Das Handsteuergerät (engl. kurz MPG), Auswahltasten und Steuertasten exportieren HAL-Pins, um sich mit linuxcnc zu verbinden.
Die Auswahl- und Kontrollgruppen-Boxen können durch die Option -o hide= verdeckt werden.
groupBoxControl und groupBoxSelection sind die Widget-Namen, die versteckt werden können.
Wenn Sie beide verbergen möchten, verwenden Sie eine Komma zwischen ihnen ohne Leerzeichen.
Die Option -a verhindert ein Verdecken des Panels durch andere Fenster.
loadusr qtvcp sim_panel
Hier laden wir das Panel ohne MPG-Auswahltasten und die immer-im-Vordergrund (engl. always-on-top)-Option.
loadusr qtvcp -a -o hide=groupBoxSelection sim_panel
1.9. tool_dialog
Manual tool change dialog that gives tool description.
loadusr -Wn tool_dialog qtvcp -o speak_on -o audio_on tool_dialog
Optionen:
-
-o notify_on` - _verwendet Desktop-Notify-Dialoge anstelle der QtVCP-eigenen Dialoge.
-
-o audio_on
- Ton beim Werkzeugwechsel abspielen -
-
o talk_on
- Sprach-Ankündigung des Werkzeugwechsels
2. vismach
3D Simulation Panels
Diese Tafeln sind vorgefertigte Simulationen gängiger Maschinentypen.
Diese können auch in andere Bildschirme wie AXIS oder GMOCCAPY eingebettet werden.
2.1. QtVCP vismach_mill_xyz
3D-OpenGL-Ansicht einer 3-Achsen-Fräsmaschine.
loadusr qtvcp vismach_mill_xyz
2.2. QtVCP vismach_router_atc
3D-OpenGL-Ansicht einer 3-Achsen-Fräsmaschine im Gantry-Bett-Stil.
Dieses spezielle Panel zeigt, wie man die Modellteile in der Handler-Datei definiert und verbindet, anstatt das vorgefertigte Modell aus der Vismach-Bibliothek von QtVCP zu importieren.
loadusr qtvcp vismach_router_atc
2.3. QtVCP vismach_scara
3D-OpenGL-Ansicht einer SCARA-basierten Fräsmaschine.
loadusr qtvcp vismach_scara
2.4. QtVCP vismach_millturn
3D OpenGL-Ansicht einer 3-Achsen-Fräsmaschine mit einer A-Achse/Spindel.
loadusr qtvcp vismach_millturn
2.5. QtVCP vismach_mill_5axis_gantry
3D-OpenGL-Ansicht einer 5-Achsen-Fräsmaschine in Gantry-Bauweise.
loadusr qtvcp vismach_mill_5axis_gantry
2.6. QtVCP vismach_fanuc_200f
3D openGL-Ansicht eines 6-Gelenk-Roboterarms.
loadusr qtvcp vismach_fanuc_200f
3. Benutzerdefinierte virtuelle Schalttafeln (engl. panels)
Sie können natürlich Ihr eigenes Panel erstellen und laden.
Wenn Sie eine UI-Datei mit dem Namen my_panel.ui
und eine HAL-Datei mit dem Namen my_panel.hal
erstellt haben, würden Sie diese dann von einem Terminal aus laden mit:
halrun -I -f my_panel.hal
# Echtzeitkomponenten laden loadrt threads loadrt classicladder_rt # Nicht-Echtzeit-Programme laden loadusr classicladder loadusr -Wn my_panel qtvcp my_panel.ui # <1> # Komponenten zum Thread hinzufügen addf classicladder.0.refresh thread1 # Pins verbinden net bit-input1 test_panel.checkbox_1 classicladder.0.in-00 net bit-hide test_panel.checkbox_4 classicladder.0.hide_gui net bit-output1 test_panel.led_1 classicladder.0.out-00 net s32-in1 test_panel.doublescale_1-s classicladder.0.s32in-00 # start thread start
-
In diesem Fall laden wir
qtvcp
mit-Wn
, das wartet, bis das Panel das Laden beendet hat, bevor es mit der Ausführung des nächsten HAL-Befehls fortfährt.
Damit soll gewährleistet werden, dass die vom Panel erstellten HAL-Pins tatsächlich fertig sind, falls sie im Rest der Datei verwendet werden.
4. Einbettung von QtVCP Virtual Control Panels in QtVCP-Bildschirme
QtVCP-Panels können in die meisten QtVCP-Bildschirme eingebettet werden und vermeiden Probleme wie z. B. Fokusübertragungen (engl. focus transferring), die bei nicht-nativen Einbettungen ein Problem darstellen können.
4.1. Befehle einbetten
Ein typischer Bildschirm wie QtDragon sucht in der INI-Datei unter der Überschrift [DISPLAY] nach Befehlen zum Einbetten eines Panels.
[DISPLAY] EMBED_TAB_NAME=Embedding demo EMBED_TAB_COMMAND=qtvcp simple_hal EMBED_TAB_LOCATION=tabWidget_utilities
- EMBED_TAB_NAME
-
ist normalerweise der Titel der Registerkarte.
- EMBED_TAB_LOCATION
-
ist spezifisch für den Bildschirm und gibt das tabWidget oder stackedWidget an, in das eingebettet werden soll.
- EMBED_TAB_COMMAND
-
is the command used to invoke loading of the panel. For native embedded panels the first word will always be qtvcp, the last will be the panel name to load. You can also pass options to the panel with -o switches in the command line between qtvcp and the panel name. The panel will follow the debugging mode setting of the main screen.
4.2. Pfad zu mitgelieferten Panels
Es gibt Panels, die in LinuxCNC enthalten sind. Um eine Liste zu sehen, öffnen Sie ein Terminal, geben Sie "qtvcp" ein und drücken Sie die Eingabetaste.
Sie erhalten einen Hilfeausdruck und eine Liste der eingebauten Bildschirme und Bedienfelder.
Wählen Sie einen der Namen aus der Liste und fügen Sie ihn dem COMMAND-Eintrag nach qtvcp hinzu.
Der Suchpfad für die eingebauten Bedienfelder lautet share/qtvcp/panels/PANELNAME.
Run-In-Place und installierte Versionen von LinuxCNC haben diese an unterschiedlichen Stellen im System.
4.3. Pfad zu benutzerdefinierten Bedienfeldern
Auch benutzerdefinierte Panels können eingebettet werden - entweder ein modifiziertes eingebautes Panel oder ein neues vom Benutzer erstelltes.
Beim Laden von Panels sucht QtVCP im Pfad des Konfigurationsordners nach qtvcp/panels/PANELNAME/PANELNAME.ui.
PANNELNAME' ist ein beliebiger gültiger String ohne Leerzeichen. Wenn dort kein Pfad gefunden wird, dann wird im eingebauten Dateipfad gesucht.
QtVCP wird den gleichen Prozess für die optionale Handler-Datei durchführen: qtvcp/panels/PANELNAME/PANELNAME_handler.py
4.4. Tipps zur Handler-Programmierung
In einer Screen-Handler-Datei ist die Referenz für das Fenster "self.w".
In QtVCP-Panels bezieht sich diese Referenz auf das Fenster des Panels.
Um das Hauptfenster zu referenzieren, verwenden Sie self.w.MAIN. Wenn Ihr Panel unabhängig und eingebettet laufen soll, müssen Sie Fehler abfangen, die durch die Referenzierung von nicht verfügbaren Objekten entstehen. (Bemerkung: Objekte des Hauptbildschirms sind in einem unabhängigen Panel nicht verfügbar.)
Dies würde z.B. die Einstellungsdatei für den Panel verwenden, sofern eine solche vorhanden ist.
try: belt_en = self.w.PREFS_.getpref('Front_Belt_enabled', 1, int, 'SPINDLE_EXTRAS') except: belt_en = 1
Dabei wird die Einstellungsdatei für den Hauptbildschirm verwendet, sofern eine solche vorhanden ist.
try: belt_en = self.w.MAIN.PREFS_.getpref('Front_Belt_enabled', 1, int, 'SPINDLE_EXTRAS') except: belt_en = 1
4.5. Designer-Widget-Tipps
Bei Verwendung der Python-Befehlsoption in Action-Button-Widgets eines eingebetteten Panels:
-
INSTANCE
-
bezieht sich auf das Panel-Fenster, z. B.
INSTANCE.my_panel_handler_function_call(True)
- MAIN_INSTANCE
-
bezieht sich auf das Hauptbildschirmfenster (engl. main screen window). Z.B.:
MAIN_INSTANCE.my_main_screen_handler_function_call(True)
Wenn das Panel nicht eingebettet ist, beziehen sich beide auf das Panel-Fenster.
4.6. Handler Patching - Subclassing Builtin Panels
We can have QtVCP load a subclassed version of the standard handler file. in that file we can manipulate the original functions or add new ones.
Subclassing just means our handler file first loads the original handler file and adds our new code on top of it - so a patch of changes.
This is useful for changing/adding behaviour while still retaining standard handler updates from LinuxCNC repositories.
You may still need to use the handler copy dialog to copy the original handler file to decide how to patch it.
Es sollte einen Ordner im Konfigurationsordner geben; für Panel: benannt als <KONFIGURATIONSORDNER>/qtvcp/panels/<PANEL NAME>/
Fügen Sie dort die Handler-Patch-Datei hinzu, benannt als <ORIGINAL PANEL NAME>_handler.py,
demnach würde für QtDragon die Datei cam_align_handler.py genannt werden.
Hier ist ein Beispiel-Stylesheet zum Ändern der Farbe des Kreises in cam_align:
import sys import os import importlib from PyQt5.QtCore import Qt from qtvcp.core import Path PATH = Path() # erhalte Referenz zu original Handler Datei, um sie zu spezialisieren (eine Unterklasse zu bilden, engl. to subclass) sys.path.insert(0, PATH.PANELDIR) panel = os.path.splitext(os.path.basename(os.path.basename(__file__)))[0] base = panel.replace('_handler','') module = "{}.{}".format(base,panel) mod = importlib.import_module(module, PATH.PANELDIR) sys.path.remove(PATH.PANELDIR) HandlerClass = mod.HandlerClass # return our subclassed handler object to Qtvcp def get_handlers(halcomp, widgets, paths): return [UserHandlerClass(halcomp, widgets, paths)] # spezialisiert (engl. subclassed) von HandlerClass die zuvor importiert wurde class UserHandlerClass(HandlerClass): print('Custom subclassed panel handler loaded\n') def initialized__(self): # call original handler initialized function super().initialized__() # hinzufügen der eigenen Anpassung self.w.camview.circle_color = Qt.green