SDK 설치
PDComm SDK는 설치 프로그램 없이 압축 파일로 받습니다. 압축을 풀고, 응용 프로그램이 라이브러리를 찾게 하고, 라이선스 파일을 두면 설치가 끝납니다. 가상 시리얼 포트는 별도 설치 파일을 씁니다.
받는 파일
섹션 제목: “받는 파일”pdcomm-secsgem-windows-x64-<버전>.zip 또는 pdcomm-secsgem-linux-x64-<버전>.tar.gz
| 경로 | 내용 |
|---|---|
bin/ |
미리 빌드한 예제 pdcomm-tutorial과 C# 예제 PDComm.Tutorial.dll |
sdk/bin/ |
라이선스 확인 명령 pdcomm-license(Windows는 pdcomm-license.exe) |
sdk/include/ |
C 헤더(pdcomm*.h)와 C++ 헤더(pdcomm*.hpp) |
sdk/lib/ |
네이티브 라이브러리. Windows는 pdcomm_ffi.dll과 가져오기 라이브러리 pdcomm_ffi.dll.lib, Linux는 libpdcomm_ffi.so |
sdk/managed/PDComm.dll |
.NET 바인딩 (net10.0) |
sdk/examples/tutorial/ |
C++·C# 예제 소스 |
simulator/ |
시뮬레이터 GUI(pdcomm-simulator), 헤드리스, MCP 서버와 Qt 라이브러리, 라이선스 고지. Linux는 simulator/bin, simulator/lib로 나뉩니다. |
manifest.json |
버전, ABI, 운영체제, 모든 파일의 SHA-256 |
최상위 폴더는 Windows와 Linux에서 pdcomm-modbus, macOS에서 pdcomm-modbus-macos-arm64입니다.
| 경로 | 내용 |
|---|---|
bin/ |
헤드리스 시뮬레이터 pdcomm-modbus-headless, MCP 서버 pdcomm-modbus-mcp, 라이선스 확인 명령 pdcomm-license. GUI를 포함한 패키지에는 pdcomm-modbus-simulator도 있습니다. |
lib/ |
네이티브 라이브러리(pdcomm_modbus_ffi.dll과 .dll.lib, libpdcomm_modbus_ffi.so, libpdcomm_modbus_ffi.dylib)와 필요한 런타임 |
include/pdcomm/modbus/ |
C 헤더와 C++ 헤더 |
bindings/ |
.NET 바인딩 소스(dotnet/PDComm.Modbus), Qt 도우미(qt/), MFC 도우미(mfc/) |
licenses/ |
제3자 라이선스 |
manifest.json |
프로토콜, 기능(features), ABI, 운영체제, 모든 파일의 SHA-256 |
예제는 별도 ZIP의 practice/ 폴더(CMake 프로젝트, C# 프로젝트, 시나리오 파일)로 받습니다.
pdcomm-opcua-<프로필>-<os>-<arch> 이름의 압축 파일입니다. Windows는 .zip, 나머지는 .tar.gz입니다. 필요한 프로필만 받습니다.
| 프로필 | 내용 |
|---|---|
native |
C 헤더, C++ 헤더, 네이티브 라이브러리, OpenSSL 3 런타임, C·C++ 예제. Windows 패키지에는 MFC 도우미(bindings/mfc/)도 있습니다. |
qt |
native 내용과 Qt 도우미 헤더, Qt 예제 |
dotnet |
.NET 어셈블리(lib/dotnet/PDComm.OpcUa.dll)와 소스, 네이티브 라이브러리, .NET 예제 |
apps |
시뮬레이터 GUI, 헤드리스(pdcomm-opcua-headless), MCP 서버 |
헤더는 include/pdcomm/opcua/, 예제는 examples/opcua/, 라이선스 확인 명령 pdcomm-license는 bin/에 있습니다. 네이티브 라이브러리는 Windows에서 bin/, 그 밖의 OS에서 lib/에 있습니다. licenses/와 NOTICE.txt에는 제3자 고지가, manifest.json에는 프로필, ABI, 공개 함수, 모든 파일의 SHA-256이 있습니다.
무결성 확인
섹션 제목: “무결성 확인”-
압축 파일의 SHA-256을 전달받은 값과 비교합니다.
터미널 창 shasum -a 256 <패키지 파일> # macOSsha256sum <패키지 파일> # LinuxWindows PowerShell에서는
Get-FileHash <패키지 파일> -Algorithm SHA256을 씁니다. -
압축을 푼 뒤 SDK 최상위 폴더에서
manifest.json의 해시와 실제 파일을 비교합니다. 모두 같으면OK를 출력합니다.터미널 창 python3 -c 'import hashlib, json; m = json.load(open("manifest.json")); bad = [p for p, h in m["files"].items() if hashlib.sha256(open(p, "rb").read()).hexdigest() != h]; print("OK" if not bad else bad)' -
운영체제와 아키텍처가 맞는지 확인합니다.
터미널 창 python3 -c 'import json; m = json.load(open("manifest.json")); print(m["protocol"], hex(m["abi"]), m["os"], m["architecture"])'macOS용 Modbus SDK라면
modbus 0x10001 Darwin arm64처럼 출력합니다.
폴더 배치
섹션 제목: “폴더 배치”- 공백이 없는 경로에 풀고 폴더 구조를 그대로 둡니다. 시뮬레이터의 Qt 플러그인, 라이선스 고지, 런타임 라이브러리는 실행 파일과 함께 있어야 합니다.
- 운영체제와 아키텍처가 다른 파일을 섞지 않습니다. 예를 들어 Windows DLL을 Linux 폴더에 복사하지 않습니다.
- SDK를 옮겼다면 응용 프로그램을 다시 빌드합니다. 빌드 결과에 SDK의 라이브러리 경로가 기록될 수 있습니다.
라이브러리 경로 설정
섹션 제목: “라이브러리 경로 설정”응용 프로그램이 실행될 때 운영체제가 네이티브 라이브러리를 찾아야 합니다.
PowerShell에서 라이브러리 폴더를 PATH 앞에 추가합니다. SECS/GEM은 sdk\lib, Modbus는 lib, OPC UA는 bin입니다.
$env:PATH = "C:\PDComm\pdcomm-modbus\lib;$env:PATH"VCRUNTIME140.dll이나 MSVCP140.dll이 없다는 오류가 나면 x64 Visual C++ 재배포 가능 패키지를 설치합니다.
LD_LIBRARY_PATH에 라이브러리 폴더를 추가하거나, 빌드할 때 -Wl,-rpath로 경로를 기록합니다.
export LD_LIBRARY_PATH="$HOME/PDComm/pdcomm-modbus/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"패키지의 Linux 시뮬레이터는 실행 스크립트가 라이브러리와 Qt 경로를 직접 설정합니다.
라이브러리는 @rpath로 자신을 찾게 되어 있습니다. 빌드할 때 -Wl,-rpath,<SDK>/lib를 지정합니다. 빌드한 프로그램을 바로 실행할 때는 DYLD_LIBRARY_PATH를 지정해도 됩니다.
c++ -std=c++14 -I "$MODBUS_SDK/include" main.cpp -L "$MODBUS_SDK/lib" -lpdcomm_modbus_ffi -Wl,-rpath,"$MODBUS_SDK/lib" -o main라이선스 설치
섹션 제목: “라이선스 설치”SDK 라이브러리는 새 통신을 시작할 때 라이선스를 확인합니다. 라이선스가 없으면 SECS/GEM은 상태 16(PDCOMM_LICENSE_REQUIRED), OPC UA는 상태 11, Modbus는 오류 코드 license_required로 거부합니다. 시뮬레이터와 가상 시리얼 포트 도구는 라이선스 없이 씁니다.
-
받은 라이선스 파일(평가판, 개발, 런타임)을
pdcomm.license라는 이름으로 응용 프로그램 실행 파일 옆에 둡니다. 개발 중에는 환경 변수PDCOMM_LICENSE_FILE에 파일 경로를 지정해도 됩니다.터미널 창 export PDCOMM_LICENSE_FILE="$HOME/pdcomm/pdcomm.license"Windows PowerShell에서는
$env:PDCOMM_LICENSE_FILE = "$HOME\pdcomm\pdcomm.license"를 씁니다. -
SDK 패키지에 들어 있는
pdcomm-license명령으로 라이선스가 이 컴퓨터에서 유효한지 확인합니다. 허용되는 모듈은licensed또는evaluation으로 나옵니다.터미널 창 pdcomm-license verify "$PDCOMM_LICENSE_FILE" -
SECS/GEM 런타임 라이선스처럼 호스트 ID에 묶인 라이선스를 받으려면 그 컴퓨터에서
pdcomm-license host-id를 실행해 나온 값을 보냅니다.
PDComm을 ZIP 하나로 전달받았다면 최상위의 license/README.txt에 라이선스 설치 방법이 요약되어 있습니다. 각 패키지의 licenses/ 폴더는 제3자 구성 요소의 고지이며 PDComm 라이선스 파일과 관계없습니다. 설치 위치, API, 상태 확인과 문제 해결은 라이선스 설치와 확인에서 설명합니다.
빌드 설정
섹션 제목: “빌드 설정”| 제품 | C/C++ | .NET |
|---|---|---|
| SECS/GEM | 컴파일러에 -I <sdk>/include, -L <sdk>/lib -lpdcomm_ffi(Windows는 pdcomm_ffi.dll.lib) |
-p:PDCommSdk=<sdk 폴더>. 프로젝트가 <sdk>/managed/PDComm.dll을 참조합니다. |
| Modbus | CMake -DPDCOMM_MODBUS_SDK=<SDK 폴더> |
-p:PdcommModbusSdk=<SDK 폴더>. 프로젝트가 bindings/dotnet/PDComm.Modbus를 참조합니다. |
| OPC UA | CMake -DPDCOMM_OPCUA_SDK=<SDK 폴더> |
-p:PdcommOpcUaSdk=<SDK 폴더> |
.NET 바인딩은 NuGet 패키지가 아닙니다. 프로젝트가 SDK 폴더의 어셈블리나 소스를 직접 참조합니다.
.NET 프로그램은 네이티브 라이브러리를 절대 경로로 지정합니다. SECS/GEM은 프로그램을 시작할 때 PdcommRuntime.Initialize("/opt/pdcomm/sdk/lib/libpdcomm_ffi.so")처럼 한 번 호출합니다. Modbus 예제는 명령줄 인수로 받은 경로를 NativeLibrary.SetDllImportResolver로 등록합니다.