narzędzia |
Vehicle Identification NumberVIN (Vehicle Identification Number) – unikalny numer identyfikacyjny pojazdów mechanicznych. 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.
[edytuj] Format zapisu VINSą dwa sposoby zapisu numeru identyfikacyjnego pojazdu. W Unii Europejskiej jest stosowana norma ISO-3779, w Ameryce Północnej jest stosowany format bardziej surowy (liczba kontrolna), ale kompatybilny z europejskim. Numer VIN składa się z następujących sekcji:
[edytuj] Światowa identyfikacja producentaWMI (World Manufacturer Identifier) – [edytuj] Regiony WMIPierwszy znak WMI określa region, w którym znajduje się producent. W praktyce każdy jest przypisany krajowi, w którym znajduje się producent. Zaznaczono najpopularniejsze kraje produkcji.
[edytuj] Lista WMI niektórych producentówSAE przydzieliło krajom i producentom symbole WIM. Tablica zawiera często spotykane symbole, jednak istnieje wiele innych. [edytuj] Sekcja określająca typVDS (Vehicle Descriptor Section) – Znaki na pozycjach od 4 do 9 należą do sekcji określającej typ pojazdu. Są one używane, w zależności od lokalnych regulacji, do identyfikacji typu pojazdu i mogą zawierać informacje o konstrukcji i rodzaju nadwozia. Każdy producent ma własny system wykorzystywania tego pola. [edytuj] Cyfra kontrolna (Ameryka Północna)Element znajdujący się na 9 pozycji pełni rolę liczby kontrolnej VIN pojazdów z Ameryki Północnej. [edytuj] Numer własny egzemplarzaVIS (Vehicle Identifier Section) – Znaki na pozycjach od 10 do 17 są wykorzystywane do nadania unikatowego numeru pojazdu. Jest wykorzystywany przez producenta w przypadku reklamacji. Zawiera informacje o zainstalowanych opcjach wykonania, silniku, rodzaju napędu; często jest jednak po prostu kolejnym numerem. W ostatnie pięć znaków stanowią zawsze cyfry. [edytuj] Rok produkcji w Ameryce PółnocnejZnak na pozycji 10 jest w Ameryce Północnej wykorzystywany do kodowania roku produkcji. [edytuj] Kod zakładu producentaZnak 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. [edytuj] Kod roku produkcjiPoza trzema literami, które nie mogą występować w VIN (I, O oraz Q) do kodowania roku nie stosuje się liter U i Z oraz cyfry 0. Należy pamiętać, że kod roku może informować o roku produkcji, ale też o roku 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. [edytuj] Obliczenie liczby kontrolnej1. 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.
[edytuj] PrzykładWeź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
[edytuj] 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;
for (my $ctr = 0; $ctr < 17; $ctr++) {
$total += $lettervalue{$vinchar[$ctr]} * $positionweight[$ctr];
}
return (($total % 11) == 10) ? "X" : ($total % 11);
}
[edytuj] 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[$this->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);
}
[edytuj] 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]
#fff1f3ase to prevent nil errors when searching the hash
vehicle_identification_number = vehicle_identification_number.upcase
vin_chars = vehicle_identification_number.split(/\s*/)
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
[edytuj] Kod źródłowy w JavieCiekawostką tej wersji implementacji jest niewykorzystywanie 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 (char)((crc = crc % 11) == 10 ? 'X' : crc + '0');
}
private final int resolveCharacterValue(final int c) {
return c <= '9' ? c - '0' : ((c >= 'S' ? c + 1 : c) - 'A') % 9 + 1;
}
}
[edytuj] Linki zewnętrzne |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||