C# & S7300 ile C# Ethernet Haberleşmesi

Magix bana da bir program örneği gönderebilirmisin? Burayadan veya mail yoluyla paylaşabilir misin?
istediğim MD100 verisinin PLC den okuyup yazmak ethernetden kullanacağım plc s7 1200.. Şimdiden Teşekkür ederim.
 
bu libnodave haberleşmesini 64 bit işletim sisteminde gerçekleştiren veya deneyen arkadaş varmı?
ben denedim olmuyor, hazır example üzerinden yaptım ama program hemen kapanıyor.
 
Merhaba,
Libnodave ile değer atamak istiyorum fakat başaramadım.

Mesela M1.1 bitini set etmek için nasıl kullanmak gerekiyor?

byte[] bArr = new byte[0];
dc.writeBits(libnodave.daveFlags, 0, 8, 1, bArr); //M1.1 ADRESİ DOĞRU

Bu arada byte [0] olursa silmede çalışıyor.
Fakat byte[1] de olsa 255 de olsa hafızayı 1 olarak set yapmıyor.
 
Moderatör tarafında düzenlendi:
Problem Giderilmiştir.

Set 0 için;

byte[] bArr = new byte[0];
dc.writeBits(libnodave.daveFlags, 0, 8, 1, bArr);

Set 1 için;

byte[] array1 = new byte[1];
array1[0] = 1;
dc.writeBits(libnodave.daveFlags, 0, 8, 1, array1);
 
Merhaba Arkadaşlar. Şimdi ben konuyu inceledim C# yada proğramlama bilgim olmadığından konuya fransız kaldım. :D
Ama benim aklımın almadığı bir şey var. Neden S7300 Yada S7400 plc ler üzerinde çalışma yaptığınız.
Eski kurulmuş var olan sistemler hakkında çalışma yapmayı düşünüyorsanız amenna da yeni bir sitem kurma konusunda S71200 Plc ler hem fiyat olarak hemde haberleşme konusunda sorunsuz. direk tak fişi bitir işi bu kadar basit. Ha scada fiyatları pahalı bunda haklısınız ama biraz araştırma ile uygun scada yazılımlarıda buluna biliyor. Türkiyede satışı yapılan webserver cihazı ve scada yazılımlarının 10 da 1 i fiyatına ve gerçek üç boyutlu grafikleri mevcut scada yazılımları mevcut. Yani demem şu Amerikayı tekrardan keşfetmenin bir anlamı yok bence. Ben buna harciyacağım vakti projelerime harcamayı tercih ederim. Hem benim buldugum scada yazılımı su anda dünya üzerinde kullanılan bütün haberleşme protokollerini kullanıyor.
İlginizi çekerse bu yazılım bana özelden ulaşa bilirsiniz.
İyi günler dilerim.
 
Selam.

C# ı yeni öğrenecek biri için böyle bir yaklaşım tabiki mantıksız olur. Bu alanda bu iş için geliştirilmiş bir yazılım ile ilerlemek daha uygundur. Ama zaten c# biliyorsanız!

Bu durumda plc ile yaptıklarınıza bilgisayar tam desteği getirmiş oluyorsunuz ve yapılacaklar sizinle sınırlı. Mevcut ticari sisteminizin sipariş modülüne bir bağlantı yapıp (sql) verilen siparişe göre üretim alabilirsiniz. Anlık değerleri mail olarak gönderebilir veya printerdan çıktı alabilirsiniz. Barkod okutup plc ye veya plc de ürütilen miktara göre basım yapabilirsiniz. Birçoğunun scada ile de yapıldığını tahmin ediyorum. Çünkü kullanmadım. Ama ne olursa olsun scada da yazılıma bağlısınız. Bu tarafta özgürsünüz. C# da yaptığınız bir uygulamayı istediğiniz bir pc ye kurup (sadece exe kopyalayarak) hiçbir kurulum yapmadan kaldığınız yerden devam etme şansınız da mevcut.

s7 300 konusuna gelince. Sizden özel yazılım talebinde bulunacak bir işletmenin donanım olarak beklentisini Siemens in ekonomik serisi kesmeyecektir. Ayrıca yazılımın dll modülünü geriştirenlen uygulamayı s7 300 ve 400 için geliştirmişler. Fakat bağlantı opsiyonunuda (com- profinet- mpı) eklemişler.

Şu an s7 300 cpu ile birkaç yazılım üzerinde çalışıyorum. Printer, barkod, sql, grafik, servisler gibi ücretsiz birsürü ıvırzıvır düşünülünce bana göre ciddi bir alternatif oluşturuyor.

İyi çalışmalar.
 
Merhaba Arkadaşlar;


Projem büyüdükçe ciddi bir şekilde programımda yavaşlama ve takılmalar hatta programın kilitlenmesi gibi durumlarla karşılaşmaktayım.
Araştırmalarıma göre bu gibi sorunların önüne geçmek için Multithread kullanılıyormus.Bende projemde kullanmaya calısıyorum fakat bazı sorularım var altta kullandıgım Multithreadda for döngüsü ile 10ar kere bigi okuyup yazıyorum önceliği th2ye verdim herşey iyi güzel fakat ben bu döngüyü sonsuz istiyorum yada şöyle söyliyeyim th2 bitince th1 başlıyor th1 bitince th2yi başlatmak th2 bitince th1 diye devam edicek taki ben bağlantıyı kesene kadar.



th1 = new Thread(new ThreadStart(oku1));
th2 = new Thread(new ThreadStart(oku2));
th1.Priority = ThreadPriority.Lowest;
th2.Priority = ThreadPriority.Highest;

th1.Start();
th2.Start();


private void oku1()
{

th2.Join();


for (int i = 0; i < 10; ++i)
{

okunan degerler.....
Thread.Sleep(10);

}

private void oku2()
{
for (int i = 0; i < 10; ++i)
{

okunan degerler ve yazılan degerler.....

Thread.Sleep(5);
}


private void Kopar_Click(object sender, EventArgs e)
{
th1.Abort();
th2.Abort();
}
 
106tuner hocam eğer plc ye birden çok okuma isteği gönderiyorsan donma bu yüzden oluyordur. atıyorum 50tane bool, 20 tane integer 30 tane dint değerini plc den okutuyorsun diyelim.. bu okuma işini 3 komutta yapıyorsan donmalar olabilir. bunun yerine 50bool 20 integer 30dint atıyorum 50dint etsin.. tek seferde 50dint okuyup bunu program içinde parçalarsan sorun olmuyor. libnodave ile tek döngüde birkaç okuma isteği programın yavaşlamasına sebep oluyor.bool verilerini tek tek libnodave komutu ile okutuyorsan zaten şansın hiç yok program direkt donma mertebesine gelir. bunun yerine integer şeklinde okutup programın içinde bool lara parçalaman gerek.ben programda her döngüde tek libnodave komutuyla 200küsür byte okuttum ve program içinde bilgiyi parçaladım sorun yaşamadım öncesinde bitleri ayrı ayrı libnodave komutuyla okutmaya çalışmıştım program yarım saat çalışmadan sonra donuyordu..
 
Peki sanırım sizi anladım benim için birden bu kadar büyük adım atmak zor olucak.(Acemiliğimden dolayı söylüyorum)
fakat adım adım gidersek daha kolay olur diye düşünüyorum. diyelimki ben I0.0 dan I0.7 yi okumak istersem yapmam gereken;

Program.dc.readBytes(libnodave.daveInputs, 0, 0, 1, null); //I 0.0 - I0.7
deger= Program.dc.getU8();


benim "deger" değişkenim int fakat 1Bytelik veri okumus oluyorum buraya kadar hersey tamam bu veriyi işlemem gerektiğini anladım fakat bu veriyi nasıl parçalara ayırıp da örneğin I0.1'in durumuna bakabilirim?
 
I0.0dan I0.7ye kadarki verileri Move IB0 to DB100.DBB0 deyip DB den okursan daha iyi olur.DB100.DBB1 e başka veri atarsın DB100.DBD2 ye başka veri atarsın ve tek seferde DB100.dbx0.0 dan DB100.dbx200.0 a kadar olan veriyi tek komutla okursun ve programda donmalar olmaz. programdaki donmaların asıl sebebi çok kısa zaman aralığında birden çok plc ye veri isteği göndermen. biyerden sonra plc den veri gelmeden hala veri isteği yollanıyor ve donmalar başlıyor. dediğim gibi bunun yerine tek seferde 200byte okursan ve timer ile komutu refresh edip 50ms gibi zaman koyarsan hiç sorun yaşamazsın.

Byte'ları bitlere nasıl parçalayacağında şurda anlatılıyor. Kolay gelsin.

c# - Get a specific bit from byte - Stack OverflowGet a specific bit from byte


kodta şu:
public static bool GetBit(this byte b, int bitNumber) {
return (b & (1 << bitNumber)) != 0;
}
 

Forum istatistikleri

Konular
129,880
Mesajlar
931,002
Kullanıcılar
452,759
Son üye
imot

Yeni konular

Çevrimiçi üyeler

Şu anda çevrimiçi üye yok.
Geri
Üst