3D 프린터에 사용자 지정 USB 인터페이스 사용

이 항목에 설명된 아키텍처를 사용하면 v3 및 v4 인쇄 에코시스템에서 사용자 지정 USB 인터페이스 3D 프린터를 지원할 수 있습니다. 3dmon.dll 표준 포트 모니터는 로컬 서비스 자격 증명으로 실행되는 Windows 3DPrintService에 3D 인쇄 작업 명령을 전달합니다. 서비스는 파트너 DLL을 로드하고 통신하여 3D 인쇄 작업에 필요한 사용자 지정 명령을 실행합니다. 파트너 DLL과 3dmon.dll3dprintservice.exe 재배포 가능 패키지는 디바이스의 USB 드라이버 패키지에 의해 설치됩니다. 파트너 DLL은 3DPrintService통신할 함수 집합을 구현하고 내보내야 합니다. 인쇄 스풀러 서비스와 상호 작용하는 데 필요한 나머지 기능은 3dmon.dll 구현됩니다.

참고 항목

이 아키텍처를 사용하려면 파트너 DLL에서 스레드로부터 안전한 다중 인스턴스를 사용해야 합니다.

아키텍처 결정

3DPrintService Windows 서비스는 인쇄 워크플로 중에 파트너가 제공한 DLL에서 정의된 특정 API를 로드하고 호출하는 데 사용됩니다. 이러한 API는 프린터와의 통신을 허용합니다.

KMDF USB 필터 드라이버 패키지는 지원되는 3D 프린터용 PnP를 통해 설치하기 위해 Windows 업데이트 게시됩니다. KMDF 드라이버는 파트너 소프트웨어를 설치하고 3D 프린터 디바이스 노드를 만듭니다. 3D 프린터 디바이스 노드는 Windows 업데이트 파트너가 게시한 v4 인쇄 드라이버를 사용하여 설치됩니다.

패키징 결정

이진 파일 및 이진 종속성

아키텍처는 하드웨어 제조업체가 Windows 업데이트 게시한 드라이버를 사용합니다. 이 드라이버에는 다음 Microsoft 제공 재배포 가능 바이너리 및 해당 종속성이 포함됩니다.

  • 3dmon.dll

  • 3dprintservice.exe

  • ms3dprintusb.sys

커널 모드 USB 필터 드라이버

KMDF 드라이버는 파트너가 게시하고 아래 다이어그램에 표시된 구성 요소로 구성됩니다. 디바이스를 하드웨어 ID(일반적으로 VID 및 PID)와 일치합니다. 드라이버는 설치 시 인쇄 큐 및 슬라이서 드라이버의 설치를 트리거하는 3D 프린터 디바이스 노드를 만듭니다. 파트너는 생성된 3D 프린터 디바이스 노드에 대한 v4 프린터 드라이버를 제공합니다.

kmdf usb 필터 드라이버.

MS3DPrintUSB.sys

Enum\3DPrint 아래에 3D 프린터 개발 노드를 만드는 커널 모드 디바이스 드라이버입니다. PnP 하위 시스템은 Winusb.sys 만든 디바이스 노드를 기반으로 VID 및 PID의 직접 일치를 통해 호출됩니다. 드라이버 .inf 파일은 3DPrintService를 설정하는 데 사용되는 사용자 지정 DLL을 설정합니다(시스템에 아직 설치되지 않은 경우).

3dmon.dll

3DMon.dll 3D 프린터와 통신하기 위해 스풀러가 호출한 Microsoft에서 게시한 포트 모니터 재배포 가능 이진 파일입니다.

3dprintservice.exe

3DPrintService.exe 드라이버 설치 중에 Windows 서비스로 설치된 Microsoft에서 게시한 이진 파일입니다. 3DMon은 이 서비스와 통신하여 3D 프린터로 인쇄, 비디 등의 작업을 수행합니다.

Partnerimpl.dll

Partnerimp.dll 게시된 Microsoft 인터페이스의 파트너 구현입니다. DLL은 프로토콜을 사용하여 파트너의 디바이스와 통신합니다. 3DPrintService.exe 런타임에 이 DLL을 로드하여 3D 프린터 디바이스의 작업을 구동합니다.

3D 프린터 디바이스 작업에 대한 디바이스 통신 흐름을 보여 주는 다이어그램

프린터 사용 시퀀스

  • 스풀러는 3DPrintService windows 서비스로 명령을 보내는 3dmon.dll 통신합니다.

  • 3DPrintService.exe NetworkService의 계정 자격 증명을 사용하여 실행됩니다.

  • 스풀러는 3dmon.dll 통해 3D 프린터를 사용할 때마다 3DPrintService에 명령을 보냅니다.

  • 3DPrintService는 명령을 처리하고 파트너가 제공한 구현 DLL에서 런타임에 API를 호출합니다.

  • 3DPrintService는 파트너가 제공한 DLL에서 스풀러로 응답을 전달합니다.

인터페이스 및 상호 작용

파트너 DLL은 다음 API 함수를 내보내야 합니다.

HRESULT Install([in] LPCWSTR 인수)

이 API는 선택 사항이며 제조업체에서 디바이스에 대한 사용자 지정 소프트웨어 또는 등록을 설치하는 데 사용할 수 있습니다. 예를 들어 디바이스에 대한 드라이버 패키지에 포함된 모델링 설치입니다. 이 API는 설치를 사용하도록 설정하기 위해 SYSTEM 자격 증명으로 호출됩니다.

DWORD PrintApiSupported()

이 API는 타사 제조업체에서 지원되는 3D 인쇄 서비스 API의 버전을 나타내는 데 사용됩니다. 아래 API는 3DPrintService 버전 1과 호환됩니다.

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 호출 중에 파트너 특정 데이터 설정을 저장하기 위해 발급된 포인터에 대한 포인터입니다.

  • 프린터 이름은 포트 이름을 사용하여 레지스트리에서 가져올 수 있습니다. 타사 제조업체는 포트 이름을 사용하여 디바이스와 통신하지 못할 수 있습니다. 프린터 이름은 Windows 컴퓨터에서 고유하며 해당 소프트웨어는 작업을 인쇄할 프린터를 식별할 수 있습니다. 컴퓨터에서 활성 상태인 모든 프린터는 다음 레지스트리 키에서 찾을 수 있습니다.

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers

HRESULT Query(_In_ LPCWSTR command, _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"}, 완료 {"Status": "Completed"}에 사용할 상태 스풀러는 인쇄 큐 UI에 반환된 값을 표시합니다. 이렇게 하면 인쇄 큐 UI에서 인쇄하는 동안 디바이스에서 관련 정보를 표시할 수 있습니다. 디바이스는 여기에서 임의의 문자열을 반환할 수 있으며(예: "사용 중" 또는 "33% 완료") 인쇄 큐 작업 상태에 축자 표시 됩니다.
\\Printer.3DPrint:JobCancel {"Status": "Completed"} 스풀러는 사용자가 인쇄를 취소할 때 이 명령을 호출합니다. 파트너 DLL은 취소에 성공하고 핸들과 스레드가 닫혔을 때 이 값을 반환합니다.
\\Printer.Capabilities:Data PDC(PrintDeviceCapabilites) 스키마를 따르는 XML 문자열입니다. PDC 쿼리는 프린터에 대한 자세한 정보를 가져오려는 앱에서 호출됩니다. 데이터는 디바이스의 기능을 설명하는 데 사용되며 드라이버가 Microsoft 슬라이서에 의존하는 경우 슬라이서 설정을 포함할 수 있습니다. 샘플 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 프린터 디바이스를 제거할 때 호출되며 제조업체가 설치했을 수 있는 소프트웨어를 제거하는 메커니즘을 제공합니다.