1

Téma: Kontrola shody prvků při načítání součástek z knihoven

Dobrý den,
napadl m? ob?asný problémek, který by možná šlo intern? v systému elegantn? vy?ešit. Popíši jednoduše - mám v layoutu otev?enou n?jakou desku - t?eba POKUS.PCB, kde velikost padu (t?eba 4) je C 1.524. Na desku pot?ebuji umístit sou?ástku, kterou mám v jiné knihovn? (MOJE.PCB), ve které je pad 4 nastaven na jinou hodnotu. Pokud sou?ástku vložím, Formica tiše použije rozm?ry padu (a p?edpokládám, že nejen rozm?ry padu), tak, jak je definováno v POKUS.PCB. Myslím si, že p?i vkládání by m?la být kontrolována "rozm?rová stejnost prvk?" na  obou PCB a v p?ípad? nesouladu nahlášen problém.
PS. Pochopiteln? takovýchto "neshod" nenapo?ítám za rok ani na jedné ruce, ale ob?as se vyskytne, obzvláš? pokud používám nejen své knihovny ... .

2

Re: Kontrola shody prvků při načítání součástek z knihoven

Tohohle problému si jsem již nějaký ten rok dobře vědom.  V jeho plném rozsahu však asi půjde nejen o detekci konfliktů rozměrů, ale především o jejich vyřešení.  Před několika měsíci jsem o tom korespondoval v souvislosti s řazením tabulky rozměrů pájecích bodů v testovací verzi (možná se pokusím vyhledat, co jsem tehdy napsal, a použít znovu tady), ale nedospělo se k jasnému závěru.

Dovolím si připomenout původní koncepci, dnes skoro 15 let starou:  (a) V desce mají pájecí body (číslované) logické typy; jim odpovídající rozměry jsou popsány v tabulce.  (b) V případě změny technologie lze celou tabulku vyměnit, a knihovny přesto zůstanou zachovány.  (c) Uživateli jsou logické typy presentovány pod jejich čísly.  (d) Tato čísla se užijí i pro uživatelské definování clonek a vrtáků.  Na tomhle základě lze zvažovat, co by se dalo nyní dělat.

Při zachování současného formátu souborů, tj. v rámci současné verze 4.x, se mi jeví ještě tak nejlepší takovéto řešení:

1) Knihovny budou čteny do paměti (a pouzdra z nich zobrazována v náhledovém okně) včetně rozměrů padů (které dosud jsou při čtení knihovních souborů zcela ignorovány).

2) Při ručním nebo automatickém (během čtení *.PNL souboru) převzetí pouzdra z knihovny se zkontrolují rozměry padů.  V případě konfliktu se pady čteného pouzdra přečíslují a pod výsledným číslem se přidají jejich rozměry do tabulky rozměrů.  Teď jde o to, jaké číslo zvolit, tzn. kterou položku v tabulce přepsat.  K tomu se nabízejí položky (tj. typy padů) dvou druhů -- jednak prázdné (s nulovými rozměry), jednak nepoužité na desce.
2a) Je možné začít od prázdných a nepoužitých typů, po jejich vyčerpání pokračovat nepoužitými.  Přitom by se začínalo např. od nejvyšších čísel typů.
2b) Zcela jiná možnost je začít od nepoužitých (nestarat se, zda jsou prázdné) a snažit se zachovat číslo.  Důsledkem by bylo např. to, že při čtení *.PNL souboru odkazujícího na pouzdra z jediné knihovny by se de facto převzalo číslování typů z této knihovny (jelikož na počátku čtení je deska prázdná a nepoužité jsou všechny typy).

3) V průběhu času mě také napadla ještě jedna možnost, jak si tabulku dodatečně zorganizovat, a sice vnutit pořadí čtením jiné tabulky rozměrů.  Fungovalo by to docela jednoduše:  Tak, jako nyní lze do desky přečíst tabulku rozměrů z externího souboru, novým příkazem by se přečetlo jen jejich číslování.  Pokud by se v tabulce na desce vyskytovaly typy stejných rozměrů jako v té externí, vnutila by se jim čísla těch externích.  Deska jako taková by se samozřejmě nezměnila, jen by pady na ní mohly přitom dostat jiná čísla typů.

Vrátím-li se k výchozí koncepci, lze nyní začít trochu uvažovat o širších důsledcích:
* Při řešení dle 2a dvě desky se zcela stejnými pouzdry mohou mít dvě různá číslování typů padů následkem (čistě jen) toho, že v příslušných *.PNL souborech se pouzdra objevila v různém pořadí.  Totéž ale může teoreticky nastat i při řešení dle 2b, budou-li užity nejméně dvě knihovny.
* Největší potíž bych asi viděl v bodu (c).  Obávám se, že dělat automatické zásahy do číslování padů může mít na uživatele podobný dopad, jako kdyby se ve městě přečíslovaly tramvaje, či ještě spíše jako kdyby se přečíslovávaly každé ráno.
* Další problém nastává při uživatelském definování nástrojů (clonek a vrtáků), protože to se do konfiguračních souborů příslušných zařízení ukládá pod čísly logických typů.  Není sporu, že toto je nebezpečná věc, která může způsobit zkažené matrice či desky.  Praktická otázka (kterou neumím dobře posoudit) spíše je, jak často se dnes předefinování ještě užívá.  Clonkové fotoplottery už asi jsou historie, půjde tu zřejmě především o vrtačky.
* Co spojové čáry?  Z hlediska symetrie by podobné mechanismy asi měly být zavedeny i pro ně, ale v praxi jistě zdaleka nejsou tak potřebné.
* Dosavadní e-mailová  diskuse vedla víceméně k závěru, že nejlepší možná bude do logiky kolem tabulek rozměrů raději moc nezasahovat, protože na současný stav si každý jednotlivý uživatel v podstatě už nějak zvykl.  Na druhé straně by však úspěšné řešení asi dovolilo kvalitativně lepší využití cizích uživatelských knihoven, které je doposud omezeno zejména odlišnými tabulkami rozměrů.

Omlouvám se, že jsem se tak obšírně rozepsal.  Jde však o podstatný a docela komplikovaný problém, který je třeba důsledně promyslet do všech podrobností před každým pokusem o jeho programátorské řešení.  Uvidíme, jaké názory se teď objeví v diskusi.

3

Re: Kontrola shody prvků při načítání součástek z knihoven

Osobn? se p?ikláním k variant? 1 a 2x, tedy pady na?ítat do pam?ti, kontrolovat a v p?ípad? kolize VAROVAT a NECHAT na uživateli, co s tím provede - tzn. nechal bych pouze funkci kontrolní.


Pochopiteln? systém JEN VAROVAT m?že p?inést problém p?i vytvá?ení DPS importem sou?ástek p?es *.PNL (v?tší množství varování) v p?ípad? v?tšího množství atyp? - což se však dá obejít - p?i p?íprav? nové desky použiji poslední dps  s nejaktuáln?jší verzí mých úprav pad?, p?ejmenuji ji, smažu všechny sou?ástky a na?tu nové PNL.

IvoL

4

Re: Kontrola shody prvků při načítání součástek z knihoven

No, k tomu systému "pouze varovat" bych asi měl trošku výhrad jakožto programátor: pracnost se mi nezdá úměrná přírůstku užitné hodnoty. 

Jde o to, že v každém případě se musejí načíst a ukládat tabulky rozměrů všech knihovních souborů.  To asi představuje více programování, než manipulace s tabulkou rozměrů.  Na druhé straně dnes uživatel nemá žádný nástroj, kterým by mohl snadno dělat takové transakce s tabulkou rozměrů, jako je odsunutí jednoho typu padu do jiné položky tabulky (ačkoliv na toto existuje příkaz) a zároveň přečíslování typu padu v desce (ačkoliv to pomocí množinových operací také jde).  Tím méně je může dělat hromadně, tj. pro více typů najednou.  Přitom, obecně řečeno, právě tohle je postup odstraňování kolizí, jakmile byly detekovány.  (Kromě toho si nejsem jist, zda mohu kolizi lehce zjistit před začátkem čtení souboru, a v jeho průběhu už deska byla změněna.)  V ideálním případě by mohl být užit systém, kdy po detekci kolize následuje dotaz, a zásahy do tabulky rozměrů až po kladné odpovědi.

Ještě bych teď počkal, zda do diskuse nepřispěje někdo z těch uživatelů, kteří mají tabulku padů zcela zaplněnou.

5

Re: Kontrola shody prvků při načítání součástek z knihoven

Logické typy považuji za věc zapeklitou až skoro nebezpečnou. Vytváří ve mně neustálý strach, že se při natažení součástky z knihovny nebo dokonce z jiného souboru něco pokazí, čeho si v první chvíli ani nevšimnu. Naštěstí, tento strach budí velkou opatrnost, díky které dojde k problému jen zcela výjimečně. Ale popsaný problém mi komplikuje práci. Asi největší nebezpečí vidím v samotných knihovnách. Mách jich totiž víc a pokud v jedné z nich vytvořím nový pad, musím tuto změnu přenést i do ostatních. A běda, pokud to zapomenu udělat. Pokud pak někdy později vytvářím další nový pad, ale v jiné knihovně, použiji nejbližší volné číslo této knihovny, které je ale už ve skutečnosti obsazeno. Navíc i pokud nezapomenu aktualizovat všechny ostatní knihovny, čeká na mě ještě jedno riziko. Při natažení nové tabulky se mi automaticky přetahuje i "Basic Grid", takže při přetahování např. z metrické do palcové knihovny může vzniknout zásadní problém, pokud zapomenu "Basic Grid" ručně opravit (i když mě na změnu program naštěstí upozorňuje).

Já osobně bych ze tří navrhovaných variant řešení zvolil variantu čtvtou. Ta by se nejvíce podobala variantě 3) ale byla by poněkud radikálnější (mnohým uživatelům a možná i autorovi asi vstanou vlasy na hlavě):

4) Na začátku by každá deska měla ve své tabulce definovány jen nejzákladnější pady, tedy průchody, případně nějaký speciální upevňovací otvor apaod.. Nic jiného. Teprve při natahování součástek na desku z knihoven (jiných desek) by se do této tabulky přidávaly další pady podle potřeby. ??íslování by klidně mohlo probíhat pouze vzestupně tak, jak se jednotlivé součástky budou umísovat (samozřejmě by šlo i zachovávat původní čísla v případě, že jsou ještě volná). Pokud by program našel již použitou definici padu, využil by ji bez ohledu na číslování (různá čísla jednoho typu padu u dvou různých knihoven by se sjednotila). Pokusím se shrnout vlastnosti takového řešení:

a) Dojde k přečíslování padů
- obava, že to vytvoří jakýsi optický zmatek, je v z mého pohledu zcela lichá, protože si čísla padů při jejich množství stejně nepamatuju. Teda kromě čísel 0 a 1, které používám na průchody, ale průchodové pady by stejně musely být definovány jako první, ještě před natažením součástek, protože jsou potřeba vždy, takže jejich čísla by zůstala zachována.
- stejně jako pan Horský se domnívám, že pevný clonkový systém je už dávno minulostí. Já používám pro generování formát RS274X, který si clonky přiřazuje sám, takže nemůže vzniknout problém.
- nevidím problém ani ve vrtačce. Používám driver Excellon, který nehledí na číslování padů ale na jejich skutečné rozměry. Žádné další následné předefinování jsem v životě nepoužil, protože tyto dodatečné (většinou ruční) operace jsou podle mého jen zdrojem problémů.

b) Zásadní výhodu vidím v tom, že metoda odstraňuje problém možné redefinice padů při nesouladu tabulek. Metoda problém sama řeší, aniž by uživatel něco tušil.

c) A vidím ještě jednu novou výhodu. Od počátku používání SMD součástek narážím na zásadní problém. Rozměrů padů dle doporučení výrobců je snad nekonečné množství. Pokud bych se měl striktně držet doporučených rozměrů, měl bych tabulku už dávno plnou. Takže vždy hledám raději něco podobného, nebo dokonce i použiji na misto jednoho pady dva, abych tabulku hned nezaplnil. Popsaná metoda by mi dovolovala celkové množství typů padů razatně rozšířit. Pokud bych totiž v jedné knihovně zaplnil tabulku, založil bych si klidně novou knihovnu, kde bych začal zase od začátku. Takže mohu mít klidně mraky knihoven s rozdílně definovanými tabulkami, takže téměř neomezené celkové množství typů padů. Na desku by se pak natahovaly jen použité pady (256 typů pro jednu desku mi určitě stačí). Výhoda rozšíření se samozřejmě netýká jen SMD padů, ale i klasických, kterých není také nikdy dost - vrtáky jsou ostupňovány po 0,1 mm, navíc může mít pad různé měďěné okolí v závislosti na technologii nebo použití padu (upevňovací otvor bez mědi nebo naopak se širokou mědí)

d) Nemusím se moc trápit s tím, zda pad u nově vytvářené součástky již mám definovaný nebo ne (hledání stejného padu může být docela zdlouhavé). Klidně si ho nadefinuji znovu, aniž bych tím omezil celkový počet typů na vytvářené desce - stejné pady se totiž sloučí pod jediné nové číslo.


A ještě mám jeden návrh ohledně padůí. Souvisí to s tím, co jsem již napsal : s množstvím různých tupů SMD padů. Škoda je, že se tento počet ještě násobí 2 x, protože musím pro obě strany definovat dva různé pady. To je velká škoda, protože obě definice jsou téměř stejné, jen vrstvy jsou zrcadlené. Původní záměr pana Horského měnit velikost padu nahoře a dole v závislosti na technologii se bohužel nedá využít ze dvou důvodů:
i) při pájení vlnou je nutné rožšířit pady oproti pájení pastou pouze směrem od středu pouzdra. Naopak vnitřní strana padů se většinou může zkrátit. V každém případě to vede nejen ke změně rozměru padu, ale také k jeho posunutí. Navíc některá pouzdra, třeba běžná SO s roztečí 1,27 mm, by navíc měla mít na jedné straně (kde vlna končí) širší poslední pady pro odtržení vlny. Zkrátka - jiná technologie vede automaticky k jiné definici pouzdra, takže měnit rozměry padu při otáčení nemá smysl.
ii) navíc spodní strana nemusí být vždy pájena vlnou, někdy je pasta na obou stranách.

Takže bych narhoval - pokud má pad nastaven "Opposite Type" sám na sebe, zrcadlit při přesunu SMD padu na opačnou stranu vždy všechny vrstvy. Případ, kdy bych chtěl u součástky při jejím zrcadlení ponechat pady na původní straně (tedy na opačné, než zbytek součástky), si opravdu nedovedu ani teoreticky představit (v nejhorším by se tento nadmíru podivný případ dal řešit právě jiným oposite typem) . Ono se to vlastně týká i klasických padů - tam by zrcadlení také mělo automatický probíhat. Pokud by náhodou nějaký pad byl definován asymetricky tak asi není důvod, proč se součástkou nepřetáčet i tento pad, jinak se součástka ve skutečnosti změní. Možnost jiného  "Opposite Type" bych ponechal beze změny.

Tímto řešením by se jednak  rozšířil prostor pro další definice padů (a to výrazně, protože SMD plošek je ve srovnání s klasickými podstatně více typů), jednak by definovaní nového padu bylo rychlejší.

6

Re: Kontrola shody prvků při načítání součástek z knihoven

Děkuji za podrobný příspěvek s hodnotnými náměty, které ostatně vystačí ještě na celé další téma.  V tomto vlákně bych se však rád omezil na takové zásahy, které by šlo udělat v rámci stávajícího formátu *.PCB souborů. 

Možná bych měl zdůraznit, že body 1, 2 a 3 v mém minulém příspěvku nijak nemají povahu vzájemně se vylučujících variant (pouze 2a je alternativou k 2b); bod prostě 1 je nutným předpokladem pro bod 2 a k oběma lze navíc případně přidat bod 3.  (Zde bych ještě snad dovysvětlil, že bod 3 znamená doplnit příkaz, kterým uživatel může kdykoliv, tj. nezávisle na přebírání součástek z knihovny, připodobnit řazení tabulky pájecích bodů libovolnému jím zvolenému souboru.)  Z toho hlediska je návrh pana Dubeckého -- chápu-li jej správně -- alternativou k mému bodu 2.

stefan.dubecky napsal:

4) Na začátku by každá deska měla ve své tabulce definovány jen nejzákladnější pady, tedy průchody, případně nějaký speciální upevňovací otvor apaod.. Nic jiného. Teprve při natahování součástek na desku z knihoven (jiných desek) by se do této tabulky přidávaly další pady podle potřeby. ??íslování by klidně mohlo probíhat pouze vzestupně tak, jak se jednotlivé součástky budou umísovat (samozřejmě by šlo i zachovávat původní čísla v případě, že jsou ještě volná). Pokud by program našel již použitou definici padu, využil by ji bez ohledu na číslování (různá čísla jednoho typu padu u dvou různých knihoven by se sjednotila).

Když si to zkusím nějak interpretovat, algoritmicky bych zde oproti bodu 2 viděl hlavně tyto rozdíly:
* Určité posice v tabulce by byly zafixovány, takže by je čtení z knihovny nemohlo přepsat, ani kdyby se pájecí body těchto typů na desce nevyskytovaly.  (Pan Dubecký zmiňuje typy 0 a 1; mohly by to být třeba 0 až 9, které mají tu vlastnost, že se dají z tabulky vybírat klávesovými zkratkami.)
* Po konfliktu při čtení padu z knihovny by se prohledávala tabulka rozměrů (na desce), zda se v ní pad stejných rozměrů již nevyskytuje pod jiným číslem typu.  Rozdíl však je spíše důsledkem opomenutí či nedomyšlenosti z mé strany -- asi by se to muselo dělat v každém případě, jinak by se při čtení téhož padu (dokonce i se stejným číslem!) ze dvou různých knihoven mohl do tabulky dostal dvakrát.
* Je-li nutno rozměry přidat do tabulky, hledala by se volná posice od nejnižších čísel (takže by se tabulka vlastně budovala až při čtení knihovny).  Předpokládáme-li však, že čísla typů z knihovny budou pokud možno zachována, vlastně se dostáváme zpět k bodu 2b.

Naopak pouze z hlediska algoritmů pro čtení padů z knihovny nelze tak snadno zahrnout předpoklad, že se začíná s téměř prázdnou knihovnou.  Algoritmy ošetřující konflikty totiž musejí fungovat v každém stádiu návrhu, tedy i s libovolnou podobou tabulky rozměrů.

Pokusím-li se shrnout základní společné vlastnosti všech diskutovaných přístupů, vychází mi:
* Uživatel by ztratil dosavadní záruky, že pájecí bod, který si nadefinoval, najde vždy pod stejným číslem typu.
* Oproti tomu by však měl zaručeno, že rozměry pájecího bodu se budou přenášet spolu s pouzdrem, v němž je užit (až do případného vyčerpání posic v tabulce rozměrů na desce).

Sám bych zde asi zdůraznil jen potřebu najít takové algoritmy, aby se změny v číslování, které jsou pro ošetření konfliktů nevyhnutelné, uživateli jevily co nejmenší.

7

Re: Kontrola shody prvků při načítání součástek z knihoven

Připojuji další náměty k tomuto tématu vzhledem k tomu, že jsem se u právě dokončené desky setkal s diskutovaným konfliktem padů stejného čísla ale jiných rozměrů, což mě opět poněkud vyděsilo.
Zabývám se teď myšlenkou, zda jako další možnost definování pinů součástky neumožnit přímou definici rozměru padu, bez vazby na logický typ. Jde mi sazmozřejmě hlavně o SMD součástky vzhledem k množství jejich typů. Tato možnost by měla následujíc vlastnosti:

1. Pady součástky by měly fixní, neměnitelnou velikost. Ostatně u SMD není k nějakých následným změnám důvod, pokud použiji předpis výrobce. Velikost padu SMD není závislá na použité technologii DPS, ale pouze na technologii pájení. Pro pastu i vlnu mám již nyní odlišně definované součástky - jinak to bohužel nejde. Ale zase taková hrůza to není, protože vlnou toho stejně nelze moc pájet, a vzhledem k postupující miniaturizaci součástek a přechodu na bezolovnaté pájení toho bude nadále čím dál tím méně.

2. Na pady by nefunguvaly množinové operace. To považuji za velikou výhodu, protože ze zkušenosti mohu jednoznačně říci, že množinové operace tohoto typu nadělají v součástce více škody, než užitku. Nejhorší je něchtěná změna typu padu, které si ani nevšimnu (stalo se mi právě nyní). Daleko lepší a bezpečnější metoda změny čehokoliv v součástce je provést to uvnitř (při editaci součástky) v knihovně, novou součástku poté položit vedle desky, vstoupit do její editace a provést Replace All s příslušně nastavenými přepínači. Tím se provede aktualizace součástek daného typu. A alespoň vím co dělám.

3. Každou další součástkou by se nezvyšoval počet logických padů.

4. Zjednoduší se mi definování nových součástek. Zatímco nyní na základě předpisu výrobce složitě vyhledávám nejbližší existující pad z Formiky, mohl bych rovnou definovat přesně požadovaný rozměr padu. Ono s těmi stejnými pady u různých součástek je to vůbec problematické. Překvapivě stejná velikost plošky nemusí nutně znamenat stejný typ padu. Důvodem jsou požadavky na velikost otvorů šablony pro pájecí pastu, které nezávisejí pouze na samostné velikosti padu, ale také na vzájemné rozteči padů.