본문으로 건너뛰기

인터페이스와 SOME/IP 서비스

이 장에서 할 일​

이 장에서는 Interface 편집기에서 두 종류의 인터페이스를 만든다. 말단 ECU와 Zone 사이의 CP 포트가 쓰는 Sender-Receiver 인터페이스와, HPC와 Zone 사이의 SOME/IP 통신에 쓰는 서비스 인터페이스이다. 서비스 인터페이스에는 SOME/IP 배포(Service ID, 버전)와 제공자(Provider), 소비자(Consumer) 서비스 인스턴스를 추가한다. 마지막으로 System 편집기에서 Ethernet 커넥터에 IP 주소와 UDP 포트(Application Endpoint)를 넣고, 서비스 인스턴스를 커넥터에 바인딩한다.

대표로 SRI_ParkDistance와 SVC_ParkDistance를 처음부터 따라 만들고, 나머지는 값 표를 보고 같은 방법으로 반복한다.

이 장을 마치면 다음 상태가 된다.

  • SENDER-RECEIVER 탭에 SRI_* 인터페이스 11개가 있다.
  • SERVICE 탭에 SVC_ParkDistance, SVC_VehicleState, SVC_ComfortControl이 있고, 각각 SOME/IP 배포와 서비스 인스턴스를 갖는다.
  • Zone ECU와 HPC의 Ethernet 커넥터 5개에 IP 주소와 UDP Application Endpoint가 있다.
  • 서비스 인스턴스 7개가 모두 Ethernet 커넥터에 바인딩되어 있고, 같은 커넥터 안에서 UDP 포트가 겹치지 않는다.

시작하기 전에​

서비스 인터페이스Service ID제공자(Provider)소비자(Consumer)소속 PNC
SVC_ParkDistance (이벤트 DistanceUpdate, SensorFault / 메서드 SetSensitivity)0x1001SouthZone (ParkDistance_Provider)HPC ParkAssistApp (ParkDistance_Consumer)PNC_ParkAssist
SVC_VehicleState (이벤트 GearPosition, TrailerAttached)0x1002HPC VehicleStateApp (VehicleState_Provider)SouthZone (VehicleState_Consumer)PNC_Trailer
SVC_ComfortControl (이벤트 DoorStatus / 메서드 LockAll, FoldMirrors)0x1003WestZone (ComfortControl_Provider_West, 인스턴스 1), EastZone (ComfortControl_Provider_East, 인스턴스 2)HPC ComfortApp (ComfortControl_Consumer, ANY)PNC_Comfort

Sender-Receiver 인터페이스 만들기​

  1. 왼쪽 EDITOR 뷰의 DESIGN 아래에서 Interface를 클릭한다. PNC:Interface 탭이 열린다.

  2. 위쪽 탭 줄에서 SENDER-RECEIVER를 클릭한다. 왼쪽 INTERFACES 목록에 "Add an interface", 가운데 CONFIGURATION에 "Select an interface"가 표시된다.

    빈 Interface 편집기

    그림 5-1. 처음 연 Interface 편집기. 위쪽 탭은 SERVICE, SENDER-RECEIVER, CLIENT-SERVER, MODE-SWITCH, ADAPTIVE, ERROR DOMAIN, MAPPING이다. ① SENDER-RECEIVER 탭, ② INTERFACES 제목 오른쪽의 + 버튼.

  3. INTERFACES 제목 오른쪽의 + 버튼을 클릭한다(툴팁 Add Interface). SenderReceiverInterface_0이 추가되고 바로 선택된다.

  4. 가운데 NAME에 SRI_ParkDistance를 입력하고 Enter를 누른다. 왼쪽 목록의 이름도 바로 바뀐다.

    SRI_ParkDistance 추가

    그림 5-2. ① NAME = SRI_ParkDistance. DATA ELEMENTS는 아직 비어 있다("Add a data element"). ② DATA ELEMENTS 제목 오른쪽의 + 버튼으로 데이터 요소를 추가한다. 오른쪽 패널의 "No mapped Service Interface" 안내는 이 장에서 신경 쓰지 않아도 된다.

  5. DATA ELEMENTS 제목 오른쪽의 + 버튼을 클릭한다(툴팁 Add Data Element). DataElement_0 행이 기본 타입 uint8로, 펼쳐진 채 추가된다.

  6. 펼친 영역의 NAME에 Distance1을 입력한다.

  7. 타입을 지정한다. TYPE 칸을 클릭하면 "Type to search..." 검색 칸과 타입 목록이 열린다. 목록에는 내장 프리미티브 타입(boolean, float32, float64, sint8 … uint64)이 나온다.

    데이터 요소의 TYPE 목록

    그림 5-3. ① 데이터 요소 NAME = Distance1, ② TYPE 목록. 화면에는 목록 앞부분만 보인다. 원하는 타입은 목록을 아래로 내리거나 검색 칸에 입력해 찾는다.

  8. 목록에서 uint8을 선택한다. Distance1은 기본 타입이 이미 uint8이므로 목록을 닫고 그대로 둬도 된다.

    Distance1 추가 완료

    그림 5-4. ① 데이터 요소 Distance1(TYPE uint8)이 추가된 상태. 행 머리글에 NAME, TYPE, DESCRIPTION 요약이 보이고, 펼친 영역에서 값을 고친다.

  9. 같은 방법으로 DATA ELEMENTS의 + 버튼을 눌러 Distance2, Distance3, Distance4(uint8)와 SensorFault(boolean)를 추가한다. SensorFault는 TYPE 목록에서 boolean을 고른다.

나머지 Sender-Receiver 인터페이스​

같은 방법으로 다음 인터페이스를 모두 만든다. 데이터 요소 타입은 모두 내장 프리미티브이다.

인터페이스데이터 요소 (타입)
SRI_DoorStatusDoorOpen (boolean), LockState (uint8), WindowPos (uint8)
SRI_SeatStatusSeatPos (uint8), SeatHeat (uint8)
SRI_ComfortCmdLockCmd, WindowCmd, SeatMoveCmd, SeatHeatCmd (모두 uint8)
SRI_MirrorStatusFoldState, TiltX, TiltY (모두 uint8)
SRI_MirrorCmdFoldCmd, MoveCmd (모두 uint8)
SRI_ParkDistanceDistance1, Distance2, Distance3, Distance4 (uint8), SensorFault (boolean)
SRI_TrailerStatusAttached (boolean), LampFault (uint8), BrakeLamp (boolean)
SRI_TrailerCmdLampCmd (uint8)
SRI_WindowSwitchUp, Down, Auto (모두 boolean)
SRI_TailLampLampState (uint8)
SRI_GearPositionGear (uint8)

완성된 Sender-Receiver 인터페이스 목록

그림 5-5. 완성 상태의 SENDER-RECEIVER 탭. ① INTERFACES 목록의 SRI_* 11개, ② SRI_ParkDistance의 DATA ELEMENTS: Distance1~Distance4(uint8), SensorFault(boolean).

서비스 인터페이스 만들기​

  1. 위쪽 탭 줄에서 SERVICE를 클릭한다.

  2. INTERFACES 제목 오른쪽의 + 버튼을 클릭한다. ServiceInterface_0이 추가되고 선택된다.

  3. NAME에 SVC_ParkDistance를 입력한다.

  4. C++ NAMESPACE에 pnc::park를 입력하고 Tab을 누른다.

  5. MAJOR VERSION 1, MINOR VERSION 0은 기본값 그대로 둔다.

    SVC_ParkDistance 추가

    그림 5-6. ① SERVICE 탭, ② NAME = SVC_ParkDistance, ③ C++ NAMESPACE = pnc::park. 아래에 EVENTS, METHODS, FIELDS 서브탭이 있다. 오른쪽 SOA DEPLOYMENT에는 아직 "No deployments configured"가 표시된다.

이벤트 추가​

  1. EVENTS 서브탭을 클릭한다.

  2. 서브탭 줄 오른쪽 끝의 + 버튼을 클릭한다(툴팁 Add Event). Event_0 행이 기본 타입 uint8로 추가된다.

  3. NAME에 DistanceUpdate를 입력한다. 타입은 uint8 그대로 둔다.

  4. 다시 + 버튼을 클릭하고 NAME에 SensorFault를 입력한다.

  5. SensorFault의 TYPE 칸에서 boolean을 선택한다.

    이벤트 두 개 추가

    그림 5-7. ① EVENTS 서브탭, ② +(Add Event), ③ 이벤트 DistanceUpdate(uint8)와 SensorFault(boolean). 타입을 고르자 오른쪽 패널이 DATA TYPE 서브탭으로 바뀌어 boolean의 정보를 보여 준다.

참고. TYPE을 고르면 오른쪽 패널이 자동으로 DATA TYPE 서브탭으로 바뀐다. 배포를 추가할 때는 SOA DEPLOYMENT 서브탭을 다시 클릭한다.

메서드 추가​

  1. METHODS 서브탭을 클릭한다.

  2. 서브탭 줄 오른쪽 끝의 + 버튼을 클릭한다(툴팁 Add Method). Method_0 행이 추가된다.

  3. NAME에 SetSensitivity를 입력한다.

  4. METHOD TYPE은 기본값 REQUEST AND RESPONSE를 그대로 둔다. 행 머리글의 ACCESS 배지가 R&R로 표시된다.

    메서드 SetSensitivity

    그림 5-8. ① METHODS 서브탭, ② NAME = SetSensitivity, ③ METHOD TYPE = REQUEST AND RESPONSE. 응답이 없는 메서드는 FIRE AND FORGET을 선택한다. ARGUMENTS와 POSSIBLE AP ERRORS는 이 예제에서 쓰지 않는다.

SOME/IP 배포 추가하기​

배포는 추가하는 시점의 이벤트와 메서드로 만들어진다. 이벤트와 메서드를 모두 정한 뒤에 배포를 추가한다.

  1. 오른쪽 패널에서 SOA DEPLOYMENT 서브탭을 클릭한다.

  2. SOA DEPLOYMENT 제목 오른쪽의 + 버튼을 클릭한다(툴팁 Add Deployment). SOME/IP, DDS, IPC 메뉴가 열린다.

    배포 추가 메뉴

    그림 5-9. ① +(Add Deployment), ② 프로토콜 메뉴. SOME/IP를 선택한다.

  3. SOME/IP를 선택한다. 배포 카드 SOME/IP SVC_ParkDistance가 접힌 채 생긴다.

  4. 카드 머리글을 클릭해 펼친다. 오른쪽 패널이 DATA TYPE으로 바뀌면 SOA DEPLOYMENT를 다시 클릭한다.

  5. SERVICE ID 라벨 오른쪽의 DEC | HEX 중 HEX를 클릭한다.

  6. SERVICE ID에 1001을 입력하고 Tab을 누른다. 값이 0x1001로 표시된다.

  7. MAJOR VERSION 1, MINOR VERSION 0을 확인한다.

    SOME/IP 배포 카드

    그림 5-10. 펼친 배포 카드. ① SERVICE ID = 0x1001(HEX 모드), ② MAJOR VERSION 1, MINOR VERSION 0. EVENT DEPLOYMENTS(DistanceUpdate 1, SensorFault 2)와 METHOD DEPLOYMENTS(SetSensitivity 1)는 자동으로 채워지고, 전송은 모두 UDP이다. EVENT GROUPS에는 이벤트마다 그룹이 하나씩(EG_DistanceUpdate, EG_SensorFault) 만들어진다.

  8. 완성 예제처럼 두 이벤트를 한 그룹 EG_SVC_ParkDistance(EVENTGROUP ID 1)로 묶는다(그림 5-16).

    1. EVENT GROUPS에서 EG_SensorFault 행 오른쪽의 x를 클릭해 지운다.
    2. 남은 EG_DistanceUpdate 행의 NAME을 EG_SVC_ParkDistance로 바꾼다. EVENTGROUP ID는 1 그대로 둔다.
    3. 같은 행의 EVENTS 칸을 클릭하고, 열린 목록에서 SensorFault도 체크한다. EVENTS에 DistanceUpdate, SensorFault가 보이면 된다.

제공자와 소비자 인스턴스 추가하기​

  1. 배포 카드 머리글에 마우스를 올린다. 머리글 오른쪽에 작은 + 버튼이 나타난다(툴팁 Add service instance). 이 버튼은 마우스를 올렸을 때만 보인다.

  2. + 버튼을 클릭하고 Provider를 선택한다.

    서비스 인스턴스 추가 메뉴

    그림 5-11. ① 카드 머리글의 +(Add service instance), ② Provider / Consumer 메뉴.

  3. 다시 + 버튼을 클릭하고 Consumer를 선택한다.

  4. 카드 머리글을 클릭해 접는다. 요약에 방금 추가한 인스턴스가 기본 이름으로 보인다.

    기본 이름의 인스턴스

    그림 5-12. 접힌 배포 카드 요약(SERVICE ID = 0x1001, VERSION 1.0, EVENTS = 2, METHODS = 1). ① SERVICE PROVIDERS의 Provider_SVC_ParkDistance_1(0x0001), ② SERVICE CONSUMERS의 Consumer_SVC_ParkDistance_1(0xFFFF (ANY)).

  5. SERVICE PROVIDERS의 제공자 행을 클릭한다. 오른쪽 패널이 SERVICE INSTANCE 서브탭으로 바뀌고 제공자 카드가 펼쳐진다.

  6. NAME을 ParkDistance_Provider로 바꾼다.

  7. INSTANCE ID에 1을 입력하고 Tab을 누른다.

    제공자 인스턴스

    그림 5-13. ① SERVICE INSTANCE 서브탭, ② NAME = ParkDistance_Provider, ③ INSTANCE ID = 1. SD SERVER CONFIG와 EVENT GROUPS는 접힌 채 둔다.

  8. 제공자 카드 머리글을 클릭해 접고, 소비자 카드([C] Consumer_SVC_ParkDistance_1) 머리글을 클릭해 펼친다.

  9. NAME을 ParkDistance_Consumer로 바꾼다.

  10. REQUIRED INSTANCE ID에 1을 입력한다.

    소비자 인스턴스

    그림 5-14. ① NAME = ParkDistance_Consumer, ② REQUIRED INSTANCE ID = 1. 위쪽 제공자 카드는 접힌 상태로 요약(INSTANCE ID = 0x0001, SERVICE = SVC_ParkDistance)만 보인다.

  11. Ctrl+S를 눌러 저장한다. PNC:Interface 탭의 ● 표시가 사라진다.

참고. 소비자의 REQUIRED INSTANCE ID 기본값 0xFFFF (ANY)는 "어떤 인스턴스든 찾는다"는 뜻이다. 이 예제에서 ComfortControl_Consumer는 이 기본값을 그대로 쓴다.

주의. SOME/IP 배포를 추가하면 PAIO가 다음 데이터를 자동으로 만든다. 완성 예제에는 이 데이터가 없다.

  • SENDER-RECEIVER 목록의 SVC_ParkDistance_SR
  • Signal 편집기의 PDU 4개(SVC_ParkDistance_DistanceUpdate_PDU, SVC_ParkDistance_SensorFault_PDU, SVC_ParkDistance_SetSensitivity_Call_PDU, SVC_ParkDistance_SetSensitivity_Return_PDU)

이 PDU들은 검증 오류를 내지 않는다.

나머지 서비스 인터페이스와 인스턴스​

같은 방법으로 SVC_VehicleState와 SVC_ComfortControl을 만들고, 배포와 인스턴스를 추가한다. 버전은 모두 1.0, 전송은 모두 UDP이다. EVENT GROUPS는 이벤트마다 자동으로 생긴 그룹을 표의 그룹 하나로 정리한다. 이벤트가 하나뿐인 SVC_ComfortControl은 자동으로 생긴 그룹의 NAME만 EG_SVC_ComfortControl로 바꾼다.

서비스C++ NAMESPACE이벤트 (타입, EVENT ID)메서드 (METHOD ID, METHOD TYPE)SERVICE ID이벤트 그룹 (EVENTGROUP ID)
SVC_ParkDistancepnc::parkDistanceUpdate (uint8, 1), SensorFault (boolean, 2)SetSensitivity (1, REQUEST AND RESPONSE)0x1001 (4097)EG_SVC_ParkDistance (1): 두 이벤트
SVC_VehicleStatepnc::vehicleGearPosition (uint8, 1), TrailerAttached (boolean, 2)없음0x1002 (4098)EG_SVC_VehicleState (1): 두 이벤트
SVC_ComfortControlpnc::comfortDoorStatus (uint8, 1)LockAll (1, REQUEST AND RESPONSE), FoldMirrors (2, FIRE AND FORGET)0x1003 (4099)EG_SVC_ComfortControl (1): DoorStatus
인스턴스역할배포INSTANCE ID / REQUIRED INSTANCE ID
ParkDistance_ProviderProviderSVC_ParkDistance1 (0x0001)
ParkDistance_ConsumerConsumerSVC_ParkDistance1
VehicleState_ProviderProviderSVC_VehicleState1 (0x0001)
VehicleState_ConsumerConsumerSVC_VehicleState1
ComfortControl_Provider_WestProviderSVC_ComfortControl1 (0x0001)
ComfortControl_Provider_EastProviderSVC_ComfortControl2 (0x0002)
ComfortControl_ConsumerConsumerSVC_ComfortControl기본값 0xFFFF (ANY)

완성된 SVC_ParkDistance

그림 5-15. 완성 상태의 SERVICE 탭. ① SVC_ParkDistance의 NAME, C++ NAMESPACE, 버전, 이벤트 2개. ② 접힌 SOME/IP 배포 카드 요약: 0x1001, 1.0, 제공자 ParkDistance_Provider, 소비자 ParkDistance_Consumer. 목록에서 서비스 이름 오른쪽의 파란 점은 SOME/IP 배포가 있다는 표시이다. 목록의 UpdateRequest 등 나머지 서비스는 PARA 플랫폼 임포트와 PNC 요청 포트에서 추가되는 것이며, 이 장에서는 만들지 않는다.

완성된 배포 카드

그림 5-16. 완성 예제의 배포 카드를 펼친 모습. ① NAME, SERVICE ID, 버전. 여기서는 DEC 모드라 4097로 보이며, HEX를 누르면 0x1001로 보인다. ② EVENT DEPLOYMENTS, METHOD DEPLOYMENTS, EVENT GROUPS. 이벤트 그룹은 EG_SVC_ParkDistance 하나에 두 이벤트가 묶여 있다.

완성된 서비스 인스턴스

그림 5-17. 완성 예제의 SERVICE INSTANCE 서브탭. ① ParkDistance_Provider(INSTANCE ID 1), ② 접힌 ParkDistance_Consumer 카드 요약.

참고. 새로 만든 인스턴스의 SD(Service Discovery) 설정 기본값은 완성 예제의 값과 다르다. SD 설정은 제공자 카드의 SD SERVER CONFIG, 소비자 카드의 SD CLIENT CONFIG에 있다. 완성 예제의 값(모델 필드 이름 기준)은 다음과 같다.

SD 설정제공자 예제 값소비자 예제 값
initial-delay min / max0 / 0.010 / 0.01
repetition-base-delay0.150.02
repetition-max25
offer-cyclic-delay3—
ttl1010

커넥터에 IP 주소와 Application Endpoint 넣기​

서비스 인스턴스는 바인딩된 커넥터의 IP 주소와 UDP 포트로 통신한다. 그래서 바인딩하기 전에 Ethernet 커넥터마다 IP 주소와, 인스턴스가 쓸 UDP 포트(Application Endpoint)를 먼저 넣는다. 대표로 HPC_Eth_Rear_Conn을 입력한다.

  1. 왼쪽 EDITOR 뷰의 DESIGN 아래에서 System을 클릭해 System 편집기(탭 PNC:System)를 연다.

  2. HPC 노드 아래쪽 경계의 오른쪽에 있는 Ethernet 커넥터 HPC_Eth_Rear_Conn을 클릭한다(위치는 그림 5-22의 ①). 속성 패널 제목이 ETHERNET CONNECTOR로 바뀐다. NAME이 HPC_Eth_Rear_Conn이고 CONNECTED CHANNEL이 Backbone / VLAN_Rear (VLAN: 200)인지 확인한다.

  3. NETWORK ENDPOINT 섹션이 접혀 있으면 머리글을 클릭해 펼친다. 머리글 오른쪽의 IPv4 | IPv6 토글은 IPv4로 둔다.

  4. UNICAST IPV4 ADDRESS에 192.168.200.1, NETWORK MASK에 255.255.255.0을 입력한다. ADDRESS SOURCE는 FIXED를 선택한다.

    NETWORK ENDPOINT 섹션

    그림 5-18. HPC_Eth_Rear_Conn의 NETWORK ENDPOINT 섹션. ① 머리글 오른쪽의 IPv4 | IPv6 토글 — IPv4를 선택한 상태이다. ② UNICAST IPV4 ADDRESS = 192.168.200.1. ③ ADDRESS SOURCE = FIXED(AUTO-IP, DHCPv4도 있다). ④ NETWORK MASK = 255.255.255.0. DEFAULT GATEWAY, KEEP BEHAVIOR, TTL, ASSIGNMENT PRIORITY, MULTICAST CONFIG, DNS SERVER ADDRESSES는 이 예제에서 비워 둔다.

  5. APPLICATION ENDPOINTS 머리글의 + 버튼을 클릭한다(툴팁 Add Application Endpoint). 엔드포인트 행이 하나 추가된다. 새 행의 기본 종류는 TCP이다.

  6. 새 행을 클릭해 펼치고, TYPE을 UDP로 바꾼 뒤 PORT NUMBER에 30501을 입력한다. 행 요약이 UDP HPC_Eth_Rear_Conn, 192.168.200.1:30501로 바뀐다.

    APPLICATION ENDPOINTS 섹션

    그림 5-19. APPLICATION ENDPOINTS 섹션. ① 제목 오른쪽의 + 버튼(툴팁 Add Application Endpoint). ② 펼친 엔드포인트의 TYPE — TCP | UDP 중 UDP를 선택한다. ③ PORT NUMBER = 30501. 카드 머리글에는 요약 UDP HPC_Eth_Rear_Conn, 192.168.200.1:30501이 보인다. 아래 접힌 카드는 7에서 추가하는 30503 엔드포인트이다.

  7. 5~6을 반복해 UDP 30503 엔드포인트를 하나 더 추가한다.

나머지 Ethernet 커넥터도 같은 방법으로 입력한다. NETWORK MASK는 모두 255.255.255.0, ADDRESS SOURCE는 모두 FIXED이다.

노드 / 커넥터UNICAST IPV4 ADDRESSUDP Application Endpoint (PORT NUMBER)
HPC / HPC_Eth_Body_Conn192.168.100.130501
HPC / HPC_Eth_Rear_Conn192.168.200.130501, 30503
WestZone / WestZone_Eth_Conn192.168.100.1130502
EastZone / EastZone_Eth_Conn192.168.100.1330502
SouthZone / SouthZone_Eth_Conn192.168.200.1230502, 30503

참고. 엔드포인트 이름은 PAIO가 <노드>_<커넥터>_UDP_<포트> 형식으로 자동으로 붙인다. 완성 예제의 이름(HPC_Rear_UDP_30501 등)과 달라도 된다. 굵게 표시한 30503은 같은 커넥터에 인스턴스가 둘 바인딩될 때 소비자 쪽이 쓸 포트이다.

커넥터에 서비스 인스턴스 바인딩하기​

이제 서비스 인스턴스를 커넥터에 바인딩한다. 바인딩하면 인스턴스가 그 커넥터의 IP 주소와 포트를 쓴다.

  1. HPC_Eth_Rear_Conn이 선택된 상태에서 SERVICE INSTANCES 섹션 머리글의 + 버튼을 클릭한다(툴팁 Add Service Instance). Select Service Instance 창이 열린다.

  2. ParkDistance_Consumer 행의 체크 상자를 선택하고 Bind를 클릭한다.

    Select Service Instance 창

    그림 5-20. Select Service Instance 창. 열은 PROTOCOL, ROLE, INSTANCE, SERVICE, SERVICE ID, INSTANCE ID이다. ① ParkDistance_Consumer 행 체크, ② Bind. SERVICE ID는 10진수(4097)로 표시된다.

  3. SERVICE INSTANCES에 SOME/IP C ParkDistance_Consumer 카드가 생긴다. 아직 포트가 없다. 카드를 클릭해 펼치면 IP ADDRESS(192.168.200.1, 커넥터 주소라 고칠 수 없음), TCP PORT, UDP PORT가 보인다. 그 아래의 TLS (TCP), TLS (UDP) 줄은 이 예제에서 비워 둔다.

  4. UDP PORT 오른쪽의 ▾ 버튼을 클릭한다. 이 커넥터의 Application Endpoint 포트 목록(30501, 30503)이 열린다.

  5. 30503을 선택한다.

    UDP 포트 선택

    그림 5-21. ① UDP PORT 목록, ② 30503. 같은 커넥터의 VehicleState_Provider가 30501을 쓰므로, 소비자에게는 겹치지 않는 30503을 준다.

  6. 캔버스에서 다른 요소를 클릭한 뒤 HPC_Eth_Rear_Conn을 다시 클릭한다. 카드 요약 줄이 UDP:30503으로 갱신된다.

    바인딩 완료

    그림 5-22. ① 선택한 커넥터 HPC_Eth_Rear_Conn, ② SERVICE INSTANCES의 요약 줄 SOME/IP C ParkDistance_Consumer UDP:30503. VehicleState_Provider는 아직 바인딩하지 않아서 한 줄만 보인다. 탭의 ● 표시는 저장하지 않은 변경이 있다는 뜻이다.

  7. Ctrl+S를 눌러 저장한다.

참고. 포트를 바꿔도 카드 요약 줄(UDP:…)은 바로 바뀌지 않는다. 모델에는 즉시 반영되며, 커넥터를 다시 선택하면 요약도 갱신된다.

참고. Bind부터 UDP 포트를 정할 때까지 상태 표시줄의 검증 아이콘(V)에 빨간 배지 1이 붙고, VALIDATION 패널에는 ParkDistance_Consumer의 오류 1건 Service "SVC_ParkDistance" uses UDP, but the mapping of "ParkDistance_Consumer" on "HPC/HPC_Eth_Rear_Conn" defines no UDP port.가 나온다. 5에서 포트를 정하면 오류가 사라지고 배지도 없어진다(그림 5-22). 아이콘의 툴팁에는 마지막 건수 Validation: 1 error(s), 0 warning(s), 0 info(s)가 그대로 남는다. 현재 결과는 VALIDATION 패널에서 확인한다.

나머지 바인딩​

같은 방법으로 인스턴스 7개를 모두 바인딩한다. 굵게 표시한 포트는 같은 커넥터의 다른 인스턴스와 겹치지 않도록 30503으로 정한 값이다.

노드 / 커넥터바인딩할 인스턴스 (역할, UDP PORT)
HPC / HPC_Eth_Body_ConnComfortControl_Consumer (C, 30501)
HPC / HPC_Eth_Rear_ConnVehicleState_Provider (P, 30501), ParkDistance_Consumer (C, 30503)
WestZone / WestZone_Eth_ConnComfortControl_Provider_West (P, 30502)
EastZone / EastZone_Eth_ConnComfortControl_Provider_East (P, 30502)
SouthZone / SouthZone_Eth_ConnParkDistance_Provider (P, 30502), VehicleState_Consumer (C, 30503)

완성된 HPC_Eth_Rear_Conn

그림 5-23. 완성 상태의 HPC_Eth_Rear_Conn. ① APPLICATION ENDPOINTS의 UDP 엔드포인트 두 개(HPC_Eth_Rear_Conn, 192.168.200.1:30501, HPC_Eth_Rear_Conn, 192.168.200.1:30503). ② SERVICE INSTANCES의 P VehicleState_Provider UDP:30501, C ParkDistance_Consumer UDP:30503.

주의. 같은 IP 주소와 같은 UDP 포트에 인스턴스 두 개를 바인딩하면 검증 오류(paio_someip_address_port_unique)가 난다. 한 커넥터에 인스턴스가 둘 이상이면 포트를 서로 다르게 지정한다.

왜 PNC가 서비스 인스턴스를 참조하는가​

HPC(AP)와 Zone ECU(CP) 사이는 SOME/IP로 통신한다. PNC는 I-PDU Group과 물리 채널뿐 아니라 서비스 인스턴스도 참조할 수 있다. 서비스 인스턴스를 참조해 두면 "이 PNC가 깨어 있어야 쓸 수 있는 서비스"가 모델에 명시된다. 예를 들어 PNC_ParkAssist가 잠들면 SVC_ParkDistance도 쓸 수 없다.

이 참조가 의미를 가지려면 인스턴스가 커넥터에 바인딩되어 있어야 한다. 바인딩이 있어야 익스포트할 때 인스턴스와 머신을 잇는 매핑(SomeipServiceInstanceToMachineMapping)이 만들어진다. 그래서 이 장에서 정한 인스턴스 이름을 커넥터 바인딩과 PNC 다이얼로그 — PNC별 바인딩의 SERVICE INSTANCES 양쪽에서 쓴다.

확인하기​

  • SENDER-RECEIVER 탭에 SRI_* 인터페이스 11개가 있고, SRI_ParkDistance에 데이터 요소 5개가 있다.
  • SERVICE 탭에 SVC_ParkDistance, SVC_VehicleState, SVC_ComfortControl이 있다.
  • 각 서비스의 SOA DEPLOYMENT 카드 요약에 Service ID 0x1001, 0x1002, 0x1003과 버전 1.0이 보인다.
  • SERVICE INSTANCE 서브탭에 제공자 4개와 소비자 3개가 표의 이름으로 있다.
  • System 편집기에서 Ethernet 커넥터 5개에 표의 UNICAST IPV4 ADDRESS와 UDP Application Endpoint가 있다.
  • System 편집기에서 HPC_Eth_Rear_Conn을 선택하면 SERVICE INSTANCES에 VehicleState_Provider UDP:30501과 ParkDistance_Consumer UDP:30503이 보인다.
  • Interface 편집기와 System 편집기 탭에 저장하지 않은 변경 표시(●)가 없다.

다음 단계​

VFB와 VFC(PortGroup)에서 기능에 참여하는 SWC 포트를 PortGroup으로 묶어 VFC(Virtual Function Cluster)를 만든다.