
VEXPLOR AAS Studio는 자산관리 셸(AAS)을 브라우저에서 작성·검증·제공하고, AAS에 정의된 정보를 바탕으로 설비 값을 수집하는 오픈소스 웹 앱이다. 제작사 WACE는 AASX 파일 편집, Part 2 REST API 제공, 현장 데이터 수집과 OPC UA 게시를 한곳에 모았다고 설명한다. 저장소는 waceinc/vexplor-aas이며 Apache License 2.0으로 제공된다.
처음 사용하는 사람은 시작 화면에서 “Start with a sample”을 눌러 값이 채워진 설비 파일과 공정 구조를 열 수 있다. 기존 AASX 파일은 JSON 또는 XML 형식으로 불러와 트리 형태로 살펴보고 값을 편집하거나 내보낼 수 있다. 서브모델 값 표나 CSV 설비 목록에서 여러 값을 한꺼번에 채우는 기능도 제공한다. IDTA 템플릿을 설치하면 값마다 필수·수집·선택 항목을 표시하며, “Show only what to fill”을 눌러 입력할 항목만 볼 수 있다.
검증기는 패키지 구조(L1), 메타모델 제약(L2), 제출 업무 규칙(L3)의 세 계층에서 52개 규칙을 적용한다. 발견 항목 가운데 19개 규칙은 자동 수정할 수 있으며, 사용자는 수정 내용을 미리 보고 선택한 뒤 한꺼번에 적용한다. 이동된 항목은 기록된다. 결과는 인쇄 가능한 HTML 보고서로 내보낸다. 한국 제출 검증기 KOSMO Validator의 업무 규칙도 제출 전에 점검하지만, 이 앱의 검사는 사전 점검이며 최종 접수 여부를 결정하는 권한은 제출 검증기에 있다. 표준과 충돌하는 정책은 사용자가 판단하도록 표시한다.
AAS 메타모델 V3.0·V3.1·V3.2 파일을 열 수 있다. XML은 네임스페이스로 버전을 판별하고, 버전 표기가 없는 JSON은 내용이 들어갈 수 있는 가장 낮은 버전으로 읽는다. 내려받을 때는 원래 버전을 유지하거나 다른 버전을 선택할 수 있다. 낮은 버전으로 기록하면 빠지는 필드를 값과 함께 보여주며, assetKind의 Role·Batch나 entityType 누락처럼 표현할 수 없는 값이 있으면 “download with the values as they are”를 선택하지 않는 한 내보내기를 거부한다. 새 설비·샘플·여권 템플릿은 KOSMO가 요구하는 V3.1을 사용한다.
V3.0 파일 검증에는 공식 검사기 aas-test-engines 1.0.3을 사용한다. 이 검사기는 V3.0만 확인한다. V3.1·V3.2는 저장소 테스트에서 admin-shell-io/aas-specs-metamodel의 공식 JSON 스키마(v3.1.2·v3.2.0)로 검사하며, aas-test-engines는 아직 해당 버전을 검사하지 않는다. XML 읽기 오류 네 건을 2.9.0에서 수정했으므로 그보다 앞선 버전에서 XML을 올린 파일은 다시 업로드해야 한다. AASX는 JSON과 XML을 읽고 JSON으로 기록한다. V3.1·V3.2에서는 공백이나 비ASCII 문자가 든 첨부 파일명을 URI에 맞게 퍼센트 인코딩하고, V3.0 출력은 바꾸지 않는다.
데이터 수집은 AAS 안의 AID 서브모델에 적힌 주소를 기준으로 OPC UA, Modbus TCP, MQTT 장치에서 값을 읽는다. S7 및 MELSEC MC 프로토콜 PLC도 직접 읽을 수 있지만, 이는 표준 AID 바인딩이 아닌 VEXPLOR 확장 바인딩이다. 두 PLC 연결은 공개된 형식으로 만든 테스트 서버에서 확인했으며 실제 PLC에서는 아직 확인하지 않았다. 모두 읽기 전용이며 PLC 프로그램을 변경하지 않는다. HTTP와 BACnet 인터페이스는 AID에서 인식하지만 수집하지 않는다. 값은 실시간·오래됨·누락 상태로 표시하고, 설비별로 가동·정지·경보 상태 막대를 제공한다. 패턴 하나로 여러 태그를 추가할 수 있다.
공장 밖에 서버를 두는 경우에는 공장 PC에 별도 오픈소스 프로그램인 VEXPLOR Edge를 설치한다. 승인된 목록에 있는 PLC만 읽고, 서명된 배치를 HTTPS로 외부에 전송한다. 연결은 바깥 방향뿐이며 원격 정지 기능은 없다. Linux x64·arm64를 지원하고 Windows x64는 VEXPLOR Edge 1.2.0 이상이 필요하다. 설정의 Remote collectors에서 “+ Connect a collector”를 눌러 서버 주소와 읽기 목록을 확인하고, 안내된 명령 한 줄을 공장 PC에 붙여 넣어 연결한다. 수집기는 연결이 끊긴 동안 읽은 배치를 오래된 순서대로 보내며 기본적으로 maxQueueDays 30일까지 보관한다. OPC UA 구독은 deadband를 사용한다. 제작사가 측정한 6개 태그·1초 간격·5분 조건에서는 폴링 데이터가 283KB, 구독 데이터가 88KB였다.
2.10.0에서는 Siemens S7-300·400·1200·1500(ISO-on-TCP)과 MELSEC Q·L·iQ-R·iQ-F(MC protocol 3E binary)를 게이트웨이 없이 읽는 기능을 추가했다. 주소는 DB10.DBD4:REAL, D100, D10.3처럼 엔지니어링 도구 표기를 사용한다. AID 1.1에는 두 프로토콜의 바인딩이 없어 VEXPLOR 확장 바인딩 IRI로 표시하며, 다른 AID 도구는 이 인터페이스를 읽지 않는다. 서버는 COLLECT=on으로 읽고, 원격 수집에는 VEXPLOR Edge 1.2.0 이상이 필요하다. 더 낮은 버전의 Edge는 해당 인터페이스를 읽지 않고 이유를 표시하면서 나머지 인터페이스는 계속 읽는다. Windows 원격 수집기 설치 화면은 명령 프롬프트나 PowerShell에서 관리자 권한으로 실행할 한 줄을 제공한다. 이 명령은 파일을 내려받고 해시를 확인한 뒤 Windows 서비스를 설치·시작하며 실행 정책을 변경하지 않는다. 서비스 설치는 GitHub Windows 러너에서 시험했지만 공장 PC에서는 아직 확인하지 않았다.
기타 기능으로는 한 단계 실행 취소, 서브모델의 이전 상태 복원, 타입 파일과 단위 관리, 회사→라인→공정→설비→부품 구조로 묶는 공정 번들 내보내기가 있다. 타입 변경 사항은 줄 단위로 비교해 선택한 항목만 가져오며 현장에서 편집한 값은 덮어쓰지 않는다. Part 2 REST API는 다른 시스템이 앱에 저장된 AAS를 읽게 한다. MES·ERP·CMMS 연동에는 변경·실행 이벤트의 pull 피드(CloudEvents), 서명 웹훅, MQTT, JSON·CSV 내보내기, AASX 옆에 보관하는 ERP 번호, 서버 측 상태·경보·카운터·임계값 규칙이 포함된다. OPC UA 서버는 계정과 암호화를 요구한다. 계정에는 관리자·편집자·뷰어 역할이 있으며 변경 이력을 기록한다.
Part 2 REST API는 /api/v3.0과 V3.1·V3.2 클라이언트용 /api/v3 경로에서 같은 라우트를 제공한다. AasxFileServer는 6/6, ConceptDescription은 7/7, AAS Repository는 47/54, Submodel Repository는 38/45를 구현했으며 Registry와 Discovery는 일부만 지원한다. V3.2에서 새로 추가된 $recent-changes, $history, $signed, 비동기 패키지 작업은 구현되지 않아 404를 반환한다. 구현 범위는 node scripts/part2-coverage.mjs로 사양의 OpenAPI 파일과 비교할 수 있다.
제품 여권(DPP) 작성용으로 CC BY 4.0에 따라 공개된 IDTA 템플릿 여덟 개를 제공한다. 여기에는 DPP Part 1 메타데이터(IDTA 02099-1 1.0.2)와 배터리 여권 일곱 파트(IDTA 02035-1 – 7)가 포함된다. DPP-1~DPP-5 규칙은 필수 항목 일곱 개, 세분화(Model·Item·Batch), UTC 기준 lastUpdate, 콘텐츠 사양 ID, 셸의 assetKind와 세분화의 일치 여부를 확인한다. 이는 여권 데이터 작성과 점검을 돕는 기능이지 EU DPP 규정 준수 판정은 아니다.
VEXPLOR Logic Studio Cloud에서는 이 앱에서 작성하고 52개 규칙으로 확인한 AASX를 설비 화면에 끌어다 놓아 가져올 수 있다. 미리보기에서 타입·설비·공장·라인을 확인한 뒤 등록하면 각 설비가 타입과 연결된다. 타입 파일과 인스턴스 파일은 따로 가져온다. 같은 파일을 다시 끌어다 놓으면 중복 설비를 만들지 않고 “Nothing changes”로 끝난다. 실시간 값도 Logic Studio Cloud로 보내는 기능은 준비 중이며 아직 제공되지 않는다. 단계별 안내는 docs/logic-studio.md, 데이터 계약은 docs/edge-contract.md에 있다.
설치와 보안
Docker로 설치할 때 저장소를 복제하고 .env.example을 .env로 복사한 뒤 POSTGRES_PASSWORD를 설정한다. 이후 다음 명령을 실행하고 http://localhost:8080에 접속한다.
git clone <this repository> && cd <folder>
cp .env.example .env # only POSTGRES_PASSWORD is required
docker compose up -d --build
인터넷이 연결되지 않은 공장 서버에는 사이트 설치 번들을 사용할 수 있다. 데이터베이스 이미지 timescale/timescaledb는 Tiger Data의 TimescaleDB Community Edition이며 Timescale License를 적용한다. 저장소 라이선스와는 다르고, Docker가 사용자의 컴퓨터에서 Docker Hub로부터 내려받는다. -oss 이미지는 Apache-2 Edition으로 압축이나 연속 집계를 지원하지 않는다. 라이선스 안내
소스에서 실행하려면 Node.js 24 LTS를 사용한다. 22 이상도 동작한다.
npm install
npx tsc -b
npm run build --workspace apps/web
node apps/api/dist/server.js # http://localhost:8080
개발할 때는 API와 UI를 별도 터미널에서 실행한다.
npm run dev:api # API on 8080
npm run dev:web # UI on 5173 (in another terminal)
설정하지 않으면 서버는 127.0.0.1에서만 요청을 받는다. 외부에 공유하기 전 계정이나 API 키를 설정해야 한다. 시작 직후 Settings → Create the first administrator에서 첫 관리자를 만든다. 첫 계정이 생기기 전에는 서버가 열려 있으며, 계정이 하나라도 생기면 UI와 API 모두 로그인이나 API 키가 필요하다. 로그인 사용자가 있다면 앞단에 HTTPS를 구성해야 한다. 인증은 선택 사항이지만 계정과 API 키를 설정하지 않은 서버는 로컬 컴퓨터에서만 수신한다. OPC UA 서버(포트 4840)는 기본적으로 꺼져 있고 계정과 암호화(Sign 또는 SignAndEncrypt)가 필요하다. OPCUA_ALLOW_INSECURE=on을 설정하면 인증 없는 기존 포트를 복원할 수 있지만 격리된 테스트 네트워크에서만 사용하도록 안내한다. 로그인 정보는 설비 파일에 저장하지 않고 서버의 자격 증명 파일과 공장 PC의 credentials.json에 엔드포인트별로 보관한다. 보안 문제는 공개 이슈가 아닌 SECURITY.md에 안내된 경로로 신고한다.
서버 상태 화면은 데이터베이스가 멈추거나 과부하된 경우에도 약 7초 안에 응답하고 저장소 연결 실패를 표시하도록 바뀌었다. 원격 수집기 상태에는 디스크 여유 공간, 전송 실패, 시계 차이, 읽기 성공률, 대기열, 무응답, 연결된 설비 여부가 표시된다. “Show state”에서는 공장 PC의 CPU·메모리·디스크·가동 시간·시계 차이와 서버 연결 상태를 볼 수 있다. VEXPLOR Edge 1.1.0 이상이 보낸 값이 있으면 설비별 응답 시간·성공률·재연결 횟수와 최근 24시간 상태도 표시한다. 관리자는 설정에서 서버 저장소 연결, 디스크, 최근 한 시간 배치, 버전을 확인할 수 있다.
주요 릴리스 변경
2.8.1부터 원격 수집기 배치의 모든 파일 값과 도착 기록을 데이터베이스 한 트랜잭션으로 저장한다. 전에는 값마다 따로 기록했다. 제작사 측정에서 4코어 테스트 서버는 이전 방식으로 초당 약 11,500개 값에 그쳤고 데이터베이스가 절반 정도 유휴 상태였지만, 변경 후 같은 서버에서 약 50,000개를 처리했다. 이 수치는 해당 테스트 서버의 측정치다. PG_POOL_MAX로 데이터베이스 연결 수를 지정하며 기본값은 10이다.
2.8.0은 OPC UA 연결의 보안 모드와 정책 선택, OPC UA·MQTT 로그인 요구, 단위·Modbus 바이트 및 워드 순서(ABCD·CDAB·BADC·DCBA), 설비별 읽기 주기를 화면에 추가했다. 자동 수집과 원격 수집은 읽기 실패 이유를 저장해 화면을 다시 열어도 표시한다. MQTT 주소에 비밀번호가 들어간 이전 형식의 링크는 원격 수집기 목록에서 제외되며 AID-1 규칙으로 알린다. MQTT 로그인을 쓰려면 VEXPLOR Edge 1.1.0 이상이 필요하다.
2.7.0에서 원격 수집기를 별도 waceinc/vexplor-edge 저장소(Apache-2.0, 버전 1.0.0)로 분리했다. 수집기 연결은 버튼 한 번과 공장 Linux PC에 붙여 넣는 명령 한 줄로 진행하며 다운로드·해시 확인·설치·등록·승인을 수행한다. 수집 화면은 10초마다 갱신되고, OPC UA·Modbus TCP·MQTT 장치 판독 라이브러리도 배포 패키지에 포함됐다.
2.4.0은 공장 Linux 서버에 앱·데이터베이스·원격 수집기를 한 명령으로 설치하고 재부팅 후 다시 실행하는 기능을 추가했다. TimescaleDB Community Edition을 사용하면 7일보다 오래된 값을 압축하고 1분·1시간 집계를 만든다. 제작사 측정에서 1,000개 태그·1초 간격·1시간 조건의 데이터 크기는 1,099MB에서 50MB로 줄었다.
저장소와 참고 자료
저장소는 TypeScript 모노레포다. packages/aas-core는 V3.0·V3.1·V3.2 메타모델과 버전 변환, packages/aasx는 손실 없는 왕복을 지원하는 AASX 읽기·쓰기, packages/linter는 규칙·자동 수정·보고서, packages/store는 메모리·폴더·PostgreSQL 저장소를 제공한다. packages/collector는 AID를 해석하고 값을 수집하며 packages/opcua와 packages/fieldbus는 각각 OPC UA와 Modbus TCP·MQTT·S7·MC 연결을 담당한다. apps/api는 REST API 서버, apps/web은 React 프런트엔드다. 라이브러리는 GitHub 릴리스의 npm tarball로 제공되며 체크섬은 SHA256SUMS에 있다. 공개 npm의 @aas 범위는 WACE 소유가 아니므로 버전 번호로 설치하지 말고 릴리스 URL을 사용해야 한다. 사용 설명서 · 설치 안내 · 배포와 호스팅 · 52개 규칙 · 연동 안내 · 전체 릴리스
인터페이스와 서버가 작성하는 검사 결과·규칙 설명·보고서·번들 README·오류 메시지는 영어와 한국어로 제공한다. 언어를 직접 고르지 않으면 브라우저 언어를 따르며, 한국어 브라우저는 한국어, 그 밖에는 영어를 사용한다. 저장소는 Apache License 2.0으로 수정과 상용 제품 배포를 허용한다. 다만 VEXPLOR와 WACE 이름·로고는 WACE의 상표이며 사용 허가 대상이 아니다. NOTICE 및 제3자 고지를 참조한다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요