Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De architectuur die in dit onderwerp wordt beschreven, biedt ondersteuning voor aangepaste USB-interface 3D-printers in de v3- en v4-afdrukecosystemen. Een standaardpoortmonitor, 3dmon.dll, stuurt 3D-afdruktaakopdrachten door naar een Windows 3DPrintService die met lokale servicereferenties wordt uitgevoerd. De service wordt geladen en communiceert met een partner-DLL om de aangepaste opdrachten uit te voeren die nodig zijn voor een 3D-afdruktaak. Het DLL-bestand van de partner, evenals de 3dmon.dll en 3dprintservice.exe herdistribueerbare bestanden, worden geïnstalleerd door het USB-stuurprogrammapakket van het apparaat. Het partner-DLL-bestand moet een set functies implementeren en exporteren om te communiceren met de 3DPrintService. De rest van de vereiste functionaliteit voor interactie met de afdrukspooler-service wordt geïmplementeerd in 3dmon.dll.
Notitie
Voor deze architectuur moet de partner-DLL multi-instance en draadveilig zijn.
Architectuurbeslissingen
De 3DPrintService Windows-service wordt gebruikt voor het laden en aanroepen van specifieke gedefinieerde API's in door de partner geleverde DLL's tijdens een afdrukwerkstroom. Deze API's zorgen voor communicatie met de printer.
De KMDF USB-filterstuurprogrammapakketten worden gepubliceerd op Windows Update voor installatie via PnP voor een ondersteunde 3D-printer. Het KMDF-stuurprogramma installeert partnersoftware en maakt een 3D-printerapparaatknooppunt. Het knooppunt van het 3D-printerapparaat wordt geïnstalleerd met behulp van een door een partner gepubliceerd v4-afdrukstuurprogramma van Windows Update.
Verpakkingsbeslissingen
Binaire bestanden en binaire afhankelijkheden
De architectuur maakt gebruik van een stuurprogramma dat is gepubliceerd door de hardwarefabrikant in Windows Update. Dit stuurprogramma bevat de volgende door Microsoft geleverde herdistribueerbare binaire bestanden en hun afhankelijkheden:
3dmon.dll
3dprintservice.exe
ms3dprintusb.sys
Stuurprogramma voor USB-filter in kernelmodus
Het KMDF-stuurprogramma wordt gepubliceerd door de partner en bestaat uit onderdelen die worden weergegeven in het onderstaande diagram. Dit komt overeen met het apparaat met een hardware-id (meestal een VID-& PID). Het stuurprogramma maakt een 3D-printerapparaatknooppunt tijdens de installatie, waardoor de installatie van de afdrukwachtrij en de slicerstuurprogramma's wordt geactiveerd. De partner biedt v4-printerstuurprogramma's voor het 3D-printerapparaatknooppunt dat wordt gemaakt.
MS3DPrintUSB.sys
Het apparaatstuurprogramma voor de kernelmodus waarmee het 3D-printerdev-knooppunt onder Enum\3DPrint wordt gemaakt. Het PnP-subsysteem roept het aan via een directe overeenkomst van de VID & PID, gebaseerd op het apparaatknooppunt dat is gecreëerd door Winusb.sys. Het .inf-stuurprogrammabestand stelt het aangepaste DLL-bestand in dat wordt gebruikt om de 3DPrintService- in te stellen (als dit nog niet op het systeem is geïnstalleerd).
3dmon.dll
3DMon.dll is een door Microsoft herdistribueerbare poortmonitor die door de spooler wordt aangeroepen om te communiceren met de 3D-printer.
3dprintservice.exe
3DPrintService.exe is een door Microsoft gepubliceerd binair bestand dat tijdens de installatie van het stuurprogramma is geïnstalleerd als een Windows-service. 3DMon communiceert met deze service om bewerkingen uit te voeren zoals afdrukken, bidi, enzovoort met de 3D-printer.
Partnerimpl.dll
Partnerimp.dll is de implementatie van de partner van de gepubliceerde Microsoft-interface. Het DLL-bestand communiceert met het apparaat van de partner met behulp van hun protocollen. 3DPrintService.exe laadt deze DLL tijdens runtime om de bewerkingen van het 3D-printerapparaat aan te sturen.
Volgorde van printergebruik
De spooler communiceert met 3dmon.dll die opdrachten verzendt naar de Windows-service 3DPrintService
De 3DPrintService.exe wordt uitgevoerd met de accountgegevens van NetworkService
De spooler, via 3dmon.dll, verzendt opdrachten naar 3DPrintService wanneer de 3D-printer wordt gebruikt
De 3DPrintService verwerkt opdrachten en roept API's tijdens runtime aan op door de partner geleverde implementatie-DLL's
De 3DPrintService geeft de antwoorden van door de partner geleverde DLL's terug aan de spooler.
Interfaces en interacties
Het DLL-bestand van de partner moet de volgende API-functies exporteren:
HRESULT Install([in] LPCWSTR args)
Deze API is optioneel en kan door de fabrikant worden gebruikt om aangepaste software of registratie voor hun apparaat te installeren. Bijvoorbeeld installatie van modellering die is opgenomen in het stuurprogrammapakket voor het apparaat. Deze API wordt aangeroepen met SYSTEEMreferenties om de installatie in te schakelen.
DWORD PrintApiSupported()
Deze API wordt gebruikt door de fabrikanten van derden om aan te geven welke versie van de 3D-printservice-API wordt ondersteund. De onderstaande API's zijn compatibel met versie 1 van de 3DPrintService.
HRESULT InitializePrint(LPCWSTR pPrinterName, LPCWSTR pPortName, DWORD dwJobId, LPVOID* ppPartnerData)
Deze API wordt aangeroepen voordat een afdrukgebeurtenis begint met het initialiseren van de printer. De printer kan de taakspecifieke status opslaan in de parameter ppPartnerData. Deze aanroep is vergelijkbaar met een Aanroep van StartDocPort.
jobId - taak-id die wordt gebruikt om de taak bij te houden
portName - poortnaam voor de 3D-printer
printerName - naam van de printer waarnaar deze afdruktaak wordt verzonden
ppPartnerData, aanwijzer naar aanwijzer die kan worden gebruikt om taakspecifieke gegevens op te slaan
HRESULT PrintFile([in] DWORD jobId, [in] LPWSTR portName, [in] LPWSTR printerName, [in] LPWSTR pathToRenderedFile,[in]LPVOID* ppPartnerData)
Deze API wordt gebruikt door fabrikanten van derden om het document op hun printer af te drukken.
jobId - taak-id die wordt gebruikt om de taak bij te houden
portName - poortnaam voor de 3D-printer
printerName - naam van de printer waar de afdruktaak naar wordt verzonden
pathToRenderedFile - UNC-pad naar de locatie van het gepoolde bestand nadat de rendering is uitgevoerd. De fabrikant van derden verwerkt het bestand vanaf deze locatie en drukt het document af op het apparaat
ppPartnerData - aanwijzer naar aanwijzer die is uitgegeven voor het opslaan van partnerspecifieke gegevensinstellingen tijdens de initializePrint-API-aanroep.
printerName kan worden verkregen uit het register met behulp van de poortnaam. Fabrikanten van derden kunnen mogelijk de poortnaam niet gebruiken om met hun apparaat te communiceren. De printernaam is uniek op een Windows-computer en de bijbehorende software kan bepalen op welke printer de taak moet worden afgedrukt. Alle printers die actief zijn op een computer, vindt u op de volgende registersleutel:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers
HRESULT Query(_In_ LPCWSTR command, _In_ LPCWSTR commandData, _Out_ LPWSTR resultBuffer, _Out_ resultBufferSize, , _In_ LPVOID* ppPartnerData)
opdracht - tekstopdracht verzonden als een query
commandData - opdrachtargumenten (optioneel)
resultBuffer - resultaat van aanroep van queryargumenten>
resultBufferSize - grootte van de resultaatbuffertekenreeks
ppPartnerData - aanwijzer naar aanwijzer voor de huidige DLL-instantie van de partner
De 3Dprint-service roept de partner-DLL aan om de grootte van de buffer op te halen die moet worden toegewezen voor de opdracht.
Nadat het geheugen is toegeroepen om de antwoordreeks op te slaan, wordt het DLL-bestand opnieuw aangeroepen om het werkelijke resultaat op te halen.
Het DLL-bestand kan de instantiegegevens uit een eerdere IntializePrint() aanroep gebruiken om met het apparaat te communiceren zonder dat er telkens een nieuw communicatiekanaal wordt geopend wanneer de Query() functie wordt aangeroepen.
Deze API wordt gebruikt om te communiceren met de printer om informatie te verkrijgen over de apparaatconfiguratie, de voortgang van het afdrukken of om meldingen naar de partner-DLL te sturen bij loskoppelen van de apparatuur.
De onderstaande opdrachten moeten worden ondersteund door de fabrikant:
| Opdracht | CommandData | Uitvoer | Opmerkingen |
|---|---|---|---|
| \\Printer.3DPrint:JobStatus | Taak gestart = {"Status": "ok"}, Status die moet worden gebruikt bij voltooiing {"Status": "Voltooid"} | De spooler geeft elke geretourneerde waarde weer in de gebruikersinterface van de afdrukwachtrij. Hierdoor kan het apparaat relevante informatie weergeven tijdens het afdrukken in de gebruikersinterface van de printwachtrij. Het apparaat kan hier een willekeurige tekenreeks retourneren (bijvoorbeeld 'Bezet' of '33% voltooid') en dit wordt letterlijk weergegeven in de status van de afdrukwachtrijtaak. | |
| \\Printer.3DPrint:TaakAnnuleren | {"Status": "Voltooid"} | De spooler roept deze opdracht aan wanneer een gebruiker een afdruk annuleert. De partner-DLL retourneert deze waarde wanneer de annulering is geslaagd en de handles en threads zijn gesloten. | |
| \\Printer.Capabilities:Data | XML-tekenreeks die voldoet aan het PDC-schema (PrintDeviceCapabilites). | De PDC-query wordt aangeroepen door apps die meer informatie over de printer willen verkrijgen. De gegevens worden gebruikt om de mogelijkheden van het apparaat te beschrijven en kunnen de slicerinstellingen bevatten als het stuurprogramma afhankelijk is van de Microsoft-slicer. Zie hieronder voor een voorbeeld-PDC. | |
| \\Printer.3DPrint:Verbinding verbreken | {"Status": "OK"} | Deze query wordt geactiveerd wanneer er een PnP-verbinding wordt verbroken van het printerapparaat. Partners kunnen alle vereiste acties uitvoeren, bijvoorbeeld alle geopende ingangen sluiten om opnieuw verbinding te maken. | |
| \\Printer.3DPrint:Connect | {"Status":"OK"} | Deze query wordt geactiveerd wanneer er een PnP-verbinding van het printerapparaat is. Partners kunnen alle vereiste acties ondernemen. |
XML-bestand met apparaatmogelijkheden afdrukken
De volgende XML met mogelijkheden voor afdrukapparaten kan als voorbeeld worden gebruikt.
<?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>
Voor 3D-printers die geen on-board display en knoppen hebben om de gebruiker te laten communiceren met het apparaat aan het begin van de afdruk, pleiten we ervoor om een PDC XML te retourneren met een geschikte gebruikerspromptbericht ingesteld zoals hierboven wordt weergegeven in psdk3dx:userPrompt. Dit is om te voorkomen dat een nieuwe afdruk boven op een bestaande afdruk wordt gestart. Het aangepaste statusbericht <psk3dx:customStatus> wordt gebruikt om een bericht weer te geven tijdens het segmenteren.
HRESULT Cleanup(LPCWSTR pPrinterName, LPCWSTR pPortName, DWORD dwJobId, LPVOID* ppPartnerData)
dwJobId - taak-id die wordt gebruikt om de taak in de spooler te volgen
pPortName - poortnaam voor de 3D-printer
pPrinterName - naam van de printer waar deze afdruktaak naartoe wordt verzonden
ppPartnerData - een aanwijzer naar een andere aanwijzer die de taakspecifieke gegevensconfiguratie bevat tijdens een InitializePrint API-aanroep
Opschonen wordt aangeroepen na succesvolle voltooiing van een afdruktaak of bij voltooiing van een annuleringsverzoek voor een afdruktaak. Het biedt de partner-DLL de mogelijkheid om de resources die voor deze printopdracht zijn geïnitialiseerd, op te ruimen.
HRESULT UnInstall([in]LPCWSTR args)
Deze API wordt aangeroepen bij het verwijderen van het 3D-printerapparaat en biedt een mechanisme voor de fabrikant om software te verwijderen die ze mogelijk hebben geïnstalleerd.