Vehicle Identification Number

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

VIN (Vehicle Identification Number) – numer identyfikacyjny pojazdu nadany i umieszczony przez producenta[1]. Przed 1981 nie było zaakceptowanego standardu określającego ten numer i producenci stosowali dla niego różne formaty. Współczesny numer VIN składa się z 17 znaków – cyfr i liter z wyłączeniem liter I, O oraz Q.

Format zapisu VIN[edytuj | edytuj kod]

Są dwa sposoby zapisu numeru identyfikacyjnego pojazdu. W Unii Europejskiej jest stosowana norma ISO-3779, w Ameryce Północnej jest stosowany format bardziej surowy (zawierający liczbę kontrolną), ale kompatybilny z europejskim.

Numer VIN składa się z następujących sekcji:

Standard 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
ISO 3779 WMI VDS VIS
Ameryka Północna Identyfikacja producenta Atrybuty typu Liczba kontrolna Rok produkcji Kod zakładu Numer egzemplarza

Światowa identyfikacja producenta[edytuj | edytuj kod]

WMI (World Manufacturer Identifier) – to pierwsze trzy pozycje numeru VIN, za pomocą których koduje się region i nazwę producenta pojazdu.

Regiony WMI
Pierwszy symbol WMI określa region, w którym znajduje się producent. W praktyce każdy jest przypisany krajowi producenta. Zaznaczono najpopularniejsze kraje produkcji.
WMI Region Uwagi
A-H Afryka AA-AH = RPA
J-R Azja J = Japonia
KL-KR = Korea Płd.
L = Chiny
MA-ME = Indie
MF-MK = Indonezja
ML-MR = Tajlandia
PA-PE = Filipiny
PL-PR = Malezja
S-Z Europa SA-SM = Zjednoczone Królestwo
SN-ST, W = Niemcy
SU-SZ = Polska
TA-TH = Szwajcaria
TJ-TP = Czechy
TR-TV = Węgry
VA-VE = Austria
VF-VR = Francja
VS-VW = Hiszpania
VX-V2 = Jugosławia
XS-XW = ZSRR
X3-X0 = Rosja
YA-YE = Belgia
YF-YK = Finlandia
YS-YW = Szwecja
ZA-ZR = Włochy
1-5 Ameryka Północna 1, 4, 5 = Stany Zjednoczone
2 = Kanada
3 = Meksyk
6-7 Oceania 6A-6W = Australia
7A-7E = Nowa Zelandia
8-0 Ameryka Południowa 8A-8E = Argentyna
8X-82 = Wenezuela
9A-9E, 93-99 = Brazylia
9F-9J = Kolumbia
Lista WMI niektórych producentów
Kolejne 2 symbole określają producenta. Najczęściej jest to kod, który SAE przydzieliło oficjalnie krajom i producentom. Tablica może jednak zawierać także symbole nietypowe.
WMI Producent
JA Isuzu
JDA Daihatsu
JF Fuji Heavy Industries (Subaru)
JH Honda
JK Kawasaki (motocykle)
JM Mazda
JN Nissan
JS Suzuki
JT Toyota
JY Yamaha (motocykle)
KL Daewoo
KMH Hyundai (prod. koreańska)
KN Kia
MAL Hyundai (prod. indyjska)
NLH Hyundai (prod. turecka)
SAL Land Rover
SAJ Jaguar
SCC Lotus Cars
SUA Autosan
SUF FSM/Fiat Auto Poland
SUJ Jelcz
SUL FSC Lublin
SUP FSO
SUR Fabryka Samochodów Rolniczych "Polmo" w Poznaniu
SUS Fabryka Samochodów Ciężarowych "Star"
SUU Solaris
SUZ Zasław
SW9 Solbus
SZ9 Epoka
TMA Hyundai (prod. czeska)
TRA Ikarus
TRU Audi
U5Y Hyundai (prod. słowacka)
VF1 Renault
VF3 Peugeot
VF7 Citroën
VSS SEAT
WAU Audi
WBA BMW
WBS BMW M
WDB Mercedes-Benz
WMA MAN AG
WMW MINI
WP0 Porsche
W0L Opel
WVW Volkswagen
WV1 Volkswagen Commercial Vehicles
WV2 Volkswagen Bus/Van
YK1 Saab
YS3 Saab
YV1 Volvo Cars
ZDF Ferrari Dino
ZFA Fiat
ZFF Ferrari
1FB Ford Motor Company
1FC Ford Motor Company
1FD Ford Motor Company
1FM Ford Motor Company
1FU Freightliner
1FV Freightliner
1F9 FWD Corp.
1G General Motors
1GC Chevrolet
1GM Pontiac
1H Honda USA
1L Lincoln
1M? Mercury
1M1 Mack Truck
1M2 Mack Truck
1M3 Mack Truck
1M4 Mack Truck
1N Nissan USA
1VW Volkswagen USA
1YV Mazda USA
2FB Ford Motor Company Kanada
2FC Ford Motor Company Kanada
2FM Ford Motor Company Kanada
2FT Ford Motor Company Kanada
2FU Freightliner
2FV Freightliner
2M Mercury
2G General Motors Kanada
2G1 Chevrolet Kanada
2G1 Pontiac Kanada
2HM Hyundai Kanada
2WK Western Star
2WL Western Star
2WM Western Star
3FE Ford Motor Company Meksyk
3G General Motors Meksyk
3VW Volkswagen Meksyk
9BW Volkswagen Brazylia
4F Mazda USA
4M Mercury
4S Subaru-Isuzu Automotive
4US BMW USA
VT Yamaha (motocykle)
4V1 Volvo
4V2 Volvo
4V3 Volvo
4V4 Volvo
4V5 Volvo
4V6 Volvo
4VL Volvo
4VM Volvo
4VZ Volvo
5L Lincoln
6F Ford Motor Company Australia
6H General Motors-Holden
6MM Mitsubishi Motors Australia
6T1 Toyota Australia
SAR MG ROVER

Sekcja określająca typ[edytuj | edytuj kod]

VDS (Vehicle Descriptor Section) to znaki na pozycjach od 4 do 9. Określają one typ pojazdu. Są używane zgodnie z lokalnymi regulacjami prawnymi do identyfikacji typu pojazdu i mogą zawierać informacje o konstrukcji i rodzaju nadwozia. Każdy producent ma własny system wykorzystywania tego pola.

Liczba kontrolna (Ameryka Północna)
Element znajdujący się na 9 pozycji pełni rolę liczby kontrolnej VIN pojazdów z Ameryki Północnej.

Numer własny egzemplarza[edytuj | edytuj kod]

VIS (Vehicle Identifier Section) to znaki na pozycjach od 10 do 17. Są one wykorzystywane do nadania unikatowego numeru konkretnego egzemplarza pojazdu. VIS jest wykorzystywany przez producenta w przypadku reklamacji. Zawiera informacje o zainstalowanych opcjach wykonania, silniku, rodzaju napędu; często jest jednak po prostu numerem porządkowym nadawanym automatycznie kolejnym wychodzącym z produkcji pojazdom. Ostatnie cztery znaki stanowią zawsze cyfry.

Rok produkcji w Ameryce Północnej
znak na pozycji 10 jest w Ameryce Północnej wykorzystywany do kodowania roku produkcji.
Kod zakładu producenta
znak na pozycji 11 jest w Ameryce Północnej wykorzystywany do kodowania zakładu producenta. Każdy producent ma własny system oznaczeń, jednak jego położenie w kodzie VIN jest ustalone.

Kod roku modelowego[edytuj | edytuj kod]

Jest to kod, który zależnie od zwyczajów producenta określa rok produkcji pojazdu lub rok wprowadzenia na rynek typu lub modelu pojazdu. Rok 1980 jest kodowany jako „A” i następne lata odpowiednimi kolejnymi literami aż do roku 2000, któremu odpowiada litera „Y”. Lata od 2001 do 2009 są kodowane cyframi od 1 do 9.

Zgodnie z normą ISO, w kodzie roku nie mogą występować litery I, O oraz Q, ponadto zwyczajowo nie stosuje się liter U i Z oraz cyfry 0. Wynika to z faktu, że te litery i cyfry jest łatwo z sobą pomylić.

Przykładowa tabelka:

Kod Rok
A 1980
B 1981
C 1982
D 1983
E 1984
F 1985
G 1986
H 1987
J 1988
K 1989
Kod Rok
L 1990
M 1991
N 1992
P 1993
R 1994
S 1995
T 1996
V 1997
W 1998
X 1999
Kod Rok
Y 2000
1 2001
2 2002
3 2003
4 2004
5 2005
6 2006
7 2007
8 2008
9 2009
Kod Rok
A 2010
B 2011
C 2012
D 2013
E 2014
F 2015
G 2016
H 2017
J 2018
K 2019
Kod Rok
L 2020
M 2021
N 2022
P 2023
R 2024
S 2025
T 2026
V 2027
W 2028
X 2029
Kod Rok
Y 2030
1 2031
2 2032
3 2033
4 2034
5 2035
6 2036
7 2037
8 2038
9 2039

Obliczenie liczby kontrolnej[edytuj | edytuj kod]

1. Należy znaleźć wartość liczbową odpowiadającą kolejnym znakom VIN. Litery I, O oraz Q nie są dozwolone, ich obecność świadczy o błędzie. Cyfry przyjmują swoją wartość liczbową. Odpowiednie wartości podaje tabela.

A: 1 J: 1
B: 2 K: 2 S: 2
C: 3 L: 3 T: 3
D: 4 M: 4 U: 4
E: 5 N: 5 V: 5
F: 6 W: 6
G: 7 P: 7 X: 7
H: 8 Y: 8
  R: 9 Z: 9

2. Każdej pozycji znaku VIN (oprócz 9 – liczba kontrolna) jest przypisana podana w tabeli waga.

1.: ×8 5.: ×4 10.: ×9 14.: ×5
2.: ×7 6.: ×3 11.: ×8 15.: ×4
3.: ×6 7.: ×2 12.: ×7 16.: ×3
4.: ×5 8.: ×10 13.: ×6 17.: ×2

3. Należy pomnożyć odpowiadające literom i liczbom wartości przez odpowiadające ich pozycji wagi i zsumować otrzymane iloczyny. Otrzymaną sumę należy podzielić przez 11, reszta dzielenia jest liczbą kontrolną. Jeśli reszta wynosi 10 liczbą kontrolną jest litera „X”.

Przykład
Weźmy hipotetyczny VIN 1M8GDM9A_KP042788, w którym podkreślenie odpowiada miejscu liczby kontrolnej.
       VIN: 1  M  8  G  D  M  9  A  _   K   P   0   4   2   7   8   8
   Wartość: 1  4  8  7  4  4  9  1  0   2   7   0   4   2   7   8   8
   Pozycja: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
      Waga: 8  7  6  5  4  3  2 10  0   9   8   7   6   5   4   3   2
   Iloczyn: 8 28 48 35 16 12 18 10  0  18  56   0  24  10  28  24  16
Suma wszystkich 16 iloczynów wynosi 351. Po podzieleniu przez 11 otrzymujemy resztę 10, a więc liczbą kontrolną jest „X” i kompletny VIN ma postać 1M8GDM9AXKP042788.

Kody źródłowe obliczania liczby kontrolnej[edytuj | edytuj kod]

Kod źródłowy w Perlu
sub calcVINcheckdigit {
  my %lettervalue = (A => 1, B => 2, C => 3, D => 4,
                     E => 5, F => 6, G => 7, H => 8,
                     J => 1, K => 2, L => 3, M => 4,
                     N => 5, P => 7, R => 9, S => 2,
                     T => 3, U => 4, V => 5, W => 6,
                     X => 7, Y => 8, Z => 9, 1 => 1,
                     2 => 2, 3 => 3, 4 => 4, 5 => 5,
                     6 => 6, 7 => 7, 8 => 8, 9 => 9, 0 => 0);
 
  my @positionweight = (8, 7, 6, 5, 4, 3, 2, 10,
                        0, 9, 8, 7, 6, 5, 4, 3, 2);
 
  my @vinchar = split(//, $_[0]);
  my $total = 0;
  foreach my $ctr (0..16) {
    $total += $lettervalue{$vinchar[$ctr]} * $positionweight[$ctr];
  }
  return (($total % 11) == 10) ? "X" : ($total % 11);
}
Kod źródłowy w PHP
function calcVINcheckdigit($vin){
  //Uppercase to avoid errors
  $vin = strtoupper($vin);
 
  //$cv is the "converted value" of any digit
  $cv = array('A'=>1,'B'=>2,'C'=>3,'D'=>4,'E'=>5,'F'=>6,'G'=>7,'H'=>8,'J'=>1,
              'K'=>2,'L'=>3,'M'=>4,'N'=>5,'P'=>7,'R'=>9,'S'=>2,'T'=>3,'U'=>4,
              'V'=>5,'W'=>6,'X'=>7,'Y'=>8,'Z'=>9,'0'=>0,'1'=>1,'2'=>2,'3'=>3,
              '4'=>4,'5'=>5,'6'=>6,'7'=>7,'8'=>8,'9'=>9);
 
  //$multiplier is the number to multiply each digit by.
  $multiplier = array(8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2);
 
  $total = 0;
  for ($i=0; $i<17; ++$i) {
    $total += $cv[$vin[$i]] * $multiplier[$i];
  }
 
  //The idea is to get the remainder of $total/11
  //The remainder can be 0-10.  0-9 are their digits, and 10=X
  return ($total%11 == 10)? 'X':($total%11);
}
Kod źródłowy w Ruby
# assumes that the vin string has already been validated to prevent 
# the submission of case-insensitive letters I, O and Q. Otherwise
# nil errors will be thrown when searching the letter_value hash.
def is_checkdigit_valid
 
    # find the numerical value associated with each letter in the VIN. 
    # (I, O and Q are not allowed.) Digits use their own values.
    letter_value = {'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4,
                    'E' => 5, 'F' => 6, 'G' => 7, 'H' => 8,
                    'J' => 1, 'K' => 2, 'L' => 3, 'M' => 4, 
                    'N' => 5, 'P' => 7, 'R' => 9, 'S' => 2,
                    'T' => 3, 'U' => 4, 'V' => 5, 'W' => 6,
                    'X' => 7, 'Y' => 8, 'Z' => 9, '1' => 1,
                    '2' => 2, '3' => 3, '4' => 4, '5' => 5,
                    '6' => 6, '7' => 7, '8' => 8, '9' => 9, '0' => 0}
 
    position_weight = [8, 7, 6, 5, 4, 3, 2, 10,
                       0, 9, 8, 7, 6, 5, 4, 3, 2]
 
    #uppercase to prevent nil errors when searching the hash     
    vehicle_identification_number = vehicle_identification_number.upcase
 
    vin_chars = vehicle_identification_number.split('')
    total = 0
    for i in 0...17
      total += letter_value[vin_chars[i]] * position_weight[i]
    end
 
    check_digit = ((total % 11) == 10) ? 'X' : (total % 11)
    vin_chars[8] == check_digit 
 
end
Kod źródłowy w Javie 
Ta implementacja nie wykorzystuje tablicy haszującej (mieszającej).
public class Vin {
    private static final int VIN_LENGTH = 17;
    private static final int[] weights = {8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2};
 
    public final String number;
    public final char checksum;
 
    Vin(final String number) {
        this.number = number.trim().toUpperCase();
        this.checksum = this.calcChecksum();
    }
 
    public boolean isChecksumValid() {
        return this.number.charAt(8) == this.checksum;
    }
 
    private final char calcChecksum() {
        int crc = 0;
        for (int i = 0; i < VIN_LENGTH; i++) {
            crc += weights[i] * this.resolveCharacterValue(this.number.charAt(i));
        }
        return (crc %= 11) == 10 ? 'X' : Character.forDigit(crc, 10);
    }
 
    private final int resolveCharacterValue(final int c) {
        return c <= '9' ? c - '0' : ((c >= 'S' ? c + 1 : c) - 'A') % 9 + 1;
    }
}
Wikimedia Commons

Przypisy