Поделиться через


Включение пользовательского USB-интерфейса для трехмерного принтера

Архитектура, описанная в этом разделе, обеспечивает поддержку пользовательских трехмерных принтеров USB-интерфейса в экосистемах печати версии 3 и версии 4. Стандартный монитор портов, 3dmon.dll, пересылает 3D-команды задания печати в Windows 3DPrintService , запущенную с учетными данными локальной службы. Служба загружает и взаимодействует с библиотекой DLL партнера для выполнения пользовательских команд, необходимых для задания печати трехмерной печати. Библиотека DLL партнера, а также распространяемые 3dmon.dll и 3dprintservice.exe устанавливаются пакетом USB-драйвера устройства. Библиотека DLL партнера должна реализовать и экспортировать набор функций для взаимодействия с 3DPrintService. Остальная часть необходимых функций для взаимодействия со службой spooler печати реализована в 3dmon.dll.

Примечание.

Для этой архитектуры требуется библиотека DLL партнера для нескольких экземпляров, безопасного потока.

Решения по архитектуре

Служба windows 3DPrintService используется для загрузки и вызова определенных API в библиотеках DLL, предоставляемых партнером, во время рабочего процесса печати. Эти API позволяют осуществлять обмен данными с принтером.

Пакеты драйверов USB-фильтра KMDF публикуются Обновл. Windows для установки с помощью PnP для поддерживаемого трехмерного принтера. Драйвер KMDF устанавливает партнерское программное обеспечение и создает 3D-узел устройства принтера. Узел устройства 3D-принтера устанавливается с помощью опубликованного партнером драйвера печати версии 4 из Обновл. Windows.

Решения по упаковке

Двоичные файлы и двоичные зависимости

В архитектуре используется драйвер, опубликованный производителем оборудования на Обновл. Windows. Этот драйвер включает в себя следующие распространяемые двоичные файлы, предоставляемые Корпорацией Майкрософт, и их зависимости:

  • 3dmon.dll

  • 3dprintservice.exe

  • ms3dprintusb.sys

Драйвер USB-фильтра в режиме ядра

Драйвер KMDF публикуется партнером и состоит из компонентов, показанных на схеме ниже. Это соответствует устройству с аппаратным идентификатором (как правило, VID и PID). Драйвер создает узел устройства 3D-принтера при установке, который активирует установку очереди печати и драйверов среза. Партнер предоставляет драйверы принтера версии 4 для созданного узла устройства 3D-принтера.

Драйвер usb-фильтра kmdf.

MS3DPrintUSB.sys

Драйвер устройства в режиме ядра, создающий узел разработки 3D-принтера в разделе Enum\3DPrint. Он вызывается подсистемой PnP через прямое сопоставление VID и PID на основе узла устройства, созданного Winusb.sys. Inf-файл драйвера настраивает пользовательскую библиотеку DLL, используемую для установки 3DPrintService (если она еще не установлена в системе).

3dmon.dll

3DMon.dll — это распространяемый двоичный файл монитора порта, опубликованный корпорацией Майкрософт, который вызывается spooler для взаимодействия с трехмерным принтером.

3dprintservice.exe

3DPrintService.exe — это опубликованный корпорацией Майкрософт двоичный файл в качестве службы Windows во время установки драйвера. 3DMon взаимодействует с этой службой для выполнения таких операций, как печать, биди и т. д. с трехмерными принтерами.

Partnerimpl.dll

Partnerimp.dll является реализацией партнера опубликованного интерфейса Майкрософт. Библиотека DLL взаимодействует с устройством партнера с помощью протоколов. 3DPrintService.exe загружает эту библиотеку DLL во время выполнения, чтобы управлять операциями устройства 3D-принтера.

Схема, показывющая поток связи устройства для операций с принтером 3 D.

Последовательность использования принтера

  • Spooler взаимодействует с 3dmon.dll который отправляет команды в службу windows 3DPrintService

  • 3DPrintService.exe выполняется с учетными данными учетной записи NetworkService.

  • Spooler через 3dmon.dll отправляет команды в 3DPrintService в любое время, когда используется трехмерный принтер.

  • 3DPrintService обрабатывает команды и вызывает API во время выполнения в библиотеках DLL реализации, предоставляемых партнером.

  • 3DPrintService передает ответы от предоставленных партнером БИБЛИОТЕК DLL обратно в spooler

Интерфейсы и взаимодействия

Библиотека DLL партнера должна экспортировать следующие функции API:

HRESULT Install([in] LPCWSTR args)

Этот API является необязательным и может использоваться производителем для установки пользовательского программного обеспечения или регистрации для своего устройства. Например, установка моделирования, включенная в пакет драйвера для устройства. Этот API вызывается с учетными данными SYSTEM, чтобы включить установку.

DWORD PrintApiSupported()

Этот API используется сторонними производителями, чтобы указать версию поддерживаемого API 3D-службы печати. Приведенные ниже API совместимы с версией 1 3DPrintService.

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

Этот API вызывается перед событием печати, начинающийся инициализировать принтер. Принтер может сохранить определенное состояние задания в параметре ppPartnerData. Этот вызов аналогиен вызову StartDocPort.

  • jobId — идентификатор задания, используемый для отслеживания задания

  • portName — имя порта для трехмерного принтера

  • printerName — имя принтера, в который отправляется задание печати.

  • ppPartnerData — указатель на указатель, который можно использовать для хранения данных конкретного задания.

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

Этот API используется сторонними производителями для печати документа на принтере.

  • jobId — идентификатор задания, используемый для отслеживания задания

  • portName — имя порта для трехмерного принтера

  • printerName — имя принтера, в который отправляется задание печати.

  • pathToRenderedFile — UNC-путь к расположению spooled-файла после отрисовки. Сторонний производитель обрабатывает файл из этого расположения и печатает документ на своем устройстве.

  • ppPartnerData — указатель на указатель, выданный для хранения конкретной настройки данных партнера во время вызова API InitializePrint.

  • Имя принтера можно получить из реестра с помощью имени порта. Сторонние производители могут не использовать имя порта для связи с устройством. Имя принтера уникально на компьютере с Windows, и его программное обеспечение сможет определить, на каком принтере напечатать задание. Все принтеры, активные на компьютере, можно найти в следующем разделе реестра:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers

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

  • команда — строка, отправленная в виде запроса

  • commandData — аргументы команд (необязательно)

  • resultBuffer — результат вызова аргументов запроса>

  • resultBufferSize — размер строки буфера результата

  • ppPartnerData — указатель на указатель на текущий экземпляр DLL партнера

Служба 3Dprint вызывает библиотеку DLL партнера, чтобы получить размер буфера для выделения команды.

После выделения памяти для хранения строки ответа библиотека DLL будет вызвана снова, чтобы получить фактический результат.

Библиотека DLL может использовать данные экземпляра из предыдущего вызова IntializePrint() для взаимодействия с устройством без открытия нового канала связи при каждом вызове функции Query( ).

Этот API используется для обмена данными с принтером для получения сведений о конфигурации устройства, ходе печати или уведомлении о событиях отмены подключения к партнерской библиотеке DLL устройства.

Приведенные ниже команды должны поддерживаться производителем:

Команда CommandData Выходные данные Комментарии
\\Printer.3DPrint:JobStatus Задание началось = {"Status": "ok"}, состояние, которое будет использоваться при завершении {"Состояние": "Завершено"} Средство spooler отобразит любое возвращаемое значение в пользовательском интерфейсе очереди печати. Это позволяет устройству отображать соответствующие сведения во время печати в пользовательском интерфейсе очереди печати. Устройство может вернуть произвольную строку здесь (например, "Занят" или "33% завершено"), и это будет отображаться в состоянии задания очереди печати.
\\Printer.3DPrint:JobCancel {"Status": "Completed"} Средство spooler вызовет эту команду, когда пользователь отменяет печать. Библиотека DLL партнера возвращает это значение, когда отмена была успешной, а дескрипторы и потоки были закрыты.
\\Printer.Capabilities:Data XML-строка, соответствующая схеме PrintDeviceCapabilites (PDC). Запрос PDC вызывается приложениями, которые хотят получить дополнительные сведения о принтере. Данные используются для описания возможностей устройства и могут включать параметры среза, если драйвер использует срез Майкрософт. См. ниже пример PDC.
\\Printer.3DPrint:Disconnect {"Status": "OK"} Этот запрос активируется всякий раз при отключении PnP устройства принтера. Партнеры могут выполнять любые необходимые действия, например закрыть все открытые дескрипторы, чтобы разрешить правильное повторное подключение.
\\Printer.3DPrint:Connect {"Status":"OK"} Этот запрос активируется всякий раз, когда подключение к PnP устройства принтера. Партнеры могут выполнять любые необходимые действия.

В качестве примера можно использовать следующие возможности устройства печати:

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

Для трехмерных принтеров, которые не имеют встроенного дисплея и кнопок, чтобы разрешить пользователю взаимодействовать с устройством в начале печати, мы выступаем за возвращение xml PDC с подходящим набором сообщений запроса пользователя, как показано выше в psdk3dx:userPrompt. Это позволяет предотвратить запуск новой печати поверх существующей. Настраиваемое сообщение <о состоянии psk3dx:customStatus> используется для отображения любого сообщения во время срезов.

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

  • dwJobId — идентификатор задания, используемый для отслеживания задания в spooler

  • pPortName — имя порта для трехмерного принтера

  • pPrinterName — имя принтера, в который отправляется задание печати.

  • ppPartnerData — указатель на указатель, содержащий настройку конкретных данных задания во время вызова API InitializePrint

Очистка вызывается при успешном завершении задания печати или при завершении запроса отмены для задания печати. Она предоставляет возможность для партнерской библиотеки DLL очистить ресурсы, которые были инициализированы для этой печати.

HRESULT UnInstall([in]LPCWSTR args)

Этот API вызывается при удалении устройства 3D-принтера и предоставляет механизм удаления программного обеспечения изготовителя, который, возможно, был установлен.