Aktivieren einer benutzerdefinierten USB-Schnittstelle für einen 3D-Drucker
Die in diesem Thema beschriebene Architektur ermöglicht die Unterstützung von benutzerdefinierten USB-Schnittstellen-3D-Druckern in den Druckökosystemen v3 und v4. Ein Standardportmonitor, 3dmon.dll, leitet 3D-Druckauftragsbefehle an einen Windows 3DPrintService weiter, der mit lokalen Dienstanmeldeinformationen ausgeführt wird. Der Dienst lädt und kommuniziert mit einer Partner-DLL, um die benutzerdefinierten Befehle auszuführen, die für einen 3D-Druckauftrag erforderlich sind. Die Partner-DLL sowie die 3dmon.dll und 3dprintservice.exe verteilbaren Dateien werden vom USB-Treiberpaket des Geräts installiert. Die Partner-DLL muss eine Reihe von Funktionen implementieren und exportieren, um mit dem 3DPrintService zu kommunizieren. Der Rest der erforderlichen Funktionalität für die Interaktion mit dem Druckspoolerdienst wird in 3dmon.dll implementiert.
Hinweis
Diese Architektur erfordert die Partner-DLL für mehrere Instanzen, threadsicher.
Architektur-Entscheidungen
Der 3DPrintService-Windows-Dienst wird verwendet, um bestimmte definierte APIs in vom Partner bereitgestellten DLLs während eines Druckworkflows zu laden und aufzurufen. Diese APIs ermöglichen die Kommunikation mit dem Drucker.
Die KMDF-USB-Filtertreiberpakete werden unter Windows Update für die Installation über PnP für einen unterstützten 3D-Drucker veröffentlicht. Der KMDF-Treiber installiert Partnersoftware und erstellt einen 3D-Druckergeräteknoten. Der 3D-Druckergeräteknoten wird mit einem partnerveröffentten v4-Drucktreiber aus Windows Update installiert.
Verpackungsentscheidungen
Binärdateien und Binäre Abhängigkeiten
Die Architektur verwendet einen Treiber, der vom Hardwarehersteller unter Windows Update veröffentlicht wird. Dieser Treiber enthält die folgenden von Microsoft bereitgestellten weiterverteilbaren Binärdateien und deren Abhängigkeiten:
3dmon.dll
3dprintservice.exe
ms3dprintusb.sys
Kernelmodus-USB-Filtertreiber
Der KMDF-Treiber wird vom Partner veröffentlicht und besteht aus Komponenten, die im folgenden Diagramm dargestellt sind. Dies entspricht dem Gerät mit einer Hardware-ID (in der Regel ein VID & PID). Der Treiber erstellt einen 3D-Druckergeräteknoten bei der Installation, der die Installation der Druckwarteschlange und der Datenschnitttreiber auslöst. Der Partner stellt v4-Druckertreiber für den erstellten 3D-Druckergeräteknoten bereit.
MS3DPrintUSB.sys
Der Kernelmodusgerätetreiber, der den 3D-Druckerentwicklungsknoten unter "Enum\3DPrint" erstellt. Sie wird vom PnP-Subsystem über eine direkte Übereinstimmung der VID & PID basierend auf dem von Winusb.sys erstellten Geräteknoten aufgerufen. Die Inf-Treiberdatei richtet die benutzerdefinierte DLL ein, die zum Festlegen des 3DPrintService verwendet wird (sofern noch nicht auf dem System installiert).
3dmon.dll
3DMon.dll ist ein von Microsoft veröffentlichter Portmonitor, der vom Spooler aufgerufen wird, um mit dem 3D-Drucker zu kommunizieren.
3dprintservice.exe
3DPrintService.exe ist eine von Microsoft veröffentlichte Binärdatei, die während der Treibereinrichtung als Windows-Dienst installiert ist. 3DMon kommuniziert mit diesem Dienst, um Vorgänge wie Drucken, bidirektional usw. mit dem 3D-Drucker auszuführen.
Partnerimpl.dll
Partnerimp.dll ist die Implementierung der veröffentlichten Microsoft-Schnittstelle des Partners. Die DLL kommuniziert mit dem Gerät des Partners mithilfe ihrer Protokolle. 3DPrintService.exe lädt diese DLL zur Laufzeit, um die Vorgänge des 3D-Druckergeräts zu steuern.
Druckerverwendungssequenz
Der Spooler kommuniziert mit 3dmon.dll, die Befehle an den Windows-Dienst 3DPrintService sendet.
Die 3DPrintService.exe wird mit den Kontoanmeldeinformationen von NetworkService ausgeführt.
Der Spooler sendet über 3dmon.dll Befehle an 3DPrintService, wenn der 3D-Drucker verwendet wird.
Der 3DPrintService verarbeitet Befehle und ruft APIs zur Laufzeit auf vom Partner bereitgestellten Implementierungs-DLLs auf.
Der 3DPrintService übergibt die Antworten von vom Partner bereitgestellten DLLs zurück an den Spooler.
Schnittstellen und Interaktionen
Die Partner-API muss die folgenden API-Funktionen exportieren:
HRESULT Install([in] LPCWSTR args)
Diese API ist optional und kann vom Hersteller verwendet werden, um benutzerdefinierte Software oder Registrierung für ihr Gerät zu installieren. Zum Beispiel die Installation der Modellierung, die im Treiberpaket für das Gerät enthalten ist. Diese API wird mit SYSTEM-Anmeldeinformationen aufgerufen, um die Installation zu aktivieren.
DWORD PrintApiSupported()
Diese API wird von den Drittanbietern verwendet, um die Version der unterstützten 3D-Druckdienst-API anzugeben. Die folgenden APIs sind mit Version 1 des 3DPrintService kompatibel.
HRESULT InitializePrint(LPCWSTR pPrinterName, LPCWSTR pPortName, DWORD dwJobId, LPVOID* ppPartnerData)
Diese API wird vor dem Starten der Initialisierung des Druckers vor einem Druckereignis aufgerufen. Der Drucker kann auftragsspezifischen Zustand im ppPartnerData-Parameter speichern. Dieser Aufruf ist analog zu einem StartDocPort-Aufruf.
jobId – Auftrags-ID, die zum Nachverfolgen des Auftrags verwendet wird
portName – Portname für den 3D-Drucker
printerName – Name des Druckers, an den dieser Druckauftrag gesendet wird
ppPartnerData - Zeiger auf Zeiger, der zum Speichern von auftragsspezifischen Daten verwendet werden kann
HRESULT PrintFile([in] DWORD jobId, [in] LPWSTR portName, [in] LPWSTR printerName, [in] LPWSTR pathToRenderedFile,[in]LPVOID* ppPartnerData)
Diese API wird von Drittanbietern verwendet, um das Dokument auf ihrem Drucker zu drucken.
jobId – Auftrags-ID, die zum Nachverfolgen des Auftrags verwendet wird
portName – Portname für den 3D-Drucker
printerName – Name des Druckers, an den den Druckauftrag gesendet wird
pathToRenderedFile – UNC-Pfad zum Speicherort der spoolierten Datei, nachdem das Rendern ausgeführt wurde. Der Drittanbieter verarbeitet die Datei von diesem Speicherort aus und druckt das Dokument auf ihrem Gerät.
ppPartnerData – Zeiger auf Zeiger, der während des InitializePrint-API-Aufrufs zum Speichern von partnerspezifischen Daten ausgegeben wurde.
printerName kann über den Portnamen aus der Registrierung abgerufen werden. Hersteller von Drittanbietern können den Portnamen möglicherweise nicht für die Kommunikation mit ihrem Gerät verwenden. Der Druckername ist auf einem Windows-Computer eindeutig, und seine Software kann ermitteln, auf welchem Drucker der Auftrag gedruckt werden soll. Alle drucker, die auf einem Computer aktiv sind, finden Sie im folgenden Registrierungsschlüssel:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers
HRESULT Query(_In_ LPCWSTR command, _In_ LPCWSTR commandData, _Out_ LPWSTR resultBuffer, _Out_ resultBufferSize, _In_ LPVOID* ppPartnerData)
command - Zeichenfolgenbefehl, der als Abfrage gesendet wird
commandData - Befehlsargumente (optional)
resultBuffer - Ergebnis des Aufrufs von Abfrageargumenten>
resultBufferSize – Größe der Ergebnispufferzeichenfolge
ppPartnerData - Zeiger auf Zeiger für die aktuelle Partner-DLL-Instanz
Der 3Dprint-Dienst ruft die Partner-DLL auf, um die Größe des Puffers abzurufen, der für den Befehl zugewiesen werden soll.
Nach dem Zuweisen des Speichers zum Speichern der Antwortzeichenfolge wird die DLL erneut aufgerufen, um das tatsächliche Ergebnis zu erhalten.
Die DLL kann die Instanzdaten eines vorherigen IntializePrint()- Aufrufs verwenden, um mit dem Gerät zu kommunizieren, ohne bei jedem Aufruf der Query() -Funktion einen neuen Kommunikationskanal zu öffnen.
Diese API wird verwendet, um mit dem Drucker zu kommunizieren, um Informationen zur Gerätekonfiguration, zum Druckstatus oder zum Benachrichtigen der Partner-DLL über Geräteabscheidungsereignisse zu erhalten.
Die folgenden Befehle müssen vom Hersteller unterstützt werden:
Get-Help | CommandData | Output | Kommentare |
---|---|---|---|
\\Printer.3DPrint:JobStatus | Auftragsbeginn = {"Status": "ok"}, Status, der für den Abschluss {"Status" verwendet werden soll: "Abgeschlossen"} | Der Spooler zeigt jeden zurückgegebenen Wert in der Druckwarteschlangen-Benutzeroberfläche an. Auf diese Weise kann das Gerät relevante Informationen während eines Drucks auf der Druckwarteschlangen-UI anzeigen. Das Gerät kann hier eine beliebige Zeichenfolge (z. B. "Beschäftigt" oder "33 % abgeschlossen") zurückgeben, und dies wird im Status des Druckwarteschlangenauftrags angezeigt. | |
\\Printer.3DPrint:JobCancel | {"Status": "Completed"} | Der Spooler ruft diesen Befehl auf, wenn ein Benutzer einen Druck abbricht. Die Partner-DLL gibt diesen Wert zurück, wenn der Abbruch erfolgreich war und die Handles und Threads geschlossen wurden. | |
\\Printer.Capabilities:Data | XML-Zeichenfolge, die dem PrintDeviceCapabilites (PDC)-Schema entspricht. | Die PDC-Abfrage wird von Apps aufgerufen, die weitere Informationen zum Drucker erhalten möchten. Die Daten werden verwendet, um die Funktionen des Geräts zu beschreiben und die Datenschnitteinstellungen einzuschließen, wenn der Treiber auf dem Microsoft-Datenschnitt basiert. Ein PDC-Beispiel sehen Sie unten. | |
\\Printer.3DPrint:Disconnect | {"Status": "OK"} | Diese Abfrage wird ausgelöst, wenn eine PnP-Verbindung des Druckergeräts besteht. Partner können alle erforderlichen Aktionen ausführen, z. B. alle geöffneten Handles schließen, um eine ordnungsgemäße erneute Verbindung zu ermöglichen. | |
\\Printer.3DPrint:Connect | {"Status":"OK"} | Diese Abfrage wird ausgelöst, wenn eine PnP-Verbindung des Druckergeräts besteht. Partner können alle erforderlichen Maßnahmen ergreifen. |
XML der Druckgerätefunktionen
Die folgenden XML-Druckgerätefunktionen können als Beispiel verwendet werden:
<?xml version="1.0"?>
<PrintDeviceCapabilities
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="https://www.w3.org/2001/XMLSchema"
xmlns:xml="https://www.w3.org/XML/1998/namespace"
xmlns:psk="https://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords"
xmlns:psk3d="https://schemas.microsoft.com/3dmanufacturing/2013/01/pskeywords3d"
xmlns:psk3dx="https://schemas.microsoft.com/3dmanufacturing/2014/11/pskeywords3dextended"
xmlns:pskv="https://schemas.microsoft.com/3dmanufacturing/2014/11/pskeywordsvendor"
xmlns:psf="https://schemas.microsoft.com/windows/2003/08/printing/printschemaframework"
xmlns:psf2="https://schemas.microsoft.com/windows/2013/12/printing/printschemaframework2"
xmlns="https://schemas.microsoft.com/windows/2013/12/printing/printschemaframework2"
version="2">
<CapabilitiesChangeID xsi:type="xsd:string">{9F58AF07-DCB6-4865-8CA3-A52EA5DCB05F}</CapabilitiesChangeID>
<psk3d:Job3DOutputArea psf2:psftype="Property">
<psk3d:Job3DOutputAreaWidth>150001</psk3d:Job3DOutputAreaWidth>
<psk3d:Job3DOutputAreaDepth>150001</psk3d:Job3DOutputAreaDepth>
<psk3d:Job3DOutputAreaHeight>150001</psk3d:Job3DOutputAreaHeight>
</psk3d:Job3DOutputArea>
<psk3d:Job3DMaterials psf2:psftype="Property">
<psk3dx:MaterialPLA>
<psk:DisplayName>PLA</psk:DisplayName>
<psk3d:Job3DMaterialType>psk3d:PLA</psk3d:Job3DMaterialType>
<psk3d:MaterialColor>#FFFFFFFF</psk3d:MaterialColor>
<psk3dx:platformtemperature>0</psk3dx:platformtemperature>
<psk3dx:filamentdiameter>1750</psk3dx:filamentdiameter>
<psk3dx:filamentcalibrationoverride>1.0</psk3dx:filamentcalibrationoverride>
<psk3dx:extrudertemperature>207</psk3dx:extrudertemperature>
<psk3dx:SpeedFactor>1.0</psk3dx:SpeedFactor>
<psk3dx:SetupCommands>
<!-- Executed during pre-commands: nozzle pre-heating, priming, etc -->
<psk3dx:command>M104 S207 T1</psk3dx:command>
<psk3dx:command>M140 S50</psk3dx:command>
</psk3dx:SetupCommands>
<psk3dx:SelectCommands>
<!-- Executed during printing: T0/T1 selection, nozzle wiping sequence,turn fan on/off/gradual, retract the material, temperature, etc-->
<psk3dx:command>; PLA on</psk3dx:command>
<psk3dx:command>M108 T1</psk3dx:command>
</psk3dx:SelectCommands>
<psk3dx:DeselectCommands>
<!-- Executed during printing: retract the material, park the nozzle, reduce temperature, etc -->
<psk3dx:command>; PLA off</psk3dx:command>
</psk3dx:DeselectCommands>
</psk3dx:MaterialPLA>
</psk3d:Job3DMaterials>
<psk3dx:customStatus>Slicing</psk3dx:customStatus>
<psk3dx:userprompt>Confirm the 3D printer is calibrated and ready for the next print</psk3dx:userprompt>
<!— Additional Slicer settings follow (optional) -->
</PrintDeviceCapabilities>
Bei 3D-Druckern, die keine Anzeige und Schaltflächen an Bord haben, damit der Benutzer am Anfang des Drucks mit dem Gerät interagieren kann, geben wir eine PDC-XML mit einer geeigneten Benutzeraufforderungsmeldung zurück, wie oben in psdk3dx:userPrompt dargestellt. Dadurch wird verhindert, dass ein neuer Druck über einem vorhandenen Druck gestartet wird. Die benutzerdefinierte Statusmeldung <psk3dx:customStatus> wird verwendet, um während des Slicings eine beliebige Nachricht anzuzeigen.
HRESULT Cleanup(LPCWSTR pPrinterName, LPCWSTR pPortName, DWORD dwJobId, LPVOID* ppPartnerData)
dwJobId – Auftrags-ID zum Nachverfolgen des Auftrags im Spooler
pPortName – Portname für den 3D-Drucker
pPrinterName – Name des Druckers, an den dieser Druckauftrag gesendet wird
ppPartnerData – Zeiger auf Zeiger, der die Auftragsspezifische Dateneinrichtung während eines Aufrufs der InitializePrint-API enthält
Die Bereinigung wird nach erfolgreichem Abschluss eines Druckauftrags oder nach Abschluss einer Abbruchabfrage für einen Druckauftrag aufgerufen. Die Partner-DLL bietet die Möglichkeit, Ressourcen zu bereinigen, die für diesen Druck initialisiert wurden.
HRESULT UnInstall([in]LPCWSTR args)
Diese API wird beim Deinstallieren des 3D-Druckergeräts aufgerufen und stellt einen Mechanismus zum Deinstallieren von Software bereit, die sie möglicherweise installiert haben.