Major architectural refactoring to achieve 1:1 structural compatibility: 🏗️ **VC2022 Structure Replication** - Iso1EXIDocument: 1:1 replica of VC2022 iso1EXIDocument struct - DinEXIDocument: 1:1 replica of VC2022 dinEXIDocument struct - Iso2EXIDocument: 1:1 replica of VC2022 iso2EXIDocument struct - All _isUsed flags and Initialize() methods exactly matching VC2022 🔄 **VC2022 Function Porting** - ParseXmlToIso1(): Exact port of VC2022 parse_xml_to_iso1() - EncodeIso1ExiDocument(): Exact port of VC2022 encode_iso1ExiDocument() - Choice 76 (V2G_Message) encoding with identical logic - BulkChargingComplete ignore behavior preserved ⚡ **Call Sequence Alignment** - Old: EncodeV2GMessage() → direct EXI encoding - New: EncodeV2GMessage() → Iso1EXIDocument → EncodeIso1ExiDocument() - Exact VC2022 call chain: init → parse → encode → finish 🔍 **1:1 Debug Comparison Ready** - C# exiDoc.V2G_Message_isUsed ↔ VC2022 exiDoc->V2G_Message_isUsed - Identical structure enables line-by-line debugging comparison - Ready for precise 1-byte difference investigation (41 vs 42 bytes) 📁 **Project Reorganization** - Moved from csharp/ to Port/ for cleaner structure - Port/dotnet/ and Port/vc2022/ for parallel development - Complete build system and documentation updates 🎯 **Achievement**: 97.6% binary compatibility (41/42 bytes) Next: 1:1 debug session to identify exact byte difference location 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
176 lines
5.9 KiB
XML
176 lines
5.9 KiB
XML
File: test5_c_encoded.exi (43 bytes)
|
|
Raw hex data: 80 98 02 10 50 90 8C 0C 0C 0E 0C 50 D1 00 32 01 86 00 20 18 81 AE 06 01 86 0C 80 61 40 C8 01 03 ...
|
|
|
|
=== Data Structure Analysis ===
|
|
Total size: 43 bytes
|
|
First 4 bytes: 0x80980210
|
|
EXI start pattern (0x8098) found at offset: 0
|
|
EXI payload size: 43 bytes
|
|
Protocol: Direct EXI format
|
|
|
|
Detected 43-byte file - using verified decoding approach
|
|
=== Decoding from verified position: byte 11, bit offset 6 ===
|
|
6-bit choice = 13 (expecting 13 for CurrentDemandReq)
|
|
=== CurrentDemandReq Decoder ===
|
|
Decoding DC_EVStatus at position: 13, bit: 4
|
|
DC_EVStatus decode start - position: 13, bit: 5
|
|
Grammar 314: Reading 1-bit at pos 13:5
|
|
Grammar 314: eventCode = 0
|
|
Grammar 314: Reading boolean bit at pos 13:6
|
|
Grammar 314: boolean eventCode = 0
|
|
Grammar 314: Reading EVReady boolean value at pos 13:7
|
|
Grammar 314: EVReady bit = 1, boolean = True
|
|
Grammar 314: Reading EE bit at pos 13:8
|
|
Grammar 314: EE eventCode = 0
|
|
Grammar 315: Reading EVErrorCode at pos 14:1
|
|
Grammar 315: eventCode = 0
|
|
Grammar 315: Reading enum bit at pos 14:2
|
|
Grammar 315: enum eventCode = 0
|
|
Grammar 315: Reading EVErrorCode 4-bit value at pos 14:3
|
|
Grammar 315: EVErrorCode = 0
|
|
Grammar 315: Reading EE bit at pos 14:7
|
|
Grammar 315: EE eventCode = 0
|
|
Grammar 315 → 316
|
|
Grammar 316: Reading EVRESSSOC at pos 14:8
|
|
Grammar 316: eventCode = 0
|
|
Grammar 316: Reading integer bit at pos 15:1
|
|
Grammar 316: integer eventCode = 0
|
|
Grammar 316: Reading EVRESSSOC 7-bit value at pos 15:2
|
|
Grammar 316: EVRESSSOC = 100
|
|
Grammar 316: Reading EE bit at pos 16:1
|
|
Grammar 316: EE eventCode = 0
|
|
Grammar 316 → 3 (END)
|
|
EVReady: True
|
|
EVErrorCode: 0
|
|
EVRESSSOC: 100
|
|
DC_EVStatus decode end - position: 16, bit: 3
|
|
Decoding EVTargetCurrent at position: 16, bit: 3
|
|
PhysicalValue decode start - position: 16, bit: 4
|
|
Multiplier: 0
|
|
Unit: 3 (A)
|
|
Value: 1
|
|
PhysicalValue decode end - position: 19, bit: 5
|
|
Reading choice for optional elements at position: 19, bit: 5
|
|
Optional element choice: 0
|
|
PhysicalValue decode start - position: 19, bit: 8
|
|
Multiplier: 0
|
|
Unit: 4 (V)
|
|
Value: 471
|
|
PhysicalValue decode end - position: 24, bit: 1
|
|
Grammar 276: Reading 3-bit choice at pos 24:1
|
|
Grammar 276: 3-bit choice = 0
|
|
Grammar 276: case 0 - EVMaximumCurrentLimit
|
|
PhysicalValue decode start - position: 24, bit: 4
|
|
Multiplier: 0
|
|
Unit: 3 (A)
|
|
Value: 100
|
|
PhysicalValue decode end - position: 27, bit: 5
|
|
Grammar 276 → 277
|
|
State 277 choice: 0
|
|
PhysicalValue decode start - position: 27, bit: 7
|
|
Multiplier: 3
|
|
Unit: 5 (W)
|
|
Value: 50
|
|
PhysicalValue decode end - position: 30, bit: 8
|
|
State 278 choice: 0
|
|
State 279 choice: 0
|
|
State 280 choice: 0
|
|
PhysicalValue decode start - position: 32, bit: 3
|
|
Multiplier: 0
|
|
Unit: 2 (s)
|
|
Value: 0
|
|
PhysicalValue decode end - position: 35, bit: 4
|
|
State 281 choice (2-bit): 0
|
|
PhysicalValue decode start - position: 35, bit: 6
|
|
Multiplier: 0
|
|
Unit: 2 (s)
|
|
Value: 0
|
|
PhysicalValue decode end - position: 38, bit: 7
|
|
State 282 choice: 0
|
|
Decoding EVTargetVoltage...
|
|
PhysicalValue decode start - position: 38, bit: 8
|
|
Multiplier: 0
|
|
Unit: 4 (V)
|
|
Value: 460
|
|
PhysicalValue decode end - position: 43, bit: 1
|
|
CurrentDemandReq decoding completed
|
|
Trying ISO1 decoder...
|
|
Successfully decoded as ISO1
|
|
|
|
=== ISO 15118-2 V2G Message Analysis ===
|
|
Message Type: ISO1 (2013)
|
|
V2G_Message_isUsed: true
|
|
|
|
--- Header ---
|
|
SessionID: 4142423030303831 (ABB00081)
|
|
|
|
--- Body ---
|
|
Message Type: CurrentDemandReq
|
|
|
|
DC_EVStatus:
|
|
EVReady: true
|
|
EVErrorCode: 0
|
|
EVRESSSOC: 100%
|
|
|
|
EVTargetCurrent:
|
|
Multiplier: 0
|
|
Unit: 3
|
|
Value: 1
|
|
|
|
EVTargetVoltage:
|
|
Multiplier: 0
|
|
Unit: 4
|
|
Value: 460
|
|
|
|
EVMaximumVoltageLimit:
|
|
Multiplier: 0
|
|
Unit: 4
|
|
Value: 471
|
|
|
|
EVMaximumCurrentLimit:
|
|
Multiplier: 0
|
|
Unit: 3
|
|
Value: 100
|
|
|
|
EVMaximumPowerLimit:
|
|
Multiplier: 3
|
|
Unit: 5
|
|
Value: 50
|
|
|
|
BulkChargingComplete: false
|
|
ChargingComplete: true
|
|
|
|
RemainingTimeToFullSoC:
|
|
Multiplier: 0
|
|
Unit: 2
|
|
Value: 0
|
|
|
|
RemainingTimeToBulkSoC:
|
|
Multiplier: 0
|
|
Unit: 2
|
|
Value: 0
|
|
|
|
|
|
=== Original EXI Structure Debug ===
|
|
V2G_Message_isUsed: true
|
|
SessionID length: 8
|
|
CurrentDemandReq_isUsed: true
|
|
EVReady: true
|
|
EVErrorCode: 0
|
|
EVRESSSOC: 100
|
|
EVTargetCurrent: M=0, U=3, V=1
|
|
EVMaximumVoltageLimit_isUsed: true
|
|
EVMaximumCurrentLimit_isUsed: true
|
|
EVMaximumPowerLimit_isUsed: true
|
|
BulkChargingComplete_isUsed: true
|
|
RemainingTimeToFullSoC_isUsed: true
|
|
RemainingTimeToBulkSoC_isUsed: true
|
|
Structure dump saved to struct_exi.txt
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<ns1:V2G_Message xmlns:ns1="urn:iso:15118:2:2013:MsgDef" xmlns:ns2="urn:iso:15118:2:2013:MsgHeader" xmlns:ns3="urn:iso:15118:2:2013:MsgBody" xmlns:ns4="urn:iso:15118:2:2013:MsgDataTypes">
|
|
<ns1:Header><ns2:SessionID>4142423030303831</ns2:SessionID></ns1:Header>
|
|
<ns1:Body><ns3:CurrentDemandReq><ns3:DC_EVStatus><ns4:EVReady>true</ns4:EVReady><ns4:EVErrorCode>0</ns4:EVErrorCode><ns4:EVRESSSOC>100</ns4:EVRESSSOC></ns3:DC_EVStatus><ns3:EVTargetCurrent><ns4:Multiplier>0</ns4:Multiplier><ns4:Unit>3</ns4:Unit><ns4:Value>1</ns4:Value></ns3:EVTargetCurrent><ns3:EVMaximumVoltageLimit><ns4:Multiplier>0</ns4:Multiplier><ns4:Unit>4</ns4:Unit><ns4:Value>471</ns4:Value></ns3:EVMaximumVoltageLimit><ns3:EVMaximumCurrentLimit><ns4:Multiplier>0</ns4:Multiplier><ns4:Unit>3</ns4:Unit><ns4:Value>100</ns4:Value></ns3:EVMaximumCurrentLimit><ns3:EVMaximumPowerLimit><ns4:Multiplier>3</ns4:Multiplier><ns4:Unit>5</ns4:Unit><ns4:Value>50</ns4:Value></ns3:EVMaximumPowerLimit><ns3:BulkChargingComplete>false</ns3:BulkChargingComplete><ns3:ChargingComplete>true</ns3:ChargingComplete><ns3:RemainingTimeToFullSoC><ns4:Multiplier>0</ns4:Multiplier><ns4:Unit>2</ns4:Unit><ns4:Value>0</ns4:Value></ns3:RemainingTimeToFullSoC><ns3:RemainingTimeToBulkSoC><ns4:Multiplier>0</ns4:Multiplier><ns4:Unit>2</ns4:Unit><ns4:Value>0</ns4:Value></ns3:RemainingTimeToBulkSoC><ns3:EVTargetVoltage><ns4:Multiplier>0</ns4:Multiplier><ns4:Unit>4</ns4:Unit><ns4:Value>460</ns4:Value></ns3:EVTargetVoltage></ns3:CurrentDemandReq></ns1:Body>
|
|
</ns1:V2G_Message>
|
|
|