Set Up the VeriStand Bench
This guide takes the charger PC (the ChargeLink charger and NI VeriStand) from a fresh Windows installation to a validated bench, using only the files and scripts in ChargeLink-<VERSION>-bench-kit-win64.zip. Your vehicle or EVCC (the DUT) connects to the charger PC over the link adapter; for a self-test without a DUT, steps 7 and 8 also set up the ChargeLink vehicle on a second PC, the vehicle PC. Nothing is built or generated in VeriStand: the system definition and plant model are delivered ready to deploy, and the owner host deploys them for every session. What each file is, and how a session then runs, is on the NI VeriStand Bench page.
Before you start
Have ready (details in Prerequisites):
- Charger PC: Windows 11 Pro x64 with at least 13 logical processors, NI VeriStand 2024 Q4 installed and licensed, the .NET 10 runtime x64, the Microsoft Visual C++ 2015-2022 Redistributable x64, and 20 GB free disk space.
- One Ethernet adapter on the charger PC for the direct link to your DUT, IPv6 enabled. Note the adapter's name (
Get-NetAdapter). - For a self-test: a vehicle PC with Windows 10 or 11 x64, Windows PowerShell 5.1, the Visual C++ 2015-2022 Redistributable x64 and its own Ethernet adapter for the link.
- The package ZIP and its
ChargeLink-<VERSION>-bench-kit-win64.zip.sha256file. - Either your own ISO 15118-20 Annex B certificates and keys for the charger and the vehicle side, or the decision to generate the engineering bench PKI in step 3.
The package's docs\INSTALL-CHARGER.md (charger PC) and docs\INSTALL-VEHICLE.md (vehicle PC) contain the same steps. The kit has a charger\ and a vehicle\ folder.
Step 1 — check NI VeriStand and .NET on the charger PC
Get-FileHash 'C:\Program Files\National Instruments\VeriStand 2024\veristand-server.exe','C:\Program Files\National Instruments\VeriStand 2024\NationalInstruments.VeriStand.SystemDefinitionAPI.dll'
dotnet --list-runtimes
Compare the two hashes with the table in docs\INSTALL-CHARGER.md, section 1. A different NI build is not the environment the bench was verified with; record the difference before relying on a result. dotnet --list-runtimes must list Microsoft.NETCore.App 10.0.x. New-BenchConfiguration.ps1 also checks that veristand-server.exe and NationalInstruments.VeriStand.ClientAPI.dll exist in the VeriStand folder.
Step 2 — unpack and verify the package on the charger PC
Verify the archive against its .sha256 file, unpack it to a local folder without spaces, and check every file:
Get-FileHash 'C:\Downloads\ChargeLink-<VERSION>-bench-kit-win64.zip' -Algorithm SHA256
Get-Content 'C:\Downloads\ChargeLink-<VERSION>-bench-kit-win64.zip.sha256'
Expand-Archive 'C:\Downloads\ChargeLink-<VERSION>-bench-kit-win64.zip' -DestinationPath 'C:\ChargeLink\<VERSION>'
cd C:\ChargeLink\<VERSION>
Get-Content .\manifest\SHA256SUMS | ForEach-Object {
$hash, $path = $_ -split ' ', 2
if ((Get-FileHash -LiteralPath $path -Algorithm SHA256).Hash -ne $hash.ToUpperInvariant()) { throw "Changed: $path" }
}
'all files verified'
If the ZIP contains a top-level ChargeLink-<VERSION>-bench-kit-win64 folder, run the check inside it and use that folder in place of C:\ChargeLink\<VERSION> below. If docs\SIGNING.md says the package is signed, also check Get-AuthenticodeSignature .\charger\bin\chargelink.exe.
Step 3 — TLS material
ISO 15118-20 requires mutual TLS 1.3 with the certificate profiles of ISO 15118-20 Annex B. Choose one of the two ways.
A. The engineering bench PKI (engineering and test use only)
Run this once on the charger PC, from a working folder outside the package (the CLI keeps its runtime state in .chargelink under the current folder). The output folder must not exist yet:
New-Item -ItemType Directory -Force C:\ChargeLink\work | Out-Null; cd C:\ChargeLink\work
C:\ChargeLink\<VERSION>\charger\bin\chargelink.exe evse tls-material-init --bench-pki --output-dir C:\ProgramData\DEVlink\ChargeLink\tls\engineering-pki
It writes new keys and certificates on every run, readable only by their owner and SYSTEM, and prints no key:
| File in the output folder | Used by |
|---|---|
The charger-side certificate folder: secc-cert-chain.pem, secc-key.pem, v2g-root-ca.pem | The charger PC, through New-BenchConfiguration.ps1 -EngineeringPki (step 5) |
The vehicle-side certificate folder: vehicle-cert-chain.pem, vehicle-key.pem, v2g-root-ca.pem | The vehicle side: in a self-test, copy them unchanged into the vehicle\tls folder on the vehicle PC (step 7) |
engineering-pki-manifest.json, README-ENGINEERING-ONLY.txt | your record (fingerprints, validity, file hashes; no key) |
Every certificate carries the subject O ChargeLink ENGINEERING ONLY - not for production. The SECC accepts it only when the bench configuration allows it, which -EngineeringPki does. The root and sub-CA keys are discarded when the command ends, and there is no revocation service for this PKI. To replace the material, generate into a new folder, run step 5 again with -Force, and give the vehicle side the new vehicle files.
B. Your own PKI
| File (your names) | Role | Used by |
|---|---|---|
| SECC certificate chain (PEM, leaf first) | SECC identity, Annex B profile | Charger PC -TlsCertChain |
| SECC private key (PEM) | SECC leaf key | Charger PC -TlsKey |
| Trust anchor for vehicle certificates (PEM) | root the vehicle's certificate chain validates to | Charger PC -TlsTrustAnchor |
| V2G root (PEM) | root the SECC chain validates to | Your DUT; in a self-test vehicle\tls\v2g-root-ca.pem on the vehicle PC |
| Vehicle certificate chain and key (PEM) | vehicle identity, Annex B vehicle profile | Your DUT; in a self-test vehicle\tls\vehicle-cert-chain.pem and vehicle\tls\vehicle-key.pem on the vehicle PC |
Keep the charger PC files outside the package folder, for example in C:\ProgramData\DEVlink\ChargeLink\tls\charger, readable only by the operator account.
Step 4 — firewall on the charger PC (administrator, once)
The SECC answers SDP on UDP 15118 and accepts TLS on TCP 50118, on the link adapter only. Replace the adapter name and, if different, the package path:
$alias = 'Ethernet 3'; $exe = 'C:\ChargeLink\<VERSION>\charger\bin\chargelink.exe'
New-NetFirewallRule -DisplayName 'DEVlink ChargeLink EVSE SDP UDP 15118' -Direction Inbound -Action Allow -Profile Any -InterfaceAlias $alias -Protocol UDP -LocalPort 15118 -RemoteAddress 'fe80::/10' -Program $exe
New-NetFirewallRule -DisplayName 'DEVlink ChargeLink EVSE TCP' -Direction Inbound -Action Allow -Profile Any -InterfaceAlias $alias -Protocol TCP -LocalPort 50118 -RemoteAddress 'fe80::/10' -Program $exe
New-NetFirewallRule -DisplayName 'DEVlink ChargeLink ICMPv6 Diagnostics' -Direction Inbound -Action Allow -Profile Any -InterfaceAlias $alias -Protocol ICMPv6 -IcmpType 128 -RemoteAddress 'fe80::/10'
The rules name the executable by path; create them again if the package folder moves. The gRPC service the owner host starts listens on 127.0.0.1:50051 only and needs no rule.
Step 5 — bench configuration on the charger PC
Record the link adapter, the TLS files and the NI folder once, from charger. With the engineering bench PKI:
cd C:\ChargeLink\<VERSION>\charger
powershell -NoProfile -ExecutionPolicy Bypass -File .\New-BenchConfiguration.ps1 -InterfaceAlias 'Ethernet 3' `
-EngineeringPki C:\ProgramData\DEVlink\ChargeLink\tls\engineering-pki
It prints a warning that the bench runs with engineering material. With your own PKI:
powershell -NoProfile -ExecutionPolicy Bypass -File .\New-BenchConfiguration.ps1 -InterfaceAlias 'Ethernet 3' `
-TlsCertChain C:\ProgramData\DEVlink\ChargeLink\tls\charger\secc-cert-chain.pem `
-TlsKey C:\ProgramData\DEVlink\ChargeLink\tls\charger\secc-key.pem `
-TlsTrustAnchor C:\ProgramData\DEVlink\ChargeLink\tls\charger\v2g-root-ca.pem
The script reads the adapter's interface index and its preferred IPv6 link-local address, checks the NI files and the TLS files, and writes charger\bench-configuration.json. It prints the SECC address the vehicle side connects to; note it. Further parameters: -VeriStandDir (default C:\Program Files\National Instruments\VeriStand 2024), -RunsRoot (default runs next to charger), -Force to replace an existing file. Run it again with -Force whenever the adapter or the TLS files change: a link-local address can change when the adapter is reinstalled.
Step 6 — validate on the charger PC
powershell -NoProfile -ExecutionPolicy Bypass -File .\Start-SeccSession.ps1 -ValidateOnly
powershell -NoProfile -ExecutionPolicy Bypass -File .\Start-SeccSession.ps1 -Mode Manual -ValidateOnly
Each renders one run's native.json and campaign-configuration.json from charger\templates and has the owner host check them. It starts no VeriStand runtime and no listener. Both must print Configuration accepted by the owner host.
With your DUT, the charger PC is now ready: connect the DUT to the link adapter, give it the vehicle-side TLS material from step 3, and continue with step 8.
Step 7 — install the ChargeLink vehicle on the vehicle PC (self-test)
- Copy the package's
vehiclefolder to the vehicle PC, for example toC:\ChargeLinkExternalEvcc, together with a copy ofmanifest\SHA256SUMS, and check the sixvehicle/files:cd C:\ChargeLinkExternalEvcc Get-Content .\SHA256SUMS | Where-Object { $_ -match ' vehicle/' } | ForEach-Object { $hash, $path = $_ -split ' ', 2 $local = $path.Substring(4) if ((Get-FileHash -LiteralPath $local -Algorithm SHA256).Hash -ne $hash.ToUpperInvariant()) { throw "Changed: $local" } } 'vehicle files verified' - TLS files. Place
vehicle-cert-chain.pem,vehicle-key.pemandv2g-root-ca.peminvehicle\tls(seevehicle\tls\README.txt). With the engineering bench PKI, these are the three files from itsvehiclefolder, copied unchanged, for example with a removable drive (delete the copy on the drive afterwards). Copy them again whenever the charger PC's material is regenerated. Restrictvehicle\tlsto the operator account. - Firewall (administrator, once), if the Windows firewall filters outbound traffic on the vehicle PC:
$alias = 'Ethernet 3'; $exe = 'C:\ChargeLinkExternalEvcc\chargelink.exe' New-NetFirewallRule -DisplayName 'DEVlink ChargeLink EVCC SDP UDP 15118' -Direction Outbound -Action Allow -Profile Any -InterfaceAlias $alias -Protocol UDP -RemotePort 15118 -RemoteAddress 'ff02::1' -Program $exe New-NetFirewallRule -DisplayName 'DEVlink ChargeLink EVCC TCP' -Direction Outbound -Action Allow -Profile Any -InterfaceAlias $alias -Protocol TCP -RemotePort '49152-65535' -RemoteAddress 'fe80::/10' -Program $exe New-NetFirewallRule -DisplayName 'DEVlink ChargeLink ICMPv6 Diagnostics' -Direction Inbound -Action Allow -Profile Any -InterfaceAlias $alias -Protocol ICMPv6 -IcmpType 128 -RemoteAddress 'fe80::/10' - EV cases.
Start-Evcc.ps1setsCHARGELINK_ISO20_LIVE_SEMANTIC_CASEtocases\nominal.json(-Case Nominal, the default) orcases\emergency-transition.json(-Case EmergencyTransition), andCHARGELINK_ISO20_FULL_WIRE_SESSION_MANIFESTtocases\full-wire-session-manifest.json. The ChargeLink vehicle refuses a live session without them. Do not edit them.
Step 8 — check the link
With your DUT, check from the charger PC that the DUT's link-local address answers on the link adapter (if your DUT answers ICMPv6 echo requests):
ping -6 'fe80::<DUT>%<CHARGER_PC_INTERFACE_INDEX>'
In a self-test, start a session on the charger PC (Start-SeccSession.ps1, see Running a session) so that the SECC listens, then probe it from the vehicle PC without starting an ISO 15118 session:
cd C:\ChargeLinkExternalEvcc
powershell -NoProfile -ExecutionPolicy Bypass -File .\Start-Evcc.ps1 -PeerIpv6 fe80::xxxx:xxxx:xxxx:xxxx -InterfaceAlias 'Ethernet 3' -ProbeOnly -WaitSeconds 60
-PeerIpv6 is the address step 5 printed, without the % zone; the launcher scopes it to the vehicle PC's own adapter. The launcher's defaults for -PeerIpv6 and -InterfaceAlias are placeholders: pass both every time, or edit the two defaults in Start-Evcc.ps1 once for this bench (its SHA-256 then differs from the manifest, which is expected; record the change). The probe opens and closes one TCP connection. The SECC waits for the vehicle only for its phase timeout (120 s in automation mode), so let that charger PC run end before the first real session.
The bench is ready. Continue with Running a session.
Troubleshooting the setup
| Message or symptom | Cause | Action |
|---|---|---|
Changed: <path> during verification | A file differs from manifest\SHA256SUMS | Unpack the verified ZIP again; do not run a changed package. |
Expected exactly one connected adapter named '…' | Wrong adapter name, or the link is down | Check Get-NetAdapter; connect the cable; pass the exact name. |
Expected exactly one preferred IPv6 link-local address on '…' | IPv6 disabled on the adapter, or the address is not ready | Enable IPv6 on the adapter; check Get-NetIPAddress -InterfaceAlias '…' -AddressFamily IPv6. |
NI VeriStand file missing: … | VeriStand 2024 not installed, or installed elsewhere | Install NI VeriStand 2024 Q4, or pass -VeriStandDir. |
… bench-configuration.json exists; pass -Force to replace it. | The bench is already configured | Add -Force if you mean to replace it. |
No engineering PKI at … (engineering-pki-manifest.json missing) | -EngineeringPki points to the wrong folder | Pass the folder given to --output-dir in step 3. |
… is ChargeLink engineering material, which the SECC refuses unless allowed … | Engineering certificates passed as your own PKI | Use -EngineeringPki <folder> instead of the three TLS parameters. |
… holds no PEM private key, … must not contain a private key, … holds no PEM certificate | TLS files swapped or in the wrong format | Pass the chain, key and trust anchor to the matching parameters, PEM encoded. |
Warning: TLS file is inside the kit folder | Key material stored in the package folder | Move it outside the package folder and run step 5 again with -Force. |
The owner host did not accept the configuration … in step 6 | A path or value in the rendered configuration is wrong, or the .NET 10 runtime is missing | Read <run>\validation.log; check step 1; run step 5 again. |
Probe: SECC did not accept connections within … s | No session listening on the charger PC, a wrong address or adapter, or missing charger PC firewall rules | Start a charger PC session first; check the address, the adapter names and the rules from step 4. |
Session-time problems are covered in NI VeriStand Bench, Troubleshooting.
Uninstalling
Delete the package folder and runs_root; remove the firewall rules (Remove-NetFirewallRule -DisplayName 'DEVlink ChargeLink*') on the charger PC and, if used, the vehicle PC; delete %ProgramData%\DEVlink\ChargeLink\RuntimeOwnership\native-activation.state on the charger PC; and destroy the TLS keys (for the engineering bench PKI: its output folder on the charger PC and the vehicle\tls files on the vehicle PC; remove the vehicle material from your DUT).

