GenelArıza false ise demekIF "InStart" AND "InStop" AND NOT "GenelAriza" AND "AcMotorPozisyonlama_DB".HomeDone THEN
"AnaStart" := TRUE;
buradaki AND NOT ne demek acaba

GenelArıza false ise demekIF "InStart" AND "InStop" AND NOT "GenelAriza" AND "AcMotorPozisyonlama_DB".HomeDone THEN
"AnaStart" := TRUE;
buradaki AND NOT ne demek acaba
Vay be zamanında ne kadar basit ufak tefek şeylere takılmışızMerhaba arkadaslar,
Ladder diagrama hakimim fakat SCL ile program yazmak istiyorum.
Resimdeki gibi bir programı SCL ile nasıl yazabilirim? Bir kaç deneme yaptım fakat bir türlü başaramadım. Yardımcı olursanız sevinirim.
Hocam bu filtreyi laddder da yapacak şekilde açmanız mümkün mü...?PLC tarafından okunan analog değer bilgileri çoğu zaman etraftaki gürültülerden dolayı ne kadar topraklama yapsakta stabil olmayabilir, işte bu değerleri stabil hale getirmek için yazılımla yapılan alçak geçiren filtre örneği:
Tarafımca denenmiştir, örnekleme zamanı (OB35 gibi) ve smooth time ile oynayarak, baya güzel sabitliyor oynayan analog değerleri,
Kod:FUNCTION_BLOCK FB_LowPassFilter VAR_INPUT rActualValue : REAL ; // measured value rSamplingTime : REAL ; // Sampling time ms rSmoothingTime : REAL ; // Smooth time constant ms END_VAR VAR_OUTPUT rFilteredActualValue : REAL ; END_VAR VAR rActualValue_Old : REAL ; rFilteredValue_Old : REAL ; rt_alpha : REAL ; END_VAR rt_alpha := 2.0 * rSmoothingTime / rSamplingTime ; rFilteredActualValue := ( rFilteredValue_Old * (rt_alpha-1.0) + rActualValue + rActualValue_Old ) / ( 1.0 + rt_alpha ) ; rActualValue_Old := rActualValue ; rFilteredValue_Old := rFilteredActualValue ; END_FUNCTION_BLOCK
Daha fazla bilgi: http://en.wikipedia.org/wiki/Low-pass_filter
Onu gördüm hocamda mantığını tam anlayamadım.Analog kartın özelliklerinden 4 plc cycle için filtre koyabiliyorsun
Ekli dosyayı görüntüle 102495

FUNCTION_BLOCK FB_LowPassFilter
VAR_INPUT
rActualValue : REAL ; // measured value
rSamplingTime : REAL ; // Sampling time ms
rSmoothingTime : REAL ; // Smooth time constant ms
END_VAR
VAR_OUTPUT
rFilteredActualValue : REAL ;
END_VAR
VAR
rActualValue_Old : REAL ;
rFilteredValue_Old : REAL ;
rt_alpha : REAL ;
END_VAR
rt_alpha := 2.0 * rSmoothingTime / rSamplingTime ;
rFilteredActualValue := ( rFilteredValue_Old * (rt_alpha-1.0)
+ rActualValue
+ rActualValue_Old
) / ( 1.0 + rt_alpha ) ;
rActualValue_Old := rActualValue ;
rFilteredValue_Old := rFilteredActualValue ;
END_FUNCTION_BLOCK
END_IMPLEMENTATION
Merhaba, bloku denerken resimdeki hatayı veriyor sizce sebebi nedirSCL ile kucuk bir katkida bizden olsun, SFC1 i kullanarak gercek zaman saatini okuyup integer olarak sonuclari alma..
kod asagidaki gibi..
---------------------------------------------------------------------
----------------------------------Kod:FUNCTION_BLOCK FB9 Title = 'RTC' VAR_TEMP TarihBCD:DATE_AND_TIME; Tarih AT TarihBCD:STRUCT Yil:BYTE; Ay:BYTE; Gun:BYTE; Saat:BYTE; Dakika:BYTE; Saniye:BYTE; Milisaniye:BYTE; END_STRUCT; SFC1Donus:INT; END_VAR VAR_OUTPUT A_Yil:INT; A_Ay:INT; A_Gun:INT; A_Saat:INT; A_Dakika:INT; A_saniye:INT; A_m_saniye:INT; END_VAR SFC1Donus:=SFC1(CDT:=TarihBCD); A_Yil:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Yil)); A_Ay:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Ay)); A_Gun:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Gun)); A_Saat:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Saat)); A_Dakika:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Dakika)); A_saniye:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Saniye)); A_m_saniye:=WORD_TO_INT(BYTE_TO_WORD(Tarih.Milisaniye)); END_FUNCTION_BLOCK
daha sonra bu blok ob icerisinden cagrilarak kullanilabilir.
Kod:CALL "RTC" , "RTC_DB" A_Yil :=MW100 A_Ay :=MW102 A_Gun :=MW104 A_Saat :=MW106 A_Dakika :=MW108 A_saniye :=MW110 A_m_saniye:=MW112
--------------------
kolay gelsin..