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 monitor delle porte standard, 3dmon.dll, inoltra i comandi dei processi di stampa 3D a un Windows 3DPrintService in esecuzione con 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 del partner, nonché le 3dmon.dll e le 3dprintservice.exe ridistribuibili, vengono installate dal pacchetto driver USB del dispositivo. La DLL del 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, 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 seguenti 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. Questo corrisponde al dispositivo con un ID hardware (in genere, un VID & PID). Il driver crea un nodo del dispositivo stampante 3D durante l'installazione che attiva l'installazione della coda di stampa e i driver del filtro dei dati. Il partner fornisce i driver della stampante v4 per il nodo del dispositivo della stampante 3D creato.
MS3DPrintUSB.sys
Driver di 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.
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 esegue nuovamente le risposte dalle DLL fornite dai partner allo spooler
Interfacce e interazioni
La DLL partner deve esportare le funzioni API seguenti:
Installazione HRESULT([in] Args 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 che ha emesso 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
HRESULT Query(_In_ LPCWSTR command, _In_ LPCWSTR commandData, _Out_ LPWSTR resultBuffer, _Out_ resultBufferSize, , _In_ LPVOID* ppPartnerData)
comando - stringa inviato come query
commandData - Argomenti del 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 della DLL partner corrente
Il servizio 3Dprint richiama la DLL 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 chiamata IntializePrint() precedente 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 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. Ciò consente al dispositivo di visualizzare 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": "Completed"} | Lo spooler richiamerà questo comando quando un utente annulla una stampa. La DLL partner restituisce questo valore quando l'annullamento ha avuto esito positivo 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. Vedere di seguito per un pdc di esempio. | |
\\Printer.3DPrint:Disconnect | {"Status": "OK"} | Questa query viene attivata ogni volta che si verifica una disconnessione PnP del dispositivo della stampante. I partner possono intraprendere qualsiasi azione necessaria, 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. |
Xml funzionalità del dispositivo di stampa
L'XML delle funzionalità del dispositivo di stampa seguente può essere usato 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, come illustrato in precedenza in psdk3dx:userPrompt. Si tratta di impedire l'avvio di una nuova stampa su uno esistente. Il messaggio <di stato personalizzato psk3dx:customStatus> viene usato per visualizzare qualsiasi messaggio durante il sezionamento.
HRESULT Cleanup(LPCWSTR pPrinterName, LPCWSTR pPortName, DWORD dwJobId, LPVOID* ppPartnerData)
dwJobId - ID processo usato per tenere traccia del processo nello spooler
pPortName - portname per la stampante 3D
pPrinterName : nome della stampante a cui viene inviato il processo di stampa
ppPartnerData : puntatore al puntatore che contiene la configurazione dei dati specifica del processo durante una chiamata all'API InitializePrint
La pulizia viene richiamata al completamento corretto di un processo di stampa o al completamento di una query di annullamento in un processo di stampa. Consente alla DLL partner di pulire le risorse inizializzate per la stampa.
HRESULT UnInstall([in]LPCWSTR args)
Questa API viene chiamata durante la disinstallazione del dispositivo stampante 3D e fornisce un meccanismo per consentire al produttore di disinstallare il software che potrebbe aver installato.