AIRHMI · 05.11.2026

SAE J1939, kamyon, otobüs, tarım ve iş makinelerindeki motor, şanzıman, fren ve gösterge gibi kontrol ünitelerinin CAN hattı üzerinde konuştuğu ortak dildir. CAN yalnızca mesajı taşır; hangi mesajın motor devri, hangisinin araç hızı olduğunu ve verinin nasıl ölçekleneceğini J1939 tanımlar. Bu sayede farklı üreticilerin cihazları aynı hatta birbirini anlar. Bu rehberde 29 bitlik kimliğin yapısını, PGN ve SPN kavramlarını, sık kullanılan mesajları, adres almayı, arıza kodlarını ve araç verisini HMI ekranda göstermeyi anlatıyoruz. CAN’in temelleri için önce CANBus Nedir? rehberimize bakabilirsiniz.
J1939 nedir?
J1939, Amerikan otomotiv mühendisleri birliği SAE’nin ağır ticari araçlar ve makineler için yayımladığı bir üst protokoldür. Fiziksel taşıyıcı olarak CAN 2.0B kullanır: 29 bitlik genişletilmiş kimlik, çoğunlukla 250 kbit/s (J1939-11) ve yeni araçlarda 500 kbit/s (J1939-14) hat hızı.
Standart birkaç bölümden oluşur:
- J1939-21: veri bağlantı katmanı; kimliğin yapısı, Request mesajı ve 8 bayttan uzun verilerin taşınması (Transport Protocol)
- J1939-71: uygulama katmanı; hangi parametrenin hangi mesajda, hangi baytta ve hangi ölçekle gönderildiğini tanımlayan sözlük
- J1939-73: arıza teşhisi; DM1, DM2 gibi teşhis mesajları ve arıza kodları
- J1939-81: ağ yönetimi; cihazların hatta adres alması (Address Claim)
Otomobillerde kullanılan OBD-II / UDS’ten farklı olarak J1939, yalnızca arıza teşhisi için değil araçtaki tüm kontrol ünitelerinin sürekli haberleşmesi için tasarlanmıştır. Gösterge paneli, motor devrini teşhis cihazı gibi sorarak değil, motor beyninin düzenli olarak yayınladığı mesajı dinleyerek öğrenir.
29 bitlik kimliğin yapısı
J1939 mesajının kimliği üç ana parçadan oluşur: öncelik, PGN ve kaynak adresi. Öncelik 0 ile 7 arasındadır; 0 en yüksektir. Motor kontrol mesajı EEC1 öncelik 3 ile, çoğu durum mesajı öncelik 6 ile gönderilir. CAN’de küçük kimlik hattı kazandığından öncelikli mesaj hat yoğunken bile gecikmez.
PGN (Parameter Group Number), DP, PF ve PS alanlarından oluşan 18 bitlik numaradır ve mesajın ne olduğunu söyler. PF alanının değeri iki mesaj türünü ayırır:
- PDU1 (PF < 240): PS alanı hedef adresidir; mesaj belirli bir cihaza gönderilir. Request ve Address Claim gibi mesajlar bu türdendir. Hedef 255 (global) ise herkese gider.
- PDU2 (PF ≥ 240): PS alanı grup uzantısıdır; mesaj herkese yayınlanır. Motor devri, hız ve sıcaklık gibi veriler bu türdendir.
Örnekteki 0x0CF00400 kimliği şöyle okunur: 0x0C → öncelik 3; 0xF0 ve 0x04 → PGN 0xF004 (61444, EEC1); 0x00 → kaynak adresi 0, yani motor. Aynı mesajı gösterge paneli de alır, teşhis cihazı da; kaynak adresi mesajı kimin gönderdiğini belirtir, kimin alacağını değil.
PGN ve SPN: mesaj ve parametre
Bir PGN en çok 8 baytlık bir mesajdır ve içinde birden fazla parametre taşır. Her parametrenin bir SPN’si (Suspect Parameter Number) vardır. J1939-71 her SPN için şunları tanımlar:
- Mesajdaki yeri: başlangıç baytı ve biti, uzunluğu (1 bit, 1 bayt, 2 bayt…)
- Çözünürlük ve ofset: ham değerin gerçek değere nasıl çevrileceği
- Geçerli aralık ve birim
Örnek: motor devri SPN 190, EEC1 mesajının 4. ve 5. baytındadır, 0,125 rpm/bit çözünürlüğündedir. Baytlar 4 = 0xE0, 5 = 0x2E geldiyse ham değer 0x2EE0 = 12 000, motor devri 12 000 × 0,125 = 1 500 rpm’dir.
Çok baytlı değerler düşük bayt önce (little-endian) gönderilir; 4. bayt düşük, 5. bayt yüksek bayttır. Bir parametre için veri yoksa tüm bitler 1 gönderilir (0xFF, 0xFFFF); 0xFE hata anlamına gelir. Bu değerler gerçek ölçüm gibi işlenmemelidir.
Sık kullanılan mesajlar
Aşağıdaki mesajlar hemen her ağır araçta bulunur; gösterge paneli ve telematik cihazları en çok bunları okur:
| PGN | Ad | Parametre (SPN) | Yeri ve ölçeği |
|---|---|---|---|
| 61444 (0xF004) | EEC1 | Motor devri (190) | 4–5. bayt · 0,125 rpm/bit |
| 65262 (0xFEEE) | ET1 | Soğutma suyu sıcaklığı (110) | 1. bayt · 1 °C/bit, −40 °C ofset |
| 65265 (0xFEF1) | CCVS | Araç hızı (84) | 2–3. bayt · 1/256 km/h per bit |
| 65276 (0xFEFC) | Dash Display | Yakıt seviyesi (96) | 2. bayt · %0,4/bit |
| 65263 (0xFEEF) | EFL/P1 | Motor yağ basıncı (100) | 4. bayt · 4 kPa/bit |
| 65271 (0xFEF7) | VEP1 | Akü gerilimi (168) | 7–8. bayt · 0,05 V/bit |
| 65253 (0xFEE5) | HOURS | Toplam motor saati (247) | 1–4. bayt · 0,05 h/bit |
| 65226 (0xFECA) | DM1 | Aktif arıza kodları | Lamba durumu + 4 baytlık DTC’ler |
Soğutma suyu örneği: ET1’in 1. baytı 0x7E = 126 geldiyse sıcaklık 126 − 40 = 86 °C’dir. Ofseti unutmak en sık yapılan hesap hatasıdır.
Mesajların gönderim aralıkları da standarttır: EEC1 10–20 ms’de bir, CCVS 100 ms’de bir, ET1 ve Dash Display saniyede bir yayınlanır. Bir cihaz bu mesajları ne kadar sık okuyacağına kendisi karar verir.
Yayın ve Request: veri nasıl istenir?
J1939’da veri iki yolla alınır. Çoğu mesaj düzenli aralıklarla yayınlanır; dinleyen cihaz hiçbir şey göndermeden veriyi alır. Yayınlanmayan ya da nadiren gönderilen bir PGN ise Request mesajıyla (PGN 59904, 0xEA00) istenir: 3 baytlık veri alanına istenen PGN yazılır, hedef adres ilgili cihaz ya da 255’tir.
- İstenen PGN’i destekleyen cihaz mesajı hemen gönderir.
- Desteklemiyorsa olumsuz yanıt (NACK) döner; mesaj hiç gelmezse cihaz o PGN’i tanımıyor demektir.
- Request, Address Claim ve bileşen kimliği gibi tek seferlik bilgiler için de kullanılır.
Uzak I/O modüllerinde de aynı iki yaklaşım görülür: SmartIO CANLink stream modunda durumlarını seçilen aralıkta yayınlar, sorgu–cevap modunda ise yalnızca Request geldiğinde yanıt verir.
Address Claim: cihazlar adresini nasıl alır?
Her J1939 cihazının 0–253 arasında bir kaynak adresi olmalıdır; 254 “adres yok”, 255 “herkes” anlamındadır. Motor (0), şanzıman (3), fren (11), gösterge paneli (23) ve üst yapı kontrolcüsü (33) gibi temel cihazların adresleri standartta sabittir; 128–247 aralığı dinamik olarak alınabilen adreslerdir.
Cihaz hatta katılırken Address Claim mesajı (PGN 60928, 0xEE00) ile “bu adres benim” der. Mesajın 8 baytlık veri alanında cihazın NAME’i taşınır: üretici kodu, cihaz işlevi, sektör grubu ve seri numarası gibi alanlardan oluşan 64 bitlik kimlik.
- Aynı adresi iki cihaz isterse NAME değeri küçük olan adresi alır; diğeri başka bir adres dener.
- Boş adres bulamayan cihaz 254 ile “adres alamadım” mesajı gönderir ve veri yayınlamaz.
- Üretici kodu SAE tarafından dağıtılır; kendi J1939 cihazını yapan firmaların bu kodu alması önerilir.
Üreticiye özel mesajlar: Proprietary A ve B
Standartta tanımlı olmayan veriler için J1939 iki alan ayırır. Proprietary A (PGN 61184, 0xEF00) PDU1 türündedir ve belirli bir cihaza gönderilir; Proprietary B (PGN 65280–65535, 0xFF00–0xFFFF) PDU2 türündedir ve yayınlanır. İçeriğini üretici belirler.
Uzak I/O modülleri, üst yapı kontrolcüleri ve özel sensörler verilerini çoğunlukla Proprietary B ile gönderir. Örneğin bir I/O modülü dijital girişlerini 0xFF10, analog girişlerini 0xFF12 PGN’iyle yayınlayabilir; ana cihaz çıkış komutlarını Proprietary A ile ya da ayrı bir Proprietary B PGN’iyle gönderir. Aynı hatta birden fazla modül farklı kaynak adresleriyle çalışır; PGN’ler aynı kalabilir çünkü kimliğin içinde kaynak adresi de vardır.
8 bayttan uzun veriler: Transport Protocol
Bir CAN mesajı 8 bayt taşır; bileşen kimliği, yazılım sürümü ya da birden fazla arıza içeren DM1 gibi veriler bundan uzundur. J1939-21 bunları Transport Protocol ile parçalara böler: TP.CM (PGN 60416) mesajı aktarımı duyurur, TP.DT (PGN 60160) mesajları 7’şer baytlık parçaları taşır; en çok 1 785 bayt gönderilebilir.
- BAM: herkese yayın; gönderen duyurur ve parçaları art arda gönderir
- RTS/CTS: tek alıcıya; alıcı kaç parça kabul edeceğini bildirir, gönderen ona göre ilerler
Her mesajı 8 bayta sığdırmak, hem alıcının hem gönderenin işini kolaylaştırır; uzak I/O modüllerinde grup başına tek bir 8 baytlık mesaj kullanılmasının nedeni budur.
Arıza kodları: DM1 ve DTC
Aktif arızalar DM1 mesajıyla (PGN 65226) saniyede bir yayınlanır. İlk 2 bayt uyarı lambalarının durumunu (kırmızı stop, sarı uyarı, koruma, arıza), sonraki her 4 bayt bir DTC’yi taşır:
- SPN (19 bit): arızalı parametre; ör. 110 soğutma suyu sıcaklığı
- FMI (5 bit): arıza türü; 0 normalin üstünde, 1 normalin altında, 3 gerilim yüksek, 4 gerilim düşük, 5 akım düşük / açık devre, 6 akım yüksek / kısa devre
- OC (7 bit): arızanın kaç kez oluştuğu
- CM (1 bit): SPN’nin bit sırasını belirten dönüşüm yöntemi; yeni cihazlarda 0
Tek arıza 8 bayta sığar; birden fazla arıza varsa DM1, Transport Protocol ile BAM olarak gönderilir. Geçmiş arızalar DM2 (PGN 65227) ile okunur. Gösterge ekranında SPN ve FMI’yi okunabilir metne çevirmek için J1939-71 sözlüğünden küçük bir tablo yeterlidir.
J1939, CANopen ve ham CAN farkları
| Özellik | SAE J1939 | CANopen | Ham CAN |
|---|---|---|---|
| Kimlik | 29 bit; öncelik + PGN + kaynak adresi | 11 bit; işlev kodu + düğüm numarası | 11 ya da 29 bit; anlamı kullanıcı belirler |
| Hız | 250 / 500 kbit/s | 10 kbit/s – 1 Mbit/s | Serbest |
| Veri sözlüğü | J1939-71 ile standart (SPN) | Nesne sözlüğü ve cihaz profilleri | Yok |
| Adres yönetimi | Address Claim ile dinamik | Düğüm numarası sabit (1–127) | Yok |
| Ağ yönetimi | Yok (her cihaz bağımsız yayınlar) | NMT master ve düğüm durumları | Yok |
| Tipik kullanım | Kamyon, otobüs, iş ve tarım makineleri | Endüstriyel otomasyon, asansör (CiA 417) | Makine içi özel ağlar |
Araç hattına bağlanacak bir cihaz J1939 konuşmalıdır; kapalı bir makine ağında ise ham CAN ya da CANopen daha sade olabilir. İki modu da destekleyen cihazlar hem araçta hem makinede kullanılır.
AirHMI ile J1939: araç verisini ekranda gösterme
Bir HMI ekranın J1939 hattından veri göstermesi için üç şey gerekir: hattı dinleyip yalnızca gerekli PGN’leri süzen bir CAN arabirimi, SPN’leri gerçek değere çeviren küçük bir hesap ve bu değerleri gösteren bir arayüz.
- AirHMI Mobile ekranlarda CANBus – UART kartı gövdenin içindedir; 29 bitlik kimlikleri PGN’e göre süzer ve motor devri, hız, sıcaklık, yakıt ve DM1 verilerini ekrana aktarır. 9–36 VDC besleme ve kontak girişiyle doğrudan araca bağlanır.
- SmartIO CANLink aynı hatta J1939 düğümü olarak çalışır: Address Claim ile adresini alır, girişlerini Proprietary B PGN’leriyle yayınlar, Request’e yanıt verir; pompa, valf ve lamba gibi üst yapı ekipmanlarını ekrandan yönetmenizi sağlar.
- Mevcut bir AirHMI ekrana CAN eklemek için CANBus – UART Modülü kullanılır; belirlediğiniz kimlikleri süzüp UART’a aktarır.
- Arayüz ücretsiz AIRHMI Designer ile tasarlanır; kadran ve gösterge bileşenleri ile C tabanlı olay kodu, ham baytı rpm ya da °C’ye çevirmek için yeterlidir.
Kablolamada CAN kuralları aynen geçerlidir: bükümlü çift, hattın iki ucunda 120 Ω sonlandırma, kısa ara bağlantılar. Araç hattında sonlandırma genellikle zaten vardır; ekrana ya da modüle ikinci bir sonlandırma eklemeyin.
Sık yapılan hatalar
- Yanlış hat hızı: 250 yerine 500 kbit/s seçilmesi tüm hatta hata çerçevelerine yol açar; önce yalnızca dinleme modunda hızı doğrulayın.
- Bayt sırası: çok baytlı SPN’ler düşük bayt önce gelir; baytları ters okumak değeri 256 kat yanıltır.
- Ofset unutma: sıcaklıklar −40 °C ofsetlidir; 126 ham değer 86 °C’dir, 126 °C değil.
- 0xFF’i veri sanmak: tüm bitleri 1 olan değer “veri yok” demektir; göstergede boş gösterilmelidir.
- PDU1 / PDU2 karıştırma: PF 240’ın altındaysa PS alanı hedef adresidir, PGN’in parçası değildir.
- Adres çakışması: sabit adres vermek yerine Address Claim kullanın; aynı adresli iki cihaz hattı bozar.
- Çoklu DM1’i kaçırmak: birden fazla arıza BAM ile parçalı gelir; yalnızca tek çerçeveyi okuyan cihaz ikinci arızayı görmez.
Sorun giderirken bir USB–CAN arayüzü ve J1939 çözen bir izleme yazılımı en hızlı yoldur: hattaki PGN’leri, kaynak adreslerini ve gönderim aralıklarını birkaç saniyede gösterir.
J1939 çözümlerimizi inceleyin
Araç verisini ekranda göstermek, üst yapı ekipmanını CAN hattından yönetmek ya da mevcut bir ekrana J1939 eklemek için ürünlerimizi inceleyin. Projeniz için doğru yapılandırmayı seçmekte yardım isterseniz bize yazın.








