DS1302 ile role kontrol...

Başlatan mikrotronik, 03 Nisan 2016, 10:46:41

mikrotronik

Merhaba Arkadaşlar;

DS1302 ile iki zaman arasında bir roleyi kontrol etmek istiyorum.
Şöyleki;
Saat 17:30 da role çeksin ,01:20 de bıraksın ve 07:00 da role çeksin,06:59 da role bıraksın.
Saat formatı 24 ve role sayısı iki .

Ben şu şekilde denedim ancak saat sıralamasında 01:20,17:30 dan küçük olduğu için çalışmıyor.

Örneğin;
1.role kapama saati : 17:30
1.role açma saati : 01:20
_____________________
2.role kapama saati : 07:00
2.role açma saati : 06:59
___________________________________________________
if 1.role kapama saati >= saat and 1.role açma saati <=saat then
  High 1.role
  else
  low 2.role
endif
__________________________________________________
if 2.role kapama saati >= saat and 2.role açma saati <=saat then
  High 2.role
  else
  low 2.role
endif

Teşekkürler,

ete

Tam saat ve dakikaları esas alırsan sistem sorunsuz çalışır. Yani IF SAAT=6 and DAK=59 THEN ACIL gibi.
Ama bu durumda voltajın kesilmesi durumunda o saati kaçırırsan sistem çalışmayacaktır.
Sonradan da sistemin çalışmasını istersen bir üçüncü parametre devreye girmeli.
Örneğin Haftanın günü yada ayın günü. Malum gece 12:00 den sonra haftanın günü ve aynı günü değişir.
Bunuda devreye sokarsan sistem çalışacaktır. Ancak yinede ortaya bir sürü aksaklık çıkacaktır. Zira tam aybaşlarından bir önceki ay 31'inde açılmış bir sistem 1'inde kapanması gerekecektir. Bu durumda devreye Ay da girecektir. Anlayacağın Bütün takvimide devreye alman gerekiyor yıl içinde sorunsuz çalışmasını istediğin bir sistem için.
Daha kolay bir yol istersen şayet açılma saati bir önceki günde ve kapanma bir sonraki günde ise mutlaka gece yarısı saat tam 12:00 de bir değişkeni set etmen gerekir. (SANRAKI=1 gibi )  Bu değişken bir bit değişkeni olabilir . Böylece gün değiştiğini kayıt altına almış olur ve tarihlerle uğraşmamış olursun.
IF SAAT=>ACILIS AND SONRAKI=0 THEN ROLE1=1
IF SAAT=>KAPANIS AND SONRAKI=1 THEN ROLE1=0 demen yeterli olacaktır.

Ancak hala sorun var. Zira diyelimki Saat 18:00 da açılacak 21:00 de kapancak bu durumda yukarıdaki mantık yine çalışmayacaktır. O halde açılış kapanış saatlerini kayıt ederken birde gündeğişimi diye ilave bir değişken kullanmak gerekir.
Degisim diyelim buna Şayet 18:00 de açılıp 2:de kapanacak ise Degisim=0 olmalıdır. Bu şekilde değer girilir.
Şayet 18:00 da açılıp sabah 06:00 da kapanacak ise Degisim=1 girilmelidir. Bu durumda kaşılaştırma;
IF SONRAKI=DEGISIM ise (Yani gün değişmemiş ise)
   IF SAAT=>ACILIS THEN ROLE1=1
ELSE
   ROLE1=0
ENDIF Demek yeterli olacaktır diye düşünüyorum. Çok dallı budaklı bir iş. Yeni sorunlar çıkabilir ama takip edilirse sonu getirilir.

Ete

mikrotronik

#2
ETE bey merhaba,
Yorumlarınız için teşekkür ederim.Sorun belirttiğiniz gibi elektrik kesintilerinde karşımıza çıkıyor.Ancak rolenin açılma ve kapanma zamanları değiştirilebilir olduğu için aynı günde de açılıp kapanması istenilebilir.
Örneğin:
07:45 da kapan- 22:30 da açıl veya
12:20 da kapan -02:10 da açıl veya
07:00 da kapan - 06:00 da açıl gibi...

Aslında yaptığım yazılım şu şekilde;

1.role kapama saati : 17
1.role kapanma dakikası  30

1.role açılma saati : 01
1.role açılma dakikası  20
___________________________________________________
if 1.role kapama saati = saat and 1.role kapanma dakikası=dakika then
x=1
EWRITE 0 , x
endif

if 1.role açılma saati = saat and 1.role açılma dakikası=dakika then
x=0
EWRITE 0 , x
endif

x = EREAD 0
if x=1 then high role1
if x=0 then low role1
__________________________________________________

Bu şekilde 1 sorun karşıma çıkıyor;
Eğer açılış kapanış zamanlarında elektrik kesilmiş ise x değişkeni bit değiştirmeyeceği için role konum değiştirmiyor.

Teşekkürler,

Burak

Bu tür kıyaslamaları saat ve dakika bazında ayrı ayrı yapamazsın ... Saat 01:30 için 90 dakika ifadesini kullanıp kıyaslama yapmak zorundasın aksi halde kod içinden çıkılmaz hale gelecek ..

Ayrıca senin yapmayı istediğin zaman rölesi kodlamasında gün devreden algoritma kullanılmak zorunda ve if döngüleri biraz uzun uzadıya olacak ... İhtiyacıma binayen bu şekilde bir algoritma yazmıştım ve ticari olduğu için paylaşamıyorum ama eline kalemi kağıdı alıp olası tüm şu anki saat ve tarih ve olası bir saat tarih ihtimalleri için bir kondüsyon oluşturman gerekecek ... Ama fikir oluşturması açısından ve senin için güzel bir başlangıç olması açısındanda aşağıdaki olasılık ve ihtimalleri göz önünde bulundurarak kodlamaya başla ..

Haftanın "hangi günü" saat kaçta "başlayıp" kaçta "biteceğini" ayarlardığımız bir alarmımız olsun ..

Bize lazım olan şu anki saat , başlangıç saati , bitiş saati , ve aktif edilmiş alarm günü (p.tesi , salı vs)

    sta=X[1]*60+X[0]  ' Start Saati
    sto=X[3]*60+X[2]  ' Stop Saati
    pre=Q[2]*60+Q[1] ' Şu anki Saat


Şimdide kondüsyonları oluşturalım . Olası durum sayısı benim gözlemleyebildiğim kadarıyla şu şekilde olacak ;

1. Start saati Stop saatinden küçükse ;
2. Start saati Stop saatinden büyük yada eşitse ..

Bunlar üzerine yoğunlaş ..

Burak
Ω Gens Una Sumus Ω

mikrotronik

#4
Burak Bey merhaba,
Yorumlarınız için teşekkür ederim. Rolenin haftanın hangi günlerinde çalışacağını belirleyebiliyorum buraya kadar sorun yok ancak belirttiğiniz başlama ve kapanma zamanlarını nasın şimdiki zamanla kıyaslayacağımı anlayamadım.

Start 07:30 olsun, 450 dk
Stop 02:30 olsun, 150 dk
yada
Start 20:30 olsun, 1200 dk
Stop 05:00 olsun, 300 dk

Şimdiki zamanda  01:10 olsun, 90 dk

1. Start saati Stop saatinden küçükse ; 2.zamanda küçük,
2. Start saati Stop saatinden büyük yada eşitse .." evet küçük,

şimdiki saat kıyaslaması nerede peki ?
Teşekkürler,

Burak

#5
1. kondüsyon için ; diyelim ki start saati stop saatinden küçük ve bir aktif alarm günü içerisindeyiz ...

Bu durumda ;

Şu andaki saat , start saatinden büyük ve eşit ise ve aynı zamanda stop saatinden de küçükse röleyi çek , aksi halde bırak ...

if pre>=sta and pre<sto then    
     rel[tmp]=1
else
     rel[tmp]=0
endif



gibi ...

Alıntı YapStart 07:30 olsun, 450 dk
Stop 02:30 olsun, 150 dk
yada
Start 20:30 olsun, 1200 dk
Stop 05:00 olsun, 300 dk

Şimdiki zamanda  01:10 olsun, 90 dk

Bu arada buradaki çevrimlerin bazıları yanlış ...

20:30 = 1230 dakika
01:10 = 70 dakika

şeklinde olacak .

Burak
Ω Gens Una Sumus Ω

mikrotronik

#6
Burak hocam tekrar merhaba,
Belirttiğiniz algoritma stop saati ,start saatinden büyük olduğu sürece sorunsuz çalışıyor ancak buradaki sıkıntı stop saati start saatinden küçük ise ne yapmalıyız.

Belittiginiz kodu bu şekilde düzenledim,ancak stop saati start saatinden küçük ise role çalışmıyor.

Dim SAAT1X As Word
Dim SAAT2X As Word
Dim SAATX As Word

    SAAT1X = SAAT1 * 60 + DAKIKA1  ' Start Saati  'saat 07:00  = 420
    SAAT2X = SAAT2 * 60 + DAKIKA2  ' Stop Saati   'saat 02:40  = 160
    SAATX  =  SAAT * 60 + DAKIKA   ' Şu anki Saat 'saat 17:35  = 1055


If SAATX >= SAAT1X And SAATX < SAAT2X Then   
  High Role1
Else
  Low Role1
EndIf

Örneğin ;
Rolenin 07:00 ile 02:40 arası çalışacağını varsayalım.Saatimizde 17:52 ,bu kod üzerinde stop zamanı 02:40 olduğu için role çekmiyor.

Çevrimlerde değişiklikler yapmıştım.Son kısmını düzeltmeden yazmışım.

ete

#7
Önceden de söylediğim gibi gün değişimini dikkate almazsanız işin içinden çıkamazsınız.
Önce elimizdeki parametreleri inceleyelim.
Açılış ile Kapanış zamanlarının bir birleri ile ilişkisi aşağıdaki konumlarda olabiliyor.
1. Açılış saati ile kapanış saati aynı ancak dakikaları farklı. Örnek Açılış: 14:20  ve Kapanış 14:45 , gün değişimi yok
2. Açılış Zamanı < Kapanış Zamanı  , Örnek verelim,   Açılış: 10:45   ve Kapanış : 16:20, gün değişimi yok.
3. Açılış Zamanı > Kapanış Zamanı  , Örnek verelim,   Açılış: 21:40  ve  Kapanış : 6:30  , gün değişimi VAR

Zamanı dakika bazına getirmemiz gerekiyor. Elimizde olan bilgiler ve karşılaştırma şekilleri şöyle olmalı,
Açılış Zamanı , Kapanış Zamanı ,Şimdiki Zaman (o andaki zaman bilgisi) Bunlara kısaca ACILIS , KAPANIS ve SIMDI isimlerini vereceğiz.
Açılış ve Kapanış bilgilerini girdikten sonra Gündeğişimi var ise DEGISIM=1 yok ise DEGISIM=0 olarak kayıt altına almalıyız. Bunu anlamak için;
DEGISIM=0
IF ACILIS>KAPANIS THEN DEGISIM=1 şeklinde kayıt almak gerekecek.
Bir örnek verelim bu kısım için;
ACILIS   = 21:40   , (ACILIS   =21*60+40=1300)
KAPANIS= 06:30   , (KAPANIS= 06*60+30= 390)
ACILIS (1300) > KAPANIS (390) olduğu için otomatikman DEGISIM=1 olacaktır.

Karşılaştırmalara geçmeden önce Gece Saat tam 00:00 da DEGISTI isimli değişkenimizi set edeceğiz. Yani gün değişimini belirleyeceğiz. Şimdi karşılaştırmalara geçelim.
Önce Saati okuyacağız. Diyelimki  Şimdi= 14:25  o halde SIMDI=14*60+25=865 olarak bulunacak.
IF DEGISIM=0  THEN  ' (yani gün değişimi söz konusu değil ise
  IF SIMDI>ACILIS AND SIMDI<KAPANIS THEN ROLE=1   'Bu röleyi açma konumu
  IF SIMDI =>KAPANIS THEN    'buda röleyi kapatma konumu
    ROLE=0:DEGISTI=0
  ENDIF
ELSE   'Yani DEGISIM=1 ise
  IF DEGISTI=0 
    ROLE=1  'yani gün değişmemiş ve açılış saatini geçmiş isek (burası biraz tartışılır)
  ELSE   'Yani degisti=1 ise
    IF SIMDI <ACILIS THEN ROLE=1  'Bu röleyi açma konumu
    IF SIMDI=>KAPANIS THEN
      ROLE=0         
      DEGISTI=0
    ENDIF
ENDIF

Bu mantığın çalışacağını düşünüyorum. Henüz bende denemedim ama alarm takibinde deneyeceğim.

ACILIS ve KAPANIS değişkenleri WORD tipinde olmalı. Alınacak kayıtlar gerek açılış ve gerekse kapanış zamanları dakika formatına çevrildikten sonra alınmalı. Kolaylık olur. Yada saat ve Dak olarak kayıt edip okunma anında dakika formatına çevirebilirsiniz.

Ete 

Burak

#8
Bu kodun sadece 1. kondüsyon için çalışacağını ifade etmiştim zaten ..
2. kondüsyon birazcık kafa karıştıran olasılıksal durumlara uğradığı için onları şu şekilde ifade edelim yani start saati stop saatine eşit yada büyük ise ; (bunu saat örnekleri şeklinde verelim)

Start saati = 11:00
Stop saati = 04:00
              Ve
Günlerden P.tesi (Alarm p.tesi aktif olacak şekilde çalışacak)

Olasılık 1 ; 

Saat = 12:00 ise ve aktif bir alarm günü içerisindeysek Röle çekecek .. Yani if pre>=start durumu

Olasılık 2 ;

Eğer günlerden salı ve ptesi aktif bir alarm günü ise pre<stop ise (örneğin saat=02:00 ise)

Bu durumda içinde bulunduğumuz yeni gün içerisinde bir önceki günün aktif bir alarm günü olup olmadığını sorgulamamız gerekiyor .. Çünkü öyle ise röle çekecek değilse bırakacak ...

Burak
Ω Gens Una Sumus Ω

mikrotronik

#9
Burak Bey,
Rolenin her gün istenilen start ve stop saatleri arasında çalışacağını düşünürsek,yeni gün içerisinde bir önceki günde aktif bir alarm olup olmamasını önemi var mı ?
Teşekkürler,

Ete Bey,
Yazdığınız kodlarda DEGISIM=0 kısmı sorunsuz çalışıyor ,DEGISIM=1 den sonra olan kısmı muallakta kalan kısım bende şimdi o kısıma adapte oldum sonucu umarım başarılı olur.

Selamlar,

Burak

Elbette yok o halde işin çok daha kolay ... Bu durumda sadece dediğim kondüsyon kontrollerini yaptırıp otomasyonu sağlıycaksın ...

Burak
Ω Gens Una Sumus Ω

ete

Mikrotronik,

Daha iyi bir algoritma bulabilmek için bu sefer bir günü yuvarlak bir daire olarak kağıda çizdim.
Bu daire üzerinde ortada üstte gün değişim noktası işaretledim. Bu resmi esas alarak muhtelif noktalara Açma-Kapama ve Simdi noktaları belirledim. Buna göre rölenin alması gereken konumları belirledim.
Bu sistem olayı 3 boyutlu düşünmenizi kolaylaştırıyor ve her şeyi daha kolay görüp anlayabiliyorsunuz.
Bu sisteme göre ortaya koyduğum algortme şöyle çıktı;
IF SIMDI>AC THEN
  IF SIMDI>KAPA THEN ROLE=DEGISIM
  IF SIMDI<KAPA AND DEGISIM=0 THEN ROLE=1
ENDIF

IF SIMDI<AC THEN
  IF SIMDI<KAPA THEN ROLE=DEGISIM
  IF SIMDI>KAPA AND DEGISIM=1 THEN ROLE=1
ENDIF

Bu sistemi bir dene bakalım sonuç ne olacak.

Ete

mikrotronik

#12
Ete Bey merhaba,
Yazılım belirttiginiz şekilde şu sorunları veriyor.
1.Kapama zamanı geldiğinde role kapatmıyor.
2.Şimdiki zaman açılıştan küçük olsa da role 1 konumunda kalıyor.Yani start 18:00-stop 02:00, şimdiki 17:00 da iken role 1 konumunda oluyor.
Teşekkürler,

mikrotronik

ETE Bey merhaba,

If SAATX >= SAAT1X Then
  If SAATX > SAAT2X Then Role1 = 0
  If SAATX < SAAT2X And degisim = 0 Then
    Role1 = 1
    Else
    Role1=0
  EndIf
EndIf

Bu kısım stop zamanı start zamanından büyük ise sorunsuz işliyor,ancak diğer kısımda stop zamanı start zamanından küçük ise çalışmıyor.


ete

Çok fazla alternatif var ve her konumu 3 boyutlu olarak insan gözünde canlandıramıyor.
Ne yaparsan yap bir yerden açık veriyorsun. Yine oturup grafikler üzerinden biraz daha çalıştım.
Bu sefer bir daireyi 24'e bölerek alternatifleri inceledim. Sonra hepsini değerlendirerek program komutlarına çevirdim
Çıkan sonuç şöyle,
Gün aşımında kayıt almaya gerek kalmıyor sanırım. Zira Açma Saati > Kapanma Saati mutlaka Gün Aşımı var demek oluyor.
Saatın anlık değeride (SIMDI) karar almanı sağlayabiliyor.
IF ac>KAPA THEN GA=1   '.....GA=GUN_ASIMI

IF SIMDI <= AC THEN
  IF SIMDI = KAPA THEN ROLE=0
  IF SIMDI < KAPA THEN ROLE=GA
  IF SIMDI > KAPA AND GA=1 THEN ROLE=0
ENDIF

IF SIMDI => AC THEN
  IF SIMDI=KAPA THEN ROLE=0
  IF SIMDI > KAPA AND GA=0 THEN ROLE=0
  IF SIMDI < KAPA AND GA=0 THEN ROLE=1
ENDIF

Bunları kendi kodlarına çevirip bir dene bakalım bu sefer ne çıkacak.

Ete

Powered by EzPortal