14 Temmuz 2017 Cuma

MIL-STD-1553

Giriş
Bu yazının amacı havacılıkta sıkça karşımıza çıkan bir teknolojiye giriş yapmak. Bu veriyolu 1973 yılından beri kullanımda.

Tutucu olan havacılık sanayinde, bazı firmalar yavaş yavaş IP ve/veya ethernet tabanlı veriyollarına geçiş yapmaya başladılar. İleride bununla ilgili de bir yazı yazmak istiyorum. Örneğin Avionics Full Duplex Switch (AFDX) teknolojisinde Airbus Ethernet teknolojisi kullanıyor. AFDX Ethernet 802.3 tabanlı ve OSI katmanlarında Layer 1 ve Layer 2'yi içeriyor.

MIL-STD-1553 ve MSB
Eski ethernet veriyollarında, aynı 1553'te olduğu gibi ilk gönderilen bitin LSB olduğu yazıyordu. Çünkü sinyalleşmede her sinyal bir biti temsil ediyordu. Ancak gigabit ethernet teknolojisinde artık bir sinyal birden fazla bite denk geliyor.  1553 böyle yüksek hızlarda çalışmadığı için ilk gönderilen bit, ethernetin tam tersidir yani MSB'dir.


MIL-STD-1553
Askeri hava araçlarında kullanılan sayısal veriyolu tiplerinden birisi MIL-STD-1553'tür. MIL-STD ile başlaması, Amerikan ordusunun bir standardı olduğunu gösterir. Bu standardın NATO'daki karşılığı STANAG 3838'dir.

Bu veriyolu uçak, helikopter, füze vs. gibi bir çok yerde kullanılıyor. Bu veriyoluna benzeyen ancak daha çok sivil hava araçlarında kullanılan bir diğer sayısal veriyolu ise ARINC 429'dur.

Veriyolunun'ın çalışmasını gösteren şekili buradan aldım.

Bu veriyolu elektriksel sinyalleri kullanıyor. Daha gelişmiş bir sistem olan MIL-STD-1773 ise fiber optik teknolojisini kullanıyor. Kablolar twisted shield (twinax) ve dual redundant, yani iki farklı kablodan aynı veri akıyor. Redundant kabloların üzerinde 1 A ve 1 B  yazar. Veriyolunun uzunluğu 100 metreyi geçemez. Eğer geçmesi gerekirse "repeater" kullanarak sinyali güçlendirmek gerekir. Veriyolunun ucuna 78 ohm'luk terminator'lerin bağlanması gerekir. Bir cihazı veriyoluna bağlamanın en kolay yolu "coupler" kullanmaktır. Coupler üzerindeki girişleri 2 kanala sahip (2 RT'ye sahip) 1553 kartının kanal 1 A ve kanal 2 A girişlerine bağlayarak external loopback testi çalıştırılabilir. Yani kartın birinci RT ucunda gönderilen veri  aynı kartın ikinci RT ucundan girer ve doğruluğu kontrol edilir.

1553'ün havacılıktaki önemini anlamak için buradan yaptığım alıntıya dikkat etmek lazım.
Previous aircraft designs incorporated individual boxes for almost every system, linked to a central computer via a MIL-STD-1553 1 megabit-per-second serial avionics databus. The F-22 was the first to have a more fully integrated native architecture, built around a high-speed serial databus, which was able to get the most use of those assets without adding more boxes and electronics. That approach also eased the sharing of assets at a relatively low level of integration.
Veriyolu ile gönderilebilecek verilerin bitlerini gösteren şema ise aşağıda.

Word Nedir ?
Aslında her bir word 20 bit olarak tanımlanmasına rağmen ilk 3 bit senkronizasyon, 1 bit ise parity için kullanıldığından, data bit word genişliği 16 bit'e denk geliyor. Toplamda en fazla 32 bit data word gönderilebilir.

Word MSB
Aşağıdaki cümle önemli. Cümlede alışılagelmişin tersine, ilk yazılan bit değerinin 15. bitten başlayarak yazılması gerektiği söyleniyor.
The data field bits numbered 00 through 15, left to right, with bit 00 designated as the most significant bit (MSB)
Bileşenler Nelerdir?
1553 veriyolunu kullanan bir uçağın tipik bileşenleri aşağıdadır. Bu bileşenler "Bus Controller" , "Remote Terminal" ve "Bus Monitor" olarak ayırılıyorlar.


Bus Controller Nedir?
Her veriyolunda tek bir tane Bus Controller (BC) bulunur. BC programlanabilen ve tüm veriyolunu yöneten cihazdır. Dolayısıyla 1553 Command/Response şeklinde çalışır.

Not 1:

Bus Controller 1553 kartının üzerinde bulunan clock'a göre veriyolunu yönetir. Eğer Windows gibi gerçek zamanlı olmayan bir işletim sistemi kullanılıyorsa, BC'nin frame'inin ne zaman başladığı ve ne zaman bittiğini bilmek, ve okuma yazma işlemini yapan thread'i BC'nin clock döngüsüne uydurmak gerekir. Bunu yapmak için aşağıdaki Ballard API'sindeki "Interrupt döngüsü" başlığına bakabilirsiniz.

Eğer gerçek zamanlı bir işletim sistemi kullanılıyorsa, I/O işlemlerini yapan bölümlemenin periyodunu değiştirme imkanı bulunmadığı için, bu sefer kartın çipine uymak yerine, kartı bize uyduracak bir yöntem kullanmak gerekir. Bu yöntem de genellikle ya kartın çıkarttığı interrupt'ı dinlemek ya da I/O işlemine başlanınca, kartın clock'ını bizim clock'ımız ile eşitlemek olur.

Not 2
Gönderilecek mesaj sayısı çok ise ciddi bir scheduling problemine dönüşebilir. Scheduling problemler NP-hard problem halini bile alabilir. Nurse scheduling problem gibi gıcık algoritmik şeyler halini almamasına dikkat etmek gerekir.


Remote Terminal Nedir ?
Remote Terminal (RT), veriyoluna bağlı ve BC tarafından yönetilen cihazdır. Bir veriyoluna bir çok  RT bağlanabilir (31 tane).

Bus Controller programlandığı aralıklarla RT'ye bana veya başka bir RT'ye veri gönder veya gönderilen veriyi al komutunu gönderir.

Bus Monitor Nedir ?
Veriyolundan akan veriyi okumak için kullanılır.

Komut Akışı
BC'nin gönderdiği komutlar iki başlık altında toplanır. 

Veri Aktarımı
Veri aktarımı BC-RT, RT-BC veya RT-RT arasında olabilir.
Receive: BC tarafından RT'ye gönderilir. BC 1-32 arasında Data Word gönderir. RT Status Word ile cevaplar. Böylece BC RT'nin komutu aldığını anlar.
Transmit: BC tarafından RT'ye gönderilir. RT Status Word (Böylece BC RT'nin komutu aldığını anlar) ve 1-32 arasında Data Word ile cevaplar.
Broadcast: BC tarafından gönderilir. Broadcast, RT to RT olabilir.1-32 arasında Data word gönderir. Tüm RT'ler okurlar ama cevaplamazlar.
RT to RT : BC başlatır. RT1'e Receive komutu gönderir. RT2'ye Transmit komutu gönderir. RT2 1-32 arasında Data Word gönderir. RT1 Status Word ile cevaplar.
System Control : Mode komutları

Şimdi bazı özel wordlerin içine bakalım.
Status Word
Aşağıdaki şekilde status word'ün yapısı görülüyor.

Remote Terminal Address Bitleri : Status word'ü gönderen terminalin adresini içerir.
Message Error Biti : Eğer atanmışsa bir önce gönderilen mesajda hata olduğunu belirtir.
Busy Biti : Eğer atanmışsa RT'nin istenilen komutu yapamayacağını belirtir.

Mode Komutları
Veri aktarımı amacıyla değil ancak bir işlevin yerine getirilmesi için gönderilir. Örneğin cihazı temizlemek, sıfırlamak vs. gibi. Mode Komutlar komutun arkasından 0-1 arasında Data Word da gönderebilir. RT Status Word ve 0-1 arasında Data Word ile cevaplar.

BC RT'te bir Command Word ve gerekiyorsa arkasından Data Word gönderir. Data Word içinde RT Adresi barındırmadığı için Command Word'ü takip etmek zorundadır.  

RT ise Status Word ile cevap verir ve gerekiyorsa hemen arkasından Data Word gönderir. Data Word yine aynı şekilde içinde RT Adresi barındırmadığı için Status Word'ü takip etmek zorundadır. 


Remote Terminal ve Subadres
Subadresi işlev olarak açıklayan dokümanlar gördüm. Bir kartın birden fazla işlevi olabilir ve kartın hangi işlevi yerine getirmesini istediğimi subadres kullanılarak belirtilir diye açıklamalar vardı. 

Ben ise daha farklı bir şekilde açıklamayı uygun buluyorum. RT kendisine gönderilen veya kendi göndereceği veriyi kartın üzerindeki belli bir hafıza alanında saklamak zorundadır. Bu hafıza alanına subadres denilir. 

Bir Remote Terminal'in 30 tane subadresi olabiliyor. Subadres'ler 5 bit ile temsil ediliyorlar. Yani teoride 32 subadres bulunabilir, ancak 0 ve 31. subadresler broadcast için kullanıldıkları için RT-RT iletişim için geriye 30 tane kalıyor. 

Yani bir RT 30 Rx (alma), 30 Tx (gönderme) işlemi için toplam 60 subadrese sahip.(Bu cümleyi kontrol etmek lazım)

Her subadrese ne kadar veri yazılabilir?
Her bir okuma veya yazma işleminde bir subadres'e 32 word gönderilip alınabilir. 

1553 ve ICD
Bant genişliği çok fazla omadığı için bit oriented mesajlar kullanılır. Double gibi 8 byte tutan değeri göndermek yerine, (int * precision) şeklinde daha az yer tutan gönderim yöntemleri seçilebilir.

1553 ve Zamanlama

1553 veriyolunda zamanlama herşeydir. Bus controller programlandığı zamanda veriyi ister. Eğer veri hazır değilse sıkıntı çıkar. Bu yüzden gerçek zamanlı işletim sistemlerinde, I/O yani 1553 veriyolu ile haberleşme işlevini yerine getiren ayrı bir bölümlenme (partition) kullanılması sık görülen bir durumdur.  Bu kullanım şeklinde I/O bölümlenmesinin bus controller veriyi talep ettiğinde (örneğin her 50 milisaniyede bir) çalışacağı daha kolay garanti edilebilir. 

DDC Kartları
Data Device Corporation firmasının PCI Express, USB girişlerine takılabilen bir çok kart modeli mevcut. Bu firma bus'i izlemek için BusTracer isimli bir program da veriyor.

RT olarak kartı kullanma
uint16_t deviceNum = 0;
aceInitialize (deviceNum,ACE_ACCESS_CARD,ACE_MODE_RT,0,0,0);

//Cmd stacks are 1K words
aceRTConfigure (deviceNum,ACE_RT_CMD_STK_1K,0);

uint16_t rtNumber = 1;
aceRTSetAddress (deviceNum, rtNumber);


Okuma örneği

//This is the global (used for all messages) message structure for decoded 1553 messages
MSGStRUCT message;
aceRTGetStkMsgDecoded (deviceNum,&message,ACE_RT_MSGLOC_NEXT_PURGE);

uint16_t commandWord = message.wCmdWrd1;

uint32_t rtAddr = commandWord >> 11; //11 bits
uint32_t direction = (commandWord >> 10) & 1; // 1 bit
uint32_t subAddr = (commandWord >> 5 ) & 0X1F; // 5 bits
uint32_t wordCount = commandWord & 0x1F; // 5 bits

//Read
if (wordCount != 0){}

Ballard
Ballard firmasını da bir çok kart modeli mevcut.
Aşağıda Ballard'ın 1553 kartını Windows'ta kullanma örneği var. Ballard'ın verdiği sürücünün API'si burada.
Şu cümle card ve core arasındaki farkı açıkladığı için önemli.
Ballard hardware devices are implemented with one or more sections called cores. Typically, each core has its own protocol processing circutiry.

Kartı açma
HCARD hcard;
unsigned short cardNum = 0;
BTICard_CardOpen (&hCard,cardNum);//Open card
HCORE hCore;
unsigned short coreNum = 0;
BTICard_CoreOpen (&hCore,coreNum,hCard);//Open core

BC olarak Ayarlama
BTI1553_BCConfig (BCCFG1553_DEFAULT,//select all default settings
                                 CH0,//Channel number
                                 hCore);

RT olarak Ayarlama
BTI1553_RTConfig(RTCFG1553_DEFAULT,//select all default settings
                                 1,//Terminal address
                                CHO,//Channel number
                                hCore);

Mesajları Atama
BTI1553_MsgDataRd ve BTI1553_MsgDataWr metodları ile bir subadrese okuma yazma işlemi yapılabilir. Ancak bu metodlar MSGADDR parametresi kullanıyorlar. Bu parametre aşağıdaki gibi yaratılabilir.
 
unsigned short channelNum = 0;
BTI1553_BConfig (BCCFG1553_DEFAULT,channelNum,hCard);

//BC to RT message
{
    //Receive from RT's point of view
    unsigned short commandWord = BTI1553_ValPackCWD (rt1,RCV,sa1,wc);//Command Word

    unsigned short pData = new unsigned short [wc];

    //MSGADDR    a handle to a struct that contains data associated with a 1553 message
    MSGADDR msgAddr = BTI1553_BCCreateMsg (MSGCRT1553_DEFAULT,commandWord,0,pData,hCard);
}

//RT to BC message
{
    //Transmit from RT's point of view
    unsigned short commandWord = BTI1553_ValPackCWD (rt1,XMT,sa1,wc);//Command Word

    unsigned short pData = new unsigned short [wc];

    //MSGADDR    a handle to a struct that contains data associated with a 1553 message
    MSGADDR msgAddr = BTI1553_BCCreateMsg (MSGCRT1553_DEFAULT | MSGCRT1553_LOG,commandWord,0,pData,hCard);
}

Interrupt döngüsü
Bize gelen mesajları okumak için interrupt kullanılabilir. Bunun için bir döngü içinde interrupt'ı beklemek gerekir.

BTICard_EventLogConfig (LOGCFG_ENABLE//Enable event log list
                                           4096//Number of entries in the event log list
                                           hCore
                                          );
 
unsigned short type = 0;
MSGADDR msgAddr = 0; //subaddress
//Wait for event. 3 parametre olan channel için NULL kullanıyoruz
if (BTICard_EventLogRd (&type,&msgAddr,NULL,hCore))
{
    if (type == EVENTTYPE_1553MSG)
    {
        unsigned short msgData [32];
        unsigned short msgSize = 32 //size of data to be read

        BTI1553_MsgDataRd (msgData,msgSize,msgAddr,hCore);
    }
}

Bir başka örnekte frame'in geldiğini görebiliriz.
unsigned short type = 0;
unsigned int info = 0; //frame numarası
//Wait for event. 3 parametre olan channel için NULL kullanıyoruz
if (BTICard_EventLogRd (&type,&info,NULL,hCore))
{
    if (type == EVENTTYPE_1553OPCODE)
    {
    }
}
Kullanım Örnekleri
Kullanım yerlerine bir kaç örnek vermek istedim.

Hindistan'da geliştirilen Light Combat Helicopter (LCH)
Amerikan B-52 bombardıman uçağı


Türkiye'nin elinde bulunan F4 uçakları da bu veriyolunu kullanacak şekilde modernize edildi.

Ayrıca ASELSAN tarafından geliştirilen ASES sisteminin MIL-STD-1553 ile uyumlu çalıştığı da yazılıyor

Aşağıda bazı MIL-STD-1553 videoları var


 



 


ARINC 429
ARINC 429 yazısına taşıdım.

MIL-STD-1760
MIL-STD-1760 hava araçlarında kullanılan elektriksel bir arayüz. Roketsan tarafından geliştirilen Cirit silahında MIL STD-1760 arayüzü destekleniyor.

Can Bus
Can Bus otomotiv dünyasında kullanılan Bosch tarafından geliştirilen bir veriyolu. 1983 yılında ticari hale geldi. Ethernet'e benzer şekilde, iki düğüm aynı anda konuşmaya başlarsa çarpışma oluyor, yani CSMA/CD. Ancak mesajların öncelik sırası var. Çarpışma tespit edilirse en yüksek öncelikli mesaj iletilir. Veriyolunda master ve slave görevine sahip düğümler var.

Can Bus Frame Acknowledgement
Layer 2'de gerçekleşir. Bir mesajı alan tüm düğümler Acknowledgement gönderirler.

Can Bus Acceptance Filtering
Düğümler sadece kendilerine adreslenen frame'leri alması için ayarlanabilirler.


4 yorum:

  1. Güzel bir paylaşım olmuş. MIL-STD-1553 e alternatif olarak CAN BUS yapısınıda paylaşmanızı öneririm. Aviyonik sistemlerde sıkça kullanılan teknolojilerden birisidir.

    YanıtlaSil
    Yanıtlar
    1. Merhaba. CAN BUS ile hiç çalışmadığım için maalesef konu hakkında yazamıyorum :) Öneriniz için teşekkürler.

      Sil
  2. Paylaştığınız bilgiler çok faydalı. Aselsan linki kırık sanırım çince bir siteye yönlendiriyor.

    YanıtlaSil
  3. merhaba, sanırım "Transmit: BC tarafından RT'ye gönderilir." ifadesi tam tersi olarak düzeltilmeli

    YanıtlaSil