Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi ile Scada
#11
(18-08-2020, Saat: 12:10)QuAdR Adlı Kullanıcıdan Alıntı: @pro_imaj 

Dikkat ederseniz arkadaşın belirttiği yöntemlerde ( Modbus TCP/IP kompenenti, Siemens Profinet için dll dosyaları, Beckhoff için ADS pas. veya OPC ) hazır olan yapılar üzerine geliştirme yapılmış. Burada yapılan işlemler zaten birileri tarafından geliştirilmiş sistemler üzerinden haberleşme yapmak veya sorgu göndermek. Nasıl haberleşme yapıldığını , protokol yapısını, verimliliği hakkında herhangi bir bilgi edinmeden sadece 3. parti bileşenlerle işlem yapmaktır. Profinet i ele alırsak ISO-TSAP standartı haberleşme kullanır. 102 nolu port ile haberleşir. Sizin dediğiniz gibi "Yani firmalar verdikleri verileri sadece kendi geliştirdikleri sistemlere farklı algoritmalar ile gönderiyorlar."  siemens haberleşme detaylarını paylaşmaz ama bu sizin bunu çözemeyeceğiniz anlamına gelmez. Burada biraz tersine mühendislik devreye giriyor. Network tabanlı veya seri bir haberleşme yapan, veya aracı bir programla haberleşen herhangi bir sistemde giden gelen paketleri yakalayıp inceleme ile nasıl haberleştiğini çözebilirsiniz.  Örnek kod olarak aşağıda profinet protolünü okuma isteği yapma ve yazma isteği yapma procedure lerini bulabilirsiniz.



 FirstStartCommand: array[0..21] of    byte = ($03,$00,$00,$16,$11,$E0,$00,$00,$00,$01,$00,$C1,$02,$01,$00,$C2,
                                         $02,$01,$01,$C0,$01,$09);
 StartCommand: array[0..24] of byte = ($03, $00, $00, $19, $02, $f0, $80, $32, $01, $00, $00, $00, $00, $00,
                                       $08, $00, $00, $f0, $00, $00, $01, $00, $01, $01, $e0);

 RCommand: array[1..31] of byte = ($03, $00, $00, $1f, $02, $f0, $80, $32, $01, $00, $00, $04, $00, $00, $0e, $00, $00,
                                     $04, $01, $12, $0a, $10,$04,$00,$02,$00,$01,$84,$00,$00,$18);

// Area ID
 S7AreaI    = $81;
 S7AreaQ    = $82;
 S7AreaM    = $83;
 S7AreaDB   = $84;
 S7AreaCT   = $1C;
 S7AreaTM   = $1D;
// Word Length
 S7WLBit     = $01;
 S7WLByte    = $02;
 S7WLChar    = $03;
 S7WLWord    = $04;
 S7WLInt     = $05;
 S7WLDWord   = $06;
 S7WLDInt    = $07;
 S7WLReal    = $08;
 S7WLDate    = $09;
 S7WLTOD     = $0A;
 S7WLTime    = $0B;
 S7WLS5Time  = $0C;
 S7WLDT      = $0F;
 S7WLCounter = $1C;
 S7WLTimer   = $1D;
// Block type
 Block_OB    = $38;
 Block_DB    = $41;
 Block_SDB   = $42;
 Block_FC    = $43;
 Block_SFC   = $44;
 Block_FB    = $45;
 Block_SFB   = $46;
// Sub Block Type
 SubBlk_OB   = $08;
 SubBlk_DB   = $0A;
 SubBlk_SDB  = $0B;
 SubBlk_FC   = $0C;
 SubBlk_SFC  = $0D;
 SubBlk_FB   = $0E;
 SubBlk_SFB  = $0F;
// Block languages
 BlockLangAWL   = $01;
 BlockLangKOP   = $02;
 BlockLangFUP   = $03;
 BlockLangSCL   = $04;
 BlockLangDB    = $05;
 BlockLangGRAPH = $06;

 //Error Code
 NoError = 0;  // Success
 WrongCPU_Type = 1;
 ConnectionError = 2;
 //IPAdressNotAvailable

 WrongVarFormat = 10;
 WrongNumberReceivedBytes = 11;

 SendData = 20;
 ReadData = 30;

 WriteData = 50;

 InvalidAdress = 5;


function TProfinetProtocol.MakeReadRequest(mType: Byte; ReadType:string; BaslangicAdresi, DbNo,
  Size: integer): integer;
var
  HexStr: string;
  i: integer;
begin

 // Count := 2;
  i := 0;
  Result := 0;
  //RCommand[0] := $03; RCommand[1] := $00; RCommand[2] := $00; RCommand[3] := $1f;
  //RCommand[4] := $02; RCommand[5] := $f0; RCommand[6] := $80;
 // RCommand[7] := $32; RCommand[8] := $01; RCommand[9] := $00; RCommand[7] := $00;
  HexStr :=  IntToHex(Count,4);
  //gönderilen istek sayısı
  RCommand[12] := HexToInt(copy(HexStr,1,2)); ; RCommand[13] := HexToInt(copy(HexStr,3,2));
 // RCommand[12] := $00; RCommand[13] := $0e;
 // RCommand[14] := $00; RCommand[15] := $00;
//  RCommand[16] := $04; //RCommand[17] := $01;

 // RCommand[18] := $12; RCommand[19] := $0a;
  //RCommand[20] := $10;
  //Taşıma uzunluğu word - byte - bit
 // RCommand[23] := $04;

  HexStr := IntToHex(Size ,4);
  //Okunacak data sayısı
  RCommand[24] := HexToInt(copy(HexStr,1,2)); ; RCommand[25] := HexToInt(copy(HexStr,3,2));
  //Blok numarası
  HexStr := IntToHex(DbNo ,4);
  RCommand[26] := HexToInt(copy(HexStr,1,2)); ; RCommand[27] := HexToInt(copy(HexStr,3,2));
  RCommand[28] := mType;

  if ReadType = 'W' then
  begin
    if mType = S7AreaDB then
    begin
      i := BaslangicAdresi * 8;
      i := i * 2;
      Result := 2 * Size;
    end;

    if mType = S7AreaM then
    begin
      i := BaslangicAdresi;
      Result := Size;
    end;

    RCommand[23] := S7WLWord;
  end;

  if ReadType = 'O' then
  begin
    i := BaslangicAdresi * 8;
    Result := 2 * Size;
    RCommand[23] := S7WLByte;
  end;

  if ReadType = 'B' then
  begin
    i := BaslangicAdresi;
    Result := Size;
    RCommand[23] := S7WLBit;
  end;

  HexStr := IntToHex(i,6);
  RCommand[29] := HexToInt(copy(HexStr,1,2)); RCommand[30] := HexToInt(copy(HexStr,3,2)); RCommand[31] := HexToInt(copy(HexStr,5,2));
  if Count = 32000 then Count := 0
  else Count := Count + 1;
end;


procedure TProfinetProtocol.MakeWriteRequest(mType: Byte; Values,
  ReadType: string; BaslangicAdresi, DbNo, Size: integer);
var
  DataLength: integer;
  HexStr: string;
  Result,i : integer;
  ValuesList: TStringList;
  PaketUzunlugu: integer;
begin
  ValuesList := TStringList.Create;
  ValuesList.CommaText := Values;

  if ReadType = 'W' then
  PaketUzunlugu := 35 + (Size * 2);

  if ReadType = 'O' then
  PaketUzunlugu := 35 + Size;

  if ReadType = 'B' then
  PaketUzunlugu := 35 + Size;

  SetLength(WriteArray, PaketUzunlugu);

  WriteArray[0] := $03; WriteArray[1] := $00;

  HexStr := IntToHex(PaketUzunlugu,4);    //paket uzunluğu
  WriteArray[2] := HexToInt(copy(HexStr,1,2)); WriteArray[3] := HexToInt(copy(HexStr,3,2));

  WriteArray[4] := $02; WriteArray[5] := $f0; WriteArray[6] := $80;

  WriteArray[7] := $32; WriteArray[8] := $01; WriteArray[9] := $00; WriteArray[10] := $00;

  HexStr :=  IntToHex(Count,4);
  //gönderilen istek sayısı
  WriteArray[11] := HexToInt(copy(HexStr,1,2)); WriteArray[12] := HexToInt(copy(HexStr,3,2));

  WriteArray[13] := $00; WriteArray[14] := $0e;

  //Veri uzunluğu + sabit 4 byte parametre
  if ReadType = 'W' then
  begin
    DataLength := 4 + (2 * Size);
    HexStr :=  IntToHex(DataLength,4);
    WriteArray[15] := HexToInt(copy(HexStr,1,2)); WriteArray[16] := HexToInt(copy(HexStr,3,2));
  end;

  if ReadType = 'O' then
  begin
    DataLength := 4 + Size;
    HexStr :=  IntToHex(DataLength,4);
    WriteArray[15] := HexToInt(copy(HexStr,1,2)); WriteArray[16] := HexToInt(copy(HexStr,3,2));
  end;

  if ReadType = 'B' then
  begin
    DataLength := 4 + Size;
    HexStr :=  IntToHex(DataLength,4);
    WriteArray[15] := HexToInt(copy(HexStr,1,2)); WriteArray[16] := HexToInt(copy(HexStr,3,2));
  end;



  WriteArray[17] := $05;  WriteArray[18] := $01;
  WriteArray[19] := $12;  WriteArray[20] := $0a;
  WriteArray[21] := $10;



  HexStr := IntToHex(Size ,4);
  //Okunacak data sayısı
  WriteArray[23] := HexToInt(copy(HexStr,1,2)); WriteArray[24] := HexToInt(copy(HexStr,3,2));
  //Blok numarası
  HexStr := IntToHex(DbNo ,4);
  WriteArray[25] := HexToInt(copy(HexStr,1,2)); WriteArray[26] := HexToInt(copy(HexStr,3,2));
  WriteArray[27] := mType;


   if ReadType = 'W' then
  begin
    if mType = S7AreaDB then
    begin
      i := BaslangicAdresi * 8;
      i := i * 2;
      Result := 2 * Size;
      Result := 8 * Result;
    end;

    if mType = S7AreaM then
    begin
      i := BaslangicAdresi;
      Result := Size;
    end;


    WriteArray[22] := S7WLWord;
  end;

  if ReadType = 'O' then
  begin
    i := BaslangicAdresi * 8;
    Result := Size * 8;
    WriteArray[22] := S7WLByte;
  end;

  if ReadType = 'B' then
  begin
    i := BaslangicAdresi;
    Result := Size;
    WriteArray[22] := S7WLBit;
  end;



  HexStr := IntToHex(i,6);

  WriteArray[28] := HexToInt(copy(HexStr,1,2)); WriteArray[29] := HexToInt(copy(HexStr,3,2)); WriteArray[30] := HexToInt(copy(HexStr,5,2));
  WriteArray[31] := $00;

  //Veri tipi word byte...
  WriteArray[32] := S7WLWord; //WriteArray[22];
  if ReadType = 'B' then WriteArray[32] := 3;


  HexStr := IntToHex(Result, 4);
  WriteArray[33] := HexToInt(copy(HexStr,1,2)); WriteArray[34] := HexToInt(copy(HexStr,3,2));

  for i := 35 to length(WriteArray) - 1 do
  begin
     WriteArray[i] := HexToInt(ValuesList[i-35]);
  end;

  HexStr := '';

  for i := 0 to Length(WriteArray) - 1  do
  begin
    HexStr := HexStr + IntToHex(WriteArray[i],2);
  end;

  //ShowMessage(HexStr);
  if Count = 32000 then Count := 0
  else Count := Count + 1;
end;


Açıklamalarınız için teşekkürler, kafamda eksik kalan yer tamamlanmış oldu, sanırım zaten işin en uğraştırıcı ve zaman alıcı kısmı burası oluşturuyor, buda ayrı bir uzmanlık konusu.

Teşekkürler.
Cevapla
#12
(18-08-2020, Saat: 10:43)pro_imaj Adlı Kullanıcıdan Alıntı:
(17-08-2020, Saat: 23:01)Milenyumotomasyon Adlı Kullanıcıdan Alıntı: Öncelikle bilgileriniz için teşekkürler, bu konuları benim gibi bir arkadaşında aynı yöntemle çözdüğünü bilmek beni mutlu etmiştir. Scada sistemleri ağırlıklı olarak proses (Yem, Un, Arıtma, Kimya, Elektrik Santralleri vb) uygulamalarında kullanılır ve sistemi yöneten genellikle üst seviye tek bir PLC veya Endüstriyel PC dir. Bu nedenle farklı farklı Plc lerden veri okuma yazma işlemi yapmak zorunda kalınmaz. Eğer farklı PLC lerle bu işlem yapılacaksa dediğiniz gibi OPC 
bu iş için uygundur. Fabrikalarda makine parkı ve çeşitliliği çok olduğu için genelde makine kontrolörüne fazla dokunulmaz, otomasyon sistemine ufak müdahale ile sinyal alınır ve makine-operatör performansları ölçülür. Ayrıca Delphi mutlaka Scada olarak kullanılacak diyede bir kural yok. Sadece bir makina PLC  kontolörü ve Delphi ile yazdığınız arayüz programı ile makineye veri girişi ve raporlama yaptırabilirsiniz. Örneğin lastikciye gittiniz, arabanıza balans ayarı yaptıracaksınız, tekeri bağladığı makine bir PLC ve PC den oluşur. PLC tekerleği çevirir ve balansın olduğu yönü açısal olarak verir, bu değerleride PC ekranında göstermek Delphi ile yazacağınız programa kalır.

Teşekkürler.
Öncelikle şunu belirtmekte fayda var, her fabrikayı ayrı değerlendirmek gerekir. Bir yem fabrikası 3000-4000 sinyalin işlendiği bütün makinelerin genelde tek bir PLC veya endüstriyel PC
tarafından kontrol edildiği komple bir yapıdır. Arıtma tesisleri, un fabrikaları, kimya tesisleride aynıdır. Üretim çeşitliğinin çok olduğu fabriklarda durum biraz faklıdır. Makina parkı ve çeşidi çok olduğu için standart bir haberleşme yapılamaz. Ancak makine kontrolörleri OPC yi destekliyorsa, buda makine üreticisinin insiyatifine kalmış genelde uygulamazlar zaten. Bunun yerine teknik olarak otomasyon sistemine ufak müdahelerle bu işler halledilir. Delphi mutlaka Scada olarak kullanılacak diyede bir kaide yoktur. Tek bir makine arayüzünüde yazabilirsiniz. Makineden veri çekip rapor ve grafik oluşturmak, verileri analiz etmek, bu tamamen sizin yazacağınız programa kalıyor. Örneğin bizim daha önce yapmış olduğumuz teleskop gözlem evinde, teleskop hedef yıldız takip ederken dünyanın dönüşünden dolayı sürekli dönmek zorundadır, teleskop dönünce bizim yaptığımız kontrolöre bağlı kubbeninde dönmesi gerekiyordu. Bizde Delphi ile ethernet üzerinde teleskobun pozisyonu okuyup kontrölere gönderdik ve senkron olarak dönmelerini sağladık.

Cevaplar için teşekkürler. Lastikçi örneğinizden yola çıkarsak, İlgili PLC bize bilgi vermeyeceğine göre PC tarafında da kendi iletişimi kurup haberleşme sağladığına göre Delphi ile yazacağımız program nereden nasıl beslenecek, zaten projelerdeki sorun bu. Yani firmalar verdikleri verileri sadece kendi geliştirdikleri sistemlere farklı algoritmalar ile gönderiyorlar.

Benim aklıma görüntü işleme ile PC'deki kendi yazılımlarının ekran görüntüsünden verileri sabit alanlardan kamera ile okumak geliyor, buda çok sıkıntılı bir bir yöntem (Ekranda hep aynı yazılım açık kalmayabiliyor.)

Teşekkürler.
Otomasyon tarafında Plc programlarınıda yazan birisi olarak,  plc kodlarınıda kendim yazdığım icin hangi adresde hangi datalar var biliyorum. Başkaları tarafindan yazilmış plc programında şifre yoksa programı çekerek veri adreslerini görebilirsin. Bu konuda biraz plc bilgisine ihtiyacınız olacak.
Cevapla
#13
(18-08-2020, Saat: 14:35)Milenyumotomasyon Adlı Kullanıcıdan Alıntı:
(18-08-2020, Saat: 10:43)pro_imaj Adlı Kullanıcıdan Alıntı: Cevaplar için teşekkürler. Lastikçi örneğinizden yola çıkarsak, İlgili PLC bize bilgi vermeyeceğine göre PC tarafında da kendi iletişimi kurup haberleşme sağladığına göre Delphi ile yazacağımız program nereden nasıl beslenecek, zaten projelerdeki sorun bu. Yani firmalar verdikleri verileri sadece kendi geliştirdikleri sistemlere farklı algoritmalar ile gönderiyorlar.

Benim aklıma görüntü işleme ile PC'deki kendi yazılımlarının ekran görüntüsünden verileri sabit alanlardan kamera ile okumak geliyor, buda çok sıkıntılı bir bir yöntem (Ekranda hep aynı yazılım açık kalmayabiliyor.)

Teşekkürler.
Otomasyon tarafında Plc programlarınıda yazan birisi olarak,  plc kodlarınıda kendim yazdığım icin hangi adresde hangi datalar var biliyorum. Başkaları tarafindan yazilmış plc programında şifre yoksa programı çekerek veri adreslerini görebilirsin. Bu konuda biraz plc bilgisine ihtiyacınız olacak.

Cevap için teşekkürler.

İyi çalışmalar.
Cevapla
#14
Selamlar,
Konu ile ilgili bir soruna denk geldiğim için buradan devam ettirmek istedim. OPC üzerinden haberleşme ile gerekli olan bilgileri okumada bir problem yaşanmayabiliyor ancak, oluşan alarmları direk PLC üzerinden TCPIP ile okumak gerekirse, bununla ilgili bir çalışma yapan, örnekleme verebilecek arkadaşlarımız varsa, yardımlarını rica ederim.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#15
Merhabalar, 

Özel mesaj ile sormuşsunuz buradan da cevabı verelim ki ihtiyacı olanlara fikir olsun.
Soruyu ve cevabı direk yapıştırıyorum.


Alıntı:wiseman Adlı Kullanıcıdan Alıntı:
Selamlar

PLC içinden oluşan alarmları okumamız mümkün müdür? Bununla ilgili bir çalışma yaptınız mı hiç?

Selamlar,
Alarm oluşması demek kısaca açıklayacak olursak,
Herhangi bir giriş değeri (sayısal veya logic) geldiğinde bir adresi set edip pc tarafından okumak demektir.
Yani sisteminizde bir motor ve bu motorun koruma termiği var diyelim. Motor aşırı akım çekince termik atar termiğin kontağı üzerinden geçen bağlantı plc ye
input sinyalı verir. Sizde bu sinyali gördüğünüzde plc içerisinde set edeceğiniz alarm bitini 1 yaparsınız.
Pc tarafından bu bitin durumunu sorgulamanız durumunda eğer 1 ise alarm oluşmuş demektir 0 ise alarm yok demektir.

İyi çalışmalar dilerim.
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...





Cevapla
#16
(24-09-2020, Saat: 11:39)wiseman Adlı Kullanıcıdan Alıntı: Selamlar,
Konu ile ilgili bir soruna denk geldiğim için buradan devam ettirmek istedim. OPC üzerinden haberleşme ile gerekli olan bilgileri okumada bir problem yaşanmayabiliyor ancak, oluşan alarmları direk PLC üzerinden TCPIP ile okumak gerekirse, bununla ilgili bir çalışma yapan, örnekleme verebilecek arkadaşlarımız varsa, yardımlarını rica ederim.

Her markada hikaye değişir. OPC gibi bir ara katman kullanmak istemiyorsan, bu doğrudan PLC ile konuşmak istediğin anlamına gelir. Bu yüzden doğrudan PLC ile konuşacaksan onun haberleşme dili, metodu neyse onu öğrenmen gerekir. Yani bu sorunun cevabı PLC markasına göre değişir. Aslında OPC'nin de yaptığı tamamen bu, yani OPC PLC markasının kendi konuşma dilini biliyor konuşuyor o veriyi alıyor ve sana sunuyor.
Cevapla
#17
Selamlar
Standart alarmalarda bir sorunum yok PLC den alarmları farklı bir DataBlock a yönlendirerek okuyorum zaten. Ancak benim merak ettiğim şey, PLC nin kendi sistem mesajlarını okuyabilmek. Örneğin: Batarya düşük, Bağlantı koptu, Reduandant sağlanamıyor gibi. Çünkü bu veriler PLC de tutulmadan direkt olarak OPC sunucusuna gönderiliyor.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#18
Her plc nin special registers veya system registers diye registerları vardır.Örnek olarak (Clock pulse, first scan, cpu status, port busy - ready ... vb).
OPC sunucusuna gönderme diye bir şey olmaz. OPC sunucu haberleşme yapısı gereği bu sorguları otomatik sorup işler.
Sizde sorgulayarak alabilirsiniz veya bu register durumlarını başka bir registera yazarak ordan okuma yapabilirsiniz.
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...





Cevapla
#19
(16-08-2020, Saat: 09:54)Milenyumotomasyon Adlı Kullanıcıdan Alıntı: SCADA sistemleri geniş alana yayılmış tesislerin tek bir merkezden bilgisayar, cep telefonu veya tablet gibi cihazlarla izlenebildiği bir sistemdir ve temel olarak bir yazılımdır. 
Tek bir cihazdan kullanılabileceği gibi ağ bağlantılarıyla birden fazla bilgisayar ve taşınabilir cihazla kontrol ve izleme yapılabilir. Genel olarak endütriyel olduğu için otomasyon sektöründeki 
firmaların arayüz hazırlamak için hazır tasarım programları vardır. Örneğin, Siemens WINCC, Schenıder CITECT, Beijer IX Developer gibi. Bunların haricinde sadece scada arayüz tasarım 
programlarıda vardır. Lisans ücretleride tag (okunan bir data) başınadır ve 500 Eurolardan başlayıp 10.000 eurolara kadar çıkabilmektedir. Her tesis için yeniden lisans almanız gerekir.
Bunu yapmak istemiyorsanız benim gibi Delphi Lisansı alıp özgürlüğün tadını çıkartırsınız. Scada sistemlerinde scada operesyonu ve sistemi yönetmez, sadece kullanıcı ile sistemi yöneten
birim arasında veri girişi, izleme, veri yedekleme ve raporlama vb. gibi işleri yapar. Sistemi yöneten PLC ve Endüstriyel PC lerdir. Asıl yazılım bunların üzerindedir. Bu PLC ve PC ler
üzerine yazılım; 1: Ladder (Elektrikçi dili) 2: ST (Delphi ve C gibi programlama) 3: FBD (Fonksiyon Blok Diyagramı) 4: Lojik Fonksiyon. vb gibi dillerle yazılır.
Beckhoff PLC yazılımı Visual Studıo ile yapılır ve geneli Endüstriyel Pc dir. Yazılım yaparken 5 yazılım dilini iç içe kullanabilirsiniz. Değişken tanımlamaları ve ST yazılım Delphi kullanıcıları için çok kolay olacaktır.
Fatek PLC Winproladder ile yazılır Ladder dili kullanılır.
Delphi ile bunları haberleştirmek için PLC ler için Delphi Modbus TCP/IP kompenenti, Siemens Profinet için dll dosyapalrı, Beckhoff için ADS pas. dosyası kullanarak veya hazır kompenenti
vardır. Ben ağırlıklı olarak ADS pas. dosyasını kullanarak haberleştiriyorum. Veri okuma yazma işleminde PLC ler için adres, PC ler için hem adres hemde değişken adı kullanılarak okuma yazma
yapılabilmektedir.  Uygulama resimleri yüklemeye çalıştım fakat dosya boyutu fazla geldi sanırım. Bu konularda daha fazla yardım isteyen arkadaş olursa bilgim ve vakit olduğunca yardımcı olmaya çalışırım.

Merhaba bu konu hakkında eğitim videoları mevcutmu?
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi Direktif Kullanımı narkotik 14 6.201 20-12-2024, Saat: 13:55
Son Yorum: frmman
  Delphi ile .Net Ortamında geliştirilen dll içerisindeki fonksiyon kullanımı yhackup 10 10.295 09-04-2023, Saat: 02:17
Son Yorum: gogo72
  Delphi ve Protocol Buffers SimaWB 10 9.271 10-12-2022, Saat: 15:04
Son Yorum: SimaWB
  Delphi AES 128 ECB PKCS5 Padding ile sorun aegean 1 1.706 28-11-2022, Saat: 13:07
Son Yorum: aegean
  Delphi IDE'sine Eklenti Yapmak - 2 SimaWB 29 26.648 03-07-2022, Saat: 16:40
Son Yorum: enigma



Konuyu Okuyanlar: 1 Ziyaretçi