Bu komut, Vemg hızı ile kapının kapatılmasını sağlar. Kapı boyu + aralık toleransı kadar bir mesafe sonra engel algılanmasa bile motor duracaktır.
Bu işlemde hata üretilmez. İşlem bittikten sonra sürücü durumu DRIVE_CLOSED olacak ve busy = 0 yapılacaktır.
// SABIT HIZLA KAPATMA: Vemg hizi ile kapi kapatma komutu ////////////////////////////////////////////////////////////////////////// case 10: drive.command = 0; rampset = Vemg; // set degeri Vemg olacak! current_threshold = Tmc; // durma zorlanma degeri: kapanma limit algılama yükü // burada engel algılama yapmıyorum.. PID.overloaded = 0; // zorlanma algilama sayacını da OCcounter = 0; // sifirla /* Position Breakpoint Ayari: * Kapi boyu + olcum toleransi kadar bir mesafe hareket hakki var. * Tetiklenen encodertick flag hareketi sonlandıracak * Bu kadar mesafe boyunca donus olmussa kapı sonuna gelinmiş olmalı * motor duracak, hata da verilebilirdi.. */ ClearEncoderCounter(); bppos.ul = dt.ul + APERTURE_TOLERANCE; bppos.l = (signed long *) ( -1 * bppos.l); SetREVBreakpoint(); // sabit rampali kalkis gorevini baslat: dir = 1; // yon: REV drive.subindex = 11; drive.status = 1100; // sabit rampa adimi alt gorevi break; // Hareket sonu mesafesine erişim ya da zorlanma limiti bekleme adımı case 11: // ZORLANMA ALGILANDI: if (PID.overloaded) { PID.nocontrol = 1; // PID kontrol kapalı olmalı! // Demek zorlanma oldu.. Bayrağı sıfırla... PID.overloaded = 0; OCcounter = 0; drive.status = 12; } // kapı boyu kadar hareket edildiyse motor durmalı: if (encodertick) { // TODO: burada bir hata kodu uretebilirim ama // onu handle edecek mekanizma da olmali... // bunun yerine "bu kadar hareket ettiysem kapı kapanmıştır artık" // deyip bitiriyorum.. drive.status = 1000; drive.subindex = 12; } // bu esnada kullanıcı durdurma komutu verdiyse: if (drive.command == 1000) { drive.command = 0; drive.status = 1000; drive.subindex = 12; } break; // kapı sonu, hareket bitti: case 12: // 90ms. daha kapiyi kapama yonunde zorla ve bitir: if (PID.controlcounter > 8) { PID.controlcounter = 0; speedref = 0; MDC = 0; MOTOR_BRK_L; drive.itemstatus = DRIVE_CLOSED; // kapi KAPALI drive.status = 0; drive.busy = 0; // position sayaçlarini sifirla: ClearEncoderCounter(); position.ul = 0; } break;