3D プリンターのカスタム USB インターフェイスを有効にする

このトピックで説明するアーキテクチャでは、v3 および v4 印刷エコシステムでカスタム USB インターフェイス 3D プリンターをサポートできます。 標準ポート モニターである 3dmon.dll は、3D プリント ジョブ コマンドを、ローカル サービス資格情報で実行されている Windows 3DPrintService に転送します。 サービスはパートナー DLL を読み込んで通信し、3D 印刷ジョブに必要なカスタム コマンドを実行します。 パートナー DLL、および 3dmon.dll3dprintservice.exe の再頒布可能パッケージは、デバイスの USB ドライバー パッケージによってインストールされます。 パートナー DLL は、3DPrintService と通信するための一連の関数を実装し、エクスポートする必要があります。 印刷スプーラー サービスを操作するために必要な残りの機能は、3dmon.dll に実装されています。

Note

このアーキテクチャでは、パートナー DLL がマルチインスタンスでスレッド セーフである必要があります。

アーキテクチャの決定

3DPrintService Windows サービスは、印刷ワークフロー中にパートナーが提供する DLL 内の特定の定義された API をロードし、呼び出すために使用されます。 これらの API を使用すると、プリンターとの通信が可能になります。

KMDF USB フィルター ドライバー パッケージは Windows Update で公開されており、対応する 3D プリンターの PnP 経由でインストールできます。 KMDF ドライバーは、パートナー ソフトウェアをインストールし、3D プリンター デバイス ノードを作成します。 3D プリンター デバイス ノードは、パートナーが発行した Windows Update の v4 印刷ドライバーを使用してインストールされます。

パッケージ化の決定

バイナリとバイナリの依存関係

このアーキテクチャでは、Windows Update 上のハードウェア製造元によって公開されたドライバーが使用されます。 このドライバーには、次のマイクロソフト提供の再頒布可能バイナリとその依存関係が含まれています。

  • 3dmon.dll

  • 3dprintservice.exe

  • ms3dprintusb.sys

カーネル モード USB フィルター ドライバー

KMDF ドライバーはパートナーによって公開され、次の図に示すコンポーネントで構成されます。 これは、ハードウェア ID (通常は VID および PID) を持つデバイスと一致します。 ドライバーは、インストール時に 3D プリンター デバイス ノードを作成し、それによって印刷キューとスライサー ドライバーのインストールが開始されます。 パートナーは、作成される 3D プリンター デバイス ノード用の v4 プリンター ドライバーを提供します。

kmdf usb filter driver.

MS3DPrintUSB.sys

Enum\3DPrint の下に 3D プリンター開発ノードを作成するカーネル モード デバイス ドライバー。 これは、Winusb.sys によって作成されたデバイス ノードに基づいて、VID と PID の直接一致を介して PnP サブシステムによって呼び出されます。 ドライバー .inf ファイルは、3DPrintService の設定に使用されるカスタム DLL を設定します (システムにまだインストールされていない場合)。

3dmon.dll

3DMon.dll は、3D プリンターと通信するためにスプーラーによって呼び出される、マイクロソフトが公開しているポート モニター再頒布可能バイナリです。

3dprintservice.exe

3DPrintService.exe は、ドライバーのセットアップ時に Windows サービスとしてインストールされるマイクロソフトが公開しているバイナリです。 3DMon は、このサービスと通信して、3D プリンターで印刷、bidi などの操作を実行します。

Partnerimpl.dll

Partnerimp.dll は、公開されたマイクロソフト インターフェイスをパートナーが実装したものです。 DLL は、プロトコルを使用してパートナーのデバイスと通信します。 3DPrintService.exe は、実行時にこの DLL を読み込み、3D プリンター デバイスの動作を促進します。

Diagram that shows the device communication flow for 3 D printer device operations.

プリンターの使用順序

  • スプーラーは、コマンドを 3DPrintService Windows サービスに送信する 3dmon.dll と通信します

  • 3DPrintService.exe は、NetworkService のアカウント資格情報で実行されます

  • スプーラーは、3dmon.dll を介して、3D プリンターが使用されるたびにコマンドを 3DPrintService に送信します

  • 3DPrintService は、パートナーが提供する実装 DLL でコマンドを処理し、実行時に API を呼び出します

  • 3DPrintService は、パートナーが提供する DLL からの応答をスプーラーに渡します

インターフェイスと相互作用

パートナー DLL は、次の API 関数をエクスポートする必要があります。

HRESULT Install([in] LPCWSTR args)

この API は省略可能であり、製造元がデバイスのカスタム ソフトウェアをインストールしたり、登録を行うために使用できます。 たとえば、デバイスのドライバー パッケージに含まれるモデリングのインストールなどです。 この API は、インストールを有効にするために SYSTEM 資格情報を使用して呼び出されます。

DWORD PrintApiSupported()

この API は、サードパーティの製造元が、サポートされている 3D プリント サービス API のバージョンを示すために使用します。 以下の API は、バージョン 1 の 3DPrintService と互換性があります。

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

この API は、プリンターの初期化を開始する印刷イベントの前に呼び出されます。 プリンターは、ジョブ固有の状態を ppPartnerData パラメーターに保存できます。 この呼び出しは、StartDocPort 呼び出しに似ています。

  • jobId - ジョブの追跡に使用されるジョブ ID

  • portName - 3D プリンターのポート名

  • printerName - この印刷ジョブが送信されるプリンターの名前

  • ppPartnerData - ジョブ固有のデータを格納するために使用できるポインターへのポインター

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

この API は、サード パーティの製造元がプリンターでドキュメントを印刷するために使用します。

  • jobId - ジョブの追跡に使用されるジョブ ID

  • portName - 3D プリンターのポート名

  • printerName - 印刷ジョブが送信されるプリンターの名前

  • pathToRenderedFile - レンダリングが実行された後のスプール ファイルの場所への UNC パス。 サードパーティの製造元は、この場所からファイルを処理し、そのデバイスで文書を印刷します。

  • ppPartnerData - InitializePrint API 呼び出し中にパートナー固有のデータ セットアップを格納するために発行されたポインターへのポインター。

  • printerName は、ポート名を使用してレジストリから取得できます。 サードパーティの製造元は、自社のデバイスとの通信にポート名を使用できない場合があります。 プリンター名は Windows コンピューター上で一意であり、そのソフトウェアはジョブを印刷するプリンターを識別できます。 マシンでアクティブなすべてのプリンターは、次のレジストリ キーにあります。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers

3d printer registry.

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

  • command - クエリとして送信される文字列コマンド

  • commandData - コマンド引数 (省略可能)

  • resultBuffer - クエリ引数の呼び出しの結果>

  • resultBufferSize - 結果バッファー文字列のサイズ

  • ppPartnerData - 現在のパートナー DLL インスタンスのポインターへのポインター

3Dprint サービスは、パートナー DLL を呼び出して、コマンドに割り当てるバッファーのサイズを取得します。

応答文字列を保持するメモリを割り当てた後、DLL が再度呼び出されて実際の結果が取得されます。

DLL は、Query() 関数が呼び出されるたびに新しい通信チャネルを開くことなく、以前の Query() 呼び出しからのインスタンス データを使用してデバイスと通信できます。

この API は、プリンターと通信してデバイスの構成に関する情報を取得したり、進行状況を印刷したり、デバイスの取り外しイベントをパートナー DLL に通知したりするために使用されます。

以下のコマンドは、製造元によってサポートされている必要があります。

コマンド CommandData 出力 Comments
\\Printer.3DPrint:JobStatus ジョブの開始 = {"Status": "ok"}、完了時に使用するステータス {"Status": "Completed"} スプーラーは、印刷キュー UI に返された値を表示します。 これにより、デバイスは印刷キュー UI で印刷中に関連情報を表示できます。 デバイスはここで任意の文字列 ("Busy" や "33% complete" など) を返すことができます。これは、印刷キュー ジョブの状態に逐語的に表示されます。
\\Printer.3DPrint:JobCancel {"Status": "Completed"} スプーラーは、ユーザーが印刷をキャンセルすると、このコマンドを呼び出します。 パートナー DLL は、取り消しが正常に行われ、ハンドルとスレッドが閉じられたときに、この値を返します。
\\Printer.Capabilities:Data PrintDeviceCapabilites (PDC) スキーマに準拠する XML 文字列。 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>

印刷の開始時にユーザーがデバイスを操作できるようにするためのオンボード ディスプレイやボタンを持たない 3D プリンターについては、上記の psdk3dx:userPrompt に示されているように、適切なユーザー プロンプト メッセージが設定された PDC xml を返すことを推奨します。 これは、既存の印刷の上に新しい印刷を開始しないようにするためです。 カスタム ステータス メッセージ <psk3dx:customStatus> は、スライス中に任意のメッセージを表示するために使用されます。

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

  • dwJobId - スプーラー内のジョブを追跡するために使用されるジョブ ID

  • pPortName - 3D プリンターのポート名

  • pPrinterName - この印刷ジョブが送信されるプリンターの名前

  • ppPartnerData - InitializePrint API 呼び出し時に設定されたジョブ固有のデータを保持するポインターへのポインター

クリーンアップは、印刷ジョブの正常な完了時、または印刷ジョブのキャンセル クエリの完了時に呼び出されます。 パートナー DLL がこの印刷用に初期化されたリソースをクリーンアップする機会を提供します。

HRESULT UnInstall([in]LPCWSTR args)

この API は、3D プリンター デバイスをアンインストールするときに呼び出され、製造元がインストールした可能性のあるソフトウェアをアンインストールするためのメカニズムを提供します。