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;