V1.2 | 2018-05-09
Vector Webinar
Professional Development of Diagnostic Sequences
2
u Introduction
Runtime Environment
Development Environment
Diagnostic Sequences
User Interaction
Tips & Tricks
Help & Documentation
Agenda
3
Vector Diagnostics Scripting Library
Introduction
u .NET based library for diagnostic sequences
u Vector Diagnostic Scripting Library (VDS Library)
u Author diagnostic sequences in any .NET based language> C#
> VB.NET
u Features
u Interaction with ECUs using diagnostics (request / response)
u Interaction with an user using dialogs (value input / confirmation)
4
Interoperability
Introduction
u Works in Vector Diagnostic Test Tools
u Indigo
u CANoe
u CANape
u vScriptDiagnostics on VN8810
u vFlash (Custom Actions)
5
Application areas
Introduction
u Learning of pedal / window positions
u Documentation of vehicle ECUs (ID data) and their state (fault memory)
u Read out ECU identification data and print it
u Diagnostic Logger
u OBD Logger
u … and much more!
6
Introduction
u Runtime Environment
Development Environment
Diagnostic Sequences
User Interaction
Tips & Tricks
Help & Documentation
Agenda
7
u Execute scripts in Script Runner
u Open Script Manager
u Load script
u Open Script Runner
u Execute script
Indigo
Runtime Environment
8
u Execute scripts via command line interface
u No user interface
u Indigo.exe [IndigoProjectFile] [ScriptName] /log [LogFilePath]
u Return values
u 0: Success
u 100: Loading project failed
u 200: Script is missing
u 300: Error on script execution
u 400: Communication error
u 500: Invalid command line arguments
u 1000: Unknown error
Indigo
Runtime Environment
9
Vector VN8810 Intelligent Diagnostic Device
Runtime Environment
10
Vector VN8810 Intelligent Diagnostic Device
Runtime Environment
VN8810
Kernel
Windows
WLAN / LAN
vScriptDiagnostics
Buttons, LEDs, ...
u Project/data supply
u Action documentation
u Vehicle reports
WLANu Control execution
u Select project
u Provide user input
u Visualize results
XL driver
u Control execution
VDSProjects
User Libraries
ECU
11
u Import diagnostic sequences in CANape
u Tools | Task Manager
u .NET scripts
u Insert | .NET Scripts | Insert …
CANape
Runtime Environment
12
CANoe
Runtime Environment
u Import diagnostic sequences in CANoe
u View | Automation Sequences
u .NET Snippets
13
vFlash
Runtime Environment
u vFlash Custom Actions
u PreFlash Actions
u PostFlash Actions
u Attributes = Parameters passed to script
14
Introduction
Runtime Environment
u Development Environment
Diagnostic Sequences
User Interaction
Tips & Tricks
Help & Documentation
Agenda
15
Code Editors
Development Environment
u Microsoft Visual Studio 201x (recommended)
u Microsoft Visual C# Express 201x (recommended)
u https://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx
u Microsoft Visual Studio Community 2013
u https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx
u SharpDevelop
u http://www.icsharpcode.net/opensource/sd/
u Notepad
16
Visual Studio Extension
Development Environment
u Professional development environment for diagnostic sequences
u Extension for Microsoft Visual Studio 2015/2017 Professional
17
Visual Studio Extension
Development Environment
u Features
u Providing IntelliSense for qualifier based on the diagnostic databases> ECU, services, requests, parameters, ..
u Debugging capabilities> Debug VDS Scripts like C# code using all features of Microsoft Visual Studio
u Deployment on VN8810 > Generation of Indigo Pack&Go projects
u Diagnostic Trace> Visualizing diagnostic communication on the bus system
u Code Analyzers> Applying best practices of VDS script authorings (e.g. cleaning up objects,
checking conversions, …)
18
Visual Studio Extension
Development Environment
Professional software development consists of testing code via unit tests
Plan
Code
BuildTest
Release
Deploy
19
Visual Studio Extension
Development Environment
Professional software development consists of testing code via unit tests
u Execution of unit tests against diagnostic sequences
u Inside the development environment (Visual Studio)
u In continous integration systems (e.g. Jenkins, CruiseControl, ..)
20
Visual Studio Extension
Development Environment
Professional software development consists of testing code via unit tests
u The VDS extension for Visual Studio provides support for common unittest frame works
u Examples: NUnit, MSTest, XUnit, …
u Generation of test code incl. test execution environment
21
Visual Studio Extension
Development Environment
u Test execution possible on
u real targets (ECUs / vehicle),
u (semi-)automatically generated simulations (based on the diagnosticdatabases)
u in-memory (e.g. for continous integration systems)
22
Visual Studio Extension
Development Environment
u Mocking Framework for Vector Diagnostics Scripting Library
u For „endoscopic“ testing in unit tests mocking frameworks are required> Stimulating special conditions like communication errors, invalid conversions, …
> VDS extension also provides an extensive mocking framework
Injecting Communication Error
The next time „VIN_Read“ is executed, a communication error is returned instead ofthe response from an ECU.
23
Introduction
Runtime Environment
Development Environment
u Diagnostic Sequences
User Interaction
Tips & Tricks
Help & Documentation
Agenda
24
u Vector.Diagnostics.dll
u Library for diagnostic objects (ECUs, requests, responses, …)
u Vector.Tools.dll
u Tool specific objects (Logging output, …)
u Vector.Scripting.UI.dll
u User interaction (Dialogs)
u (only Indigo / CANoe)
u Vector.Scripting.dll
u Execution.Wait()
u Vector.Indigo.Scripting.FaultMemory.dll (Indigo only)
u Convenient fault memory API
Assembly Overview
Diagnostic Sequences
25
Class Diagram
Diagnostic Sequences
class Vector Diagnostics Scripting Library
Application
+ GenerateSecurityKey(Ecu, byte[], byte, string, byte[]*): GenerateSecurityKeyResult
+ GetEcu(string): Ecu
+ GetEcu(): Ecu
+ GetEcuByLogicalLink(string): Ecu
IDisposable
IEquatable
Ecu
+ ActivateTesterPresent(bool): bool
+ Close(): void
+ CreateRequest(string): Request
+ CreateRequest(byte[]): Request
+ CreateRequestsBySemantic(string): RequestCollection
+ Dispose(): void
+ Equals(Ecu): bool
+ Equals(object): bool
+ GetHashCode(): int
+ IdentifyAndSelectVariant(): string
+ IdentifyVariant(): string
+ IsTesterPresentActive(): bool
+ SelectVariant(string): VariantSelectionResult
+ ToString(): string
+ Unlock(byte): SecurityAccessResult
+ Unlock(byte, string): SecurityAccessResult
IDisposable
Parameter
{leaf}
+ Dispose(): void
+ GetParameter(string): Parameter
+ SetIterationCount(uint): bool
+ ToString(): string
IMessage
Request
{leaf}
+ Dispose(): void
+ GetParameter(string): Parameter
+ Send(): SendResult
+ SendAsynchronous(): SendResult
+ ToString(): string
IMessage
Response
{leaf}
+ Dispose(): void
+ GetParameter(string): Parameter
+ ToString(): string
IDisposable
SendResult
{leaf}
+ Dispose(): void
+ WaitAll(int, SendResult[]): WaitResult
+ WaitAll(SendResult[]): WaitResult
+ WaitAny(int, int*, SendResult[]): WaitResult
+ WaitAny(int*, SendResult[]): WaitResult
IDisposable
Value
{leaf}
+ Dispose(): void
+ GetBytes(): byte[]
+ Set(Int32): bool
+ Set(UInt32): bool
+ Set(Double): bool
+ Set(String): bool
+ Set(byte[]): bool
+ ToDouble(): Double
+ ToInt32(): Int32
+ ToString(): String
+ ToUInt32(): UInt32
«enumeration»
SendStatus
Ok = 0
InvalidRequest = 1
CommunicationError = 2
FailedResponseParse = 3
UnexpectedResponse = 4
AsynchronousTransactionPending = 5
«enumeration»
SecurityAccessResult
NoResult = 0
Success = 1
InvalidSeedKeyDll = 10
CommunicationError = 11
NegativeResponse = 12
Failure = 100
«enumeration»
GenerateSecurityKeyResult
NoResult = 0
Success = 1
InvalidSeedKeyDll = 10
InvalidVariant = 11
InvalidSecurityLevel = 12
Failure = 100
ApplicationException
DiagnosticException
+ DiagnosticException(ExceptionType)
+ DiagnosticException()
+ DiagnosticException(string)
+ DiagnosticException(string, Exception)
26
Working with ECUs
Diagnostic Sequences
u Vector.Diagnostics.Application class
Accessing the first ECU in the project / configuration
Accessing an ECU by qualifier
Ecu ecu = Application.GetEcu();
Ecu ecu = Application.GetEcu("MyEcuQualifier");
27
Accessing diagnostic requests
Diagnostic Sequences
u Working with requests
Creating a request by qualifier
Creating a request by pdu
string serviceQualifier = "VIN_Read";
Request request = ecu.CreateRequest(serviceQualifier);
var pdu = new byte[] {0x22, 0xF1, 0x90};
Request request = ecu.CreateRequest(pdu);
28
Send data to ECU and evaluate response
Diagnostic Sequences
SendResult result = request.Send();
u Sending a request to an ECU
u Handle communication errors
if (result.Status == SendStatus.CommunicationError)
{
// Handle communication error
}
29
Send data to ECU and evaluate response
Diagnostic Sequences
u Accessing response(s)
if (result.Status == SendStatus.Ok)
{
Response response = result.Response;
// Access response parameter
foreach (Response response in result.Responses)
{
// Access response parameter
}
}
30
Send data to ECU and evaluate response
Diagnostic Sequences
u Working with response data
u Accessing raw data
byte[] rawResponseData = response.Pdu;
31
Send data to ECU and evaluate response
Diagnostic Sequences
u Working with response data
u Accessing parameters via qualifier
u Accessing parameters using the parameter collection
Parameter parameter = response.GetParameter("VIN");
ParameterCollection parameters = response.Parameters;
foreach (Parameter parameter in parameters)
{
// process parameter values
}
32
Send data to ECU and evaluate response
Diagnostic Sequences
u Working with parameters
u Name
u Qualifier
u Description
u Unit
string parameterName = parameter.Name;
string qualifier = parameter.Qualifier;
string description = parameter.Description;
string parameterUnit = parameter.Unit;
33
Send data to ECU and evaluate response
Diagnostic Sequences
u Working with parameters
u Value
Value value = parameter.Value;
// Accessing raw parameter value
byte[] rawData = value.GetBytes();
// Accessing physical / symbolic parameter value
double valueAsDouble = value.ToDouble();
int valueAsInt32 = value.ToInt32();
uint valueAsUInt32 = value.ToUInt32();
string valueAsString = value.ToString();
34
Reading Data From An ECU
Diagnostic Sequences
u Example: Reading VIN from ECU
35
Security Access: Unlocking ECUs
Diagnostic Sequences
u Unlock ECU in level 0x01
u Unlock ECU in level 0x01 using an additional option string
SecurityAccessResult result = ecu.Unlock(0x01);
SecurityAccessResult result = ecu.Unlock(0x01, "OptionString");
36
Security Access: Unlocking ECUs
Diagnostic Sequences
u Error / success handling
public enum SecurityAccessResult
{
NoResult = 0,
Success = 1,
InvalidSeedKeyDll = 10,
CommunicationError = 11,
NegativeResponse = 12,
Failure = 100,
}
37
Security Access: Unlocking ECUs
Diagnostic Sequences
u Unlocking ECU in specified security level
GenerateSecurityKeyResult result =
Application.GenerateSecurityKey(
ecu,
seed,
securityLevel,
option,
out key);
38
Security Access: Unlocking ECUs
Diagnostic Sequences
u Error Handling
public enum GenerateSecurityKeyResult
{
NoResult = 0,
Success = 1,
InvalidSeedKeyDll = 10,
InvalidVariant = 11,
InvalidSecurityLevel = 12,
Failure = 100,
}
39
Indigo Extension: Access Fault Memory
Diagnostic Sequences
u Reading DTCs
// Get current ECU
Ecu ecu = Application.GetEcu();
// Read fault memory from ECU
DtcCollection dtcCollection = DtcReader.ReadDtcs(ecu);
foreach (Dtc dtc in dtcCollection)
{
Output.WriteLine("DTC Code: " + dtc.ErrorCode);
Output.WriteLine("DTC Text: " + dtc.ErrorText);
Output.WriteLine("DTC Status: 0x" + BitConverter.ToString(dtc.Status));
}
40
Indigo Extension: Access Fault Memory
Diagnostic Sequences
u Reading Environment Data for DTCs
// Read environment data for the DTC
DtcInfoCollection snapshotRecords = DtcReader.ReadSnapshotRecord(ecu, dtc);
// Write environment data to output
foreach (DtcInfo snapshotRecord in snapshotRecords)
{
Output.WriteLine(snapshotRecord.Name + ": " + snapshotRecord.Value + snapshotRecord.Unit);
}
41
Indigo/VN88 Extension: Vector.Diagnostics.Obd
Diagnostic Sequences
u Convenience API for reading out OBD data from the vehicle
u Supported OBD Data
u OBD Discovery
u Read Powertrain Diagnostic Data (Mode $01)
u Access OBD Fault Memory (Mode $02, $03, $07, $0A)
u Read Info Type Data like VIN, .. (Mode $09)
u Read On-Board Monitoring Test Results (Mode $06)
u Supported Standards
u OBD II (SAE J1979 / ISO 15031)
u WWH-OBD (ISO 27145)
42
Indigo/VN88 Extension: Vector.Diagnostics.Obd
Diagnostic Sequences
u Use Cases
u Create customized OBD reports
u OBD Logger / Diagnostic Logger
u Collect OBD fleet data via VN8810
u and much more!
43
Indigo/VN88 Extension: Vector.Diagnostics.Obd
Diagnostic Sequences
u OBD Discovery
u Start OBD Discovery
u Determine if OBD discovery was successful
DiscoveryResult result = ObdDiscovery.Discover();
if (result.Status == ResultStatus.Success)
{
// OBD Discovery successful ...
}
else
{
// OBD Discovery failed ...
}
44
Indigo/VN88 Extension: Vector.Diagnostics.Obd
Diagnostic Sequences
u OBD Discovery
u Determine OBD standard used by the ECU
if (result.ObdType == ObdType.OBD2)
{
// Handle OBD 2 ECUs ..
}
else if (result.ObdType == ObdType.WWHOBD)
{
// Handle WWH-OBD ECUs ..
}
45
Indigo/VN88 Extension: Vector.Diagnostics.Obd
Diagnostic Sequences
u OBD Discovery
u Accessing the functional group for sending OBD requests
ObdFunctionalGroup funcGroup = result.ObdFunctionalGroup;
46
Indigo/VN88 Extension: Vector.Diagnostics.Obd
Diagnostic Sequences
u Accessing OBD Fault Memory
u Reading OBD DTCs
u Possible values for ObdDtcType enumeration
var ecuDtcCollection = funcGroup.ReadObdFaultMemory(ObdDtcType.All);
[Flags]
public enum ObdDtcType
{
None = 0,
Confirmed = 3,
Pending = 7,
Permanent = 10,
All = Confirmed | Pending | Permanent
}
47
Indigo/VN88 Extension: Vector.Diagnostics.Obd
Diagnostic Sequences
u Accessing OBD Fault Memory
u Clear DTCs
funcGroup.ClearFaultMemory();
48
Indigo/VN88 Extension: Vector.Diagnostics.Obd
Diagnostic Sequences
u Reading Mode $01 Data
u Retrieving supported OBD PIDs from ECUs
u Reading OBD PID data
u Accessing the supported OBD PIDs via enumeration
var supportedPids = funcGroup.ReadSupportedPids();
var obdPidEcuDataCollection = funcGroup.ReadObdPid( ObdPidCategory.PID_01_MonitorStatusSinceDtcsCleared);
ObdPidCategory
49
Indigo/VN88 Extension: Vector.Diagnostics.Obd
Diagnostic Sequences
u Reading Mode $09 Data
u Retrieving supported OBD InfoTypes from ECUs
u Reading OBD InfoType data
u Accessing the supported OBD InfoTypes via enumeration
var supportedInfoTypes = funcGroup.ReadSupportedInfoTypes();
var obdInfoTypeEcuCollection = funcGroup.ReadObdInfoType(ObdInfoTypeCategory.InfoType_04_CalibrationId);
ObdInfoTypeCategory
50
Introduction
Runtime Environment
Development Environment
Diagnostic Sequences
u User Interaction
Tips & Tricks
Help & Documentation
Agenda
51
Dialog Types
User Interaction
u Confirmation Dialogs
ConfirmationResult result =
ConfirmationDialog.Show(
"This is a message",
"This is the caption",
ConfirmationDialogButtons.OKCancel);
52
Dialog Types
User Interaction
u Input Dialogs
u Simple Data Input
DataEntryResult result =
DataEntryDialog.Show(
"This is a message",
"This is the caption",
"Additional information.",
ref value);
53
Dialog Types
User Interaction
u Input Dialogs
u Input Validation: Allow values in a range
DataEntryResult result =
DataEntryDialog.Show(
"This is a message",
"This is the caption",
"Additional information.", rangeCollection,
ref value);
54
Dialog Types
User Interaction
u Input Dialogs
u Input Validation: Allow values in a range
DataEntryResult result =
DataEntryDialog.Show(
"This is a message",
"This is the caption",
"Additional information.", rangeCollection,
ref value);
List<Range<int>> ranges = new List<Range<int>>();
ranges.Add(new Range<int>(1,4));
var rangeCollection = new RangeCollection<int>(ranges);
55
Dialog Types
User Interaction
u Input Dialogs
u Input Validation: Regular Expression
DataEntryResult result =
DataEntryDialog.Show(
"This is a message",
"This is the caption",
"Additional information.",
ref value,
@"^[A-Fa-f0-9]{2}$");
56
Dialog Types
User Interaction
u Input Dialogs
u Value Selection
DataEntryResult result =
DataEntryDialog.Show(
"Please select one value:",
"Data Input",
"Choose a value.",
ref value,
defaultIndex, valueTable);
57
Dialog Types
User Interaction
u Input Dialogs
u Value Selection
DataEntryResult result =
DataEntryDialog.Show(
"Please select one value:",
"Data Input",
"Choose a value.",
ref value,
defaultIndex, valueTable);
List<string> values = new List<string> { "My First Value", "My Second Value" };
ValueTable<string> valueTable = new ValueTable<string>(values);
58
Introduction
Runtime Environment
Development Environment
Diagnostic Sequences
User Interaction
u Tips & Tricks
Help & Documentation
Agenda
59
Script Recording
Tips & Tricks
u Script Recorder
60
Script Recording
Tips & Tricks
u Generate Script Template for Copy & Paste
61
Debugging
Tips & Tricks
u How to debug diagnostic sequences?
u Prerequisites> Microsoft Visual C# Express / Microsoft Visual Studio
> Indigo
u Indigo> Script Manager
> Context Menu | Edit
> Indigo prepares Visual Studio solution and debugging environment
u Visual Studio> Simply press Debug | Start Debugging (F5)
62
Introduction
Runtime Environment
Development Environment
Diagnostic Sequences
User Interaction
Tips & Tricks
u Help & Documentation
Agenda
63
u API Description> Vector.Diagnostics:
VDSLibrary.chm
> Vector.Scripting.UI: Vector.Scripting.UI.chm
u Getting Started> <CANoe|CANape|Indigo>\Docs\
VDS_Library_QuickStart.pdf
u Examples> Reading Variant Coding:
> <CANoe|CANape|Indigo>\Examples\CodingReader.cs
API Documentation / Getting Started / Examples
Help & Documentation
64 © 2016. Vector Informatik GmbH. All rights reserved. Any distribution or copying is subject to prior written approval by Vector. V1.2 | 2018-05-09
Author:Abramowitsch, RalfVector Germany
For more information about Vectorand our products please visit
www.vector.com