1. sayfa (Toplam 2 sayfa)

ST dilde Convert işlemi

Gönderilme zamanı: 21 Haz 2022, 12:27
gönderen DeisS
Merhabalar.

15MC ile program hazırlıyorum.
ST dilinde DINT_TO_UDINT convert işlemi icin ;

Sayi1 := DINT_TO_UDINT(In:= Sayi2 ) ;

yazımı doğrumudur?
teşekkürler.

Re: ST dilde Convert işlemi

Gönderilme zamanı: 21 Haz 2022, 14:47
gönderen Coşkun
Merhaba,

Kullanım şekliniz doğrudur.

ST_DINT_TO_UDINT.elcx.png



Saygılarımla, iyi çalışmalar dilerim.

Re: ST dilde Convert işlemi

Gönderilme zamanı: 21 Haz 2022, 14:55
gönderen DeisS
Teşekkürler.

Re: ST dilde Convert işlemi

Gönderilme zamanı: 22 Haz 2022, 14:21
gönderen DeisS
Coşkun Bey merhabalar.
CANopenBuilder ile 15MC çalışması yapıyorum.
Aşağıda kodunu verdiğim kod paracığında CASE işleminde bir türlü sıralı çalışmayı yakalayamadım.
CASE döngüsü 10'dan 30'a atlıyor ve bu şekilde birer atlamalı gidiyor.
MC_MoveAbsolute bloğunun EN girişine bir bit ekledim RESET ve SET işlemlerini yaptım ama yine sonuç alamadım.
Birde MC_MoveAbsolute bloğunun giriş ve cıkışlarında TRUE şeklinde kalanlar oluyor.
Hata nerede acaba ?
Yardımcı olurmusunuz?
Teşekkürler.

Kod: Tümünü seç


IF Otomatik AND SenkronCalisma THEN		
	IF EDGEPOS(xStart) AND NOT(osCalisma_Basladi) THEN        // Otomatik çalışma başlasın
		osCalisma_Basladi := True ;
	    osAdimPos := 10 ;
	END_IF ;

	
		  os_AdimAbs(EN:= True,           // MC_MoveAbsolute fonksiyon bloğu
	  Axis:= 1,
	  Execute:= osAdimBasla,
	  Position:= os_igPos,
	  Velocity:= os_igVel,
	  Acceleration:= osAbs_Acc,
	  Deceleration:= osAbs_Dec,
	  Jerk:= osAbs_Jerk,
	  Direction:= 1,
	  BufferMode:= 0,
	  );
	
	
	IF EDGEPOS(os_AdimAbs.Done) THEN         // Aktif adım pozisyonuna ulaşıldı
		osAdimBasla := FALSE ;
	END_IF ;
	
END_IF;


CASE osAdimPos OF
	
	10: // Adım1
	
	     osA1Gecikme_tmr (EN:= osAdimPos = 10 ,     // Adım1 gecikme timer
	          IN:= osAdimPos = 10 ,
	          PT:= osA1Gecikme,
	          );
			
	    IF osA1Gecikme_tmr.Q THEN         // Adım1 gecikme bittiyse pozisyona git
	        osAdimBasla := TRUE ;
	    END_IF ;
		
		  os_igPos := hmi_osA1_AbsPos ;       // Adım1 pozisyon ataması
		  os_igVel := hmi_osA1_AbsVel ;       // Adım1 Hız ataması
			
	    IF EDGEPOS(os_AdimAbs.Done) THEN         // Adım1 bittiyse Adım2'ye geç
	        osAdimPos := 20 ;
	    END_IF ;
	
	20: // Adım2

		
	     osA2Gecikme_tmr (EN:= osAdimPos = 20 ,     // Adım2 gecikme timer
	          IN:= osAdimPos = 20 ,
	          PT:= osA2Gecikme,
	          );
			
	    IF osA2Gecikme_tmr.Q THEN         // Adım2 gecikme bittiyse pozisyona git
	        osAdimBasla := TRUE ;
	    END_IF ;
		
		  os_igPos := hmi_osA2_AbsPos ;       // Adım2 pozisyon ataması
		  os_igVel := hmi_osA2_AbsVel ;       // Adım2 Hız ataması
			
	    IF EDGEPOS(os_AdimAbs.Done) THEN         // Adım2 bittiyse Adım3'e geç
	        osAdimPos := 30 ;
	    END_IF ;
	
	
	30: // Adım3
	
	     osA3Gecikme_tmr (EN:= osAdimPos = 30 ,     // Adım3 gecikme timer
	          IN:= osAdimPos = 30 ,
	          PT:= osA3Gecikme,
	          );
						
	    IF osA3Gecikme_tmr.Q THEN         // Adım3 gecikme bittiyse pozisyona git
	        osAdimBasla := TRUE ;
	    END_IF ;
		
		  os_igPos := hmi_osA3_AbsPos ;       // Adım3 pozisyon ataması
		  os_igVel := hmi_osA3_AbsVel ;       // Adım3 Hız ataması
			
	    IF EDGEPOS(os_AdimAbs.Done) THEN         // Adım3 bittiyse Adım4'e geç
	        osAdimPos := 40 ;
	    END_IF ;
		
	
	40: // Adım4
	
	     osA4Gecikme_tmr (EN:= osAdimPos = 40 ,     // Adım4 gecikme timer
	          IN:= osAdimPos = 40 ,
	          PT:= osA4Gecikme,
	          );
						
	    IF osA4Gecikme_tmr.Q THEN         // Adım4 gecikme bittiyse pozisyona git
	        osAdimBasla := TRUE ;
	    END_IF ;
		
		  os_igPos := hmi_osA4_AbsPos ;       // Adım4 pozisyon ataması
		  os_igVel := hmi_osA4_AbsVel ;       // Adım4 Hız ataması
			
	    IF EDGEPOS(os_AdimAbs.Done) THEN         // Adım4 bittiyse Adım5'e geç
	        osAdimPos := 50 ;
	    END_IF ;
		
	
	50: // Adım5
	
	     osA5Gecikme_tmr (EN:= osAdimPos = 50 ,     // Adım5 gecikme timer
	          IN:= osAdimPos = 50 ,
	          PT:= osA5Gecikme,
	          );
						
	    IF osA5Gecikme_tmr.Q THEN         // Adım5 gecikme bittiyse pozisyona git
	        osAdimBasla := TRUE ;
	    END_IF ;
		
		  os_igPos := hmi_osA5_AbsPos ;       // Adım5 pozisyon ataması
		  os_igVel := hmi_osA5_AbsVel ;       // Adım5 Hız ataması
			
	    IF EDGEPOS(os_AdimAbs.Done) THEN         // Adım5 bittiyse Adım6'ya geç
	        osAdimPos := 0 ;
	    END_IF ;
		

  ELSE
    osAdimPos := 0 ;
	
END_CASE ;








Re: ST dilde Convert işlemi

Gönderilme zamanı: 22 Haz 2022, 17:58
gönderen Coşkun
Merhaba,

Komutların EN girişini keserseniz komut pasif olur ve aktif olana kadar bir işlem yapmaz. Burada izlediğiniz yöntem yanlıştır.

Daha doğru çalışma yöntemi için "EN" koşulu önüne "Power.Status, MotionState.Jog değil" gibi koşullar ekleyip komutu sürekli çevrimde bırakmalısınız. Daha sonra komutu çalıştırmak için komutun "Execute" girişini kullanabilirsiniz. "Execute" setli kaldığı sürece komut tamamlandı "Done" çıkışı da aktif olacaktır. Taki "Execute" girişi resetleninceye kadar.

Ayrıca burada her "case" altında komut çağırmak yerine Örn. Axis formu oluşturup orada eksenler için birer adet komut tanımlayıp daha sonra o komutları programın farklı yerlerinden çağırabilirsiniz (Tek komut ile sadece pozisyon ve hız değiştirip aynı eksen kontrol edilebilir). Bu yöntem daha pratik olacaktır.

Bir başka yöntem olarak da makro hareket komut kümesi oluşturup daha sonra o komutları program içerisinden farklı noktalardan çağırabilirsiniz. Daha sonra komutların durumuna göre "case" adımları dallandırabilirsiniz.



Saygılarımla, iyi çalışmalar dilerim.

Re: ST dilde Convert işlemi

Gönderilme zamanı: 22 Haz 2022, 18:16
gönderen DeisS
Bilgi için teşekkür ederim.
ST dilinde yeniyim ve öğrenmeye çalışıyorum.
Elimdeki projeyide ST olarak yaparak tecrübe kazanmak istiyorum.
Rica etsem 1-2 satırlık bir örnek paylaşırmısınız.
Coşkun yazdı: 22 Haz 2022, 17:58
Ayrıca burada her "case" altında komut çağırmak yerine Örn. Axis formu oluşturup orada eksenler için birer adet komut tanımlayıp daha sonra o komutları programın farklı yerlerinden çağırabilirsiniz (Tek komut ile sadece pozisyon ve hız değiştirip aynı eksen kontrol edilebilir). Bu yöntem daha pratik olacaktır.

Bir başka yöntem olarak da makro hareket komut kümesi oluşturup daha sonra o komutları program içerisinden farklı noktalardan çağırabilirsiniz. Daha sonra komutların durumuna göre "case" adımları dallandırabilirsiniz.
Burada demek istediklerinizi anlamadım maalesef :)
Birkaç konumluk absolute hareket döngüsüyle örneklendirmeniz mümkün mü?
Teşekkürler.

Re: ST dilde Convert işlemi

Gönderilme zamanı: 26 Haz 2022, 03:44
gönderen Coşkun
Merhaba,

ST ile hazırlamış olduğum ekteki örnekten faydalanabilirsiniz.

ST_Example_20220625.png


Saygılarımla, iyi çalışmalar dilerim.

Re: ST dilde Convert işlemi

Gönderilme zamanı: 27 Haz 2022, 09:28
gönderen DeisS
Teşekkürler

Re: ST dilde Convert işlemi

Gönderilme zamanı: 19 Tem 2022, 13:25
gönderen DeisS
Merhabalar.
Geçen gün forumu gezerken çok adetli bir alarm bitlerini bir data adresine taşıyıp alarm olup olmadığını kontrolünü sağlayan bir yapı gördüm.
Bu yapıyı yaklaşık 80 adet alarm durumu olan programımda kulanmayı istiyorum.
Sormak istediğim bu yapıyı ST ile yazmaya çalıştım ama olmadı çünkü taşıma D adresi bitlerine (D0.0 v.s.) yapılmış ama karşılaştırma data olarak yapılmıştı.
Bu yapının ST karşılığı nasıl olmalıdır?
PLC modelim = AS228T
Teşekkür ederim.
Screenshot_1.jpg

Re: ST dilde Convert işlemi

Gönderilme zamanı: 19 Tem 2022, 19:49
gönderen Coşkun
Merhaba,

Aşağıdaki görselde olduğu gibi iki farklı şekilde okuyabilirsiniz. Ayrıca array olarak tanımladığınız word dataları da bir for döngüsü içinde döndürebilirsiniz. Aslında birden fazla yöntem mevcuttur. Sizin için en efektif olanına karar verip kullanabilirsiniz.

ST_Alarm_Read.png


Saygılarımla, iyi çalışmalar dilerim.