FirmGod

J1939 PGN 디코더

29비트 J1939 식별자를 우선순위, PGN, 송신·수신 주소로 분해하거나 PGN으로 식별자를 만듭니다. SAE J1939-21의 PDU1·PDU2 규칙을 그대로 따릅니다.

공백은 무시하고, 0x 접두사는 선택한 진법과 무관하게 항상 16진수를 뜻합니다.

예시
PGN 652650xFEF1

Cruise Control/Vehicle Speed (CCVS1)

식별자0x18FEF100 · 419361024
PGN0xFEF1 · 65265
PDU formatPDU2 — PF 254 ≥ 240, 브로드캐스트
우선순위6 (110)
송신 주소0x00 · 0
그룹 확장0xF1 · 241
데이터 페이지 / 확장 데이터 페이지DP 0 · EDP 0
도달 범위모든 노드
비트 구성110 0 0 11111110 11110001 00000000

왼쪽부터 우선순위, EDP, DP, PDU format, PDU specific, 송신 주소입니다.

자주 쓰이는 PGN

일반적인 캡처를 채우는 메시지만 추린 것이고 J1939 데이터베이스가 아닙니다. 그 밖의 것은 각자의 DBC에서 찾으세요.

59392Acknowledgement (ACKM)
59904Request (RQST)
60160Transport Protocol, Data Transfer (TP.DT)
60416Transport Protocol, Connection Management (TP.CM)
60928Address Claimed (AC)
61443Electronic Engine Controller 2 (EEC2)
61444Electronic Engine Controller 1 (EEC1)
65226Active Diagnostic Trouble Codes (DM1)
65227Previously Active Diagnostic Trouble Codes (DM2)
65247Electronic Engine Controller 3 (EEC3)
65253Engine Hours, Revolutions (HOURS)
65262Engine Temperature 1 (ET1)
65263Engine Fluid Level/Pressure 1 (EFL/P1)
65265Cruise Control/Vehicle Speed (CCVS1)
65266Fuel Economy, Liquid (LFE1)
65269Ambient Conditions (AMB)
65270Inlet/Exhaust Conditions 1 (IC1)
65271Vehicle Electrical Power 1 (VEP1)
65272Transmission Fluids 1 (TRF1)
65276Dash Display (DD)

29비트 식별자의 구성

J1939는 29비트 확장 식별자를 쓰는 CAN 위에서 동작하고, SAE J1939-21이 그 식별자의 모든 비트에 역할을 지정합니다. 구현자가 고를 여지가 없고, 그래서 서로 다른 제조사의 노드가 같은 버스에서 통합니다.

  • 28~26비트, 우선순위 — 3비트, 0이 가장 높습니다. 중재에만 쓰입니다.
  • 25비트 EDP와 24비트 DP — 확장 데이터 페이지와 데이터 페이지
  • 23~16비트 PF — PDU format. 다음 바이트를 어떻게 읽을지 결정합니다.
  • 15~8비트 PS — 목적지 주소 또는 그룹 확장
  • 7~0비트 SA — 프레임을 보낸 노드의 주소

PGN은 EDP, DP, PF, 그리고 경우에 따라 PS로 조립됩니다. 우선순위와 송신 주소는 절대 포함되지 않습니다. PGN은 무엇을 보내는지를 식별하고, 식별자 전체는 거기에 더해 누가 얼마나 급하게 보내는지를 담습니다.

모두가 걸리는 규칙

PS가 PGN에 포함되는지는 PF가 결정하고, 그것을 알려 주는 별도의 표시는 없습니다.

  • PF 240 미만 — PDU1, 주소 지정. PS는 목적지 주소이고 PGN의 하위 바이트는 0입니다.
  • PF 240 이상 — PDU2, 브로드캐스트. PS는 그룹 확장이며 PGN의 일부입니다.

이것을 거꾸로 알면 스스로 숨습니다. 노드 0x21로 보낸 요청의 식별자는 0x18EA21FE입니다. 가운데 두 바이트를 PGN으로 읽으면 0xEA21이 나오는데, 그런 PGN은 표준에도 데이터베이스에도 없어서 알 수 없는 독자 메시지처럼 보입니다. 실제 PGN은 0xEA00 — 59904, Request 메시지 — 이고 0x21은 그저 받는 쪽입니다. 목적지를 PGN에 섞으면 잘 알려진 메시지 하나가 256개의 가짜 메시지로 변합니다.

우선순위가 하는 일과 하지 않는 일

CAN 중재는 회선에서 비트 단위로 결정되고 dominant 비트가 이깁니다. 우선순위가 식별자 최상위에 있으므로 우선순위 3인 프레임은 6인 프레임과 동시에 송신을 시작하면 반드시 이깁니다. 진 쪽은 물러났다가 다시 시도합니다.

하지 않는 일은 메시지의 정체를 바꾸는 것입니다. 같은 PGN을 다른 노드가 다른 우선순위로 보내도 같은 파라미터 그룹이고 신호 배치도 같습니다. 식별자 전체로 필터를 걸면 트래픽을 놓칠 수 있는 이유가 이것입니다 — 우선순위를 올린 노드는 보내는 내용은 그대로인데 식별자가 달라집니다.

주소, 그리고 노드가 아닌 두 값

버스의 모든 노드는 0부터 253까지의 주소를 가지며, 시작할 때 Address Claimed(PGN 60928)로 확보하고 다른 노드가 같은 주소를 주장하면 방어합니다. 두 값은 예약되어 있습니다.

  • 254, 널 주소 — 주소를 확보하지 못한 노드가 송신 주소로 씁니다. 송신 주소에서 이 값을 보면 주소 확보가 실패했거나 아직 끝나지 않은 것입니다.
  • 255, 전역 주소 — 모든 노드에 보낼 때 목적지로 씁니다. 255로 보낸 PDU1 메시지는 버스 전체에 닿습니다.

캡처를 읽을 때

일반적인 상용차 캡처의 대부분은 고정 주기로 반복되는 몇 개의 PDU2 메시지입니다. EEC1의 엔진 회전수와 토크, CCVS1의 차속, ET1의 온도 같은 것들입니다. 관심 있는 노드라면 누구나 쓸 수 있어 브로드캐스트이고 목적지가 없습니다.

대화가 일어나는 곳은 PDU1 쪽입니다. 요청과 응답, 8바이트를 넘는 메시지를 위한 전송 프로토콜 세션, 주소 확보 같은 것들입니다. 무엇이 무엇과 통신하는지 보려면 주소 지정 메시지를 따라가야 합니다.

식별자를 만들 때

반대 방향 — PGN에서 송신할 식별자를 만드는 것 — 에서도 PDU1 규칙이 다시 걸립니다. PDU2 PGN은 그룹 확장을 자기 안에 담고 있으므로 PGN, 우선순위, 자기 송신 주소만 있으면 됩니다. PDU1 PGN은 목적지를 따로 받아야 합니다. PGN이 의도적으로 목적지를 담고 있지 않기 때문입니다.

이 도구는 하위 바이트가 0이 아닌 PDU1 PGN을 조용히 잘라내지 않고 거부합니다. 그 자리에 0xEA21 같은 값이 들어왔다는 것은 호출자가 목적지를 파라미터 그룹의 일부로 믿고 있다는 뜻이고, 그대로 인코딩하면 본인이 의도한 것과 다른 프레임이 나가기 때문입니다.

자주 묻는 질문

PGN이 DBC 파일의 값과 다릅니다.

대개 PDU1 메시지인데 목적지 주소를 PGN에 포함시켰기 때문입니다. PF가 240 미만이면 그다음 바이트는 목적지 주소이지 PGN의 일부가 아니며, PGN의 하위 바이트는 0이 됩니다. 노드 0x21로 보낸 요청의 0xEA21을 PGN으로 읽으면 어떤 데이터베이스에도 없는 값이 나옵니다. 실제 PGN은 0xEA00, 즉 59904입니다.

PDU1과 PDU2가 무엇이 다른가요?

PDU format 바이트 값이 전부입니다. 240 미만이면 특정 노드에 보내는 메시지이고 다음 바이트가 그 주소입니다. 240 이상이면 브로드캐스트이고 다음 바이트는 그룹 확장으로 PGN에 포함됩니다. 어느 쪽인지 알려 주는 별도의 플래그는 없습니다.

우선순위가 PGN을 바꾸나요?

바꾸지 않습니다. 우선순위는 식별자 최상위 3비트를 차지하고 의도적으로 PGN 밖에 있습니다. 같은 파라미터 그룹을 다른 우선순위로 보내도 여전히 같은 메시지입니다. 중재에만 영향을 주며 값이 작을수록 우선합니다.

주소 254와 255는 무엇인가요?

254는 널 주소로, 아직 주소를 확보하지 못한 노드가 송신 주소로 씁니다. 255는 전역 주소로, 모든 노드에 보낼 때 목적지로 씁니다. 255로 보낸 PDU1 메시지는 형식은 주소 지정이지만 실질적으로 브로드캐스트입니다.

NMEA 2000에도 쓸 수 있나요?

식별자 구조가 같아서 우선순위, PGN, 송신·수신 주소는 정확히 나옵니다. 다만 파라미터 그룹의 의미와 데이터 페이지 사용 방식이 달라서, 계산은 맞아도 여기 표시되는 이름은 NMEA 2000 메시지와 일치하지 않습니다.