Compartir a través de


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 puertos estándar, 3dmon.dll, reenvía los comandos de trabajo de impresión 3D a Windows 3DPrintService que se ejecuta con credenciales de servicio local. El servicio se carga y se comunica con un archivo DLL de partner para ejecutar los comandos personalizados necesarios para un trabajo de impresión 3D. El paquete de controladores USB del dispositivo instala el DLL del partner, así como los redistribuibles 3dmon.dll y 3dprintservice.exe. El DLL del partner 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 DLL del partner sea seguro para varios subprocesos.

Decisiones sobre la arquitectura

El servicio de Windows 3DPrintService se usa para cargar e invocar API específicas definidas en DLL proporcionados por partners 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 del partner 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 partner 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 partner publica el controlador KMDF y consta de componentes que se muestran en el diagrama siguiente. Esto hace coincidir el dispositivo con un identificador de hardware (normalmente, un VID y 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 partner proporciona controladores de impresora v4 para el nodo del 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. Lo invoca el subsistema PnP a través de una coincidencia directa del VID & PID basado en el nodo de dispositivo creado por Winusb.sys. El archivo .inf del controlador configura el DLL personalizado usado para establecer 3DPrintService (si aún no está instalado en el sistema).

3dmon.dll

3DMon.dll es un archivo binario redistribuible del monitor de puerto publicado por Microsoft que invoca el administrador de colas 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 partner de la interfaz de Microsoft publicada. El DLL se comunica con el dispositivo del partner mediante sus protocolos. 3DPrintService.exe carga este DLL en tiempo de ejecución para impulsar 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 administrador de colas, a través de 3dmon.dll, envía comandos a 3DPrintService siempre que se use la impresora 3D.

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

  • 3DPrintService entrega las respuestas de los DLL proporcionados por el partner a la cola.

Interfaces e interacciones

El DLL del partner debe exportar las siguientes funciones de API:

HRESULT Install([in] LPCWSTR args)

Esta API es opcional y el fabricante puede usar esta API 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 el seguimiento del trabajo

  • portName: nombre de puerto para la impresora 3D

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

  • ppPartnerData: puntero a 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 el seguimiento del trabajo

  • portName: nombre de puerto para la impresora 3D

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

  • pathToRenderedFile: ruta UNC a la ubicación del archivo en cola después de realizar la representación. El fabricante de terceros procesa el archivo desde esta ubicación e imprime el documento en su dispositivo.

  • ppPartnerData: puntero a puntero que se emitió para almacenar la configuración de datos específicos del partner durante la llamada a la 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

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

  • command: comando de cadena 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 a puntero para la instancia de DLL del partner actual

El servicio 3Dprint invoca el DLL del partner 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 DLL se invocará de nuevo para obtener el resultado real.

El 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 la impresión o para notificar al DLL del partner los eventos de desenchufado del dispositivo.

El fabricante debe admitir los siguientes comandos:

Get-Help CommandData Output Comentarios
\\Printer.3DPrint:JobStatus Job Commenced = {"Status": "ok"}, Status to be used on Completion {"Status": "Completed"} El administrador de colas 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 % completado") y se mostrará textualmente en el estado del trabajo de cola de impresión.
\\Printer.3DPrint:JobCancel {"Status": "Completed"} El administrador de cola invocará este comando cuando un usuario cancele una impresión. El DLL del partner devuelve este valor cuando la cancelación se realiza 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 si el controlador se basa en la segmentación de datos de Microsoft. Vea más adelante un PDC de ejemplo.
\\Printer.3DPrint:Disconnect {"Status": "OK"} Esta consulta se desencadena siempre que haya una desconexión PnP del dispositivo de impresora. Los partners 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 siempre que haya una conexión PnP del dispositivo de impresora. Los partners 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>

En el caso de las impresoras 3D que no tienen pantalla ni botones incorporados para permitir que el usuario interactúe con el dispositivo al principio de la impresión, se recomienda devolver un xml PDC con un mensaje de aviso al usuario adecuado, tal y como se indicó 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 que se usa para realizar el seguimiento del trabajo en la cola

  • pPortName: nombre de puerto para la impresora 3D

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

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

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. Permite que el DLL del partner limpie los recursos que se inicializaron 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 software que podrían haber instalado.