Libnodave Kullanımı Hk.

ufuk2306

Üye
Katılım
16 Tem 2007
Mesajlar
2
Puanları
1
Yaş
39
İyi ÇAlışmalar, eternet üzerinden c# ile libnodave kullanarak plcye bağlanmayı denedim, ancak err:33280 hata mesajı döndürdü ve yanında çince açıklamar vardı, sorunun ne olabileceği hakkında fikri olan ya da aynı sorunla daha önceden karşılaşıp çözmüş arkadaşlar var mı acaba
 
KNX Standardı, küçük bir rezidansın içerisindeki aydınlatma, perde panjur, klima kontrolünden, Dünya’nın en büyük havalimanlarındaki aydınlatma otomasyonu gibi çözümler için tercih edilen bir Dünya standardıdır.
Yazımızda endüstrinin can damarı sayılabilecek PLC’yi inceleyeceğiz.
Benimde libdavone ile ilgili örneklere ihtiyacım var c# ve Visual basic farketmez ama MPı ve Ethernet haberleşmesini çözmem gerek.
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace s7_300_haberleşme
{
public partial class MainForm1 : Form
{

public static libnodave.daveOSserialType fds;
public static libnodave.daveInterface di;
public static libnodave.daveConnection dc;
public static int rack = 0;
public static int slot = 2;
string ipadres = "10.0.0.209";

byte[] boy = new byte[256];
// int[] tag = new int[64];
double[] tag = new double[64];
int[] res = new int[16];
public MainForm1()
{
InitializeComponent();
}

private void MainForm1_Load(object sender, EventArgs e)
{
baglan();
}
private void baglan()
{


try // ip adresine 102. portan bağlantı kurulablir ise
{
fds.rfd = libnodave.openSocket(102, ipadres);
}
catch { Slbl1.Text = ipadres + " 'e ulaşılamadı"; }
fds.wfd = fds.rfd;
di = new libnodave.daveInterface(fds, "FD1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k);
di.setTimeout(5000); //50 saniye
dc = new libnodave.daveConnection(di, 0, rack, slot);
try
{
if (fds.rfd > 0) //Eğer Bağlantı Başarılı ise
{
if (0 == dc.connectPLC())
{
Slbl1.Text = ipadres + " Ye Bağlı Durumdasınız";
//timer1.Enabled = true;
}
else
{
Slbl1.Text = "Bağlantı Başarısız";
}
}
else
{
Slbl1.Text = "Bağlantı Başarısız";
}
}
catch { Slbl1.Text = "Çok Acayip bir Hata Oluştu"; }
}
private void kopar()
{
if (fds.rfd > 0) //Eğer Bağlantı Başarılı ise
{
if (0 == dc.connectPLC())
{
try
{
libnodave.closePort(fds.wfd);
di.disconnectAdapter();
dc.disconnectPLC();
}
catch { }
Slbl1.Text = " Plc Bağlantınızı sonlandırdınız";
}

}
}

private void button1_Click(object sender, EventArgs e)
{
int daveReadBytes (daveConnection * dc, int alan, int DB, int start, int len, void * tampon);

//Parametreleri:

//dc: bir bağlantı temsil eden bir daveConnection yapısına bir işaretçi.
//alan : Bir PLC sabit bellek alanına bir belirtir.
//DB: Bir veri bloğu sayısıdır. Tek anlamlı alan daveDB eğer. 0 oterwise kullanın.
//start: blokta ilk byte adresi.
//len: bayt sayısı.
//tampon: Eğer sonuç çok kopyalanmasını istiyorsanız bazı bellek alanına bir gösterici.

}
}
}
okuma yazmanın nasıl olduğunu anlayamadım...
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace s7_300_haberleşme
{
public partial class MainForm1 : Form
{

public static libnodave.daveOSserialType fds;
public static libnodave.daveInterface di;
public static libnodave.daveConnection dc;
public static int rack = 0;
public static int slot = 2;
string ipadres = "10.0.0.209";

byte[] boy = new byte[256];
// int[] tag = new int[64];
double[] tag = new double[64];
int[] res = new int[16];
public MainForm1()
{
InitializeComponent();
}

private void MainForm1_Load(object sender, EventArgs e)
{
baglan();
}
private void baglan()
{


try // ip adresine 102. portan bağlantı kurulablir ise
{
fds.rfd = libnodave.openSocket(102, ipadres);
}
catch { Slbl1.Text = ipadres + " 'e ulaşılamadı"; }
fds.wfd = fds.rfd;
di = new libnodave.daveInterface(fds, "FD1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k);
di.setTimeout(5000); //50 saniye
dc = new libnodave.daveConnection(di, 0, rack, slot);
try
{
if (fds.rfd > 0) //Eğer Bağlantı Başarılı ise
{
if (0 == dc.connectPLC())
{
Slbl1.Text = ipadres + " Ye Bağlı Durumdasınız";
//timer1.Enabled = true;
}
else
{
Slbl1.Text = "Bağlantı Başarısız";
}
}
else
{
Slbl1.Text = "Bağlantı Başarısız";
}
}
catch { Slbl1.Text = "Çok Acayip bir Hata Oluştu"; }
}
private void kopar()
{
if (fds.rfd > 0) //Eğer Bağlantı Başarılı ise
{
if (0 == dc.connectPLC())
{
try
{
libnodave.closePort(fds.wfd);
di.disconnectAdapter();
dc.disconnectPLC();
}
catch { }
Slbl1.Text = " Plc Bağlantınızı sonlandırdınız";
}

}
}

private void button1_Click(object sender, EventArgs e)
{
int daveReadBytes (daveConnection * dc, int alan, int DB, int start, int len, void * tampon);

//Parametreleri:

//dc: bir bağlantı temsil eden bir daveConnection yapısına bir işaretçi.
//alan : Bir PLC sabit bellek alanına bir belirtir.
//DB: Bir veri bloğu sayısıdır. Tek anlamlı alan daveDB eğer. 0 oterwise kullanın.
//start: blokta ilk byte adresi.
//len: bayt sayısı.
//tampon: Eğer sonuç çok kopyalanmasını istiyorsanız bazı bellek alanına bir gösterici.

}
}
}
okuma yazmanın nasıl olduğunu anlayamadım...
 
İlk başta bende libnodave ile uğraştım ama boşuna. Daha sonra kendim yazdım. Sizde yazabilirsiniz, yada fultek activex olarak satıyor. Nasıl çözdün derseniz anlatıyım. Pc ile plc her hangi bir program ile haberleştirdim. Sonra pc'ye iki seri port daha taktım. birinden plc'nin gönderdiği diğerinden de pc nin gönderdiği dataları milisaniye ile etiketliyerek kaydettim. Başladım enigmayı çözmeye pc ne demiş plc ne cavap vermiş.... böylece 20 gün sonunda mpi ile haberleşen bir activex yaptım. aynı sistemle ppi'ı 1 haftada yazdım. Benzer sistemle profineti yazdım. Artık hepsini bu şekilde yaparım her halde. bana siemens protokolü getirin çöziyim.

Unutmadan s7 mpi saçma sapan bir protokol. sadece 1 byte okumak için ilk seferinde 1000 byte data trasnferi yapılıyor. sonra karşılıklı 100 byte data transfer ile okuma sürdürülüyor. hepsi sadece 1 byte okumak için. Bu adamlar bu protokolü yazarken kimse yapamasın olabildiğince karıştıralım demişler. Hatta giden gelen data içersinde 16 sayısı varsa peş peşe iki 16 gönderiliyor. Zira mpı da 16 dle demek iki tane gönderince bu dll değil demek oluyor.

Kolay gelsin
 
Açklama için teşşekür. Vibnoda dave ile ilgili bir sorun yok fakat bende sizin gibi TCP/IP üzerinde s7-300 üzerinde veri akış verişi yapmaya çalıştım fakat geçirdiğim bir iş kazasından doayı 2 aydır çalıştığım iş yerinden uzağım; inşallah nisan nayı başları itibaren TCP/IP haberleşme üzerinde yoğunlaşmayı düşünüyorum.
 
Ben de veri okuma yazma yapamadım, yardımcu olabilir misiniz?
 
Kod:
Public Function ReadBit(ByVal byteAdr As Integer, ByVal bitAdr As Byte) As Integer
   Dim RetVal  As Long
   Dim V1      As Integer
   
   RetVal = daveReadBytes(dc, daveFlags, 0, byteAdr, 1, 0)
   
   If RetVal = 0 Then
      V1 = daveGetS8(dc)
      If (V1 And bArray(bitAdr)) > 0 Then
         ReadBit = 1
      Else
         ReadBit = 0
      End If
   Else
      ReadBit = -1
      WriteMessage "ReadBit Error"
      PLCConnectionTimer.Enabled = True
   End If
   
End Function

Yukarıdaki function ile bit okuyorsunuz bunun gibi okumak istediğiniz diğer int long ve double değerler için functionlar yazıp kullanabilirsiniz...
 
Moderatör tarafında düzenlendi:

Forum istatistikleri

Konular
128,133
Mesajlar
915,308
Kullanıcılar
449,849
Son üye
cagan20

Yeni konular

Çevrimiçi üyeler

Geri
Üst