Activer une interface USB personnalisée pour une imprimante 3D

L’architecture décrite dans cette rubrique permet de prendre en charge les imprimantes 3D d’interface USB personnalisées dans les écosystèmes d’impression v3 et v4. Un moniteur de port standard, 3dmon.dll, transfère les commandes de travail d’impression 3D à un service Windows 3DPrintService exécuté avec des informations d’identification de service local. Le service charge et communique avec une DLL partenaire pour exécuter les commandes personnalisées nécessaires à un travail d’impression 3D. La DLL partenaire, ainsi que les redistribuables 3dmon.dll et 3dprintservice.exe , sont installés par le package de pilotes USB de l’appareil. La DLL partenaire doit implémenter et exporter un ensemble de fonctions pour communiquer avec 3DPrintService. Le reste des fonctionnalités requises pour interagir avec le service spouleur d’impression est implémenté dans 3dmon.dll.

Notes

Cette architecture nécessite que la DLL partenaire soit multi-instance, thread-safe.

Décisions relatives à l’architecture

Le service windows 3DPrintService est utilisé pour charger et appeler des API définies spécifiques dans des DLL fournies par un partenaire pendant un flux de travail d’impression. Ces API permettent de communiquer avec l’imprimante.

Les packages de pilotes de filtre USB KMDF sont publiés sur Windows Update pour l’installation via PnP pour une imprimante 3D prise en charge. Le pilote KMDF installe le logiciel partenaire et crée un nœud de périphérique d’imprimante 3D. Le nœud du périphérique d’imprimante 3D est installé à l’aide d’un pilote d’impression v4 publié par un partenaire à partir de Windows Update.

Décisions relatives à l’empaquetage

Binaires et dépendances binaires

L’architecture utilise un pilote publié par le fabricant du matériel sur Windows Update. Ce pilote inclut les fichiers binaires redistribuables fournis par Microsoft suivants et leurs dépendances :

  • 3dmon.dll

  • 3dprintservice.exe

  • ms3dprintusb.sys

Pilote de filtre USB en mode noyau

Le pilote KMDF est publié par le partenaire et se compose de composants présentés dans le diagramme ci-dessous. Cela correspond à l’appareil avec un ID matériel (généralement, un VID & PID). Le pilote crée un nœud de périphérique d’imprimante 3D lors de l’installation, ce qui déclenche l’installation de la file d’attente d’impression et des pilotes de segment. Le partenaire fournit des pilotes d’imprimante v4 pour le nœud de périphérique d’imprimante 3D créé.

pilote de filtre usb kmdf.

MS3DPrintUSB.sys

Pilote de périphérique en mode noyau qui crée le nœud de développement d’imprimante 3D sous Enum\3DPrint. Il est appelé par le sous-système PnP via une correspondance directe du PID & VID en fonction du nœud d’appareil créé par Winusb.sys. Le fichier .inf du pilote configure la DLL personnalisée utilisée pour définir le service 3DPrintService (s’il n’est pas déjà installé sur le système).

3dmon.dll

3DMon.dll est un binaire redistribuable redistribuable de moniteur de port publié par Microsoft appelé par le spouleur pour communiquer avec l’imprimante 3D.

3dprintservice.exe

3DPrintService.exe est un binaire publié par Microsoft installé en tant que service Windows lors de l’installation du pilote. 3DMon communique avec ce service pour effectuer des opérations telles que l’impression, bidi, etc. avec l’imprimante 3D.

Partnerimpl.dll

Partnerimp.dll est l’implémentation par le partenaire de l’interface Microsoft publiée. La DLL communique avec l’appareil du partenaire à l’aide de ses protocoles. 3DPrintService.exe charge cette DLL au moment de l’exécution pour piloter les opérations de l’imprimante 3D.

Diagramme montrant le flux de communication de l’appareil pour les opérations de périphérique d’imprimante 3D.

Séquence d’utilisation de l’imprimante

  • Le spouleur communique avec 3dmon.dll qui envoie des commandes au service Windows 3DPrintService

  • Le 3DPrintService.exe s’exécute avec les informations d’identification de compte de NetworkService

  • Le spouleur, via 3dmon.dll, envoie des commandes à 3DPrintService chaque fois que l’imprimante 3D est utilisée

  • Le service 3DPrintService traite les commandes et appelle les API au moment de l’exécution sur les DLL d’implémentation fournies par le partenaire

  • Le service 3DPrintService remet les réponses des DLL fournies par le partenaire au spouleur

Interfaces et interactions

La DLL partenaire doit exporter les fonctions d’API suivantes :

HRESULT Install([in] LPCWSTR args)

Cette API est facultative et peut être utilisée par le fabricant pour installer des logiciels personnalisés ou l’inscription de son appareil. Par exemple, l’installation de la modélisation incluse avec le package de pilotes pour l’appareil. Cette API est appelée avec les informations d’identification SYSTÈME pour permettre l’installation.

DWORD PrintApiSupported()

Cette API est utilisée par les fabricants tiers pour indiquer la version de l’API du service d’impression 3D prise en charge. Les API ci-dessous sont compatibles avec la version 1 de 3DPrintService.

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

Cette API est appelée avant qu’un événement d’impression commence à initialiser l’imprimante. L’imprimante peut enregistrer l’état spécifique du travail dans le paramètre ppPartnerData. Cet appel est analogue à un appel StartDocPort.

  • jobId : ID de travail utilisé pour effectuer le suivi du travail

  • portName : portname pour l’imprimante 3D

  • printerName : nom de l’imprimante à laquelle ce travail d’impression est envoyé

  • ppPartnerData : pointeur vers le pointeur qui peut être utilisé pour stocker des données spécifiques à un travail

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

Cette API est utilisée par les fabricants tiers pour imprimer le document sur leur imprimante.

  • jobId : ID de travail utilisé pour effectuer le suivi du travail

  • portName : portname pour l’imprimante 3D

  • printerName : nom de l’imprimante à laquelle le travail d’impression est envoyé

  • pathToRenderedFile : chemin d’accès UNC à l’emplacement du fichier mis en pool une fois le rendu effectué. Le fabricant tiers traite le fichier à partir de cet emplacement et imprime le document sur son appareil

  • ppPartnerData : pointeur vers le pointeur émis pour stocker la configuration des données spécifiques du partenaire lors de l’appel de l’API InitializePrint.

  • printerName peut être obtenu à partir du registre à l’aide du nom de port. Les fabricants tiers peuvent ne pas être en mesure d’utiliser le nom de port pour communiquer avec leur appareil. Le nom de l’imprimante est unique sur un ordinateur Windows et son logiciel sera capable d’identifier l’imprimante sur laquelle imprimer le travail. Toutes les imprimantes actives sur un ordinateur se trouvent à l’aide de la clé de Registre suivante :

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers

Registre d’imprimantes 3d.

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

  • command : commande de chaîne envoyée en tant que requête

  • commandData - arguments de commande (facultatif)

  • resultBuffer : résultat de l’appel d’arguments de requête>

  • resultBufferSize : taille de la chaîne de mémoire tampon de résultat

  • ppPartnerData : pointeur vers le pointeur de la DLL partenaire actuelle instance

Le service 3Dprint appelle la DLL partenaire pour obtenir la taille de la mémoire tampon à allouer à la commande.

Après avoir alloué de la mémoire pour contenir la chaîne de réponse, la DLL est appelée à nouveau pour obtenir le résultat réel.

La DLL peut utiliser les données instance d’un appel IntializePrint() précédent pour communiquer avec l’appareil sans ouvrir de nouveau canal de communication chaque fois que la fonction Query() est appelée.

Cette API est utilisée pour communiquer avec l’imprimante afin d’obtenir des informations sur la configuration de l’appareil, la progression de l’impression ou pour informer la DLL partenaire des événements de débranchement d’appareil.

Les commandes ci-dessous doivent être prises en charge par le fabricant :

Commande CommandData Sortie Commentaires
\\Printer.3DPrint :JobStatus Travail commencé = {"Status » : « ok"}, État à utiliser à l’achèvement {"Status » : « Completed"} Le spouleur affiche toute valeur retournée dans l’interface utilisateur de la file d’attente d’impression. Cela permet à l’appareil d’afficher des informations pertinentes lors d’une impression dans l’interface utilisateur de la file d’attente d’impression. L’appareil peut retourner une chaîne arbitraire ici (par exemple , « Occupé » ou « 33 % terminé ») qui s’affiche textuellement dans le status de travail de la file d’attente d’impression.
\\Printer.3DPrint :JobCancel {"Status » : « Terminé"} Le spouleur appelle cette commande lorsqu’un utilisateur annule une impression. La DLL partenaire retourne cette valeur lorsque l’annulation a réussi et que les handles et threads ont été fermés.
\\Printer.Capabilities :Data Chaîne XML conforme au schéma PrintDeviceCapabilites (PDC). La requête PDC est appelée par les applications qui souhaitent obtenir plus d’informations sur l’imprimante. Les données sont utilisées pour décrire les fonctionnalités de l’appareil et peuvent inclure les paramètres du segment si le pilote s’appuie sur le segment Microsoft. Pour obtenir un exemple de contrôleur de domaine, consultez ci-dessous.
\\Printer.3DPrint :Disconnect {"Status » : « OK"} Cette requête est déclenchée chaque fois qu’il y a une déconnexion PnP de l’appareil d’imprimante. Les partenaires peuvent entreprendre toutes les actions requises, par exemple fermer les poignées ouvertes pour permettre une reconnexion appropriée.
\\Printer.3DPrint :Connect {"Status » :"OK"} Cette requête est déclenchée chaque fois qu’il existe une connexion PnP de l’appareil d’imprimante. Les partenaires peuvent entreprendre toutes les actions requises.

Le code XML des fonctionnalités d’impression d’appareil suivant peut être utilisé à titre d’exemple :

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

Pour les imprimantes 3D qui n’ont pas d’affichage et de boutons embarqués pour permettre à l’utilisateur d’interagir avec l’appareil au début de l’impression, nous vous conseillons de renvoyer un code xml de contrôleur de domaine avec un ensemble de messages d’invite utilisateur approprié, comme indiqué ci-dessus dans psdk3dx :userPrompt. Il s’agit d’empêcher le démarrage d’une nouvelle impression par-dessus une impression existante. Le message <status personnalisé psk3dx :customStatus> est utilisé pour afficher n’importe quel message pendant la découpe.

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

  • dwJobId : ID de travail utilisé pour suivre le travail dans le spouleur

  • pPortName : nom de port pour l’imprimante 3D

  • pPrinterName : nom de l’imprimante à laquelle cette tâche d’impression est envoyée

  • ppPartnerData : pointeur vers le pointeur qui contient la configuration des données spécifiques au travail lors d’un appel de l’API InitializePrint

Le nettoyage est appelé à l’achèvement d’un travail d’impression ou à l’achèvement d’une requête d’annulation sur un travail d’impression. Il permet à la DLL partenaire de nettoyer les ressources qui ont été initialisées pour cette impression.

HRESULT UnInstall([in]LPCWSTR args)

Cette API est appelée lors de la désinstallation de l’appareil d’imprimante 3D et fournit un mécanisme permettant au fabricant de désinstaller les logiciels qu’il a pu installer.