Word içersindeki bitlerin durumunu belirlemek

x0914667

Üye
Katılım
21 Tem 2006
Mesajlar
446
Puanları
1
Yaş
40
Bir word veya double word içersindeki
bitlerin sayısını nasıl belirleriz.
Örneğin;
Bir değerli olan bit sayısını
01110011=4 adet bir olan bit var gibi.
 
bir değeri variable table üzerinde binary 2'lik olarak izleyebilirsin, 2#00000001 bu örneğin ilk biti bir gerisi sıfır dır.
 
Sorum anlaşılmamış herhalde.
Word'un içerindeki bitleri izlemek değil.
İçeriğindeki bitlerin durum bilgisi lazım.
Örneğin MW100=0101110010111111 olsun.Normalde
MW100 içinde kaç tane bir bilgisi onu almak istiyorum.
İzlemek değil.Bu bilgiyi sistem içersinde kullanmam gerekiyor.
 
Kod:
      L     0                           //her cycle başında sıfırla
      T     MW   100

      A     M     10.0                  //Bit 0  kontrol et
      JCN   m001
      L     MW   100
      L     1                           // Bit aktif ise MW100 ü 1 arttır
      +I    
      T     MW   100
m001: A     M     10.1                  //Bit 0  kontrol et
      JCN   m002
      L     MW   100
      L     1                           // Bit aktif ise MW100 ü 1 arttır
      +I    
      T     MW   100

m002: A     M     10.2
      JCN   m003
      L     MW   100
      L     1
      +I    
      T     MW   100

m003: A     M     10.3
      JCN   m004
      L     MW   100
      L     1
      +I    
      T     MW   100
m004: A     M     10.4
      JCN   m005
      L     MW   100
      L     1
      +I    
      T     MW   100
m005: A     M     10.5
      JCN   m006
      L     MW   100
      L     1
      +I    
      T     MW   100
m006: A     M     10.6
      JCN   m007
      L     MW   100
      L     1
      +I    
      T     MW   100
m007: A     M     10.7
      JCN   end
      L     MW   100
      L     1
      +I    
      T     MW   100


end:  BE

Örneği MB10 Byte ı hesaplama olarak yazdım. İstenilen aktif bit sayısı değer MW100 içerisinde.


Altenatif olarak SLW - SRW(word kaydırma) komutu kullanılarak yapılabilir gibi.İstediğiniz WORD adresini 1 kaydırma yapıp her kaydırmada bit dizisinin en sonundaki bit i bir counter ile saydırırsınız ve 15 kaydırma sonunda counter değeri istediğiniz sonucu verir ve tekrar counter ı resetlersiniz.
 
Kod:
FUNCTION BIT_COUNT : INT
TITLE = 'BIT_COUNT'
//
//BIT_COUNT counts the amount True of bits in a dword.
//for example: bit_count(3) returns 2 because two bits (bits 0 and 1) are true and all others are false. 
//
VAR_INPUT
    IN : DWORD;
END_VAR
VAR
    temp: DWORD;
      attemp AT temp : ARRAY[0..31] OF BOOL;
END_VAR

BEGIN
  Bit_Count := 0;
  temp := in;
  
  WHILE DWORD_TO_DINT(temp) <> 0 DO
    IF attemp[24] THEN Bit_Count := Bit_Count +1; END_IF;
    temp := SHR(IN:=temp,N:=1);
  END_WHILE;

END_FUNCTION
 
eğer 300- 400 veya 1500 kullanıyorsanız bitsum diye bir fonksiyon var girişine sayılmasını istediğiniz bölge çıkışıandada size setli bit sayısını verir 2#0100001=iki gibi tek komut deneyin
 
Buna benzer bi uygulama yapmıştım. Yaptığım şey, reçete programında şecilen bitin kaç numaraya tekabül ettiğiydi. Kısaca açıklıyayım.

20 Adet buton var, mesela 13. butona basıldığında 13 sayısını veriyor program. Programın ana mantığı şöyleydi.

MD100 içinde sadece bir bit 1 oluyor ve bu 1 olan biti anlamak için. DW#16#0000 0001 0000 0000 bu sayıyı 1 ile çarpıyor sonuç 1 olursa 1. bit 1 diyip çıkışa 1 sayısını veriyor. Eğer 1 ile çarptığında çıkış 1 değilse DW#16#0000 0000 1000 0000 şeklinde 1 sağa kaydırıyor ve artı 1 ekliyor. mesela 8. de 1 bulduysa 1 ile çaprımın sonucunu çıkışa 8 yazıyor.

Senin istediğin şeyide buna benzer bişey yapabiliriz. Her defasında 1 ile çarpıp sonuç 1 ise +1 eklemek ve sayıyı 1 sağa kaydırmak. Örneğin:

W#16#0011 0101 sayısı olsun. Bunu W#16#0000 0001 ile AND leyip sonuç 1 ise bir INT sayısına 1 eklesin ve sayıyı bir sağa kaydırsın.
W#16#0001 1010 şekline gelir bunu tekrar W#16#0000 0001 ile AND leyip döngüyü devam ettirmek gerekir.
 
eğer 300- 400 veya 1500 kullanıyorsanız bitsum diye bir fonksiyon var girişine sayılmasını istediğiniz bölge çıkışıandada size setli bit sayısını verir 2#0100001=iki gibi tek komut deneyin

#Genç22

Ben bu bitsum u bulamadım. Nerde bu fonksiyon, SFC bloklarının içinde mi ?
 
genç22 arkadaşın söylediği blok ile
işimi hallettim.Teşekkürler.
 

Forum istatistikleri

Konular
129,867
Mesajlar
930,872
Kullanıcılar
452,732
Son üye
erencok

Yeni konular

Geri
Üst