Aktivieren einer benutzerdefinierten USB-Schnittstelle für einen 3D-Drucker

Die in diesem Thema beschriebene Architektur ermöglicht die Unterstützung für benutzerdefinierte USB-Schnittstellen-3D-Drucker 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 redistributables werden vom USB-Treiberpaket des Geräts installiert. Die Partner-DLL muss einen Satz 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.dllimplementiert.

Hinweis

Diese Architektur erfordert, dass die Partner-DLL mehrere instance, threadsicher.

Architekturentscheidungen

Der Windows-Dienst 3DPrintService 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-Filter-Treiberpakete werden auf Windows Update für die Installation über PnP für einen unterstützten 3D-Drucker veröffentlicht. Der KMDF-Treiber installiert Die Partnersoftware und erstellt einen 3D-Druckergeräteknoten. Der 3D-Druckergeräteknoten wird mithilfe eines vom Partner veröffentlichten v4-Drucktreibers von Windows Update installiert.

Verpackungsentscheidungen

Binärdateien und Binäre Abhängigkeiten

Die Architektur verwendet einen Treiber, der vom Hardwarehersteller auf Windows Update veröffentlicht wurde. Dieser Treiber enthält die folgenden von Microsoft bereitgestellten verteilbaren Binärdateien und deren Abhängigkeiten:

  • 3dmon.dll

  • 3dprintservice.exe

  • ms3dprintusb.sys

Usb-Filtertreiber im Kernelmodus

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 eine VID-& PID). Der Treiber erstellt bei der Installation einen 3D-Druckergeräteknoten, der die Installation der Druckwarteschlange und der Slicertreiber auslöst. Der Partner stellt v4-Druckertreiber für den erstellten 3D-Druckergeräteknoten bereit.

kmdf USB-Filtertreiber.

MS3DPrintUSB.sys

Der Kernelmodus-Gerätetreiber, der den 3D-Druckerentwicklungsknoten unter Enum\3DPrint erstellt. Es wird vom PnP-Subsystem über eine direkte Übereinstimmung der VID-& PID basierend auf dem von Winusb.sys erstellten Geräteknoten aufgerufen. Die INF-Datei des Treibers richtet die benutzerdefinierte DLL ein, die zum Festlegen des 3DPrintService verwendet wird (sofern nicht bereits auf dem System installiert).

3dmon.dll

3DMon.dll ist eine von Microsoft veröffentlichte Redistributable-Binärdatei, die 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 wird. 3DMon kommuniziert mit diesem Dienst, um Vorgänge wie Drucken, Bidi usw. mit dem 3D-Drucker auszuführen.

Partnerimpl.dll

Partnerimp.dll ist die Implementierung der veröffentlichten Microsoft-Schnittstelle durch den Partner. Die DLL kommuniziert mit dem Gerät des Partners unter Verwendung der entsprechenden Protokolle. 3DPrintService.exe lädt diese DLL zur Laufzeit, um die Vorgänge des 3D-Druckergeräts zu steuern.

Diagramm, das den Gerätekommunikationsfluss für 3D-Druckergerätevorgänge zeigt.

Sequenz der Druckernutzung

  • 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 für vom Partner bereitgestellte Implementierungs-DLLs auf.

  • Der 3DPrintService gibt die Antworten von vom Partner bereitgestellten DLLs an den Spooler zurück.

Schnittstellen und Interaktionen

Die Partner-DLL muss die folgenden API-Funktionen exportieren:

HRESULT Install([in] LPCWSTR-Argumente)

Diese API ist optional und kann vom Hersteller verwendet werden, um benutzerdefinierte Software oder Registrierung für sein Gerät zu installieren. Beispiel: 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 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 aufgerufen, bevor ein Druckereignis mit der Initialisierung des Druckers beginnt. Der Drucker kann den auftragsspezifischen Zustand im ppPartnerData-Parameter speichern. Dieser Aufruf entspricht 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 auftragsspezifischer 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 der Druckauftrag gesendet wird

  • pathToRenderedFile : UNC-Pfad zum Speicherort der Spooldatei nach dem Rendern. Der Drittanbieter verarbeitet die Datei von diesem Speicherort aus und druckt das Dokument auf dem Gerät.

  • ppPartnerData : Zeiger auf den Zeiger, der zum Speichern der partnerspezifischen Dateneinrichtung während des InitializePrint-API-Aufrufs ausgegeben wurde.

  • printerName kann mithilfe des Portnamens von der Registrierung abgerufen werden. Drittanbieter 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 identifizieren, auf welchem Drucker der Auftrag gedruckt werden soll. Alle auf einem Computer aktiven Drucker finden Sie unter dem folgenden Registrierungsschlüssel:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers

3D-Druckerregistrierung.

HRESULT Query(_In_ LPCWSTR-Befehl, _In_ LPCWSTR commandData, _Out_ LPWSTR resultBuffer, _Out_ resultBufferSize, , _In_ LPVOID* ppPartnerData)

  • Befehl : Zeichenfolgenbefehl, der als Abfrage gesendet wird

  • commandData : Befehlsargumente (optional)

  • resultBuffer : Ergebnis des Aufrufs von Abfrageargumenten>

  • resultBufferSize : Größe der Ergebnispufferzeichenfolge

  • ppPartnerData : Zeiger auf den Zeiger für die aktuelle Partner-DLL-instance

Der 3Dprint-Dienst ruft die Partner-DLL auf, um die Größe des Puffers abzurufen, der für den Befehl zugewiesen werden soll.

Nach der Zuweisung von Arbeitsspeicher für die Antwortzeichenfolge wird die DLL erneut aufgerufen, um das tatsächliche Ergebnis zu erhalten.

Die DLL kann die instance Daten aus einem vorherigen IntializePrint()-Aufruf 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 abzurufen, den Druckstatus zu erhalten oder die Partner-DLL über Geräteentkoppelungsereignisse zu benachrichtigen.

Die folgenden Befehle müssen vom Hersteller unterstützt werden:

Get-Help CommandData Ausgabe Kommentare
\\Printer.3DPrint:JobStatus Auftrag gestartet = {"Status": "ok"}, Status zur Verwendung bei Abschluss {"Status": "Abgeschlossen"} Der Spooler zeigt alle zurückgegebenen Werte auf der Benutzeroberfläche der Druckwarteschlange an. Dadurch kann das Gerät relevante Informationen während eines Drucks auf der Benutzeroberfläche der Druckwarteschlange anzeigen. Das Gerät kann hier eine beliebige Zeichenfolge zurückgeben (z. B. "Busy" oder "33% complete"), die wortwörtlich im Druckwarteschlangenauftrag status angezeigt wird.
\\Printer.3DPrint:JobCancel {"Status": "Abgeschlossen"} 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 PDC-Schema (PrintDeviceCapabilites) 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 können die Slicereinstellungen enthalten, wenn der Treiber den Microsoft-Slicer verwendet. Eine Beispiel-PDC finden Sie unten.
\\Printer.3DPrint:Trennen {"Status": "OK"} Diese Abfrage wird ausgelöst, wenn eine PnP-Verbindung des Druckergeräts besteht. Partner können alle erforderlichen Aktionen durchführen, z. B. alle geöffneten Handles schließen, um eine ordnungsgemäße Wiederherstellung der 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.

Als Beispiel kann die folgende Xml-Datei für Die Funktionen des Druckgeräts 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 ohne Onboard-Anzeige und Schaltflächen, mit denen der Benutzer zu Beginn des Drucks mit dem Gerät interagieren kann, wird empfohlen, eine PDC-XML-Datei mit einer geeigneten Benutzereingabeaufforderung zurückzugeben, wie oben in psdk3dx:userPrompt gezeigt. Dadurch wird verhindert, dass ein neuer Druck über einem vorhandenen druck gestartet wird. Die benutzerdefinierte status Nachricht <psk3dx:customStatus> wird verwendet, um während des Schneidens jede Nachricht anzuzeigen.

HRESULT Cleanup(LPCWSTR pPrinterName, LPCWSTR pPortName, DWORD dwJobId, LPVOID* ppPartnerData)

  • dwJobId : Auftrags-ID, die zum Nachverfolgen des Auftrags im Spooler verwendet wird

  • pPortName : Portname für den 3D-Drucker

  • pPrinterName : Name des Druckers, an den dieser Druckauftrag gesendet wird

  • ppPartnerData : Zeiger auf den Zeiger, der die auftragsspezifische Dateneinrichtung während eines InitializePrint-API-Aufrufs enthält

Die Bereinigung wird beim erfolgreichen Abschluss eines Druckauftrags oder nach Abschluss einer Abbruchabfrage für einen Druckauftrag aufgerufen. Sie bietet der Partner-DLL die Möglichkeit, Ressourcen zu bereinigen, die für diesen Druck initialisiert wurden.

HRESULT UnInstall([in]LPCWSTR-Argumente)

Diese API wird beim Deinstallieren des 3D-Druckergeräts aufgerufen und bietet dem Hersteller einen Mechanismus zum Deinstallieren von Möglicherweise installierter Software.