Abilitare un'interfaccia USB personalizzata per una stampante 3D

L'architettura descritta in questo argomento consente il supporto per stampanti 3D dell'interfaccia USB personalizzate negli ecosistemi di stampa v3 e v4. Un monitoraggio delle porte standard ,3dmon.dll, inoltra i comandi dei processi di stampa 3D a un Windows 3DPrintService in esecuzione con le credenziali del servizio locale. Il servizio carica e comunica con una DLL partner per eseguire i comandi personalizzati necessari per un processo di stampa 3D. La DLL partner, nonché la 3dmon.dll e 3dprintservice.exe ridistribuibili, vengono installate dal pacchetto driver USB del dispositivo. La DLL partner deve implementare ed esportare un set di funzioni per comunicare con 3DPrintService. Il resto delle funzionalità necessarie per interagire con il servizio spooler di stampa viene implementato in 3dmon.dll.

Nota

Questa architettura richiede che la DLL partner sia multiistanza e thread-safe.

Decisioni relative all'architettura

Il servizio Windows 3DPrintService viene usato per caricare e richiamare API definite specifiche nelle DLL fornite dai partner durante un flusso di lavoro di stampa. Queste API consentiranno la comunicazione con la stampante.

I pacchetti driver filtro USB KMDF vengono pubblicati in Windows Update per l'installazione tramite PnP per una stampante 3D supportata. Il driver KMDF installa il software partner e crea un nodo del dispositivo della stampante 3D. Il nodo del dispositivo della stampante 3D viene installato usando un driver di stampa v4 pubblicato dal partner da Windows Update.

Decisioni relative ai pacchetti

File binari e dipendenze binarie

L'architettura usa un driver pubblicato dal produttore dell'hardware in Windows Update. Questo driver include i file binari ridistribuibili forniti da Microsoft e le relative dipendenze:

  • 3dmon.dll

  • 3dprintservice.exe

  • ms3dprintusb.sys

Driver filtro USB in modalità kernel

Il driver KMDF viene pubblicato dal partner ed è costituito da componenti illustrati nel diagramma seguente. Corrisponde al dispositivo con un ID hardware (in genere un VID & PID). Il driver crea un nodo del dispositivo della stampante 3D durante l'installazione che attiva l'installazione della coda di stampa e dei driver del filtro dei dati. Il partner fornisce driver della stampante v4 per il nodo del dispositivo della stampante 3D creato.

driver filtro USB kmdf.

MS3DPrintUSB.sys

Driver del dispositivo in modalità kernel che crea il nodo di sviluppo della stampante 3D in Enum\3DPrint. Viene richiamato dal sottosistema PnP tramite una corrispondenza diretta del VID & PID in base al nodo del dispositivo creato da Winusb.sys. Il file con estensione inf del driver configura la DLL personalizzata usata per impostare 3DPrintService (se non è già installato nel sistema).

3dmon.dll

3DMon.dll è un file binario ridistribuibile di monitoraggio delle porte pubblicato da Microsoft richiamato dallo spooler per comunicare con la stampante 3D.

3dprintservice.exe

3DPrintService.exe è un file binario pubblicato da Microsoft installato come servizio Windows durante l'installazione del driver. 3DMon comunica con questo servizio per eseguire operazioni come stampa, bidi e così via con la stampante 3D.

Partnerimpl.dll

Partnerimp.dll è l'implementazione del partner dell'interfaccia Microsoft pubblicata. La DLL comunica con il dispositivo del partner usando i protocolli. 3DPrintService.exe carica questa DLL in fase di esecuzione per guidare le operazioni del dispositivo della stampante 3D.

Diagramma che mostra il flusso di comunicazione del dispositivo per le operazioni del dispositivo stampante 3D.

Sequenza di utilizzo della stampante

  • Lo spooler comunica con 3dmon.dll che invia comandi al servizio windows 3DPrintService

  • Il 3DPrintService.exe viene eseguito con le credenziali dell'account di NetworkService

  • Lo spooler, tramite 3dmon.dll, invia comandi a 3DPrintService ogni volta che viene usata la stampante 3D

  • 3DPrintService elabora i comandi e richiama le API in fase di esecuzione nelle DLL di implementazione fornite dai partner

  • 3DPrintService disattiva le risposte dalle DLL fornite dai partner allo spooler

Interfacce e interazioni

La DLL partner deve esportare le funzioni API seguenti:

HRESULT Install([in] Argomenti LPCWSTR)

Questa API è facoltativa e può essere usata dal produttore per installare software personalizzato o registrazione per il dispositivo. Ad esempio, l'installazione della modellazione inclusa nel pacchetto driver per il dispositivo. Questa API viene richiamata con le credenziali DI SISTEMA per abilitare l'installazione.

DWORD PrintApiSupported()

Questa API viene usata dai produttori di terze parti per indicare la versione dell'API del servizio di stampa 3D supportata. Le API seguenti sono compatibili con la versione 1 di 3DPrintService.

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

Questa API viene richiamata prima di un evento di stampa che inizia a inizializzare la stampante. La stampante può salvare lo stato specifico del processo nel parametro ppPartnerData. Questa chiamata è analoga a una chiamata StartDocPort.

  • jobId - ID processo usato per tenere traccia del processo

  • portName - portname per la stampante 3D

  • printerName : nome della stampante a cui viene inviato il processo di stampa

  • ppPartnerData : puntatore al puntatore che può essere usato per archiviare dati specifici del processo

HRESULT PrintFile([in] DWORD jobId, [in] LPWSTR portName, [in] LPWSTR printerName, [in] LPWSTR pathToRenderedFile,[in]LPVOID* ppPartnerData)

Questa API viene usata dai produttori di terze parti per stampare il documento sulla stampante.

  • jobId - ID processo usato per tenere traccia del processo

  • portName - portname per la stampante 3D

  • printerName : nome della stampante a cui viene inviato il processo di stampa

  • pathToRenderedFile : percorso UNC del percorso del file con spooling dopo l'esecuzione del rendering. Il produttore di terze parti elabora il file da questo percorso e stampa il documento sul dispositivo

  • ppPartnerData : puntatore al puntatore rilasciato per archiviare la configurazione dei dati specifica del partner durante la chiamata API InitializePrint.

  • printerName può essere ottenuto dal Registro di sistema usando il nome della porta. I produttori di terze parti potrebbero non essere in grado di usare il nome della porta per comunicare con il dispositivo. Il nome della stampante è univoco in un computer Windows e il relativo software sarà in grado di identificare la stampante in cui stampare il processo. Tutte le stampanti attive in un computer sono disponibili nella seguente chiave del Registro di sistema:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers

Registro stampanti 3d.

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

  • comando - stringa inviato come query

  • commandData : argomenti di comando (facoltativo)

  • resultBuffer : risultato della chiamata di argomenti di query>

  • resultBufferSize : dimensioni della stringa del buffer dei risultati

  • ppPartnerData : puntatore al puntatore per l'istanza DLL partner corrente

Il servizio 3Dprint richiama la DLL del partner per ottenere le dimensioni del buffer da allocare per il comando.

Dopo aver allocato la memoria per contenere la stringa di risposta, la DLL verrà richiamata di nuovo per ottenere il risultato effettivo.

La DLL può usare i dati dell'istanza di una precedente chiamata IntializePrint() per comunicare con il dispositivo senza aprire un nuovo canale di comunicazione ogni volta che viene chiamata la funzione Query( ).

Questa API viene usata per comunicare con la stampante per ottenere informazioni sulla configurazione del dispositivo, sullo stato di avanzamento della stampa o per notificare alla DLL del partner eventi di scollegazione del dispositivo.

I comandi seguenti devono essere supportati dal produttore:

Comando CommandData Output Commenti
\\Printer.3DPrint:JobStatus Job Commenced = {"Status": "ok"}, Status to be used on Completion {"Status": "Completed"} Lo spooler visualizzerà qualsiasi valore restituito nell'interfaccia utente della coda di stampa. In questo modo il dispositivo visualizza le informazioni pertinenti durante una stampa nell'interfaccia utente della coda di stampa. Il dispositivo può restituire una stringa arbitraria qui (ad esempio "Occupato" o "33% completato") e verrà visualizzato verbatim nello stato del processo della coda di stampa.
\\Printer.3DPrint:JobCancel {"Status": "Complete"} Il spooler richiama questo comando quando un utente annulla una stampa. La DLL partner restituisce questo valore quando l'annullamento è stato completato e gli handle e i thread sono stati chiusi.
\\Printer.Capabilities:Data Stringa XML conforme allo schema PrintDeviceCapabilites (PDC). La query PDC viene richiamata dalle app che desiderano ottenere altre informazioni sulla stampante. I dati vengono usati per descrivere le funzionalità del dispositivo e possono includere le impostazioni del filtro dei dati se il driver si basa sul filtro dei dati Microsoft. Per un PDC di esempio, vedere di seguito.
\\Printer.3DPrint:Disconnect {"Status": "OK"} Questa query viene attivata ogni volta che si verifica una disconnessione PnP del dispositivo stampante. I partner possono intraprendere tutte le azioni necessarie, ad esempio chiudere eventuali handle aperti per consentire la riconnessione corretta.
\\Printer.3DPrint:Connect {"Status":"OK"} Questa query viene attivata ogni volta che è presente una connessione PnP del dispositivo stampante. I partner possono intraprendere qualsiasi azione necessaria.

Le funzionalità dei dispositivi di stampa seguenti possono essere usate come esempio:

<?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>

Per le stampanti 3D che non dispongono di display e pulsanti su scheda per consentire all'utente di interagire con il dispositivo all'inizio della stampa, è consigliabile restituire un file XML PDC con un set di messaggi di richiesta utente appropriato impostato in psdk3dx:userPrompt. Si tratta di impedire l'avvio di una nuova stampa sopra una esistente. Il messaggio <di stato personalizzato psk3dx:customStatus> viene usato per visualizzare qualsiasi messaggio durante l'associazione.

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

  • dwJobId - ID processo usato per tenere traccia del processo nel spooler

  • pPortName - portname per la stampante 3D

  • pPrinterName : nome della stampante in cui viene inviato il processo di stampa

  • ppPartnerData : puntatore al puntatore che contiene l'installazione dei dati specifica del processo durante una chiamata dell'API InitializePrint

La pulizia viene richiamata al completamento di un processo di stampa o al completamento di una query di annullamento in un processo di stampa. Offre un'opportunità per la DLL partner di pulire le risorse inizializzate per questa stampa.

HRESULT UnInstall([in]LPCWSTR args)

Questa API viene chiamata quando si disinstalla il dispositivo stampante 3D e fornisce un meccanismo per il produttore per disinstallare il software che potrebbero essere stati installati.