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
QtVCP Kopierdialog - Bildschirm, Panel oder Vismach Code Copy Panel
Abbildung 1. QtVCP copy Dialog - Bildschirm, VCP Panel oder QtVismach Code Kopieren Panel

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.

QtVCP spindle_belts Panel - Spindelriemen VCP

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
QtVCP test_dial Panel - Testwahl VCP
Abbildung 2. QtVCP test_dial Panel - Testwahl VCP

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.

QtVCP test_button - Test Button VCP
Abbildung 3. QtVCP test_button - Test Button VCP

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.

QtVCP test_dial Panel - Test LED VCP
Abbildung 4. QtVCP test_dial Panel - Test LED VCP

1.6. test_panel

Sammlung nützlicher Widgets zum Testen von HAL-Komponenten, einschließlich Sprache des LED-Zustands.

loadusr qtvcp test_panel
QtVCP test_panel - Prüfpanel für HAL-Komponenten
Abbildung 5. QtVCP test_panel- - HAL Komponenten-Prüffeld

1.7. cam_align

Ein Kamera-Display-Widget für die Rotationsausrichtung.

QtVCP `cam_align` Panel zur Kamera-basierten Ausrichtung
Abbildung 6. QtVCP cam_align Panel zur Kamera-basierten Ausrichtung
Anwendung

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.
QtVCP Optionen
  • -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

Cam_align Options
  • 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
QtVCP sim_panel - Simuliertes Bedienfeld für Bildschirmtests
Abbildung 7. QtVCP sim_panel - Simuliertes Bedienfeld für Bildschirmtests.

1.9. tool_dialog

Manueller Werkzeugwechsel-Dialog, der eine Werkzeugbeschreibung enthält.

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

QtVCP `tool_dialog` - Dialog zum manuellen Werkzeugwechsel
Abbildung 8. QtVCP tool_dialog - Dialog zum manuellen Werkzeugwechsel

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
QtVCP vismach_mill_xyz - 3-Achsen-Fräse 3D-Ansichts-Panel
Abbildung 9. QtVCP vismach_mill_xyz - 3-Achsen-Fräse 3D-Ansichtspanel

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
QtVCP vismach_router_atc - 3-Achsen Portalfräsen 3D-Ansichtspanel
Abbildung 10. QtVCP vismach_router_atc - 3-Achsen Portalfräsen 3D-Ansichtspanel

2.3. QtVCP vismach_scara

3D-OpenGL-Ansicht einer SCARA-basierten Fräsmaschine.

loadusr qtvcp vismach_scara
QtVCP vismach_scara - SCARA-Fräse 3D-Ansichtspanel
Abbildung 11. QtVCP vismach_scara - SCARA Fräse 3D-Ansichtsfenster

2.4. QtVCP vismach_millturn

3D OpenGL-Ansicht einer 3-Achsen-Fräsmaschine mit einer A-Achse/Spindel.

loadusr qtvcp vismach_millturn
QtVCP `vismach_millturn` - 4 Achsen Drehzentrum 3D Ansichtspanel
Abbildung 12. QtVCP vismach_millturn - 4 Achsen Drehzentrum 3D Ansichtspanel

2.5. QtVCP vismach_mill_5axis_gantry

3D-OpenGL-Ansicht einer 5-Achsen-Fräsmaschine in Gantry-Bauweise.

loadusr qtvcp vismach_mill_5axis_gantry
QtVCP `vismach_mill_5axis_gantry` - 5-Achsen Gantry Fräse 3D-Ansichtspanel
Abbildung 13. QtVCP vismach_mill_5axis_gantry - 5-Achsen Gantry Mill 3D-Ansichtspanel

2.6. QtVCP vismach_fanuc_200f

3D openGL-Ansicht eines 6-Gelenk-Roboterarms.

loadusr qtvcp vismach_fanuc_200f
QtVCP vismach_fanuc_200f - 6-Gelenk-Roboterarm
Abbildung 14. QtVCP vismach_fanuc_200f - 6-Gelenk-Roboterarm

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
Beispiel einer HAL-Datei, die ein QtVCP-Panel lädt
# 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
  1. 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