VFB와 VFC(PortGroup)
이 장에서 할 일
이 장에서는 VFB 편집기에서 컴포지션과 원자 SWC를 직접 만들고, 그 위에 VFC(Virtual Function Cluster)를 올린다. AUTOSAR에서 VFC는 별도의 요소가 아니라 PortGroup으로 표현된다. 기능에 참여하는 SWC 포트를 PortGroup 하나로 묶고, 그 PortGroup 이름을 원자 SWC부터 루트 컴포지션까지 같게 유지한다.
먼저 컴포지션 ParkSensor_RR과 그 안의 원자 SWC ParkDistanceSensing을 처음부터 만든다. 그다음 VFB 루트의 구성을 확인하고, 방금 만든 ParkDistanceSensing에 PortGroup VFC_ParkAssist를 만든다. 마지막으로 VFC (PNC Overlay) 아이콘으로 VFC별 참여 컴포지션을 확인한다.
이 장을 마치면 다음 상태가 된다.
- 루트
PncVehicle에 컴포지션ParkSensor_RR이 있고, 그 안에 원자 SWCParkDistanceSensing이 있다. 두ParkDistance포트는 위임 커넥터로 이어지고, 컴포지션의ParkDistance포트는 루트에서SouthZone의ParkDistance포트와 어셈블리 커넥터로 이어진다. ParkSensor_RR컴포지션이 System 편집기의 노드ParkSensor_RR [ECU]에 매핑되어 있다.ParkDistanceSensing에 PortGroupVFC_ParkAssist(CATEGORYPARTIAL_NETWORKING, OUTER PORTSParkDistance)가 있다.- 상위 컴포지션
ParkSensor_RR와 루트PncVehicle에 같은 이름의 PortGroupVFC_ParkAssist가 자동으로 생긴다. - VFC 패밀리 규칙(같은 이름 규칙)을 이해하고, PNC Overlay로 VFC 참여 컴포지션을 확인할 수 있다.
시작하기 전에
- 인터페이스와 SOME/IP 서비스를 마쳐야 한다. 이 장의 포트는 5장에서 만든 PortInterface
SRI_ParkDistance를 쓴다. - 앞 장까지는 VFB 루트
PncVehicle이 비어 있다. 이 장에서 System 편집기의 노드마다 컴포지션 1개씩 모두 14개를 만든다. 대표로ParkSensor_RR을 처음부터 끝까지 따라 만들고, 나머지 13개는 만드는 방법이 같으므로 나머지 컴포지션 13개의 표를 보고 반복한다. - 대표 절차의 마지막에
ParkSensor_RR의 포트를SouthZone의 포트와 잇는다. 그래서 표의 13개를 먼저 만든 다음 대표 절차를 따라오면 그림과 같은 화면이 된다. 이 장의 절차 그림도 컴포지션 13개가 있는 상태에서 찍었다. SouthZone컴포지션에는 R-PortParkDistance(PortInterfaceSRI_ParkDistance)가 있다. 이 장에서 만들 어셈블리 커넥터의 상대이다.- 토폴로지 설계에서 System 편집기에 만든 노드
ParkSensor_RR [ECU]가 있다. 이 장에서 ECU/HPC Mapping의 대상이 된다. - PortGroup은 아직 하나도 없고, PNC와 VFC의 연결(PNC 매핑의 VFC 참조)도 아직 없다.
SWC와 컴포지션 만들기
대표로 말단 ECU용 컴포지션 ParkSensor_RR과 그 안의 원자 SWC ParkDistanceSensing을 만든다.
컴포지션 만들기
-
왼쪽 EDITOR 뷰의 DESIGN 아래에서 VFB를 클릭한다.
PNC:VFB 탭이 열리고, 캔버스 왼쪽 위에 루트 컴포지션 이름
PncVehicle이 보인다. -
캔버스 아래쪽 도구막대에서 Auto Layout 버튼을 누른다. Zoom In, Zoom Out, Fit to View 다음의 네 번째 버튼이다.
진행 대화상자가 잠깐 나타났다가 사라지고, 컴포지션이 정렬된다. 전체가 화면에 들어오지 않으면 Fit to View를 누른다. Auto Layout으로 바뀐 배치는 저장하지 않은 변경이 되며, 뒤에서 VFB 편집기를 저장할 때 함께 저장된다.
-
SouthZone근처의 빈 캔버스를 우클릭하고 Add Composition을 누른다.
그림 6-1. 컴포지션 13개가 있는 VFB 루트에서 빈 캔버스를 우클릭한 화면. ① 누를 Add Composition. 메뉴의 나머지 항목은 Attach Composition과 Add Interface Mapping이다.
참고. 뒤에서 이 컴포지션의 포트를
SouthZone의 포트와 이어야 한다. 두 노드가 한 화면에 함께 보이는 자리를 우클릭하면 편하다.우클릭한 자리에 노드가 생긴다. 기본 이름은
Composition_0이다. -
새 노드를 클릭한다. 오른쪽에 COMPOSITION 속성 패널이 나타난다.

그림 6-2. 새로 만든 컴포지션. ① 캔버스에 생긴 노드
Composition_0. ② NAME =Composition_0. ③ AS PROTOTYPE =Composition_0. 아래에는 PORTS =No ports available, PORT GROUPS =No port groups가 보인다. -
NAME에
ParkSensor_RR을 입력하고 Tab을 누른다. 이어서 AS PROTOTYPE에도ParkSensor_RR을 입력하고 Tab을 누른다.
그림 6-3. 이름을 바꾼 뒤의 화면. ① 노드. NAME과 AS PROTOTYPE이 모두
ParkSensor_RR이다.주의. NAME을 바꿔도 AS PROTOTYPE은 따라 바뀌지 않는다. 두 칸을 각각 고쳐야 한다. 루트의 프로토타입 이름과 SWC-ECU 매핑이 모두 AS PROTOTYPE 값을 키로 쓰기 때문이다.
원자 SWC 만들기
-
ParkSensor_RR노드를 더블클릭해 안으로 들어간다(드릴다운).캔버스 왼쪽 위에 경로 System › ParkSensor_RR가 표시되고, 빈 프레임
ParkSensor_RR이 보인다.참고. 경로의 첫 항목은 루트 이름(
PncVehicle)과 관계없이 System으로 표시된다. System을 누르면 루트 화면으로 돌아간다. -
프레임 안을 우클릭하고 Add SWC에 마우스를 올린 뒤 Application을 누른다.

그림 6-4. 프레임 안을 우클릭한 화면. ① Add SWC. ② 서브메뉴에서 고를 Application. 서브메뉴의 나머지는 Composition, Adaptive Application, Complex Device Driver, Ecu Abstraction, Sensor Actuator, Service이다. 프레임 바깥의 빈 캔버스를 우클릭하면 이 메뉴가 나오지 않는다.
프레임 안에 노드가 생긴다. 기본 이름은
Application_0이다. -
새 노드를 클릭한다. 오른쪽에 APPLICATION 속성 패널이 나타난다.

그림 6-5. 새로 만든 원자 SWC. ① 프레임 안의 노드
Application_0. ② NAME =Application_0. ③ AS PROTOTYPE =Application_0_0. 기본값이 서로 다르다. -
NAME에
ParkDistanceSensing을 입력하고 Tab을 누른다. AS PROTOTYPE에도ParkDistanceSensing을 입력하고 Tab을 누른다. 컴포지션과 같은 이유로 두 칸을 각각 고친다.
포트 만들기
SWC의 포트와 컴포지션 경계의 포트를 하나씩 만든다. 둘 다 이름은 ParkDistance, PortInterface는 SRI_ParkDistance이다.
-
ParkDistanceSensing노드의 오른쪽 가장자리 근처를 우클릭하고 Add Port › PPort를 고른다.
그림 6-6. SWC를 우클릭한 화면. ① Add Port. ② 서브메뉴에서 고를 PPort. 서브메뉴의 나머지는 RPort, PRPort이다. 메뉴의 나머지 항목은 Detach SWC, Delete이다.
참고. 포트는 우클릭한 지점에서 가장 가까운 경계면에 놓인다. 노드 머리글 근처를 우클릭하면 포트가 위쪽 모서리에 생겨 이름과 겹친다. 예제처럼 오른쪽에 두려면 오른쪽 가장자리를 우클릭한다.
-
새 포트를 클릭한다. 속성 패널 제목이 PPORT로 바뀐다. NAME에
ParkDistance를 입력하고, PORT INTERFACE의Type to search...를 눌러 목록에서SenderReceiver: SRI_ParkDistance를 고른다.
그림 6-7. 포트의 PortInterface를 고르는 중. ① NAME =
ParkDistance. ② PORT INTERFACE의 검색 칸. ③ 목록에서 고를SenderReceiver: SRI_ParkDistance. 목록에는 5장에서 만든 SenderReceiver 인터페이스가 함께 나온다. 포트에는 PortInterface가 반드시 있어야 하므로, 고르기 전에는 PORT INTERFACE 라벨이 빨간색이고 상태 표시줄의 V 아이콘에 오류 배지1이 붙는다. 고르면 라벨 색이 돌아오고 배지도 사라진다.참고. 노드가 선택되어 있으면 리사이즈 핸들이 포트 위에 겹쳐, 포트를 눌러도 노드가 다시 선택된다. 빈 캔버스를 한 번 클릭해 선택을 푼 뒤 포트를 클릭한다. 포트가 작아 누르기 어려우면 Ctrl을 누른 채 마우스 휠을 굴려 확대한다. 드릴다운 상태에서 Fit to View는 프레임과 경계 포트를 캔버스에 맞춘다. 속성 패널이 열려 있으면 캔버스 오른쪽을 가리므로, 프레임의 오른쪽 가장자리가 가려지면 패널을 접는다.
-
이번에는 프레임의 오른쪽 가장자리를 우클릭하고 Add Port › PPort를 고른다. 새 경계 포트도 NAME =
ParkDistance, PORT INTERFACE =SenderReceiver: SRI_ParkDistance로 맞춘다.
그림 6-8. 포트 두 개를 만든 화면(아직 연결 전). ① 프레임 경계에 만든 컴포지션 포트. ②
ParkDistanceSensing에 만든 SWC 포트. 오른쪽 DATA ELEMENT에는SRI_ParkDistance의 데이터 요소uint8 Distance1~Distance4와boolean SensorFault가 NON-QUEUED / QUEUED 토글과 함께 보인다.
위임 커넥터로 잇기
컴포지션 경계 포트와 내부 SWC 포트를 잇는 커넥터를 위임(delegation) 커넥터라고 한다.
-
포트를 우클릭하면 Connect to가 있지만, 이 화면에서는 후보가 나오지 않는다.

그림 6-9. SWC 포트를 우클릭한 화면. ① Connect to. ② 서브메뉴에 후보가 없고
(No compatible ports)만 표시된다. 메뉴의 나머지 항목은 Connect to Mapping, Delete이다.주의. 같은 PortInterface를 쓰는 경계 포트가 있는데도 Connect to 후보가 비어 있다. 이 장에서는 Shift+드래그로 잇는다.
-
SWC 포트를 Shift를 누른 채 경계 포트까지 끌어다 놓는다.

그림 6-10. Shift+드래그 직전. ① 끌기를 시작할 SWC 포트. ② 놓을 컴포지션 경계 포트.
두 포트를 잇는 선이 그려진다.

그림 6-11. 위임 커넥터까지 만든
ParkSensor_RR내부(속성 패널을 접은 화면). ① 프레임ParkSensor_RR. SWC 포트에서 경계 포트로 선이 이어져 있다.참고. 커넥터 이름은 PAIO가
Delegation_ParkDistance_ParkDistanceSensing처럼 자동으로 붙인다. 이름은 커넥터를 선택한 뒤 속성 패널의 NAME에서 바꿀 수 있고, 모델의 의미는 바뀌지 않는다.
어셈블리 커넥터로 잇기
서로 다른 컴포지션의 포트를 잇는 커넥터를 어셈블리(assembly) 커넥터라고 한다. ParkSensor_RR의 ParkDistance(P)를 SouthZone의 ParkDistance(R)에 잇는다.
-
경로의 System을 눌러 루트 화면으로 돌아간다.
-
루트에서도 Connect to의 후보는 비어 있다.

그림 6-12. 루트에서
ParkSensor_RR의 포트를 우클릭한 화면. ① Connect to. ② 서브메뉴의(No compatible ports). -
ParkSensor_RR의 포트를 Shift를 누른 채SouthZone의ParkDistance(R) 포트까지 끌어다 놓는다.
그림 6-13. 루트에서 Shift+드래그 직전. ① 끌기를 시작할
ParkSensor_RR의 포트ParkDistance. ② 놓을SouthZone의 포트ParkDistance.두 컴포지션을 잇는 선이 그려진다.
참고.
SouthZone의 왼쪽 경계에는 포트가 여러 개 나란히 있고 캔버스에 이름이 표시되지 않는다. 어느 포트인지 확실하지 않으면 포트를 클릭해 속성 패널의 NAME이ParkDistance인지 확인한다.
ECU에 매핑하고 저장하기
-
루트에서
ParkSensor_RR노드를 우클릭하고 ECU/HPC Mapping › ParkSensor_RR [ECU] 항목을 고른다.
그림 6-14. 컴포지션 노드를 우클릭한 화면. ① ECU/HPC Mapping. ② 고를 항목
ParkSensor_RR [ECU]. 이미 다른 컴포지션에 매핑된 노드는WestZone [ECU] (<- WestZone)처럼 뒤에 매핑된 컴포지션 이름이 붙는다. 목록 끝에는 New ECU, New HPC가 있다.참고. 매핑한 직후에는 캔버스의 노드 머리글에 ECU 아이콘도, 대괄호 안의 매핑 노드 이름도 붙지 않고
ParkSensor_RR로만 표시된다. 매핑 자체는 저장되며, 편집기를 닫았다가 다시 열면 머리글에 ECU 아이콘이 붙고ParkSensor_RR [ParkSensor_RR]로 표시된다. -
Ctrl+S를 눌러 저장한다. PNC:VFB 탭의 저장하지 않은 변경 표시가 사라진다.

그림 6-15. 저장한 뒤의 VFB 루트. ① 이 절에서 만든 컴포지션
ParkSensor_RR. 오른쪽 가장자리의 포트에서SouthZone으로 어셈블리 커넥터가 이어져 있고, 컴포지션은 모두 14개가 되었다.
나머지 컴포지션 13개
나머지 13개도 같은 방법으로 만든다. 컴포지션 이름은 매핑하는 System 편집기의 노드 이름과 같게 짓고, 안에는 원자 SWC를 넣은 뒤 같은 이름의 경계 포트로 위임한다. 만든 뒤에는 컴포지션마다 ECU/HPC Mapping으로 같은 이름의 노드에 매핑한다.
앞의 대표 절차는 SouthZone이 이미 있는 상태를 전제로 한다. 빈 루트에서 시작한다면 아래 표의 13개를 먼저 만든 뒤 SWC와 컴포지션 만들기로 돌아와 ParkSensor_RR을 만든다. 다음 장은 14개가 모두 들어 있는 상태에서 시작한다.
표의 내부 SWC 열은 프로토타입 = 타입 형식이다. 경계 포트의 (P), (R)는 방향이고, 그 뒤가 PortInterface이다. 경계 포트는 같은 이름의 내부 SWC 포트와 1:1로 위임되어 있다.
| 컴포지션(= 매핑 노드) | 노드 종류 | 내부 SWC | 컴포지션 경계 포트 |
|---|---|---|---|
HPC | HPC | ParkAssist = ParkAssistApp, VehicleState = VehicleStateApp, Comfort = ComfortApp | ParkDistanceSvc(R) SVC_ParkDistance, VehicleStateSvc(P) SVC_VehicleState, ComfortControlSvc(R) SVC_ComfortControl |
WestZone | ECU | Gateway = ZoneGateway | ComfortCmd(P) SRI_ComfortCmd, MirrorCmd(P) SRI_MirrorCmd, DoorStatus(R) SRI_DoorStatus, SeatStatus(R) SRI_SeatStatus, MirrorStatus(R) SRI_MirrorStatus, WindowSwitch(R) SRI_WindowSwitch, ComfortControlSvc(P) SVC_ComfortControl |
EastZone | ECU | Gateway = ZoneGateway | WestZone과 같다 |
SouthZone | ECU | Gateway = RearGateway | ParkDistance(R) SRI_ParkDistance, TrailerStatus(R) SRI_TrailerStatus, TrailerCmd(P) SRI_TrailerCmd, TailLamp(R) SRI_TailLamp, ParkDistanceSvc(P) SVC_ParkDistance, VehicleStateSvc(R) SVC_VehicleState |
DoorCtrl_FL, DoorCtrl_FR | ECU | DoorControl = DoorControl | DoorStatus(P) SRI_DoorStatus, ComfortCmd(R) SRI_ComfortCmd |
SeatCtrl_FL, SeatCtrl_FR | ECU | SeatControl = SeatControl | SeatStatus(P) SRI_SeatStatus, ComfortCmd(R) SRI_ComfortCmd |
MirrorAct_FL, MirrorAct_FR | ECU | MirrorControl = MirrorControl | MirrorStatus(P) SRI_MirrorStatus, MirrorCmd(R) SRI_MirrorCmd |
WindowSw_FL | ECU | WindowSwitch = WindowSwitch | WindowSwitch(P) SRI_WindowSwitch |
ParkSensor_RR | ECU | ParkDistanceSensing = ParkDistanceSensing | ParkDistance(P) SRI_ParkDistance (이 장에서 만든 것) |
TrailerModule | ECU | TrailerControl = TrailerControl | TrailerStatus(P) SRI_TrailerStatus, TrailerCmd(R) SRI_TrailerCmd |
TailLamp_RR | ECU | TailLampControl = TailLampControl | TailLamp(P) SRI_TailLamp |
HPC의 내부 SWC 세 개는 원자 SWC가 아니라 적응형 응용(Adaptive Application)이므로, Add SWC의 Adaptive Application으로 만든다. HPC 안에는 나중에 컴포지션 프로토타입 PARA가 하나 더 들어온다. 이것은 직접 만들지 않고 PARA 플랫폼 임포트와 PNC 요청 포트의 PARA Platform Import가 넣어 준다.
루트 PncVehicle의 어셈블리 커넥터는 모두 21개이다. 말단 ECU의 상태 포트(P)를 Zone(R)으로, Zone의 명령 포트(P)를 말단 ECU(R)로 잇고, Zone의 서비스 포트는 HPC와 잇는다. HPC 안에는 VehicleState의 VehicleStateSvc와 ParkAssist의 VehicleStateSvc를 잇는 어셈블리가 하나 더 있다.
참고. 코드를 생성하려면 원자 SWC에 runnable과 RTE 이벤트가 있어야 한다. 예제의
ParkDistanceSensing에는 runnableParkDistanceSensing_Main과 주기0.05인 timing eventTE_ParkDistanceSensing_Main이 있다. 이 튜토리얼은 PNC 설계가 목표이므로 internal behavior는 다루지 않는다. 만드는 방법은 VFB 에디터를 참고한다.
VFB 루트 구성 확인하기
-
컴포지션 14개가 모두 들어간 루트를 다시 정렬한다. Auto Layout을 누르고, 전체가 화면에 들어오지 않으면 Fit to View를 누른다.

그림 6-16. Auto Layout을 적용한 VFB 루트
PncVehicle. ① Auto Layout 버튼. 캔버스에 컴포지션 14개와 이들을 잇는 어셈블리 커넥터가 보인다. Auto Layout은 14개를 모두 다시 배치하므로, 손으로 놓았던 그림 6-15와는 자리가 달라진다(ParkSensor_RR이 왼쪽 맨 위로 온다). 창 전체 화면에서는 노드 이름이 작게 보이므로, 이름은 뒤의 그림 6-25처럼 Ctrl+마우스 휠로 확대해서 읽는다.
루트 PncVehicle은 다음 규칙으로 구성되어 있다.
- 노드마다 컴포지션 1개. System 편집기의 노드(HPC, ECU)마다 컴포지션을 하나씩 둔다. 원자 SWC는 이 컴포지션 안에 들어 있다.
- 컴포지션 이름 = 노드 이름. 컴포지션 이름을 System 편집기의 노드 이름과 같게 짓는다. VFB는 컴포지션의 프로토타입 이름(AS PROTOTYPE)으로 SWC-ECU 매핑을 찾아 노드(머신)와 연결한다.
- SWC-ECU 매핑. SYSTEM의 SWC-ECU 매핑으로 각 컴포지션을 같은 이름의 노드에 배치한다. 앞 절의 ECU/HPC Mapping이 이 매핑을 만든다.
- 어셈블리 커넥터. 말단 ECU의 상태 포트는 Zone으로, Zone의 명령 포트는 말단 ECU로 연결한다. Zone의 서비스 포트는 HPC와 연결한다.
캔버스의 컴포지션 노드에는 이름 뒤에 매핑된 노드 이름이 대괄호로 붙는다(예: EastZone [EastZone]). 매핑되지 않은 컴포지션은 이름만 표시된다. 예제의 컴포지션과 매핑 대상 노드는 다음과 같다.
| 컴포지션(= 매핑 노드) | 역할 |
|---|---|
HPC | HPC(AP). 응용 AA를 담는다 |
WestZone, EastZone, SouthZone | Zone ECU. 게이트웨이 SWC를 담는다 |
DoorCtrl_FL, SeatCtrl_FL, MirrorAct_FL, WindowSw_FL, DoorCtrl_FR, SeatCtrl_FR, MirrorAct_FR | Comfort 계열 말단 ECU |
ParkSensor_RR | 주차 거리 센서 말단 ECU |
TrailerModule, TailLamp_RR | Trailer 계열 말단 ECU |
참고. 매핑을 확인하거나 바꾸려면 루트의 컴포지션 노드를 우클릭하고 ECU/HPC Mapping을 사용한다. 자세한 내용은 VFB 에디터의 컴포지션 노드 메뉴를 참고한다.
VFC와 PortGroup
AUTOSAR에서 VFC(Virtual Function Cluster)는 PortGroup으로 실현된다. 이 튜토리얼에서는 다음처럼 정한다.
- 기능 하나(예: 주차 보조)에 참여하는 포트를 PortGroup 하나로 묶는다.
- PortGroup 이름은
VFC_<기능>으로 짓는다:VFC_Comfort,VFC_ParkAssist,VFC_Trailer. - PortGroup의 CATEGORY는 모두
PARTIAL_NETWORKING이다.
VFC 패밀리 규칙
같은 VFC에 속하는 PortGroup은 계층의 모든 단계에서 같은 이름을 쓴다. 이 묶음을 VFC 패밀리라고 부른다. VFC_ParkAssist를 예로 들면 다음과 같다.
| 계층 | 예 | PortGroup 이름 | 내용 |
|---|---|---|---|
| 원자 SWC | ParkDistanceSensing | VFC_ParkAssist | OUTER PORTS = ParkDistance |
| ECU 컴포지션 | ParkSensor_RR | VFC_ParkAssist | OUTER PORTS = 위임 포트 ParkDistance, INNER GROUPS = ParkDistanceSensing / VFC_ParkAssist |
| 루트 컴포지션 | PncVehicle | VFC_ParkAssist | INNER GROUPS = 참여하는 직계 프로토타입 HPC, SouthZone, ParkSensor_RR의 VFC_ParkAssist |
- OUTER PORTS: 그 SWC(또는 컴포지션)의 포트 중 이 VFC에 참여하는 포트이다.
- INNER GROUPS: 컴포지션 안에 있는 프로토타입의 같은 이름 PortGroup을 가리킨다.
주의. 하위 PortGroup 이름을 다르게 지으면(예:
PG_ParkAssist) VFC 멤버로 인식되지 않는다. PNC 다이얼로그의 VFC 표는 루트의 직계 프로토타입 중 "VFC와 같은 이름의 PortGroup을 가진 것"만 멤버로 센다. 반드시 같은 이름을 쓴다.
PortGroup 만들기
대표로 앞에서 만든 원자 SWC ParkDistanceSensing에 VFC_ParkAssist를 만든다.
-
루트 캔버스에서
ParkSensor_RR컴포지션을 더블클릭한다.
그림 6-17. VFB 루트. ① 더블클릭할
ParkSensor_RR컴포지션(Auto Layout 후 왼쪽 맨 위).컴포지션 안으로 들어간다(드릴다운). 캔버스 왼쪽 위에 경로 System › ParkSensor_RR가 표시되고, 프레임
ParkSensor_RR안에 원자 SWCParkDistanceSensing이 보인다. -
캔버스 아래쪽 도구막대에서 Fit to View를 누른다. 프레임이 처음에 화면보다 크게 보이든 작게 보이든, Fit to View가 프레임과 경계 포트를 화면에 맞춘다.

그림 6-18.
ParkSensor_RR로 드릴다운한 뒤 Fit to View를 누른 화면. ① 경로 System › ParkSensor_RR. ② 원자 SWCParkDistanceSensing. ③ 캔버스 도구막대의 Fit to View. SWC의 포트ParkDistance가 프레임 경계의 포트로 위임 연결되어 있다. -
ParkDistanceSensing을 더블클릭한다.SWC Internal Behavior [ParkDistanceSensing] 다이얼로그가 열린다.

그림 6-19. SWC Internal Behavior [ParkDistanceSensing] 다이얼로그. ① PORTS에 앞에서 만든
PParkDistance(SRI_ParkDistance)가 있다. ② PORT GROUPS는 아직No port groups이다. 그 아래의 IMPLEMENTATION 섹션(SW VERSION, VENDOR ID, MEMORY SECTIONS)은 이 장에서 쓰지 않는다. -
PORT GROUPS 머리글 오른쪽의 +(툴팁
Add Port Group)를 누른다.
그림 6-20. 같은 다이얼로그의 오른쪽 패널. ① 누를 PORT GROUPS의 + 버튼. 아직
No port groups상태이다.참고. 그림 6-20부터 6-22까지는 완성 예제의 화면이라 왼쪽 캔버스에 runnable 상자(
ParkDistanceSensing_Main)와 timing event를 뜻하는 시계 아이콘이 함께 보인다. 이 장의 절차로 만든 SWC에는 internal behavior가 없으므로 그림 6-19처럼 캔버스의 SWC 상자 안이 비어 있다. 이 절에서 쓰는 곳은 오른쪽 패널뿐이라 결과는 같다.새 PortGroup 블록
PortGroup_0이 생긴다. -
블록의 NAME에서 기본 이름
PortGroup_0을 지우고VFC_ParkAssist를 입력한 뒤 Tab을 누른다. 블록 제목이VFC_ParkAssist로 바뀐다. -
CATEGORY에서 PARTIAL_NETWORKING을 누른다. 다른 선택지는 MODE_MANAGEMENT이다.
-
OUTER PORTS 머리글 오른쪽의 +(툴팁
Add member port (pick a port to commit))를 누른다.새 행
1이 생긴다. 포트를 고르기 전까지 이 행의 PORT 칸은 비어 있고 빨간 밑줄(툴팁Required)이 표시된다. -
행 오른쪽의 ▾ 버튼을 눌러 후보 목록을 열고
ParkDistance를 고른다. 후보는 이 SWC 자신의 포트뿐이다.
그림 6-21. PortGroup을 입력하는 중. ① NAME =
VFC_ParkAssist. ② CATEGORY의 PARTIAL_NETWORKING. ③ OUTER PORTS의 +. ④ 드롭다운 후보ParkDistance. 다이얼로그 제목 앞의 ● 표시는 저장하지 않은 변경이 있다는 뜻이다.행이
1 | ParkDistance로 바뀐다.
그림 6-22. 완성된 PortGroup 블록(저장 전). ① 블록 전체 — NAME
VFC_ParkAssist, CATEGORY PARTIAL_NETWORKING(오른쪽은 고르지 않은 MODE_MANAGEMENT), OUTER PORTS 1행ParkDistance. 다이얼로그 오른쪽 아래에 Close 버튼이 있다. -
Ctrl+S를 눌러 다이얼로그를 저장한다. 제목 앞의 ● 표시가 사라진다.
-
오른쪽 아래의 Close를 눌러 다이얼로그를 닫는다.
-
VFB 편집기에서 다시 Ctrl+S를 눌러 저장한다. PNC:VFB 탭의 저장하지 않은 변경 표시가 사라진다.
저장하면 PAIO가 상위 컴포지션에 같은 이름의 PortGroup을 자동으로 만든다.
| 컴포지션 | 자동으로 생기는 PortGroup |
|---|---|
ParkSensor_RR | VFC_ParkAssist, INNER GROUPS = ParkDistanceSensing / VFC_ParkAssist |
PncVehicle(루트) | VFC_ParkAssist, INNER GROUPS = ParkSensor_RR / VFC_ParkAssist |
자동으로 생긴 PortGroup 확인하기
-
드릴다운 상태에서
ParkSensor_RR프레임의 제목 줄(이름ParkSensor_RR이 있는 줄)을 클릭한다.오른쪽에 COMPOSITION 속성 패널이 나타난다.
-
속성 패널의 PORT GROUPS를 본다.

그림 6-23. 저장 후
ParkSensor_RR를 선택한 화면. ① PORT GROUPS에 자동으로 생긴VFC_ParkAssist. CATEGORY는 PARTIAL_NETWORKING, INNER GROUPS의 PROTOTYPE =ParkDistanceSensing, PORT GROUP =VFC_ParkAssist이다. 아래의+ Add inner group reference로 내부 그룹 참조를 더 추가할 수 있다.
참고. 자동으로 생긴 컴포지션 PortGroup에는 OUTER PORTS(위임 포트)가 채워지지 않는다. 그래서 이 장을 따라 한
ParkSensor_RR에는 INNER GROUPS만 있고, 완성 예제의ParkSensor_RR에는 OUTER PORTSParkDistance도 있다(위의 VFC 패밀리 표). 컴포지션 속성 패널의 PORT GROUPS에서는 INNER GROUPS만 편집할 수 있고, 응용 AA(ComfortApp,ParkAssistApp,VehicleStateApp)에는 PortGroup을 편집하는 화면이 없다. 컴포지션과 응용 AA의 멤버 포트는 PNC 다이얼로그 — PNC별 바인딩에서 다룬다.
나머지 PortGroup
PortGroup은 모두 33개이고, CATEGORY는 모두 PARTIAL_NETWORKING이다. 나머지도 아래 표를 보고 같은 방법으로 만든다.
- 원자 SWC의 PortGroup은 위 절차와 같다. SWC를 더블클릭해 SWC Internal Behavior 다이얼로그를 열고 PORT GROUPS의 **+**로 만든 뒤 OUTER PORTS를 채운다.
- ECU 컴포지션과 루트의 PortGroup은 원자 SWC의 PortGroup을 저장할 때 같은 이름으로 자동으로 생기며, INNER GROUPS도 함께 채워진다.
- ECU 컴포지션과 응용 AA의 OUTER PORTS는 VFB 편집기에서 편집할 수 없다. 자동으로 생긴 컴포지션 PortGroup에는 OUTER PORTS가 비어 있다. 이 값은 다음 장 PNC 다이얼로그 — PNC별 바인딩의 SWC HIERARCHY 체크박스로 채운다. 아래 두 표의 OUTER PORTS 열은 그때 체크할 포트 목록이기도 한다.
- 응용 AA(
ComfortApp,ParkAssistApp,VehicleStateApp)에는 PortGroup을 만드는 화면 자체가 없다. 이 셋의 PortGroup도 SWC HIERARCHY에서 만든다.
원자 SWC와 응용 AA (OUTER PORTS)
| SWC | PortGroup | OUTER PORTS |
|---|---|---|
DoorControl | VFC_Comfort | DoorStatus, ComfortCmd |
SeatControl | VFC_Comfort | SeatStatus, ComfortCmd |
MirrorControl | VFC_Comfort | MirrorStatus, MirrorCmd |
WindowSwitch | VFC_Comfort | WindowSwitch |
ZoneGateway | VFC_Comfort | ComfortCmd, MirrorCmd, DoorStatus, SeatStatus, MirrorStatus, WindowSwitch, ComfortControlSvc |
ParkDistanceSensing | VFC_ParkAssist | ParkDistance (이 장에서 만든 것) |
RearGateway | VFC_ParkAssist | ParkDistance, ParkDistanceSvc |
RearGateway | VFC_Trailer | TrailerStatus, TrailerCmd, TailLamp, VehicleStateSvc |
TrailerControl | VFC_Trailer | TrailerStatus, TrailerCmd |
TailLampControl | VFC_Trailer | TailLamp |
ComfortApp (AA) | VFC_Comfort | ComfortControlSvc |
ParkAssistApp (AA) | VFC_ParkAssist | ParkDistanceSvc, VehicleStateSvc |
VehicleStateApp (AA) | VFC_Trailer | VehicleStateSvc |
ECU 컴포지션 (OUTER PORTS + INNER GROUPS)
| 컴포지션 | PortGroup | OUTER PORTS | INNER GROUPS (PROTOTYPE / PORT GROUP) |
|---|---|---|---|
DoorCtrl_FL, DoorCtrl_FR | VFC_Comfort | DoorStatus, ComfortCmd | DoorControl / VFC_Comfort |
SeatCtrl_FL, SeatCtrl_FR | VFC_Comfort | SeatStatus, ComfortCmd | SeatControl / VFC_Comfort |
MirrorAct_FL, MirrorAct_FR | VFC_Comfort | MirrorStatus, MirrorCmd | MirrorControl / VFC_Comfort |
WindowSw_FL | VFC_Comfort | WindowSwitch | WindowSwitch / VFC_Comfort |
WestZone, EastZone | VFC_Comfort | ComfortCmd, MirrorCmd, DoorStatus, SeatStatus, MirrorStatus, WindowSwitch, ComfortControlSvc | Gateway / VFC_Comfort |
ParkSensor_RR | VFC_ParkAssist | ParkDistance | ParkDistanceSensing / VFC_ParkAssist |
SouthZone | VFC_ParkAssist | ParkDistance, ParkDistanceSvc | Gateway / VFC_ParkAssist |
SouthZone | VFC_Trailer | TrailerStatus, TrailerCmd, TailLamp, VehicleStateSvc | Gateway / VFC_Trailer |
TrailerModule | VFC_Trailer | TrailerStatus, TrailerCmd | TrailerControl / VFC_Trailer |
TailLamp_RR | VFC_Trailer | TailLamp | TailLampControl / VFC_Trailer |
HPC | VFC_ParkAssist | ParkDistanceSvc | ParkAssist / VFC_ParkAssist |
HPC | VFC_Comfort | ComfortControlSvc | Comfort / VFC_Comfort |
HPC | VFC_Trailer | VehicleStateSvc | VehicleState / VFC_Trailer |
루트 PncVehicle (INNER GROUPS만 있음, VFB 저장 시 자동 생성)
| PortGroup | 참여하는 직계 프로토타입 |
|---|---|
VFC_Comfort | HPC, WestZone, EastZone, DoorCtrl_FL, SeatCtrl_FL, MirrorAct_FL, WindowSw_FL, DoorCtrl_FR, SeatCtrl_FR, MirrorAct_FR (10개) |
VFC_ParkAssist | HPC, SouthZone, ParkSensor_RR (3개) |
VFC_Trailer | HPC, SouthZone, TrailerModule, TailLamp_RR (4개) |
PNC 오버레이로 VFC 확인하기
PortGroup은 캔버스에 따로 그려지지 않는다. VFC별로 어떤 컴포지션이 참여하는지는 VFC (PNC Overlay) 아이콘으로 확인한다.
-
드릴다운 상태라면 경로의 System을 눌러 루트 화면으로 돌아간다.
-
속성 패널이 열려 있으면 접고, Fit to View를 눌러 루트 전체를 화면에 넣는다.
-
캔버스 왼쪽 가장자리의 세로 아이콘 줄에서 첫 번째 VFC (PNC Overlay) 아이콘을 누른다. 그 아래의 두 아이콘(Intrusion Detection System, Software Cluster)은 이 장에서 쓰지 않는 다이얼로그를 연다.
캔버스 왼쪽 위에 PNC OVERLAY 패널이 열린다. 패널의 VFC 목록은 이름순이고, 첫 항목이 기본으로 선택된다. 선택한 VFC에 참여하지 않는 컴포지션은 흐리게 표시된다.
그림 6-24는
ParkDistanceSensing의VFC_ParkAssist하나만 만든 시점에서 찍었다. 그 시점에는 VFC가 하나뿐이라 목록에 버튼이 하나만 나오고 그 버튼이 바로 선택된다. 캔버스에서는ParkSensor_RR만 평소대로, 나머지 컴포지션 13개는 흐리게 표시된다. 아직 어떤 PNC도 이 VFC를 참조하지 않으므로 BOUND PNCS에는--가 표시된다.나머지 PortGroup의 표까지 모두 만든 뒤라면 목록에
VFC_Comfort,VFC_ParkAssist,VFC_Trailer3개가 나오고, 화면은 완성 예제의 오버레이와 같아진다.
그림 6-24. 이 장을 따라 한 프로젝트에서 오버레이를 켠 화면. ① 세로 아이콘 줄의 첫 번째 아이콘 VFC (PNC Overlay)(켜진 상태). ② VFC 목록에 있는 유일한 버튼
VFC_ParkAssist(선택됨). ③ BOUND PNCS =--. ④ 이 VFC에 참여하는ParkSensor_RR. 나머지 컴포지션 13개는 흐리게 표시된다. -
노드 이름이 작아 읽기 어려우면 Ctrl을 누른 채 마우스 휠을 굴려 확대한다.

그림 6-25. 그림 6-24의 화면을
ParkSensor_RR부근에서 확대한 모습. ① 평소대로 표시된ParkSensor_RR. 이웃한TailLamp_RR,SouthZone,TrailerModule,SeatCtrl_FR,HPC,EastZone,DoorCtrl_FR는 흐리게 표시된다. -
오버레이를 끄려면 VFC (PNC Overlay) 아이콘을 다시 누른다.
완성 예제의 오버레이
PortGroup 33개가 모두 들어 있고 PNC 바인딩까지 끝난 완성 예제에서는 오버레이가 다음과 같이 보인다. PortGroup이 캔버스에 그려지지 않으므로, 완성 예제도 루트 화면의 모양은 그림 6-16과 같다.

그림 6-26. PortGroup 33개가 모두 들어 있는 완성 예제의 VFB 루트(Auto Layout, Fit to View 적용). 캔버스 모양은 그림 6-16과 같다.
오버레이를 켜고 목록에서 VFC_Comfort를 누르면 그림 6-27처럼 보인다.

그림 6-27. 완성 예제에서 PNC Overlay를 켜고 VFC_Comfort를 고른 화면. ① VFC (PNC Overlay) 아이콘. ② PNC OVERLAY 패널. ③ VFC_Comfort. ④ BOUND PNCS = PNC_Comfort. 캔버스 위쪽의 컴포지션 4개가 흐리게 표시된다.
그림 6-28. PNC OVERLAY 패널 확대. VFC 목록에 VFC_Comfort(선택됨), VFC_ParkAssist, VFC_Trailer가 있고, BOUND PNCS에 PNC_Comfort가 표시된다.
- VFC 하나가 버튼 하나로 나열된다. 버튼을 누르면 그 VFC가 선택된다.
- BOUND PNCS는 선택한 VFC를 참조하는 PNC이다. SYSTEM의 PNC 매핑에서 읽어 와 표시하며, 여기서는 편집할 수 없다. 참조하는 PNC가 없으면
--가 표시된다.
캔버스를 Ctrl+마우스 휠로 확대하면 흐리게 표시된 컴포지션의 이름을 읽을 수 있다.

그림 6-29. 완성 예제의 VFC_Comfort 오버레이를 확대한 화면. VFC_Comfort에 참여하지 않는 ParkSensor_RR, TailLamp_RR, SouthZone, TrailerModule은 흐리게, 참여하는 SeatCtrl_FR, EastZone, DoorCtrl_FR, HPC, MirrorAct_FR는 평소대로 표시된다.
참고. PNC Overlay는 시각화 전용이다. 오버레이에서는 VFC 멤버나 PNC 바인딩을 바꿀 수 없다. VFC와 PNC의 연결은 PNC 다이얼로그 — PNC별 바인딩에서 편집한다.
왜 이렇게 설계하는가
PNC(Partial Network Cluster)는 VFC를 참조해 "이 PNC가 깨어 있어야 동작하는 기능"을 모델에 명시한다. VFC는 한 ECU 안에 머물지 않고 여러 ECU와 HPC에 걸친다. 그래서 원자 SWC의 포트에서 시작해 ECU 컴포지션, 루트 컴포지션까지 같은 이름의 PortGroup으로 이어 붙여야, 루트에서 VFC 하나로 전체 참여 포트를 따라갈 수 있다. 컴포지션 이름을 노드 이름과 같게 두는 것도 같은 이유이다. 컴포지션에서 노드(머신)를 바로 찾을 수 있어야 VFC가 어느 ECU와 채널에 걸치는지 알 수 있다.
확인하기
- VFB 루트
PncVehicle에 컴포지션 14개가 있고, 이름이 System 편집기의 노드 이름과 같다. -
ParkSensor_RR안에 원자 SWCParkDistanceSensing이 있고, 두ParkDistance포트가 위임 커넥터로 이어져 있다. - 루트에서
ParkSensor_RR의ParkDistance(P)가SouthZone의ParkDistance(R)와 어셈블리 커넥터로 이어져 있다. - 편집기를 닫았다가 다시 열면
ParkSensor_RR노드 머리글에 ECU 아이콘이 보이고, 머리글이ParkSensor_RR [ParkSensor_RR]로 표시된다. -
ParkDistanceSensing의 SWC Internal Behavior 다이얼로그에서 PORT GROUPS에VFC_ParkAssist(PARTIAL_NETWORKING, OUTER PORTSParkDistance)가 보인다. -
ParkSensor_RR프레임을 선택하면 COMPOSITION 패널의 PORT GROUPS에VFC_ParkAssist와 INNER GROUPSParkDistanceSensing/VFC_ParkAssist가 보인다. - 나머지 PortGroup의 표대로 원자 SWC의 PortGroup을 모두 만들었다.
- 루트에서 VFC (PNC Overlay) 아이콘을 눌러 오버레이를 켜면 목록에
VFC_Comfort,VFC_ParkAssist,VFC_Trailer3개가 있다.VFC_ParkAssist를 고르면HPC,SouthZone,ParkSensor_RR만 평소대로, 나머지 컴포지션은 흐리게 표시된다. - BOUND PNCS는 아직
--이다. VFC와 PNC의 연결은 다음 장에서 만든다. - PNC:VFB 탭에 저장하지 않은 변경 표시가 없다.
다음 단계
PNC 다이얼로그 — PNC별 바인딩에서 PNC마다 VFC, I-PDU Group, 물리 채널, 서비스 인스턴스, 웨이크업 프레임을 바인딩한다.