Projekt BBPA - Portálový jeřáb December 12, 2007 Martin Bereznanin Daniel Piši Jan Kubizňák login xberez01 xpisid00 xkubiz01 ID 74888 78335 78550 1
1 Zadání Na modelu portálového jeřábu vytvořte aplikaci, která řeší problém hanojských věží. Jeřáb musí umět pracovat v automatickém i manuálním režimu. 2 Technologický popis úlohy 2.1 Pohyb po ose X Pojezd jeřábu v ose X je zajištěn stejnosměrným motorem M1. Odměřování polohy pro osu X zajišťuje analogový potenciometrem Pot, jehož výstupní hodnota je v rozsahu max. 0 V 10 V. Odměřování polohy v ose X zajišťují diskrétní snímače umístěny v pěti polohách. Jsou označeny jako K1 až K5. Jsou-li logické výstupy rovny 1, tak je vozík jeřábu přítomen. 2.2 Pohyb po ose Y Odvíjení lana (pro osu Y) je zajištěno krokovým motorem M2. Pro tento nelze zjistit v jakém smyslu je navinuto lano na bubnu navijáku. 2.3 Indikace pohybu a polohy magnetu Magnet slouží pro přesouvání břemen. Je upevněn na konci lana. Nejvyšší horní poloha magnetu je snímána čidlem K Up umístěným na vozíku jeřábu. Indikace dosednutí 2
magnetu na podložku nebo břemeno je zajištěno faktem, že kladka, přes kterou vede lano k magnetu, je po obvodu ozubená. Při pohybu kladky (pohybuje li se magnet v ose Y) zuby střídavě spínají a rozpínají spínač K Down. Pro zjištění, zda magnet dosedl na podložku, nebo břemeno, lze využít toho, že při dosednutí se v laně sníží napětí, ozubená kladka se tím přestane otáčet a snímač K Down nebude vydávat pulzy. 2.4 Bezpečnostní tlačítka Pomocí tlačítka START (zelené tlačítko na panelu jeřábu) se zapíná jeřáb. Je přivedeno napětí na snímače, motory a řídící desku. Naopak tlačítko STOP (červené tlačítko na panelu jeřábu) způsobí zastavení motorů a řídící deska a snímače se odpojí od napájení. 3 Řešení 3.1 Hlavní smyčka programu Hlavní smyčka slouží především k zabezpečení krajních poloh a regulaci navíjení lanka v závislosti na horizontálním pohybu magnetu. Tato smyčka je volána 100x za sekundu. 3.1.1 Přepínání režimů Přepínání mezi jednotlivými režimy je zajišťeno dle proměnné SysState, která může nabývat hodnot 0, 1, 2. switch SysState of case 0; InitControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc); StateText= Inicializace ; case 1; ManualControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc); StateText= Manualni rezim ; case 2; AutomaticControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc, MagOn_loc); HanoiTowerAlgorithm(); StateText= Automaticky rezim ; 3.1.2 Zjištění pohybu magnetu Zjištění, zda se magnet pohybuje, je nutné při překládání jednotlivých plechovek. Proměnná MagnetStopTime je po každém průchodu smyčkou v případě, že se hodnota čidla 3
K Down nezměnila, inkrementována. Pokud se hodnota změnila, tak je MagnetStop- Time vynulováno. Pokud hodnota MagnetStopTime dosáhne hodnoty 100 (= 1 sekunda), tak je zřejmé, že se magnet nehýbe. if (K_Down_prev = K_Down) if (MagnetStopTime < 65535) MagnetStopTime = MagnetStopTime + 1; end MagnetStopTime = 0; ImpCnt = ImpCnt + 1; if (not Model_On) switch SysState of case 0; InitControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc); StateText= Inicializace ; case 1; ManualControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc); StateText= Manualni rezim ; case 2; AutomaticControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc, MagOn_loc); HanoiTowerAlgorithm(); StateText= Automaticky rezim ; MagnetStopTime = 0; if (MagnetStopTime < 100) MagnetMove = true; MagnetMove = false; 3.1.3 Ošetření krajních poloh Následující kód zajišťuje zastavení motorů při dosažení horizontálních krajních poloh. if ((DCDir_loc and (POT>MaxRight)) or (not DCDir_loc and (POT<MaxLeft))) DCSpd_loc=0; StepperSpd_loc=0; 4
Při sepnutí čidla K Up se za předpokladu, že se magnet stále pohybuje nahoru, se motor navíjející lanko zastaví. if (K_Up and (StepperDir_loc = StepperUp) ) StepperSpd_loc = 0; Zároveň dochází ke sjetí magnetu o 4 pulzy níž v případě, že je sepnuto čidlo K Up. if (HeightCor) if (DCDir_loc xor StepperUp) StepperSpd_loc = StepperSpd_loc + 800; StepperSpd_loc = StepperSpd_loc - 800; if (ImpCnt > 4) HeightCor = false; 3.1.4 Regulace výšky magnetu Rychlost motoru, který navíjí lanko, je přepočítávána na základě rychlosti motoru zajišťujícího horizontální pohyb. Experimentálně jsme zjistili necitlivosti obou motorů a konstantu poměru jejich rychlostí. if (DCSpd_loc > 650) if(dcspd_loc > DCLimitSpd) DCSpd_loc = DCLimitSpd; StepperEn_loc=true; StepperDir_loc = (not DCDir_loc) xor StepperUp; StepperSpd_loc = (DCSpd_loc-650)*1.07 + 300; 3.2 Inicializace Inicializace je výchozí režim po spuštění programu. 3.2.1 Zjištění směru navíjení Zjištění směru je prvním krokem inicializace. Po spuštění se magnet začne pohybovat (zatím nevíme jakým směrem) a narazí buď na horní čidlo (K Up), nebo na podložku. 5
Po nárazu na podložku je proměnná MagnetMove v hlavní smyčce změněna na nulu. Změní se směr pohybu navíjení magnetu. switch state of case 0; (* Magnet nahoru *) if (K_Up or (not MagnetMove)) StepperUp = K_Up; stp_en = false; state=1; stp_spd = StepperInitSpd; stp_dir = true; stp_en = true; 3.2.2 Nastavení bezpečné výšky magnetu Z předchozího kroku je znám směr navíjení lanka, proto můžeme nastavit bezpečnou výšku magnetu. Pokud je magnet momentálně na podložce, tak vyjede na zarážku K Up. Z ní dojde k poklesu o 6 pulzů (= bezpečná poloha) nezávisle na počátečním stavu (zda byl dole nebo nahoře). 3.2.3 Sejmutí analogových hodnot snímačů polohy a dorazů Následně magnet najede na levou krajní polohu a uloží si analogovou hodnotu. Poté jede zpět ke svému pravému dorazu a při sepnutí čidel K2, K3 a K4 opět uloží jejich hodnotu. Ty jsou poté využity při řešení úlohy hanojských věží. Nakonec dojede na pravý doraz, kde uloží analogový údaj o poloze čidla K5. Toto je jeho inicializační poloha. Tímto proces inicializace končí a je možné pokračovat v manuálním nebo automatickém režimu. 3.3 Manuální režim 3.3.1 Grafické rozhraní a zobrazení na internetu přes http server Kontrolka v levém horním rohu indikuje chod, zda program běží (zelenou barvou). Textový popisek vedle ní zobrazuje současný režim - inicializace, manuální a automatický režim. Pod ním jsou zobrazeny kontrolky indikující sepnutí snímačů K1 - K5, snímač analogové horizontální polohy a snímač pohybu magnetu. Posuvníky úplně napravo lze měnit počáteční a cílovou polohu pro úlohu Hanojských věží. V manuálním režimu lze používat tlačítka se šipkami k pohybu magnetu a tlačítko v pravém horním rohu k jeho spínání. Grafické rozhraní je možné zobrazit také prostřednictvím webové stránky. Má však jistá omezení. Slouží pouze k zobrazovaní aktuální pozice magnetu. Řídící úkony jako je pohyb či spínání magnetu v manuálním režimu, či přepínání režimů nebo počáteční 6
a cílové polohy umožněno z důvodu bezpečnosti není. Zároveň je stránka obnovována každou 1 s, což se projeví nesouvislými změnami na indikátoru analogové horizontální polohy. 3.3.2 Zdrojový kód Manuální režim zajišťuje přiřazení odpovídajících rychlostí a směrů po stisknutí jednotlivých tlačítek. procedure ManualControl( var dc_spd : real; var dc_dir : boolean; var stp_spd : real; var stp_dir : boolean; var stp_en : boolean ); begin if (ButtonLeft or ButtonRight) dc_spd=dcspd; dc_spd=0; dc_dir = ButtonRight; if (ButtonDown or ButtonUp) stp_spd=stepperspd; stp_en=true; 7
stp_spd=0; stp_dir = ButtonUp; end_procedure; 3.4 Automatický režim 3.4.1 Přesun plechovek Po dosažení žádané pozice se magnet zastaví a dle proměnné CanAction dojde k nabrání nebo položení plechovky. if ((dc_dir and (POT >= xthd[xposw])) or (not dc_dir and (POT <= xthd[xposw]))) xposu = xposw; dc_spd = 0; if (xposu = xposw) switch CanAction of case 1; CanGrab(stp_spd, stp_dir, stp_en, mag_on); case 2; CanPut(stp_spd, stp_dir, stp_en, mag_on); 3.4.2 Nabrání a položení plechovky Po dosažení polohy plechovky je magnet spuštěn dolů. Když je detekováno, že se magnet již nehýbe, tak dojde k sepnutí magnetu a k nabrání plechovky. Následně je plechovka opět vytažena do horní polohy. Obdobně funguje i pokládání plechovky. 3.4.3 Dynamická změna rychlosti Při rozjezdu dochází k postupnému navyšování rychlosti. Při najíždění do polohy finální se tato rychlost naopak snižuje. Maximálně jde dosáhnout rychlosti 2200. if (xposw > xposu) dc_dir = true; dc_spd = 1.5*abs(POT-xThd[xPosW])+1000; a = 2*abs(POT-xThd[xPosU])+1000; 8
if (a < dc_spd) dc_spd = a; if (2200 < dc_spd) dc_spd = 2200; 3.4.4 Algoritmus Hanojských věží Použitý algoritmus je založen na efektivním binárním TH algoritmu. Kromě rychlosti výpočtu nabízí i nízkou paměťová náročnost. Prováděnou akci umožňuje vypočítat pouze na základě čísla kroku. Kromě zmíněných výhod má původní algoritmus i svá úskalí. Nepříjemným faktem je nemožnost volby výchozí pozice a závislost cílové pozice na počtu disků. Tento nedostatek lze řešit vhodnou modifikací vypočtené akce. Tu lze realizovat využitím vypočtených pozic jako indexů vhodně předpřipraveného pole. Tento přístup nám umožnil elegantně rozšířit původní algoritmus o volbu výchozí a cílové polohy nezávisle na počtu disků. (* Po vykonani vsech potrebnych kroku system prechazi do manualniho rezimu *) if (MoveNum >= bitshl(1, DiscCnt)) AutoRgmOn = false; ManualRgmOn = true; SysState = 1; return; (* Naplneni transformacniho pole *) if (bitand(disccnt, 1) = 1) Pegs[0] = SrcPeg; (* Vychozi pozice *) Pegs[1] = 3 - SrcPeg - DstPeg; (* Odkladaci pozice *) Pegs[2] = DstPeg; (* Cilova pozice *) Pegs[0] = SrcPeg; Pegs[1] = DstPeg; Pegs[2] = 3 - SrcPeg - DstPeg; (* Binarni TH algoritmus *) f = bitand(movenum, MoveNum-1) % 3; t = (bitor(movenum, MoveNum-1) + 1) % 3; 9
(* Transformace vystupu *) f = Pegs[f]; t = Pegs[t]; 4 Závěr Díky tomuto projektu jsme měli možnost se seznámit s programovým prostředím ControlWeb a problematikou Hanojských věží. Výsledkem naší usilovné práce je program, který je schopen řešit tuto úlohu automaticky. Stejně tak má uživatel možnost ovládat jeřáb manuálně. Vše je zabezpečeno tak, aby nedošlo k žádnému rizikovému stavu. 10