Включение пользовательского ИНТЕРФЕЙСА USB для трехмерного принтера

Архитектура, описанная в этом разделе, обеспечивает поддержку пользовательских трехмерных принтеров с интерфейсом USB в экосистемах печати версий 3 и 4. Монитор стандартного порта ,3dmon.dll, перенаправит команды задания трехмерной печати в Windows 3DPrintService , работающий с учетными данными локальной службы. Служба загружает библиотеку DLL партнера и взаимодействует с ней для выполнения пользовательских команд, необходимых для задания трехмерной печати. Библиотека DLL партнера, а также распространяемые3dmon.dll и 3dprintservice.exe устанавливаются пакетом USB-драйвера устройства. Библиотека DLL партнера должна реализовать и экспортировать набор функций для взаимодействия с 3DPrintService. Остальные функции, необходимые для взаимодействия со службой очереди печати печати, реализованы в 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). Драйвер создает узел устройства трехмерного принтера при установке, который запускает установку очереди печати и драйверов среза. Партнер предоставляет драйверы принтера версии 4 для созданного узла устройства трехмерного принтера.

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

MS3DPrintUSB.sys

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

3dmon.dll

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

3dprintservice.exe

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

Partnerimpl.dll

Partnerimp.dll — это партнерская реализация опубликованного интерфейса Майкрософт. Библиотека DLL взаимодействует с устройством партнера по протоколам. 3DPrintService.exe загружает эту библиотеку DLL во время выполнения для управления операциями устройства трехмерного принтера.

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

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

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

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

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

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

  • 3DPrintService передает ответы от предоставленных партнером библиотек DLL обратно в очередь очереди.

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

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

HRESULT Install([in] LPCWSTR args)

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

DWORD PrintApiSupported()

Этот API используется сторонними производителями для указания поддерживаемой версии API службы трехмерной печати. Приведенные ниже 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-путь к расположению хранимого файла после выполнения отрисовки. Сторонний производитель обрабатывает файл из этого расположения и выводит документ на свое устройство.

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

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

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers

Реестр трехмерных принтеров.

Запрос HRESULT(_In_ LPCWSTR command, _In_ LPCWSTR commandData, _Out_ LPWSTR resultBuffer, _Out_ resultBufferSize, , _In_ LPVOID* ppPartnerData)

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

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

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

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

  • ppPartnerData — указатель на указатель для текущего экземпляра библиотеки DLL партнера.

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

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

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

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

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

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

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

<?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(LPCWSTR pPrinterName, LPCWSTR pPortName, DWORD dwJobId, LPVOID* ppPartnerData)

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

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

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

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

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

HrESULT UnInstall([in]LPCWSTR args)

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