Habilitación de una interfaz USB personalizada para una impresora 3D

La arquitectura descrita en este tema permite la compatibilidad con impresoras 3D de interfaz USB personalizadas en los ecosistemas de impresión v3 y v4. Un monitor de puerto estándar, 3dmon.dll, reenvía los comandos de trabajo de impresión 3D a un windows 3DPrintService que se ejecuta con credenciales de servicio local. El servicio carga y comunica con un archivo DLL de asociado para ejecutar los comandos personalizados necesarios para un trabajo de impresión 3D. El paquete de controladores USB del dispositivo instala el archivo DLL del asociado, así como los 3dmon.dll y 3dprintservice.exe redistribuibles. El archivo DLL del asociado debe implementar y exportar un conjunto de funciones para comunicarse con 3DPrintService. El resto de la funcionalidad necesaria para interactuar con el servicio de cola de impresión se implementa en 3dmon.dll.

Nota

Esta arquitectura requiere que el archivo DLL del asociado sea seguro para varios subprocesos.

Decisiones de arquitectura

El servicio de windows 3DPrintService se usa para cargar e invocar API específicas definidas en archivos DLL proporcionados por el asociado durante un flujo de trabajo de impresión. Estas API permitirán la comunicación con la impresora.

Los paquetes de controladores del filtro USB KMDF se publican en Windows Update para su instalación a través de PnP para una impresora 3D compatible. El controlador KMDF instala el software asociado y crea un nodo de dispositivo de impresora 3D. El nodo del dispositivo de impresora 3D se instala mediante un controlador de impresión v4 publicado por el asociado desde Windows Update.

Decisiones de empaquetado

Archivos binarios y dependencias binarias

La arquitectura usa un controlador publicado por el fabricante de hardware en Windows Update. Este controlador incluye los siguientes archivos binarios redistribuibles proporcionados por Microsoft y sus dependencias:

  • 3dmon.dll

  • 3dprintservice.exe

  • ms3dprintusb.sys

Controlador de filtro USB en modo kernel

El asociado publica el controlador KMDF y consta de componentes que se muestran en el diagrama siguiente. Esto coincide con el dispositivo con un identificador de hardware (normalmente, un VID & PID). El controlador crea un nodo de dispositivo de impresora 3D en la instalación que desencadena la instalación de la cola de impresión y los controladores de segmentación de datos. El asociado proporciona controladores de impresora v4 para el nodo de dispositivo de impresora 3D que se crea.

controlador de filtro usb kmdf.

MS3DPrintUSB.sys

Controlador de dispositivo en modo kernel que crea el nodo de desarrollo de impresora 3D en Enum\3DPrint. El subsistema PnP lo invoca mediante una coincidencia directa del & PID de VID en función del nodo de dispositivo creado por Winusb.sys. El archivo .inf del controlador configura el archivo DLL personalizado que se usa para establecer 3DPrintService (si aún no está instalado en el sistema).

3dmon.dll

3DMon.dll es un binario redistribuible del monitor de puerto publicado por Microsoft invocado por el colador para comunicarse con la impresora 3D.

3dprintservice.exe

3DPrintService.exe es un binario publicado por Microsoft instalado como servicio de Windows durante la instalación del controlador. 3DMon se comunica con este servicio para realizar operaciones como impresión, bidi, etc. con la impresora 3D.

Partnerimpl.dll

Partnerimp.dll es la implementación del asociado de la interfaz de Microsoft publicada. El archivo DLL se comunica con el dispositivo del asociado mediante sus protocolos. 3DPrintService.exe carga este archivo DLL en tiempo de ejecución para controlar las operaciones del dispositivo de impresora 3D.

Diagrama que muestra el flujo de comunicación del dispositivo para las operaciones del dispositivo de impresora 3D.

Secuencia de uso de impresoras

  • El administrador de colas se comunica con 3dmon.dll que envía comandos al servicio de windows 3DPrintService.

  • El 3DPrintService.exe se ejecuta con las credenciales de cuenta de NetworkService.

  • El colador, a través de 3dmon.dll, envía comandos a 3DPrintService en cualquier momento en que se use la impresora 3D.

  • 3DPrintService procesa comandos e invoca las API en tiempo de ejecución en los archivos DLL de implementación proporcionados por el asociado.

  • 3DPrintService devuelve las respuestas de los archivos DLL proporcionados por el asociado al administrador de trabajos en cola.

Interfaces e interacciones

El archivo DLL del asociado debe exportar las siguientes funciones de API:

HRESULT Install([in] LPCWSTR args)

Esta API es opcional y la puede usar el fabricante para instalar software personalizado o registro para su dispositivo. Por ejemplo, la instalación del modelado incluida con el paquete de controladores para el dispositivo. Esta API se invoca con credenciales SYSTEM para habilitar la instalación.

DWORD PrintApiSupported()

Los fabricantes de terceros usan esta API para indicar la versión de la API del servicio de impresión 3D compatible. Las API siguientes son compatibles con la versión 1 de 3DPrintService.

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

Esta API se invoca antes de que un evento de impresión empiece a inicializar la impresora. La impresora puede guardar el estado específico del trabajo en el parámetro ppPartnerData. Esta llamada es análoga a una invocación StartDocPort.

  • jobId : identificador de trabajo usado para realizar un seguimiento del trabajo

  • portName : portname para la impresora 3D

  • printerName : nombre de la impresora a la que se envía este trabajo de impresión

  • ppPartnerData : puntero al puntero que se puede usar para almacenar datos específicos del trabajo.

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

Los fabricantes de terceros usan esta API para imprimir el documento en su impresora.

  • jobId : identificador de trabajo usado para realizar un seguimiento del trabajo

  • portName : portname para la impresora 3D

  • printerName : nombre de la impresora a la que se envía el trabajo de impresión.

  • pathToRenderedFile : ruta de acceso UNC a la ubicación del archivo en cola una vez realizada la representación. El fabricante de terceros procesa el archivo desde esta ubicación e imprime el documento en su dispositivo.

  • ppPartnerData : puntero al puntero que se emitió para almacenar la configuración de datos específicos del asociado durante la llamada api InitializePrint.

  • printerName se puede obtener del Registro mediante el nombre del puerto. Es posible que los fabricantes de terceros no puedan usar el nombre del puerto para comunicarse con su dispositivo. El nombre de la impresora es único en una máquina Windows y su software será capaz de identificar en qué impresora imprimir el trabajo. Todas las impresoras activas en una máquina se pueden encontrar en la siguiente clave del Registro:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers

Registro de impresora 3d.

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

  • command : comando string enviado como una consulta

  • commandData : argumentos de comando (opcional)

  • resultBuffer : resultado de la invocación de argumentos de consulta>

  • resultBufferSize : tamaño de la cadena de búfer de resultados

  • ppPartnerData : puntero al puntero para la instancia de DLL del asociado actual

El servicio 3Dprint invoca el archivo DLL del asociado para obtener el tamaño del búfer que se va a asignar para el comando.

Después de asignar memoria para contener la cadena de respuesta, el archivo DLL se invocará de nuevo para obtener el resultado real.

El archivo DLL puede usar los datos de instancia de una llamada anterior a IntializePrint() para comunicarse con el dispositivo sin abrir un nuevo canal de comunicación cada vez que se llama a la función Query().

Esta API se usa para comunicarse con la impresora para obtener información sobre la configuración del dispositivo, el progreso de impresión o para notificar al archivo DLL del dispositivo asociado de los eventos de desconecte.

Los comandos siguientes deben ser compatibles con el fabricante:

Get-Help CommandData Resultados Comentarios
\\Printer.3DPrint:JobStatus Trabajo iniciado = {"Status": "ok"}, Status to be used on Completion {"Status": "Completed"} El administrador de cola mostrará cualquier valor devuelto en la interfaz de usuario de la cola de impresión. Esto permite que el dispositivo muestre información relevante durante una impresión en la interfaz de usuario de la cola de impresión. El dispositivo puede devolver una cadena arbitraria aquí (por ejemplo, "Ocupado" o "33 % completo") y se mostrará textualmente en el estado del trabajo de la cola de impresión.
\\Printer.3DPrint:JobCancel {"Status": "Completed"} El administrador de colas invocará este comando cuando un usuario cancele una impresión. El archivo DLL del asociado devuelve este valor cuando la cancelación se realizó correctamente y se han cerrado los identificadores y subprocesos.
\\Printer.Capabilities:Data Cadena XML que se ajusta al esquema PrintDeviceCapabilites (PDC). Las aplicaciones que desean obtener más información sobre la impresora invocan la consulta PDC. Los datos se usan para describir las funcionalidades del dispositivo y pueden incluir la configuración de segmentación de datos si el controlador se basa en la segmentación de datos de Microsoft. Consulte a continuación un PDC de ejemplo.
\\Printer.3DPrint:Disconnect {"Status": "OK"} Esta consulta se desencadena cada vez que hay una desconexión PnP del dispositivo de impresora. Los asociados pueden realizar cualquier acción necesaria, por ejemplo, cerrar los identificadores abiertos para permitir la reconexión adecuada.
\\Printer.3DPrint:Connect {"Status":"OK"} Esta consulta se desencadena cada vez que hay una conexión PnP del dispositivo de impresora. Los asociados pueden realizar cualquier acción necesaria.

El siguiente XML de funcionalidades de dispositivo de impresión se puede usar como ejemplo:

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

Para las impresoras 3D que no tienen botones y pantalla a bordo para permitir que el usuario interactúe con el dispositivo al principio de la impresión, abogamos por devolver un xml PDC con un mensaje de mensaje de usuario adecuado establecido como se muestra anteriormente en psdk3dx:userPrompt. Esto es para evitar iniciar una nueva impresión sobre una existente. El mensaje <de estado personalizado psk3dx:customStatus> se usa para mostrar cualquier mensaje durante la segmentación.

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

  • dwJobId : identificador de trabajo usado para realizar un seguimiento del trabajo en el administrador de trabajos

  • pPortName : portname para la impresora 3D

  • pPrinterName : nombre de la impresora a la que se envía este trabajo de impresión

  • ppPartnerData : puntero al puntero que contiene la configuración de datos específicos del trabajo durante una invocación de la API InitializePrint.

La limpieza se invoca cuando se completa correctamente un trabajo de impresión o al finalizar una consulta de cancelación en un trabajo de impresión. Proporciona una oportunidad para que el archivo DLL del asociado limpie los recursos inicializados para esta impresión.

HRESULT UnInstall([in]LPCWSTR args)

Se llama a esta API al desinstalar el dispositivo de impresora 3D y proporciona un mecanismo para que el fabricante desinstale el software que podrían haber instalado.