MCS (ISO 15118-20 over 10BASE-T1S) Runbook
The Megawatt Charging System (MCS) carries ISO 15118-20 high-level communication over a 10BASE-T1S data link instead of powerline communication. ChargeLink runs an MCS session as an ISO 15118-20 DC session that selects the MCS energy service (ServiceID 8), with external identification (EIM), in the Scheduled control mode, over TLS only, in the charger (SECC) and the vehicle (EVCC) role. The connector signals (CE and ID) come from ChargeLink's simulated coupler model and travel over the coupler link, a ChargeLink interface on TCP port 50119 of the same 10BASE-T1S cable. Because the coupler link is ChargeLink's own interface, both roles in this release run against the other ChargeLink role, not against a third-party device (see Limits).
The MCS session uses the DC messages of ISO 15118-20. What MCS adds in ChargeLink:
- The data link first. The charger answers SDP discovery only once the data link is ready (the EV is present on the coupler link and the connector reads as mated).
- Connector checks. The charger answers the cable check only with the CE state C measured, and welding detection and the session stop only with CE state B. The EV closes its switch before the cable check and opens it after the stop.
- Side-B voltage check. On a plant-coupled charger, the schedule exchange is finished only when the plant's side-B voltage allows it; until then the charger answers Ongoing and the EV repeats its request.
- MCS limits. The charger's start check accepts the MCS voltage and current range (see Limits).
The kit has a charger\ and a vehicle\ folder.
Before you start
| Item | Requirement |
|---|---|
| Windows PCs | One ChargeLink PC per role: the charger runs on the NI VeriStand bench, the EV on a second PC. Each PC needs its own ChargeLink licence; a licensed command is refused on an unlicensed host. |
| A USB 10BASE-T1S adapter on each PC | Windows must show it as an Ethernet interface with an IPv6 link-local (fe80::) address in the Preferred state. Install the adapter's driver as its supplier describes. |
| A 10BASE-T1S cable | Point to point between the two adapters. Termination and the physical layer are the bench's responsibility (see Limits). |
| PLCA settings | PLCA on, node ID 0 on the charger side, node ID 1 on the EV side, node count 8. Set them where the adapter's driver exposes them (on Windows, usually the adapter's advanced properties) and check that they survive a re-plug. |
| One ChargeLink version for both roles | The coupler link and the TLS session require both ends from the same release. |
| TLS material | MCS runs over TLS only. Use the V2G root CA, the SECC chain and key for the charger and the vehicle chain and key for the EV, from the same PKI (see TLS and PKI). The engineering PKI delivered with the bench kit is for test benches only. |
| EV case files | The EV case and the full-wire session manifest, as for the ISO 15118-20 vehicle role. The EV case must fit the charger's operating point (see ChargeLink as vehicle). |
Complete the preflight for the 10BASE-T1S interface on each PC. Then note, on each PC:
Get-NetAdapter | Format-Table Name, ifIndex, Status, InterfaceDescription
Get-NetIPAddress -AddressFamily IPv6 -InterfaceIndex <T1S_IFINDEX> | Where-Object { $_.IPAddress -like 'fe80*' }
You need the charger's 10BASE-T1S link-local address and the 10BASE-T1S interface index of each PC. Windows can renumber interfaces after a restart or a re-plug, so read the index again before each bench day.
Set up the network
- Connect the two adapters with the 10BASE-T1S cable and apply the PLCA settings above on both PCs.
- Check the link: both interfaces show
Up, and each PC reaches the other's link-local address on the 10BASE-T1S interface (for exampleping fe80::<CHARGER_ADDRESS>%<LOCAL_T1S_IFINDEX>from the EV side; the zone index is always the local PC's interface index). - On the charger side, an administrator adds three inbound Allow rules for the charger's
chargelink.exe, limited to the 10BASE-T1S interface and to link-local remote addresses (fe80::/10): UDP 15118 (SDP), TCP 50118 (the TLS session) and TCP 50119 (the coupler link). The EV side opens outbound connections only.
$Exe = '<KIT>\charger\bin\chargelink.exe'
$T1s = '<CHARGER_T1S_ADAPTER_NAME>'
New-NetFirewallRule -DisplayName 'ChargeLink MCS SDP' -Direction Inbound -Action Allow -Program $Exe -Protocol UDP -LocalPort 15118 -InterfaceAlias $T1s -RemoteAddress 'fe80::/10'
New-NetFirewallRule -DisplayName 'ChargeLink MCS session' -Direction Inbound -Action Allow -Program $Exe -Protocol TCP -LocalPort 50118 -InterfaceAlias $T1s -RemoteAddress 'fe80::/10'
New-NetFirewallRule -DisplayName 'ChargeLink MCS coupler link' -Direction Inbound -Action Allow -Program $Exe -Protocol TCP -LocalPort 50119 -InterfaceAlias $T1s -RemoteAddress 'fe80::/10'
Add the rules before the charger runs for the first time. If Windows shows a Windows Security Alert for chargelink.exe, see Troubleshooting.
Protocol and profile per role
| Role | Where it runs | Protocol and profile | MCS selection |
|---|---|---|---|
| Charger (SECC) | Plant-coupled, on the NI VeriStand bench | --protocol mcs, profile mcs_reference_bench | The runtime profile's "energy_service": "mcs"; TLS required |
| EV (EVCC) | A ChargeLink PC | --protocol iso15118-20, profile iso15118_20_dc_evcc_reference | --energy-service mcs with --mcs-coupler-link; TLS required |
The protocol and the profile must agree: an mcs charger runs only with a runtime profile whose energy service is mcs, and such a runtime profile runs only under --protocol mcs. Without the MCS settings, the EV runs a plain ISO 15118-20 DC session, unchanged.
ChargeLink as charger
The MCS charger is plant-coupled: it computes every response from the session and the plant model, reads the plug-in state from the plant and shows the connector signals on the operator screen. It answers SDP only after an EV has connected to its coupler link, so in this release its peer is the ChargeLink EV (see Limits). On the NI VeriStand bench the bench software starts it for you. Install and activate the bench first (Set Up the VeriStand Bench), with the 10BASE-T1S adapter as the bench interface.
- Open PowerShell as administrator in the kit's charger folder (
charger\) and start the operator with the MCS stack:
VeriStand opens with the ChargeLink screen. The run folder records which plant model, EV case and operating point the charger was started with (.\Start-ChargeLinkVeriStand.ps1 -Stack Mcsdemo-plant.json). - On the screen press, in this order: Apply safe startup, Start session, Start external EVCC. Wait until the screen shows that the external EVCC session runs.
- Start the EV (see ChargeLink as vehicle).
- On the screen's MCS page press Plug inserted. The page shows the CE state, the ID state and D-LINK_READY from ChargeLink's coupler model. The charger answers discovery only after the EV has connected to the coupler link and D-LINK_READY is shown.
- Finish and stop the session as on the NI VeriStand Bench page.
For reference, the bench software starts the charger with settings equivalent to the following; operators do not type this command.
$Data = 'C:\ChargeLinkData'
$Run = "mcs-$(Get-Date -Format yyyyMMdd-HHmmss)"
$IfIndex = <CHARGER_T1S_IFINDEX>
$Advertise = 'fe80::<CHARGER_T1S_ADDRESS>%' + $IfIndex
$Pki = "$Data\pki"
$env:CHARGELINK_ISO20_RUNTIME_PROFILE = '<KIT>\charger\config\mcs_runtime_profile.json'
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse start --external-evcc-session --run-id $Run `
--protocol mcs --profile-id mcs_reference_bench --exi-mode chargelink-exi `
--host '::' --tcp-port 50118 --udp-port 15118 `
--advertise-ipv6 $Advertise --interface-index $IfIndex `
--tls --tls-cert "$Pki\secc-chain.pem" --tls-key "$Pki\secc-key.pem" --tls-cafile "$Pki\v2g-root-ca.pem" --require-ca `
--plant-grpc-endpoint <PLANT_ENDPOINT> --requested-power-kw 1250 --target-voltage-v 900
- The coupler link listens on TCP 50119 on the charger's listen address.
--advertise-ipv6and--interface-indexname the charger's 10BASE-T1S interface; without them a non-loopback charger refuses to start. - The kit's MCS runtime profile offers the Scheduled control mode with one 300 s charging schedule. On a bench with the DC plant model instead of the MCS plant model, the kit falls back to the DC operating point and a 60 s schedule, and labels the run as a DC-power fallback.
- The charger's stated maxima default to the operating point (
--requested-power-kw,--target-voltage-v).--evse-rated-current-aand--evse-rated-voltage-vstate a higher rating for a plant-coupled charger; the start check refuses a rating below the operating point, a voltage above 1250 V and a current above 3000 A. - A charger started without a plant endpoint does not run the MCS runtime: it offers the DC service only, and its evidence says so (see Results and evidence).
A good session: the coupler record shows the EV on the coupler link, D-LINK_READY and the first SDP request answered, and the charger's evidence ends with evidence_status: passed and offered_service_id 8.
ChargeLink as vehicle
The EV is the ISO 15118-20 DC EVCC with the MCS energy service. It connects to the charger's coupler link, waits for D-LINK_READY, then runs SDP on the 10BASE-T1S interface, TLS and the MCS session. The coupler link is required, so in this release its peer is the ChargeLink MCS charger (see Limits). Choose the EV case that fits the charger's operating point, as named in the charger's demo-plant.json:
| Plant model of the charger | Charger operating point | EV case |
|---|---|---|
| MCS plant model | 1250 kW at 900 V, 300 s schedule | mcs_demo_ev.json (the MCS demo EV case, from the kit's charger\evcc-cases) |
| DC plant model (fallback) | 80 kW at 800 V, 60 s schedule | nominal.json |
In a normal (not elevated) PowerShell window on the ChargeLink PC, in the kit's vehicle folder (vehicle\):
$Data = 'C:\ChargeLinkData'
$IfIndex = <LOCAL_T1S_IFINDEX>
$ChargerT1s = 'fe80::<CHARGER_T1S_ADDRESS>'
$Coupler = '[' + $ChargerT1s + '%' + $IfIndex + ']:50119'
$Tls = '<KIT>\vehicle\tls'
$env:CHARGELINK_ISO20_LIVE_SEMANTIC_CASE = '<KIT>\vehicle\cases\<EV_CASE>.json'
$env:CHARGELINK_ISO20_FULL_WIRE_SESSION_MANIFEST = '<KIT>\vehicle\cases\full-wire-session-manifest.json'
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc activate-profile `
--protocol iso15118-20 --profile-id iso15118_20_dc_evcc_reference `
--use-sdp --interface-index $IfIndex --tcp-port 50118 --connect-timeout-ms 5000 --exi-mode chargelink-exi `
--tls --tls-cert "$Tls\vehicle-cert-chain.pem" --tls-key "$Tls\vehicle-key.pem" --tls-cafile "$Tls\v2g-root-ca.pem" --require-ca `
--max-steps 14 --requested-power-kw 80 `
--energy-service mcs --mcs-coupler-link $Coupler
| Option | Meaning |
|---|---|
--energy-service mcs | Select the MCS energy service (ServiceID 8). The default is dc. mcs requires --tls and --mcs-coupler-link. |
--mcs-coupler-link <ADDR> | The charger's coupler link: [fe80::…%<ifindex>]:<port>, or an address alone for port 50119. The zone index is the local PC's own 10BASE-T1S interface index. The option is refused without --energy-service mcs. |
Start order: either side may start first. The EV retries the coupler link and waits up to 30 s for it and for D-LINK_READY; after that it ends with mcs_d_link_not_ready, and you start it again. Press Plug inserted on the charger's screen within that time.
The EV's exit code says whether the command ran, not whether the MCS session completed. Read the verdict from the evidence. A good session ends with a last coupler-record line of kind outcome and value mcs_session_completed.
Results and evidence
Each role writes its run directory as for ISO 15118-20 (frame trace, TLS and SDP diagnostics, manifest; see ISO 15118-20 and Trace, Evidence and Reports). MCS adds the files below.
| File | Role | What to read |
|---|---|---|
protocol\mcs-live-stack-evidence.json | Charger | evidence_status: passed only for a completed exchange of the MCS service; iso20_dc_exchange_only_not_mcs when the exchange completed with the DC service only; attention_required when the exchange did not complete. Also offered_service_id (8 for MCS), mcs_service_offered, mcs_exchange_shown, tls_established, the 10BASE-T1S interface binding and the message names in each direction. |
traces\iso20-mcs-ce-secc.jsonl | Charger | The coupler record, one JSON object per line with t_mono_ms, unix_ms and kind: ss3_command (the charger's switch, with the coupler-link address), ce_reading (each change of the CE state, the ID state or the link), d_link, plant_mated, sdp_withheld and sdp_answered (one line per SDP request), ce_gate (a response held for its CE state), schedule_exchange_gate (finished or ongoing, with the side-B voltage), coupler_link_lost (cause and silence before it), plant_read and plant_write (failures and recovery). |
traces\iso20-mcs-ce.jsonl | EV | The same line shape: ce_reading, d_link, sv3_command (the EV's switch, with the request it precedes), service_check and outcome. The last line has kind outcome. |
A completed MCS session shows, on the charger, evidence_status: passed with offered_service_id 8, and, on the EV, a last line with kind outcome and value mcs_session_completed. The order of events in the two coupler records is: the EV on the coupler link, D-LINK_READY, the first SDP request answered, the EV's switch closed and CE state C before the cable check, the switch opened and CE state B before welding detection.
| EV outcome | Meaning |
|---|---|
mcs_session_completed | The MCS session ran to SessionStop. |
mcs_d_link_not_ready | The coupler link or D-LINK_READY was not reached within 30 s before SDP. |
mcs_not_offered | The charger's ServiceDiscoveryRes did not offer the MCS service; the EV ended the session. |
mcs_no_parameter_set | The charger offered no usable MCS parameter set. |
ce_c_not_reached | CE state C was not measured after the EV closed its switch, so the cable check was not requested. |
ce_b_not_reached | CE state B was not measured after the EV opened its switch, so welding detection was not requested. |
mcs_coupler_lost | The coupler link went silent during the session; a silent link counts as unmated. |
mcs_go_to_pause_terminated | The charger asked for a pause; the EV ended the session (pause is not provided). |
Limits
- The MCS charger connects to the ChargeLink EV. The charger answers SDP only after an EV is present on its coupler link, and the coupler link is a ChargeLink interface. A third-party MCS vehicle or EVCC is not supported as a device under test in this release.
- The MCS EV connects to the ChargeLink charger. The EV requires
--mcs-coupler-linkand waits for D-LINK_READY on it before SDP. A third-party MCS charger or SECC is not supported as a device under test in this release. - The charger runs on the NI VeriStand bench. The MCS runtime needs the plant-coupled charger; a charger without a plant endpoint offers the DC service only.
- Scheduled control mode only. MCS sessions over 10BASE-T1S use the Scheduled control mode; the VeriStand bench's MCS charger offers Scheduled only. ChargeLink does not offer MCS Dynamic control over 10BASE-T1S.
- Simulated connector signals. CE and ID come from ChargeLink's coupler model and travel over the 10BASE-T1S cable on the coupler link, not over a real MCS connector, so losing the data link also drops CE and ID. The coupler link is a ChargeLink interface, not part of the standard; it runs over plain TCP, not TLS, for a closed bench network. Both ends must come from the same release. Each loss of the coupler link is recorded on both sides.
- Link detection. The 10BASE-T1S link counts as usable while the EV is present on the coupler link; Windows gives ChargeLink no "Ethernet operational" signal from the adapter.
- 10BASE-T1S physical layer. The link layer between two PCs is used with PLCA node 0 on the charger side and node 1 on the EV side, node count 8. The end termination and the IEEE 802.3 clause 147/148 physical layer are not covered.
- ISO 15118-10 timers and retries are not implemented: connection resume, the retries, the init retries and the emergency stop on link loss. A link loss inside a session ends it through the coupler-link loss; it is not judged against the ISO 15118-10 timing. The EV waits for D-LINK_READY within a plain 30 s bound.
- Pause. The ChargeLink charger never asks the EV to pause. The EV ends the session when a charger asks for a pause.
- The MCS demo EV case charges for about 240 s near 1388 A and needs a Scheduled charger at 1250 kW / 900 V with a schedule of at least 300 s. At 1000 kW / 900 V the charger offers 1111 A, and the EV stops at ChargeParameterDiscovery.
- A charger without the ISO 15118-20 runtime (the reference-responder listener) offers the DC service only. Its MCS evidence then says
iso20_dc_exchange_only_not_mcs, so a DC exchange never reads as an MCS result. - No power hardware. The plant is a simulation: no CE/ID circuit, no coupler, no real power, no thermal or cable-temperature model.
- No conformance claim. A ChargeLink MCS result is engineering evidence, not an MCS conformance or certification statement.
- Not provided: Plug & Charge, bidirectional power transfer (including MCS BPT), standby, and EV auxiliary power.
See also ISO 15118-20 for the TLS and session rules MCS shares with DC, and Capability Boundaries.
Troubleshooting
| Symptom | Likely cause | Action |
|---|---|---|
The EV ends with mcs_d_link_not_ready | Plug inserted was not pressed in time, the coupler link (TCP 50119) is blocked, or the address in --mcs-coupler-link is wrong | Check the charger-side firewall rule for TCP 50119; use the charger's link-local address with the EV PC's own interface index as the zone; press Plug inserted and start the EV again. |
| The EV gets no SDP answer | The charger withholds SDP until D-LINK_READY (see sdp_withheld lines), UDP 15118 is blocked, or --interface-index is not the EV PC's 10BASE-T1S interface | Read the charger's coupler record; check the firewall and the interface index on both PCs. |
A Windows Security Alert for chargelink.exe appears | The charger ran before the firewall rules were added | Do not press Cancel: it adds block rules for the program. Close the bench session, have an administrator remove any block rules for chargelink.exe and add the three firewall rules (see Before you start). |
The charger refuses to start: the mcs listener runs over TLS only | --tls missing | Start the charger with TLS; MCS has no plain-TCP session. |
The charger refuses to start: the profile offers DC, or an mcs runtime profile under another protocol | Protocol and runtime profile disagree | Use --protocol mcs with the MCS runtime profile, or the DC protocol with a DC runtime profile. |
The EV refuses the command line: --energy-service mcs needs --mcs-coupler-link, or --mcs-coupler-link is for --energy-service mcs only | The two MCS options are not given together | Give both, with --tls. |
Charger evidence says iso20_dc_exchange_only_not_mcs | The charger ran without the MCS runtime (for example, without a plant endpoint) and offered the DC service only | Start the charger from the VeriStand bench's MCS stack. This result is a DC exchange, not an MCS result. |
| The EV stops at ChargeParameterDiscovery | The EV case does not fit the charger's operating point | Use the EV case the charger's demo-plant.json names (see ChargeLink as vehicle). |
The EV ends with mcs_coupler_lost | The 10BASE-T1S link dropped, or the charger process ended | Check the cable, the adapters and the PLCA settings; read coupler_link_lost in the charger's record for the cause. |
| The interface index changed | Windows renumbered the adapters after a restart or re-plug | Read the indexes again (Get-NetAdapter) and use the new values on both PCs. |
For general failures (licence, TLS, ports, VeriStand) see Troubleshooting.

