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

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

참고

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

아키텍처 결정

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 프린터 개발 노드를 만드는 커널 모드 디바이스 드라이버입니다. Winusb.sys 만든 디바이스 노드를 기반으로 VID & PID의 직접 일치를 통해 PnP 하위 시스템에 의해 호출됩니다. 드라이버 .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 설치([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 프린터의 portname

  • printerName - 이 인쇄 작업을 보낼 프린터의 이름입니다.

  • ppPartnerData - 작업별 데이터를 저장하는 데 사용할 수 있는 포인터에 대한 포인터입니다.

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

이 API는 타사 제조업체에서 프린터에 문서를 인쇄하는 데 사용됩니다.

  • jobId - 작업을 추적하는 데 사용되는 작업 ID

  • portName - 3D 프린터의 portname

  • printerName - 인쇄 작업이 전송되는 프린터의 이름

  • pathToRenderedFile - 렌더링이 수행된 후 스풀링된 파일의 위치에 대한 UNC 경로입니다. 타사 제조업체는 이 위치에서 파일을 처리하고 디바이스에 문서를 인쇄합니다.

  • ppPartnerData - InitializePrint API 호출 중에 파트너별 데이터 설정을 저장하기 위해 발급된 포인터에 대한 포인터입니다.

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

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers

3d 프린터 레지스트리.

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

  • command - 쿼리로 전송된 문자열 명령

  • commandData - 명령 인수(선택 사항)

  • resultBuffer - 쿼리 인수 호출 결과>

  • resultBufferSize - 결과 버퍼 문자열의 크기

  • ppPartnerData - 현재 파트너 DLL instance 대한 포인터 포인터

3Dprint 서비스는 파트너 DLL을 호출하여 명령에 할당할 버퍼의 크기를 가져옵니다.

응답 문자열을 보유하도록 메모리를 할당한 후 DLL이 다시 호출되어 실제 결과를 가져옵니다.

DLL은 이전 IntializePrint() 호출의 instance 데이터를 사용하여 Query() 함수가 호출 될 때마다 새 통신 채널을 열지 않고 디바이스와 통신할 수 있습니다.

이 API는 프린터와 통신하여 디바이스 구성에 대한 정보를 가져오거나, 진행률을 인쇄하거나, 파트너 DLL에 디바이스 분리 이벤트를 알리는 데 사용됩니다.

아래 명령은 제조업체에서 지원해야 합니다.

명령 CommandData 출력 의견
\\Printer.3DPrint:JobStatus 작업 시작 = {"Status": "ok"}, 완료 시 사용할 상태 {"Status": "Completed"} 스풀러는 인쇄 큐 UI에 반환된 모든 값을 표시합니다. 이렇게 하면 인쇄 큐 UI에서 인쇄하는 동안 디바이스에서 관련 정보를 표시할 수 있습니다. 디바이스는 여기서 임의의 문자열(예: "사용 중" 또는 "33% 완료")을 반환할 수 있으며 인쇄 큐 작업 상태 축자 표시됩니다.
\\Printer.3DPrint:JobCancel {"Status": "Completed"} 스풀러는 사용자가 인쇄를 취소할 때 이 명령을 호출합니다. 파트너 DLL은 취소가 성공하고 핸들과 스레드가 닫혔을 때 이 값을 반환합니다.
\\Printer.Capabilities:Data PrintDeviceCapabilites(PDC) 스키마를 준수하는 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 프린터 디바이스를 제거할 때 호출되며 제조업체가 설치했을 수 있는 소프트웨어를 제거하는 메커니즘을 제공합니다.