DE8916116U1 - Einrichtung zur Neubeschichtung von stereolithographischen Schichten - Google Patents
Einrichtung zur Neubeschichtung von stereolithographischen SchichtenInfo
- Publication number
- DE8916116U1 DE8916116U1 DE8916116U DE8916116U DE8916116U1 DE 8916116 U1 DE8916116 U1 DE 8916116U1 DE 8916116 U DE8916116 U DE 8916116U DE 8916116 U DE8916116 U DE 8916116U DE 8916116 U1 DE8916116 U1 DE 8916116U1
- Authority
- DE
- Germany
- Prior art keywords
- level
- layer
- smoothing member
- over
- previously formed
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Lifetime
Links
- 238000000576 coating method Methods 0.000 title claims description 24
- 239000011248 coating agent Substances 0.000 title claims description 23
- 239000012530 fluid Substances 0.000 claims description 106
- 239000007788 liquid Substances 0.000 claims description 97
- 230000003287 optical effect Effects 0.000 claims description 34
- 230000005855 radiation Effects 0.000 claims description 31
- 238000010408 sweeping Methods 0.000 claims description 19
- 239000000463 material Substances 0.000 claims description 17
- 230000004044 response Effects 0.000 claims description 15
- 230000000638 stimulation Effects 0.000 claims description 10
- 238000006073 displacement reaction Methods 0.000 claims description 7
- 230000005670 electromagnetic radiation Effects 0.000 claims description 5
- 238000009499 grossing Methods 0.000 claims 64
- 239000004566 building material Substances 0.000 claims 24
- 230000002195 synergetic effect Effects 0.000 claims 9
- 230000001464 adherent effect Effects 0.000 claims 6
- 238000010894 electron beam technology Methods 0.000 claims 2
- 239000003795 chemical substances by application Substances 0.000 claims 1
- 239000004035 construction material Substances 0.000 claims 1
- 238000002360 preparation method Methods 0.000 claims 1
- 238000007790 scraping Methods 0.000 claims 1
- 238000007711 solidification Methods 0.000 claims 1
- 230000008023 solidification Effects 0.000 claims 1
- 239000011347 resin Substances 0.000 description 150
- 229920005989 resin Polymers 0.000 description 150
- 238000000034 method Methods 0.000 description 125
- 230000008569 process Effects 0.000 description 25
- 241001417527 Pempheridae Species 0.000 description 24
- 230000008859 change Effects 0.000 description 22
- 238000004519 manufacturing process Methods 0.000 description 10
- 238000004088 simulation Methods 0.000 description 8
- 238000012360 testing method Methods 0.000 description 8
- 244000309464 bull Species 0.000 description 7
- 239000004033 plastic Substances 0.000 description 7
- 229920003023 plastic Polymers 0.000 description 7
- 238000003756 stirring Methods 0.000 description 7
- 238000007654 immersion Methods 0.000 description 6
- 230000002159 abnormal effect Effects 0.000 description 4
- 239000000047 product Substances 0.000 description 4
- 238000000926 separation method Methods 0.000 description 4
- 239000013598 vector Substances 0.000 description 4
- 230000001133 acceleration Effects 0.000 description 3
- 238000013461 design Methods 0.000 description 3
- 238000001514 detection method Methods 0.000 description 3
- 230000000694 effects Effects 0.000 description 3
- 238000005259 measurement Methods 0.000 description 3
- 230000001343 mnemonic effect Effects 0.000 description 3
- 229920000642 polymer Polymers 0.000 description 3
- 239000007787 solid Substances 0.000 description 3
- 230000008901 benefit Effects 0.000 description 2
- 230000015572 biosynthetic process Effects 0.000 description 2
- 230000007547 defect Effects 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 230000005484 gravity Effects 0.000 description 2
- 238000010438 heat treatment Methods 0.000 description 2
- CPBQJMYROZQQJC-UHFFFAOYSA-N helium neon Chemical compound [He].[Ne] CPBQJMYROZQQJC-UHFFFAOYSA-N 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000000306 recurrent effect Effects 0.000 description 2
- 230000009467 reduction Effects 0.000 description 2
- 239000000126 substance Substances 0.000 description 2
- 101000701876 Homo sapiens Serpin A9 Proteins 0.000 description 1
- XUIMIQQOPSSXEZ-UHFFFAOYSA-N Silicon Chemical compound [Si] XUIMIQQOPSSXEZ-UHFFFAOYSA-N 0.000 description 1
- BQCADISMDOOEFD-UHFFFAOYSA-N Silver Chemical compound [Ag] BQCADISMDOOEFD-UHFFFAOYSA-N 0.000 description 1
- 239000004809 Teflon Substances 0.000 description 1
- 229920006362 Teflon® Polymers 0.000 description 1
- 238000010521 absorption reaction Methods 0.000 description 1
- 229920006397 acrylic thermoplastic Polymers 0.000 description 1
- 230000002411 adverse Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- UIZLQMLDSWKZGC-UHFFFAOYSA-N cadmium helium Chemical compound [He].[Cd] UIZLQMLDSWKZGC-UHFFFAOYSA-N 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000000295 complement effect Effects 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 238000004132 cross linking Methods 0.000 description 1
- 230000007423 decrease Effects 0.000 description 1
- 230000001627 detrimental effect Effects 0.000 description 1
- 238000007598 dipping method Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000001704 evaporation Methods 0.000 description 1
- 230000008020 evaporation Effects 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 239000012467 final product Substances 0.000 description 1
- 238000007667 floating Methods 0.000 description 1
- PCHJSUWPFVWCPO-UHFFFAOYSA-N gold Chemical compound [Au] PCHJSUWPFVWCPO-UHFFFAOYSA-N 0.000 description 1
- 229910052737 gold Inorganic materials 0.000 description 1
- 239000010931 gold Substances 0.000 description 1
- 230000003760 hair shine Effects 0.000 description 1
- 102000050111 human SERPINA9 Human genes 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 238000003754 machining Methods 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 230000007257 malfunction Effects 0.000 description 1
- 230000005499 meniscus Effects 0.000 description 1
- 238000000465 moulding Methods 0.000 description 1
- 230000000149 penetrating effect Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 229920003229 poly(methyl methacrylate) Polymers 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 230000002441 reversible effect Effects 0.000 description 1
- 238000005096 rolling process Methods 0.000 description 1
- 229910052710 silicon Inorganic materials 0.000 description 1
- 239000010703 silicon Substances 0.000 description 1
- 229910052709 silver Inorganic materials 0.000 description 1
- 239000004332 silver Substances 0.000 description 1
- 238000009987 spinning Methods 0.000 description 1
- ISXSCDLOGDJUNJ-UHFFFAOYSA-N tert-butyl prop-2-enoate Chemical compound CC(C)(C)OC(=O)C=C ISXSCDLOGDJUNJ-UHFFFAOYSA-N 0.000 description 1
- 238000007514 turning Methods 0.000 description 1
- 230000037303 wrinkles Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G05—CONTROLLING; REGULATING
- G05D—SYSTEMS FOR CONTROLLING OR REGULATING NON-ELECTRIC VARIABLES
- G05D9/00—Level control, e.g. controlling quantity of material stored in vessel
- G05D9/12—Level control, e.g. controlling quantity of material stored in vessel characterised by the use of electric means
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B29—WORKING OF PLASTICS; WORKING OF SUBSTANCES IN A PLASTIC STATE IN GENERAL
- B29C—SHAPING OR JOINING OF PLASTICS; SHAPING OF MATERIAL IN A PLASTIC STATE, NOT OTHERWISE PROVIDED FOR; AFTER-TREATMENT OF THE SHAPED PRODUCTS, e.g. REPAIRING
- B29C41/00—Shaping by coating a mould, core or other substrate, i.e. by depositing material and stripping-off the shaped article; Apparatus therefor
- B29C41/02—Shaping by coating a mould, core or other substrate, i.e. by depositing material and stripping-off the shaped article; Apparatus therefor for making articles of definite length, i.e. discrete articles
- B29C41/12—Spreading-out the material on a substrate, e.g. on the surface of a liquid
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B29—WORKING OF PLASTICS; WORKING OF SUBSTANCES IN A PLASTIC STATE IN GENERAL
- B29C—SHAPING OR JOINING OF PLASTICS; SHAPING OF MATERIAL IN A PLASTIC STATE, NOT OTHERWISE PROVIDED FOR; AFTER-TREATMENT OF THE SHAPED PRODUCTS, e.g. REPAIRING
- B29C64/00—Additive manufacturing, i.e. manufacturing of three-dimensional [3D] objects by additive deposition, additive agglomeration or additive layering, e.g. by 3D printing, stereolithography or selective laser sintering
- B29C64/10—Processes of additive manufacturing
- B29C64/106—Processes of additive manufacturing using only liquids or viscous materials, e.g. depositing a continuous bead of viscous material
- B29C64/124—Processes of additive manufacturing using only liquids or viscous materials, e.g. depositing a continuous bead of viscous material using layers of liquid which are selectively solidified
- B29C64/129—Processes of additive manufacturing using only liquids or viscous materials, e.g. depositing a continuous bead of viscous material using layers of liquid which are selectively solidified characterised by the energy source therefor, e.g. by global irradiation combined with a mask
- B29C64/135—Processes of additive manufacturing using only liquids or viscous materials, e.g. depositing a continuous bead of viscous material using layers of liquid which are selectively solidified characterised by the energy source therefor, e.g. by global irradiation combined with a mask the energy source being concentrated, e.g. scanning lasers or focused light sources
-
- G—PHYSICS
- G01—MEASURING; TESTING
- G01F—MEASURING VOLUME, VOLUME FLOW, MASS FLOW OR LIQUID LEVEL; METERING BY VOLUME
- G01F23/00—Indicating or measuring liquid level or level of fluent solid material, e.g. indicating in terms of volume or indicating by means of an alarm
- G01F23/22—Indicating or measuring liquid level or level of fluent solid material, e.g. indicating in terms of volume or indicating by means of an alarm by measuring physical variables, other than linear dimensions, pressure or weight, dependent on the level to be measured, e.g. by difference of heat transfer of steam or water
- G01F23/28—Indicating or measuring liquid level or level of fluent solid material, e.g. indicating in terms of volume or indicating by means of an alarm by measuring physical variables, other than linear dimensions, pressure or weight, dependent on the level to be measured, e.g. by difference of heat transfer of steam or water by measuring the variations of parameters of electromagnetic or acoustic waves applied directly to the liquid or fluent solid material
- G01F23/284—Electromagnetic waves
- G01F23/292—Light, e.g. infrared or ultraviolet
- G01F23/2921—Light, e.g. infrared or ultraviolet for discrete levels
-
- G—PHYSICS
- G01—MEASURING; TESTING
- G01F—MEASURING VOLUME, VOLUME FLOW, MASS FLOW OR LIQUID LEVEL; METERING BY VOLUME
- G01F23/00—Indicating or measuring liquid level or level of fluent solid material, e.g. indicating in terms of volume or indicating by means of an alarm
- G01F23/30—Indicating or measuring liquid level or level of fluent solid material, e.g. indicating in terms of volume or indicating by means of an alarm by floats
- G01F23/32—Indicating or measuring liquid level or level of fluent solid material, e.g. indicating in terms of volume or indicating by means of an alarm by floats using rotatable arms or other pivotable transmission elements
- G01F23/36—Indicating or measuring liquid level or level of fluent solid material, e.g. indicating in terms of volume or indicating by means of an alarm by floats using rotatable arms or other pivotable transmission elements using electrically actuated indicating means
- G01F23/366—Indicating or measuring liquid level or level of fluent solid material, e.g. indicating in terms of volume or indicating by means of an alarm by floats using rotatable arms or other pivotable transmission elements using electrically actuated indicating means using optoelectrically actuated indicating means
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B29—WORKING OF PLASTICS; WORKING OF SUBSTANCES IN A PLASTIC STATE IN GENERAL
- B29K—INDEXING SCHEME ASSOCIATED WITH SUBCLASSES B29B, B29C OR B29D, RELATING TO MOULDING MATERIALS OR TO MATERIALS FOR MOULDS, REINFORCEMENTS, FILLERS OR PREFORMED PARTS, e.g. INSERTS
- B29K2995/00—Properties of moulding materials, reinforcements, fillers, preformed parts or moulds
- B29K2995/0037—Other properties
- B29K2995/0072—Roughness, e.g. anti-slip
- B29K2995/0073—Roughness, e.g. anti-slip smooth
Landscapes
- Physics & Mathematics (AREA)
- Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Fluid Mechanics (AREA)
- Mechanical Engineering (AREA)
- Optics & Photonics (AREA)
- Chemical & Material Sciences (AREA)
- Materials Engineering (AREA)
- Electromagnetism (AREA)
- Thermal Sciences (AREA)
- Manufacturing & Machinery (AREA)
- Automation & Control Theory (AREA)
- Non-Silver Salt Photosensitive Materials And Non-Silver Salt Photography (AREA)
- Physical Vapour Deposition (AREA)
- Heating, Cooling, Or Curing Plastics Or The Like In General (AREA)
- Manufacturing Optical Record Carriers (AREA)
Description
20. September 1993
3D Systems, Inc.
3D Systems, Inc.
D 17337GBM F/La/gi
Unterlagen, die der Eintragung des Gebrauchsmusters
zugrunde zu legen sind
zugrunde zu legen sind
Neubeschichten von stereolithographischen Schichten
Diese Erfindung bezieht sich allgemein auf ein verbessertes stereolithographisches
System für die Produktion von dreidimensionalen Gegenständen.
In den letzten Jahren sind "stereolithographische" Systeme, wie z.B. die,
die in dem US-Patent Nr. 4,575,330, betitelt 'APPARATUS FOR PRO-DUCTION OF THREE-DIMENSIONAL OBJECTS BY STEREOLITHOGRAPHY"
beschrieben sind, in Gebrauch gekommen. Grundsätzlich ist Stereolithographie ein Verfahren zum automatischen Aufbauen komplexer
dreidimensionaler Kunststoffteile durch aufeinanderfolgendes Aushärten bzw. Vernetzen einer Vielzahl von dünnen Schichten einer polymerisierbaren
Flüssigkeit aufeinander, bis alle der dünnen Schichten zusammenverbunden sind, um einen ganzen Teil zu bilden. Jede polymerisierte
Schicht ist im wesentlichen ein dünner Querschnitt des gewünschten dreidimensionalen Gegenstandes. Bei dieser Technologie werden die
Teile buchstäblich in einer Wanne von flüssigem Kunststoff aufwachsen gelassen. Dieses Herstellungsverfahren ist extrem leistungsfähig für ein
schnelles Reduzieren von Entwurfsideen zu einer physischen Form und zum Herstellen von Prototypen. Außerdem können komplexe Teile
schnell ohne maschinelle Bearbeitung gemacht werden. Da das System
einen Computer verwendet, um den Querschnitt der Muster zu erzeugen,
kann das System leicht mit CAD/CAM-Systemen verbunden werden.
Derzeit bevorzugte Polymere werden durch ultraviolettes (UV) Licht
ausgehärtet und ihr Aushärten ist schnell genug, um sie zu praktischen Modellbaumaterialien zu machen. Die Flüssigkeit, die nicht polymerisiert
wird, wenn ein Teil gemacht wird, bleibt verwendbar und verbleibt in der Wanne, wenn aufeinanderfolgende Teile gemacht werden. Ein
Ultraviolet-Laser erzeugt einen kleinen intensiven UV-Lichtpunkt, der
&iacgr;&ogr; über die Flüssigkeitsoberfläche mit einem Galvanometerspiegel-X-Y-Scanner
in einem vorbestimmten Muster bewegt wird.. Der Scanner wird durch computer-erzeugte Vektoren oder ähnliches angetrieben. Präzise
komplexe Muster können schnell mit dieser Technik produziert werden.
Das Stereolithographiesystem umfaßt einen Laserscanner, eine Wanne
oder einen Behälter zum Enthalten der polymerisierbaren Flüssigkeit, und eine Gegenstandtrageplattform, die in der Lage, gehoben und in den
Tank abgesenkt zu werden, und einen Steuercomputer. Das System ist programmiert, um automatisch ein Kunststoffteil durch Bilden eines
dünnen Querschnittes zu einem Zeitpunkt und durch Aufbauen des gewünschten dreidimensionalen Gegenstandes Schicht um Schicht herzustellen.
Bei typischen Stereolithographieverfahren wird eine dünne Schicht von
viskoser aushärtbarer Kunststoffflüssigkeit auf eine Oberfläche aufgebracht,
die eine zuvor ausgehärtete Schicht sein kann, und, nachdem eine ausreichende
Zeit für die dünne Schicht von polymerisierbarer Flüssigkeit verstrichen ist, damit sie sich durch die Schwerkraft glättet, ein computer-gesteuerter
Strahl wird über die dünne Flüssigkeitsschicht bewegt, um ausreichend die Kunststoffflüssigkeit auszuhärten, so daß darauffolgende
Schichten darauf aufgebracht werden können. Die Wartöperiode, damit
die dünne Schicht sich ausgleicht, variiert abhängig von mehreren Faktoren, wie z.B. die Viskosität der polymerisierbaren Flüssigkeit, die Schichtdicke,
und ähnlichem.
Typischerweise wird die ausgehärtete Schicht, die von einer vertikal
beweglichen Gegenstandstrageplattform getragen wird, unter die Oberfläche
eines Bades der viskosen polymerisierbaren Flüssigkeit um eine Distanz eingetaucht, die gleich der gewünschten Schichtdicke ist, so daß
&iacgr;&ogr; der flüssige Kunststoff über die ausgehärtete Schicht fließen kann. Wenn
sich die Oberfläche ausgleicht, ist die Schicht fertig zum Aushärten durch Bestrahlung.
Für weitere Details der Stereolithographie wird sich auf das US-Patent
is Nr. 4,575,330 und die folgenden anhängigen US-Patentanmeldungen
bezogen, die hierin durch Bezug in ihrer Gesamtheit eingebunden werden,
einschließlich beigefügten Anhängen oder darin durch Bezug eingebundenem Material, wie es vollständig bekanntgemacht wird:
US-Patentanmeldung Seriennr. 339,246, eingereicht am 17. Aprü 1989,
betitelt "STEREOLITHOGRAPHIC CURL REDUCTION";
US-Patentanmeldung Seriennr. 331,664, eingereicht am 31. März 1989, betitelt "METHOD AND APPARATUS FOR PRODUCTION OF HIGH RESOLLHTION THREE-DIMENSIONAL OBJECTS BY STEREOLJTHO-GRAPHY";
US-Patentanmeldung Seriennr. 331,664, eingereicht am 31. März 1989, betitelt "METHOD AND APPARATUS FOR PRODUCTION OF HIGH RESOLLHTION THREE-DIMENSIONAL OBJECTS BY STEREOLJTHO-GRAPHY";
US-Patentanmeldung Seriennr. 183,015, eingereicht am 18. April 1988,
betitelt "METHOD AND APPARATUS FOR PRODUCTION OF THREE-DIMENSIONAL OBJECTS BY STEREOLITHOGRAPHY";
US-Patentanmeldung Seriennr. 182,801, eingereicht am 18. April 1988,
betitelt "METHOD AND APPARATUS FOR PRODUCTION OF THREE-DIMENSIONAL OBJECTS BY STEREOLITHOGRAPHY";
US-Patentanmeldung Seriennr. 268,429, eingereicht am 8. November 1988, betitelt "METHOD FOR CURING PARTIALLY POLYMERIZED PARTS";
US-Patentanmeldung Seriennr. 268,429, eingereicht am 8. November 1988, betitelt "METHOD FOR CURING PARTIALLY POLYMERIZED PARTS";
US-Patentanmeldung Seriennr. 268,428, eingereicht am 8. November 1988,
betitelt "METHOD FOR FINISHING PARTIALLY POLYMERIZED PARTS";
US-Patentanmeldung Seriennr. 268,408, eingereicht am 8. November 1988,
betitelt "METHOD FOR DRAINING PARTIALLY POLYMERIZED PARTS";
US-Patentanmeldung Seriennr. 268,816, eingereicht am 8. November 1988,
betitelt 'APPARATUS AND METHOD FOR PROFILING A BEAM";
US-Patentanmeldung Seriennr. 268,907, eingereicht am 8. November 1988,
betitelt APPARATUS AND METHOD FOR CORRECTING FOR DRIFT IN PRODUCTION OF OBJECTS BY STEREOLITHOGRAPHY";
US-Patentanmeldung Seriennr. 268,837, eingereicht am 8. November 1988, betitelt APPARATUS AND METHOD FOR CALIBRATING AND NORMALIZING A STEREOLITHOGRAPHIC APPARATUS";
US-Patentanmeldung Seriennr. 249,399, eingereicht am 26. September 1988, betitelt "METHOD AND APPARATUS FOR PRODUCTION OF THREE-DIMENSIONAL OBJECTS BY STEREOLITHOGRAPHY";
US-Patentanmeldung Seriennr. 268,837, eingereicht am 8. November 1988, betitelt APPARATUS AND METHOD FOR CALIBRATING AND NORMALIZING A STEREOLITHOGRAPHIC APPARATUS";
US-Patentanmeldung Seriennr. 249,399, eingereicht am 26. September 1988, betitelt "METHOD AND APPARATUS FOR PRODUCTION OF THREE-DIMENSIONAL OBJECTS BY STEREOLITHOGRAPHY";
US-Patentanmeldung Seriennr. 365,444, eingereicht am 12. Juni 1989,
betitled "INTEGRATED STEREOLITHOGRAPHY"; und
US-Patentanmeldung Seriennr. 265,039, eingereicht am 31. Oktober 1988, betitelt APPARATUS AND METHOD FOR MEASURING AND CONTROLLING THE LEVEL OF A FLUID".
US-Patentanmeldung Seriennr. 265,039, eingereicht am 31. Oktober 1988, betitelt APPARATUS AND METHOD FOR MEASURING AND CONTROLLING THE LEVEL OF A FLUID".
Was benötigt wurde und hierzuvor nicht verfügbar war," ist eine Einrichtung,,
um die Zykluszeit zum Bilden jeder Schicht von Kunststoff zu reduzieren. Die vorliegende Erfindung befriedigt dieses Verlangen.
Diese Erfindung bezieht sich auch allgemein auf eine Einrichtung
zum Steuern des Niveaus eines Fluides, und insbesondere auf eine Einrichtung zum Messen und Steuern des Niveaus
des Arbeitsfluides in einer Stereolithographieeinrichtung.
&iacgr;&ogr; Viele wissenschaftliche Experimente und industrielle Anwendungen erfordern
die Messung des Niveaus eines Fluides. Der ,Begriff "Niveau eines Fluides", wie er hier verwendet wird, bedeutet die Höhe der Oberfläche
eines Fluides in einem Gravitationsfeld oder einem anderen beschleunigten Bezugsrahmen. Diese Oberfläche kann die Oberseite oder auch die
Unterseite des Fluides sein (wenn das Fluid auf einem anderen Fluid fließt). Das Fluid kann der Ozean, das Benzin in dem Tank eines
Automobils oder eine flüssige Chemiekalie in einer Teströhre sein, unter
vielen Möglichkeiten. Verschiedene Einrichtungen sind über die Jahre
eingeführt worden, um Niveaus von solchen Fluiden zu messen, einschließlich
Eintauchstäben, Linien, die auf die Seite von Pfählen gemalt
wurden, Markierungen auf der Seite von Teströhren, Schwimmer und
ähnliches. Ein Bedürfnis existiert jedoch für eine Einrichtung, die sehr präzise und zuverlässig das Niveau eines Fluides messen kann Eine
Einrichtung dieser Art ist insbesondere bei industriellen Anwendungen
nützlich und kann mit einer Niveauaufrechterhaltungseinrichtung wie z.B. einem Eintauchkolben, einem Diaphragma oder Steuerungen für eine
Pumpe gekoppelt sein, um das Niveau des Fluides bei jeder gewünschten Höhe zu halten.
Insbesondere erfordern stereolithographische Maschinen eine sehr präzise
Steuerung des Niveaus eines Arbeitsfluides. Das US-Patent Nr. 4,575,330 für Charles W. Hull, bereits zuvor erwähnt, offenbart eine Einrichtung
zur Produktion von dreidimensionalen Gegenständen durch Stereolithographie. Das in der stereolithographischen Einrichtung verwendete Arbeitsfluid
ist gewöhnlicherweise eine Photopolymerflüssigkeit, die bei der Anwendung von ultraviolettem (UV) Licht aushärtbar ist. Wie in dem
US-Patent Nr. 4,575,330 bemerkt ist, muß das Niveau der Arbeitsflüssigkeit in dem bevorzugten Ausführungsbeispiel bei einem konstanten
&iacgr;&ogr; Niveau gehalten werden, so daß der Strahl des UV-Lichtes scharf im
Fokus auf einer festen Ebene bleiben wird.
Cr
Die Gesamtintensität und das Intensitätsprofil ("Strahlprofil") des Strahles
des UV-Lichtes an der Oberfläche des flüssigen Photopolymers wird in Zusammenwirkung mit anderen Faktoren (wie z.B. die Charakteristiken
des flüssigen Polymers und die Länge der Zeit, die der Strahl in einem einzelnen Lichtpunkt bleibt), die Tiefe und das Profil des Photopolymers
bestimmen, das dadurch ausgehärtet oder polymerisiert wird, das es dem
Strahl ausgesetzt wird. Das Strahlprofil wird mit dem Niveau des flüssigen Photopolymers variieren, da der Strahl fokussiert ist, um ein bekanntes
Profil bei einem vorbestimmten Niveau des flüssigen Photopolymers zu haben. Wenn das flüssige Photopolymer ein Niveau unterschiedlich
von dem vorbestimmten hat, wird die Differenz in dem Strahlprofil die Breite des ausgehärteten Photopolymers und seine Tiefe ändern weg von
der geplanten Tiefe und Breite.
Weiterhin, wenn das Niveau des flüssigen Photopolymers höher ist als
das vorbestimmte Niveau, kann die Tiefe des ausgehärteten Photopolymers nicht ausreichend sein, um die zuvor ausgehärtete Schicht zu
erreichen und mit ihr zusammenzuhaften, mit nachteiligen Konsequenzen
für die strukturelle Integrität des Gegenstandes, der gebildet wird. Wenn
der Pegel niedriger ist, dann wird die neue Schicht dünner als geplant
sein, was nachteilig für die Genauigkeit der Reproduktion des Gegenstandes
ist.
Das Niveau des flüssigen Photopolymers muß aufrechterhalten werden
trotz dem Schrumpfen, das durch Aushärten des flüssigen Photopolymers,
Erhitzen, Verdampfen und ähnlichem verursacht wird. Bei früheren Versionen von stereolithographischen Einrichtungen wurde dieses Niveau
&iacgr;&ogr; durch Bereitstellen eines Überlaufkanales aufrecht erhalten. Das Niveau
des flüssigen Photopolymers stieg bis und leicht über (wegen der Oberflächenspannung)
den Überlaufkanal. Ein Überlaufkanal steuert jedoch nicht das Niveau des flüssigen Photopolymers mit ausreichender Präzision,
um eine feinere Auflösung von Teilen zu ermöglichen, die durch eine
stereolithographische Einrichtung gemacht werden. Demgemäß existiert ein Bedürfnis nach einer präziseren Einrichtung zum Messen des Niveaus
eines Fluides.
Kurz und in allgemeinen Begriffen, die vorliegende Erfindung stellt ein
neues und verbessertes Stereolithographiesystem zum Erzeugen eines
dreidimensionalen Gegenstandes bereit durch Bilden aufeinanderfolgender dünne Querschnittsplättchen dieses Gegenstandes an der Fläche einer
polymerisierbaren Flüssigkeit, die in Antwort auf eine geeignete Bestrahlungsstimulierung
ausgehärtet wird. Die vorliegende Erfindung ist insbesondere auf ein verbessertes Stereolithographie -system
zum Reduzieren der Zykluszeit für jede Schicht, die durch dieses Verfahren
gebildet wird, gerichtet.
In Übereinstimmung mit der vorliegenden Erfindung wird zuerst eine
Schicht von polymerisierbarer Flüssigkeit auf einer Oberfläche auf einer
Gegenstandtrageplattfonn aufgebracht. Überschüssige polymerisierbare
Flüssigkeit wird von der Schicht abgestrichen durch Ziehen einer Klinge über die Oberfläche der Schicht, um eine glatte Schicht der gewünschten
Dicke bereitzustellen. Ein Aushärtungsmedium, wie z.B. Bestrahlung,
wird auf die obere oder Arbeitsoberfläche der geglätteten Schicht in einem vorausgewählten Muster gerichtet, um dadurch die Schicht ausreichend
auszuhärten, so daß darauffolgende Schichten aufgebracht und ausgehärtet werden können auf die gleiche Weise, um den gewünschten
dreidimensionalen Gegenstand zu formen.
&iacgr;&ogr; f
Bei einem derzeit bevorzugten Ausführungsbeispieljst eine Gegenstandstrageplattform,
mit einer Oberfläche, auf der die Schichten aufgebracht werden, bereitgestellt und angepaßt, um in einem Bad der polymerisierbaren
Flüssigkeit in einer Wanne oder in einem Behälter erhöht oder erniedrigt zu werden. Die Plattform wird in das Bad abgesenkt, so daß
eine Oberfläche darauf, die die zuletzt ausgehärtete Schicht sein kann,
unter der oberen Oberfläche des polymerisierbaren Flüssigkeitsbades ist,
um eine Distanz, die im allgemeinen größer als die gewünschte Dicke
der Schicht ist. Die Plattform wird dann angehoben, so daß die viskose
polymerisierbare Flüssigkeit auf der Oberfläche über der oberen Oberfläche des Bades ist. Ein sich horizontal bewegendes Abstreifmesser
streift überflüssige polymerisierbare Flüssigkeit ab, so daß eine flüssige Schicht von Polymer der gewünschten Dicke gebildet wird. Die Plattform
wird dann abgesenkt, so daß die obere Oberfläche der geglätteten Schicht der polymerisierten Flüssigkeit im wesentlichen auf dem gleichen
Niveau wie das Bad ist. Aushärtende Strahlung wird dann auf die geglättete Schicht in einem graphischen Muster darauf gerichtet, um die
dünne Flüssigkeitsschicht auszuhärten, so daß eine oder mehr aufeinanderfolgende
Schichten der polymerisierbaren Rüssigkeit darauf aufgebracht werden können. Die Gegenstandtrageplattform mit der teilweise ausge-
härteten festen Schicht darauf wird dann weiter abgesenkt, weg von der
Oberfläche des Bades, so daß die polymerisierbare Flüssigkeit auf die feste Schicht fließen kann und der Zyklus wiederholt werden kann.
Der Prozeß setzt sich fort mit der Bildung einer Vielzahl aufeinanderfolgend
gebildeter Schichten, wobei diese Schichten zusammen verbunden werden, bis der gewünschte dreidimensionale Gegenstand gebildet
worden ist. Das Endprodukt der Stereolithographie muß eine ausreichende Festigkeit für die darauffolgende Handhabung haben. Gewöhnlicherweise
wird dem Gegenstand eine letzte Aushärtung r nach dem Formen gegeben.
Sorgfalt sollte während der Verfahren ausgeübt werden, um zu gewährleisten,
daß das Niveau von polymensierbarer Flüssigkeit in dem Bad bei einem konstanten Niveau gehalten wird, insbesondere, wenn die ausgeglichene
Schicht von polymerisierbarer Flüssigkeit in das Bad abgesenkt und durch Strahlung ausgehärtet wird, weil die Flüssigkeit in dem Bad im
wesentlichen die Grenzen von ausgeglichenen Schichten von Flüssigkeit bildet. In einem gegenwärtig bevorzugten Ausführungsbeispiel wird das
Badniveau auf eine geeignete Weise erfaßt, ein Niveau wird mit dem
gewünschten Niveau verglichen und in Antwort auf irgendeinen Unterschied darin wird ein Kolben oder ein Eintauchkolben in dem Bad
gehoben oder in das Bad gesenkt, um das Niveau an dem gewünschten Einstellpukt zu steuern.
Der dreidimensionale Gegenstand wird auf einer horizontalen Schicht bei
einem Durchgang gebildet durch Bewegen eines Strahles, wie z.B. ultraviolettem Licht von einem Helium-Cadmium-Laser, über die Oberfläche
des photon-aushärtbaren Harzes, wobei er die Flüssigkeit verfestigt,
wo er sie trifft. Absorption in dem Harz hindert das Laserlicht daran,
tief einzudringen und erlaubt, daß eine dünne Schicht gebildet wird.
Die vorliegende Erfindung stellt auch eine neue und verbesserte Einrichtung
zum Messen des Niveaus eines Fluides bereit, die eine Einrichtung zum Erzeugen eines Strahles von elektromagnetischer Strahlung
und einen Sensor aufweist, der ein elektrisches Signal in Antwort auf
Änderungen in der Position des elektromagnetischen Strahles, der auf
den Sensor auftrifft, variiert. Der Strahlsensor ist mit einem Abstand
&iacgr;&ogr; senkrecht zu dem Niveau des Fluides montiert. Der Strahl ist längs
eines ersten optischen Pfades (der Begriff "optischer Pfad" wird verwendet, obwohl der Strahl nicht aus sichtbarem Licht sein muß) gegen die
Oberfläche des Fluides gerichtet, bei einem Winkel bezüglich der Oberfläche des Fluides, so daß ein erfaßbarer Abschnitt des Strahles von der
Oberfläche des Fluides längs einem zweiten optischen Pfad zu dem Sensor reflektiert wird. Änderungen in dem Niveau des Fluides werden
den Punkt ändern, bei dem der Strahl auf den Sensor auftrifft und werden demgemäß Variationen in dem elektrischen Signal von dem
Sensor verursachen. Dieses Signal kann benutzt werden, um Vorrichtungen
zu steuern, die wiederum das Niveau des Fluides steuern, wie z.B.
Pumpen, Diaphragmen oder Eintauchkolben.
Es wird angenommen, daß die Oberfläche des Fluides flach ist, oder daß
sie bei dem gleichen Winkel mit Bezug zu dem Strahl bleibt, auch wenn
die Höhe der Oberfläche des Fluides variieren kann. Demgemäß wird der Winkel, bei dem der Strahl reflektiert wird von der Oberfläche des
Fluides, nicht variieren. Wenn die Oberfläche nicht flach ist, kann der
Strahl nicht reflektiert werden, oder kann an unvorhersehbaren Winkern
reflektiert werden. Wenn Wellen oder Turbulenzen erwartet werden, dann kann ein bespiegelter Schwimmer, der gewichtet ist, um Gieren,
Schleudern und Rollen zu vermeiden, auf der Oberfläche des Fluides
plaziert werden, um den Strahl zu reflektieren.
In einem bevorzugten Ausführungsbeispiel ist die Einrichtung zum Erzeugen
eines Strahles von elektromagnetischer Strahlung ein Laser und der Sensor ist eine Vielzahl von verbundenen Photozellen, die von der
Oberfläche des Fluides längs einer Richtung senkrecht zu der Oberfläche des Fluides angeordnet sind. Die Strahlung von dem Laser sollte bevorzugterweise
nicht den Zustand des Fluides ändern. Elektronische Schaltungen sind bereitgestellt, um die elektrische Ausgabe-jeder der Photozellen
zu vergleichen und demgemäß Bewegungen in der Position des Strahles zu erfassen, wenn er auf die Photozellen auftrifft "Wenn sich
das Niveau des Fluides ändert, wird der Strahl nicht länger auf die Photozellen an dem gleichen Ort auftreffen. Eine Photozelle wird mehr
is von dem Strahl als zuvor empfangen und eine andere wird weniger als
zuvor empfangen. Dies wird die elektrische Ausgabe von jeder der betroffenen Photozellen ändern. Eine Vergleichsschaltung wird diese
Differenz erfassen und entweder ein Instrument antreiben, das das Niveau des Fluides anzeigt, oder eine Vorrichtung zum Ändern des
Niveaus des Fluides (wie z.B. einen Eintauchkolben) oder beides.
Die Einrichtung zum Messen des Niveaus des Fluides der vorliegenden
Erfindung ist schnell, zuverlässig und sehr empfindlich. Sie ist in der
Lage sehr präzise das Niveau des Fluides zu bestimmen und konsequenterweise dieses Niveau sehr präzise zu halten. Derzeit kann eine Einrichtung
zum Messen des Niveaus eines Fluides die gemäß der Erfindung gemacht ist, das Niveau eines Fluides messen (und halten) bei zumindests
innerhalb plus oder minus 0,5 mil (plus oder minus 0,0005 Inches).
Zusammenfassend, das Stereolithographie -system der vorhegenden
Erfindung stellt eine beträchtliche Reduktion der Zykluszeit für jede gebildete Schicht, Verbesserungen in der dimensionalen Genauigkeit
und Erhöhungen in der Grünfestigkeit und der ausgehärteten Endfestigkeit bereit. Außerdem befriedigt die Niveaumeß- und Steuereinrichtung
der vorliegenden Erfindung ein seit langem existierendes Bedürfnis nach
einem System, das in der Lage ist schnell, zuverlässig und genau das Niveau eines Fluides zu messen.
&iacgr;&ogr; Das obige und andere Ziele und Vorteile der Erfindung werden offensichtlich
werden aus der folgenden detaiUierteren Beschreibung, wenn sie in Verbindung mit der begleitenden Zeichnung von veranschaulichenden
Ausführungsbeispielen genommen wird.
Fig. 1 ist eine Querschnittsansicht eines Stereolithographiesystems, das
Merkmale der Erfindung verkörpert;
Fig. 2 ist eine perspektivische Ansicht des Systems, das in Fig. 1
gezeigt ist, die weiter das Ausführungsbeispiel, gezeigt in Fig. 1,
veranschaulicht;
Fig. 3
bis 6 sind vereinfachte Querschnittsansichten des Behälters, gezeigt in
Fig. 1, bei verschiedenen Stufen des Stereolithographieverfahrens;
Fig. 7 ist eine perspektivische Ansicht eines dreidimensionalen Gegenstandes,
der in Übereinstimmung mit der vorliegenden Erfindung gemacht worden ist;
Fig. 8 ist eine perspektivische Ansicht eines Abschnittes, einer Stereolithographieeinrichtung
mit einem bevorzugten Ausführungsbeispiel der Fluidniveau-Meßeinrichtung der vorliegenden Erfindung, die
darauf montiert ist;
Fig. 9 ist eine Seitenschnittansicht des bevorzugten Ausfuhrungsbeispiels
der Erfindung;
Fig. 10 ist eine Seitenschnittansicht des optischen Pfades, der von dem
&iacgr;&ogr; Laserstrahl des bevorzugten Ausfuhrungsbeispieles der Erfindung
genommen wird unter Bedingungen von sich änderndem Fluidniveau und Einfallwinkel;
Fig. 11 ist eine Frontschnittansicht eines Bi-Zellen-Photosensors, der in
dem bevorzugten Ausfuhrungsbeispiel der Erfindung benutzt wird;
Fig. 12 ist ein Blockdiagramm der mit dem Bi-Zellen-Photosensor verbundenen
Elekronik des bevorzugten Ausführungsbeispieles der Erfindung;
Fig. 13 veranschaulicht das Problem des eingeschlossenen Volumens;
Fig. 14 veranschaulicht mit Gewinde versehene, zurückziehbare Stifte
zum Einstellen des Klingenspaltes;
Fig. 15 stellt eine vergrößerte Ansicht des Stiftes, der in die Klinge
montiert ist, dar;
Fig-16 veranschaulicht einen Querschnitt einer Klinge, die einen Angriffswinkel
in der Richtung der Klingenbewegung hat;
Fig. 17
bis 19 veranschaulichen alternative Querschnittsformen für die Klinge
von Fig. 16;
Fig. 20 veranschaulicht eine alternative Form für einen Niveau-erfassenden
Schwimmer;
7.
Fig. 21 veranschaulicht eine Niveauerfassungseinrichtung einschließlich
einem Schwimmer;
Fig. 22 ist ein Diagramm des optischen Detektors der Einrichtung von
Fig. 21; und
Fig. 23 ist ein Flußdiagramm der wiederbeschichtenden Software, die in
der SLA-250 verwendet wird.
Die Fig. 1 und 2 veranschaulichen schematisch das Stereolithographiesystem
zum Bilden dreidimensionaler Gegenstände, das Merkmale der Erfindung verkörpert. Wie in diesen Zeichnungen gezeigt ist ein Behälter
oder eine Wanne 10 bereitgestellt, um ein Bad 11 eines polymerisierbaren
Fluides zu enthalten. Eine Gegenstandstrageplattform 12 ist in dem Behälter 10 angeordnet und ist angepaßt durch Rahmenelemente 13
und 14, um in dem Tank durch einen Motor (nicht gezeigt) gehoben und abgesenkt zu werden. Die Plattform 12 hat eine horizontale Oberfläche
15, auf der die dreidimensionalen Gegenstände in Übereinstimmung mit der Erfindung gebildet werden. Der Behälter 10 hat eine
Zuflußrinne 16 in dem oberen Abschnitt einer Seitenwand des Behälters
10 und ein Eintauchkolben oder ein Kolben 17 ist in der Zuflußrinne
angeordnet, um durch einen Motor 18 gehoben und gesenkt zu werden,
um das Niveau der oberen Oberfläche 20 der polymerisierbaren Flüssigkeit
in dem Behälter 10 zu steuern.
Das Niveau der oberen Oberfläche 20 des Bades 11 wird mittels einer
Strahlungsquelle 21, wie z.B. einem HeNe-Laser, erfaßt, der gegen die obere Oberfläche 20 auf einen Winkel- und Strahlungssensor 22 gerichtet
ist, der ein Bi-Zellen-Detektor sein kann. Die Position des Sensors 22
&iacgr;&ogr; ist eingestellt, um an einem komplementären Winkel bezüglich der
oberen Oberfläche 20 zu sein, um die Strahlung _ vom HeNe-Laser zu empfangen. Ein Steuersystem 23 ist bereitgestellt, um die Bewegung des
Eintauchkolbens 17 durch den Motor zu steuern.
Eine computergesteuerte Strahlungsquelle 24 ist über dem Bad 11 angeordnet,
um Aushärtungsmedien, wie z.B. ultraviolette Strahlung oder andere Typen von aushärtender Strahlung, in einem vorbestimmten
Muster über die obere Oberfläche 20 des Bades 11 zu richten, um die
polymerisierbare Flüssigkeit in der Schicht über der Plattform auszuhärten, wo solche Strahlung darauf auftrifft. Die Bewegung und der Betrieb
der Strahlungsquelle 24 und das Heben und Senken der Gegenstandstrageplattform 12 sind integrale Teile der Computersteuerung 25 des
Systemes, wie es weiter hiernach beschrieben werden wird.
Eine Abstreifklinge 26 ist auf dem Oberteil des Behälters 10 montiert
und angepaßt, um sich horizontal über dem Oberteil des Behälters zu bewegen. Ein Klingenträger 27 ist gleitbar auf Schienen 30 und 31
montiert, die längs einer Seite des Behälters 10 angeordnet sind. Eine mit einem Gewinde versehene Antriebswelle 32 passiert durch einen mit
einem Gewinde versehenen Durchgang (nicht gezeigt) in dem !Gingen-
träger 27 und ihre Rotation durch einen Motor 33 bewegt den Klingenträger 27 und demgemäß die Klinge 26 horizontal über das Oberteil des
Behälters 10.
Der Betrieb des Stereolithographiesystems, gezeigt in Fig. 1 und 2, ist
am besten in der Folge von Fig. 3 bis 6 gezeigt. Beginnend mit Fig. 3 wird das stereolithographische Verfahren mit der Gegenstandstrageplattform
12 initiiert, die in dem Bad 11 von polymerisierbarer Flüssigkeit
positioniert ist, so daß die horizontale Oberfläche 15 darauf bei einem
&iacgr;&ogr; kleinen Abstand von der oberen Oberfläche 20 des Bades angeordnet ist.
Dieser Abstand ist größer als die gewünschte Dicke der Schicht von polymerisierbarer Flüssigkeit, die ausgehärtet werden soll. Die Schicht
von polymerisierbarer Flüssigkeit direkt über der Oberfläche 15 wird die erste feste Schicht des dreidimensionalen Gegenstandes bilden, wenn sie
ausgehärtet ist.
Der nächste Schritt in dem Prozeß ist in Fig. 4 gezeigt. Die Gegenstandstrageplattform
12 wird angehoben, so daß die Schicht 34 der polymerisierbaren
Flüssigkeit auf der Oberfläche 15 über die obere Oberfläche 20 des Bades 11 gehalten wird. Die polymerisierbare Flüssigkeit
ist ein relativ viskoses Fluid, so daß die Flüssigkeit nicht sofort über die Kanten der Oberfläche 15 auf der Plattform 12 läuft, wenn die Schicht
aus dem Bad gehoben wird. Die Abstreifklinge 26 wird horizontal bewegt, so daß ihre untere Kante 35 überschüssige polymerisierbare
Flüssigkeit von der Schicht 34 abstreift und dadurch die obere oder Arbeitsoberfläche 36 glättet. Geeignete Klingengeschwindigkeiten werden
empirisch bestimmt, um ein gewünschtes Niveau zu der Arbeitsoberfläche
34 bereitzustellen. Außerdem können ein oder mehr Durchgänge von der Abstreifklinge 26 bei einer besonderen Geschwindigkeit benötigt
werden, um eine glatte Niveauoberfläche 34 bereitzustellen. Typische
Klingengeschwindigkeiten können von ungefähr einem bis zehn Inches pro
Sekunde reichen. Wenn polymerisierbare Flüssigkeiten mit niedriger Viskosität verwendet werden, können periphere Dämme angewendet
werden, um die Flüssigkeit zu halten, bis sie polymerisiert ist.
Nachdem die Arbeitsoberfläche 36 der Schicht 34 ausgeglichen ist durch
die Abstreifklinge 26, wird die Gegenstandshalteplattform 12 in das Bad 11 abgesenkt, wie in Fig. 5 gezeigt, so daß die geglättete Arbeitsoberfläche
36 der Schicht 34 nivelliert mit oder in der gleichen horizontalen
&iacgr;&ogr; Ebene wie die obere Oberfläche 20 des Bades 11 ist: Das polymerisierbare
Fluid des Bades 11, das die Schicht 34 umgibt, bildet eine Schnittstelle 37, die im wesentlichen eine Wand ist, die die äußere Peripherie
der Schicht 36 trägt. Irgendwelche Unterbrechungen der Arbeitsoberfläche 34 oder der oberen Oberfläche 20 des Bades 11, die durch das
Eintauchen der Gegenstandstrageplattform 12 und der Schicht 34 in das
Bad 11 verursacht werden, sind relativ gering und fallen schnell.
Die computergesteuerte Strahlungsquelle 24 wird betätigt nach einer
kurzen Verzögerung, um irgendwelche Unterbrechungen in der oberen Oberfläche zu eliminieren, um Aushärtungsmedien, vorzugsweise UV-Strahlung
oder andere geeignete Strahlung, über die Arbeitsoberfläche 36 der Schicht 34 in einem vorbestimmten Muster zu richten, um die
polymerisierbare Flüssigkeit, auf die die Strahlung auftrifft, auszuhärten.
Die Schicht 34 ist ausreichend ausgehärtet, so daß sie die notwendige Grünfestigkeit hat, um zusätzliche Schichten zu tragen, die darauffolgend
auf eine ähnliche Weise aufgebracht werden, und um Handhaben des gebildeten Gegenstandes nach der Stereolithographie, aber vor der Endaushärtung,
zu erleichtern.
Nach der Bestrahlung der Schicht 34 wird die Gegenstandstrageplattfonn
12 weiter abgesenkt, wie in Fig. 6 gezeigt, so daß die polymerisierbar?
Flüssigkeit von dem Bad 11 über die zuvor ausgehärtete Schicht 34 fließt, um eine neue Schicht 38 zu bilden, um dadurch einen weiteren
Zyklus des Prozesses zu initialisieren.
Eine Serie von polymerisierten Schichten wird auf die zuvor genannte
Weise aufgebaut, wie in Fig. 1 gezeigt, wobei jede Schicht tatsächlich ein dünner Querschnitt des gewünschten dreidimensionalen Gegenstandes 40
&iacgr;&ogr; ist. Die Dicke der individuellen Schichten kann >■ abhängig von der
Zusammensetzung und der Viskosität der polymerisierbaren .Flüssigkeit
und der Natur und der Intensität des aushärtenden Strahlungsmediums variieren. Typische Dicken reichen jedoch von ungefähr 0,005 bis ungefähr
0,01 Inch. Der endgültige dreidimensionale Gegenstand 40, der
is durch das zuvor beschnebene Stereolithographiesystem gebildet ist, wird
von dem Behälter 10 entfernt und dann einer weiteren Behandlung unterworfen, um das Aushärten von nicht ausgehärtetem Material zu
vervollständigen, das in den gebundenen Oberflächen des dreidimensionalen
Gegenstandes verbleibt. Oberflächenendbearbeiten, wie z.B. Schmirgern
und ähnliches, kann auch angewandt werden, wenn benötigt.
Eine große Vielzahl von polymerisierbaren Flüssigkeiten kann mit der
vorliegenden Erfindung verwendet werden, genauso wie ein breiter Bereich
von aushärtenden Medien. Jedoch werden photon-polymerisierbare Flüssigkeiten, wie z.B. Acryle, derzeit bevorzugt gemeinsam mit UV-Strahlung,
um sie auszuhärten. Bevorzugterweise sollte die Viskosität der polymerisierbaren Flüssigkeit 100 Centipoise überschreiten und bevorzugterweise
von ungefähr 1000 bis ungefähr 6000 Centipoise reichen.
Ein Beispiel einer bevorzugten Ausführungsform der vorliegenden Erfindung,
ein computergesteuertes Stereolithographiesystem, das von dem
gegenwärtigen Anmelder entwickelt worden ist, und das schematisch in den Fig. 1 und 2 gezeigt ist, wurde verwendet, um den dreidimensionalen
Gegenstand, der in Fig. 7 gezeigt ist, zu bilden. Die Basis des Gegenstandes
war 8,25 &khgr; 8,25 Inches, die maximale Höhe war ungefähr 4 Inches und die minimale Höhe war ungefähr 1 Inch. Die Wanddicke
war ungefähr 0,25 Inch. Das polymerisierbare Harz, das angewendet wurde, war ein relativ viskoses Harz von Desoto Chemical Company, als
&iacgr;&ogr; 4112-65-Harz bezeichnet. Die Temperatur des Bades davon war bei
ungefähr 300C gehalten. Die Dicke jeder aufgebrachten Schicht war
ungefähr 0,02 Inch. Die folgenden Verfahren, die die Merkmale der vorliegenden Erfindung verkörpern, wurden für jede aufgebrachte Schicht
verfolgt. Die Gegenstandstrageplattform des Stereolithographiesystems
is wurde in das Bad von 4112-65-Harz abgesenkt, um zu erlauben, daß das
Flüssigkeitsharz auf ihre Oberfläche fließt, um eine anfängliche Schicht von polymerisierbarer Flüssigkeit zu bilden, die dicker als gewünscht war.
Die Plattform wurde dann gehoben, so daß die anfängliche Schicht darauf über das Bad gehoben wurde. Eine Klinge, die sich mit ungefähr
einem Inch pro Sekunde bewegte, strich ungefähr 0,1 Inch von polymerisierbarer Flüssigkeit in einem Durchgang ab, ungefähr 0,02 Inch von
porymerisierbarer Flüssigkeit auf der Trägeroberfläche auf der Plattform
zurücklassend. Die Plattform wurde dann abgesenkt, so daß die geglättete
Arbeitsoberfläche der Schicht mit der oberen Oberfläche des Bades nivelliert war. Die Schicht wurde einer ultravioletten Strahlung von
einem HeCd-Laser unterworfen, der eine Strahlung bei einer Wellenlänge von ungefähr 325 nm bei ungefähr 15 Milliwatt Leistung bereitstellt.
Die Gesamtzeit für jeden Schichtzyklus war ungefähr 35 Sekunden. Die Zeit, um solch ein Teil mit früheren Verfahren herzustellen, würde
ungefähr 165 Sekunden pro Schichtzyklus gewesen sein. Die Gesamtzeit,
die durch Verwendung der Ausführungsbeispiele der vorliegenden Erfindung
in diesem Beispiel eingespart wurde, war ungefähr 7,5 Stunden.
Bezüglich jetzt zu Fig. 8 in den Zeichnungen ist ein vorteilhaftes Ausführungsbeispiel
des nivellierenden Gesichtspunktes der vorliegenden Erfindung gezeigt, angebracht an eine Stereolithographieeinrichtung 10,
um das Niveau des Arbeitsfluides 20 (einem UV-aushärtbaren Photopolymer, wie z.B. DeSoto #65) in einer Harzwanne 30 zu messen. Die
Stereolithographieeinrichtung, dargestellt in Fig. 8, abgesehen von der &iacgr;&ogr; Hinzufügung des bevorzugten Ausfuhrungsbeispieles <Ier Erfindung und
verwandter Ausrüstungen, hat das Grundformat, das in dem US-Patent
Nr. 4,575,330 (früher durch Referenz eingebunden) gezeigt ist, und das
in der kommerziellen Stereolithographieeinrichtung, die von 3D-Systems, Inc. unter dem Namen "SLA-I." verkauft wird.
Die Stereolithographieeinrichtung 10 hat einen Seitenbehälter 40, der ihr
hinzugefügt ist, der mit einer Harzwanne 30 mittels einem Durchgang 50 in der Wand 60 der Harzwanne 30 in Verbindung steht. Die Dimensionen
des Seitenbehälters sind 7 Inches zu 4 Inches in dem bevorzugten Ausführungsbeispiel der Erfindung. Das Arbeitsfluid 20 füllt die Harzwanne
30 und den Seitenbehälter 40. Das Arbeitsfluid ist frei, um von dem Seitentank zu der Harzwanne und umgekehrt zu fließen. Das
Niveau des Arbeitsfluides in der Harzwanne (und demgemäß in dem Seitenbehälter) muß präzise zu einem voreingestellten Niveau gesteuert
werden, um eine stereolithographische Produktion von Teilen (Gegenstände, die durch Stereolithographie gemacht werden, werden 'Teile"
genannt) auszuführen. Die Einrichtung der vorliegenden Erfindung, die in der Form des bevorzugten Ausführungsbeispieles gezeigt ist, erfüllt
diesen Zweck.
Ein Helium-Neon-Laser 100 ist auf die Harzwanne 30 unter und zu der
Seite des Seitenbehälters 40 montiert Der Laser ist ausgerichtet, so daß
sein Ausgangsstrahl gerade längs dem Seitenbehälter ausgestrahlt wird.
Ein Uniphase-1508-Laser wurde als erfolgreich gefunden in dem bevorzugten
Ausführungsbeispiel der vorliegenden Erfindung. Der Uniphase-1508-Laser
wurde gewählt aufgrund seiner niedrigen Kosten, der Kompaktheit und niedriger Leistungserfordernisse. Das Licht, das von diesem
Laser ausgestrahlt wird, wird das Arbeitsfluid nicht polymerisieren.
&iacgr;&ogr; Der Ausgangsstrahl 110 des Helium-Neon-Lasers ist nach oben zu einem
Spiegel 120 (einem Rolyn Optics # 60.21), der auf einem Träger über
dem Seitenbehälter montiert ist, gerichtet. Dieser lenkt den Strahl längs einem ersten optischen Pfad 112 auf die Oberfläche 70 des Arbeitsfluides
in dem Seitenbehälter 40 ab, wie es am besten in Fig. 9 zu sehen ist.
Der Strahl trifft auf die Oberfläche des Arbeitsfluides bei einem Winkel
&bgr; bezüglich der Oberfläche 70 (der Einfallswinkel ist gleich 90° minus
ß). Der Winkel &bgr; hat einen Wert, bei dem eine erfaßbare Komponente
des Strahles längs einem zweiten optischen Weg 114 reflektiert werden wird. Ein variierender Bereich von Winkeln wird dieses letztere Erfordernis
erfüllen, abhängig von der Eigenschaft des Fluides und des Laserlichtes, und den Dimensionen des Behälters. In dem bevorzugten Ausführungsbeispiel,
das hier beschrieben ist, ist dieser Winkel 15°.
Die hier beschriebene Einrichtung mißt das Niveau des Harzes in dem
Seitenbehälter gegenüber der Wanne. Dies ist vorteilhaft, da Blasen oder andere Oberflächenunterbrechungen sich in der Hauptwanne bilden
können, wenn das Teil oder der Träger durch die Harzoberfläche bei jedem Zyklus des Teüaufbauens passiert. Diese Blasen oder andere
Oberflächenunterbrechungen, wenn sie von dem Strahl getroffen werden,
können den Strahl dazu veranlassen, von der Harzoberfläche bei einem
fehlerhaften Winkel zu reflektieren. Andere Oberflächenunterbrechungen
können sich über dem Oberteil eines eingetauchten Teiles bilden, was
eine fehlerhafte Strahlablenkung verursachen kann, wobei die Unterbrechungen
eine lange Zeit brauchen, um sich auszugleichen. Diese umfassen Harzbuckel oder Bereiche, wo zuviel Harz von der Klinge
während dem Wiederbeschichten abgestoßen worden ist wegen einem Klingenreißens. Diese Probleme können insbesondere bedenklich sein im
Falle von bestimmten Teilgeometrien, die eingeschlossene Volumen, oder
große, flache, horizontale Oberflächen haben, welche Geometrien in mehr Detail später beschrieben werden. Durch Messen des Niveaus des
Harzes in einem Seitenbehälter werden die obigen Probleme, minimiert
oder eliminiert.
Nach Reflexion von der Oberfläche 70 des Arbeitsfluides kehrt der Strahl längs dem zweiten optischen Pfad 114 zu dem gleichen Winkel
bezüglich der Oberfläche des Fluides zurück, zu dem der Strahl auf die
Oberfläche 70 des Fluides auftraf. Der Strahl scheint dann auf den Bi-Zellen-Photodetektor
130, der auf dem Eintauchkolbengehäuse 85 auf der anderen Seite des Seitenbehälters 40 von dem Spiegel 120 montiert ist.
Der Spiegel ist eingestellt, so daß der Strahl auf den Bi-Zellen-Detektor
130 auftrifft, wenn das Niveau des Arbeitsfluides auf der gewünschten
Höhe ist. Der Spiegel wird nicht bewegt oder gedreht, wenn einmal eingestellt worden ist, um den Strahl von der Oberfläche des Arbeitsfluides
weg zu dem Bi-Zellen-Photodetektor zu reflektieren, wenn das
Niveau des Arbeitsfluides auf der gewünschten Höhe ist.
Ein befriedigender Bi-Zellen-Photodetektor, gezeigt in Fig. 11, wird von
der Silicon Detektor Corporation gemacht und ist durch ihre Nr. SD113-24-21-021
bekannt. Andere Marken und Größen von Bi-Zellen-Photodetektoren
würden befriedigend sein. Linearpositionsempfindliche Detekto-
ren ("PSD"), wie z.B. der zweidimensionale PSD (S 1544) von Hamamatsu
oder die zweidimensionale laterale ZeUe (S1B52) wurden akzeptierbar
sein und könnten bevorzugt sein, wenn die Einrichtung geplant ist, um
eine Ausgangsgröße in Längeneinheiten zu messen und anzuzeigen. Der Bi-Zellen-Photodetektor weist Seite an Seite zwei Photozellen 140 auf.
Der Bi-Zellen-Photodetektor 130 ist auf das Eintauchkolbengehäuse 85 montiert, so daß die Photozellen 140 eine über der anderen und beide
Photozellen über dem Niveau des Arbeitsfluides sind. Der Photodetektor
kann geneigt sein, so daß er den zweiten optischen Pfad 114 zu einem
&iacgr;&ogr; rechten Winkel unterbricht, wie es am besten in den Fig. 9 und 12
gesehen wird. Dies gewährleistet, daß das Profil des Strahle.s bei dem Photodetektor ein Kreis ist, nicht ein Oval, wenn der Strahl ursprünglich
ein kreisförmiges Profil hatte.
Wenn das Niveau des Fluides ansteigt oder abfällt aufgrund von Schrumpfen durch Aushärten, Erhitzen und ähnlichem, wird der Strahl
die Oberfläche 70 an einem unterschiedlichen Punkt treffen. Demgemäß wird der Strahl den Bi-Zellen-Photodetektor an einem unterschiedlichen
Punkt treffen. Diese Wirkung auf den Strahl ist gestrichelt in Fig. 9 gezeigt, wo ein niedrigeres Niveau 80 des Arbeitsfluides den Strahl längs
dem zweiten optischen Pfad 150 reflektiert, damit er an einem niedrigeren
Punkt bezüglich des Bi-Zellen-Photodetektors auftrifft. Die Änderung des Arbeitsfluidniveaus ist übertrieben, um diese Wirkung zu veranschaulichen;
das bevorzugte Ausführungsbeispiel der Erfindung mißt das Niveau des Arbeitsfluides, um dieses Niveau auf einer vorbestimmten Höhe
zu halten. Niveauänderungen sind klein, da solche Niveauänderungen
schnell korrigiert werden, wie unten beschrieben.
Eine gegebene Änderung in dem Niveau des Arbeitsfluides, wird die gleiche Verschiebung in dem Punkt verursachen, bei dem der Strahl auf
den Bi-Zellen-Photodetektor auftrifft, unabhängig von dem Wert von ß.
Fig. 10 veranschaulicht das Ergebnis einer Änderung in dem Arbeitsfluidniveau
vom Niveau 82 zu einem höheren Niveau 84. Der Unterschied zwischen den Niveaus 82 und 84 ist der vertikale Abstand d.
Zwei unterschiedliche Strahlen sind gezeigt, die längs ersten optischen
Pfaden 151 und 152 ankommen und die Oberfläche des Fluides bei Winkeln ^1 bzw. ß2 treffen. Die zweiten optischen Pfade 153 und 154
(für das erste Niveau 82) sind gesetzt, um auf der Senkrechten P an dem gleichen Punkt Y1 aufzutreffen. Wenn das Niveau des Arbeitsfluides
zu dem Niveau 84 ansteigt, folgen die Strahlen zweiten optischen
Pfaden 155 bzw. 156. Einfache trigonometrische Berechnungen ergeben,
daß beide zweiten optische Pfade 155 und 156 die Senkrechte P an dem gleichen Punkt Y2 treffen werden, und daß der vertikale Abstand zwischen
Y1 und Y2 zweimal der Wert von d ist, der vertikalen Änderung
im Niveau des Arbeitsfluides. Demgemäß wird Variieren von &bgr; nicht die Genauigkeit des Meßverfahrens des Niveaus eines Fluides gemäß der
Erfindung beeinflussen. Der zu wählende Wert von &bgr; hängt hauptsächlich
davon ab welcher Winkel eine ausreichende Reflexion des Strahles innerhalb der Beschränkungen der Einrichtung erreichen wird.
Die Änderung im Arbeitsfluidniveau wird in einer Änderung in dem elektrischen Signal resultieren, das von dem Bi-Zellen-Photodetektor
ausgesandt wird. Die Photozellen 140 in dem Bi-Zellen-Photodetektor
sind durch einen Schütz 160 getrennt (siehe Fig. 11), der eng ist, kleiner
als ein mil dick. Die Ausgabe von beiden der Photozellen wird gleich
sein, wenn der Bi-Zellen-Photodetektor nicht von dem Laser beleuchtet
ist, oder wenn der Laserstrahl exakt auf dem Schutz 160 zwischen den
Photozellen 140 zentriert ist. Die Ausgaben werden ungleich, wenn der Strahl sich bewegt, so daß er auf eine der Zellen mehr als auf die
andere auftrifft. Ein Vergleich der ungleichen Ausgaben durch eine
Vergleichsschaltung, wie unten beschrieben, wird in einem Signal resultieren,
das zu dem Schrittmotor 90 gesandt wird, um den Eintauchkolben 95 anzutreiben. Der Eintauchkolben 95 (siehe Fig. 9) wird nach oben
oder nach unten gehen, wie benötigt, um das Niveau des Arbeitsfluides
zu halten.
Der Eintauchkolben hält das Arbeitsfluidniveau an einem im wesentlichen
konstanten Niveau im Raum. Dies ist vorteilhaft, da es den Laserstrahl
im Brennpunkt hält. Wenn dem Niveau erlaubt wäre sich zu ändern, &iacgr;&ogr; wie es der Fall für bestimmte harzausgebende Systeme ist, die frisches
Harz in die Wanne bei jedem Zyklus von Teileaufbauenc· anordnen,
müßte der Laser für das neue Niveau wieder fokussiert werden.
Bezüglich jetzt Fig. 12 werden die Stromausgaben 205 und 207 der
is Photozellen 140 zu einem Strom/Spannung-Umwandler 200 geliefert, der
die Ausgabe jeder Photozelle zu einer Spannung zwischen 0 und -2,5 V umwandelt. Die beiden Spannungsausgaben 215 und 217 des Strom/
Spannung-Umwandlers 200 (jede Photozelle 140 hat ihre eigene Ausgabe) werden zu dem Subtrahierer eingespeist, wo die Spannungsausgaben
subtrahiert werden. Mit der Addition einer Referenzspannung (nicht
gezeigt) ist der Unterschied zwischen den Spannungsausgaben 215 und
217 ein Signal 225, das zwischen 0 und +5 V reicht. Wenn das Fluid an seinem gewünschten Niveau ist, ist das Signal 225 bei +2,5 V
Das Signal 225 wird zu einem Analog/Digital-Umwandler 230 gesandt, wo das Signal zu einem digitalen Signal 235 umgewandelt wird, das dann zu einem Computer 240 geht. Der Computer 240 vergleicht das Signal 235 mit dem vorbestimmten digitalen Signal für das gewünschte Fluidniveau und aktiviert eine Schrittmotorsteuereinrichtung 245. Die Schrittmotorsteuereinrichtung 245 wiederum aktiviert den Schrittmotor 90 (in dem bevorzugten Ausführungsbeispiel einen Schrittmotor von Minarik-
Das Signal 225 wird zu einem Analog/Digital-Umwandler 230 gesandt, wo das Signal zu einem digitalen Signal 235 umgewandelt wird, das dann zu einem Computer 240 geht. Der Computer 240 vergleicht das Signal 235 mit dem vorbestimmten digitalen Signal für das gewünschte Fluidniveau und aktiviert eine Schrittmotorsteuereinrichtung 245. Die Schrittmotorsteuereinrichtung 245 wiederum aktiviert den Schrittmotor 90 (in dem bevorzugten Ausführungsbeispiel einen Schrittmotor von Minarik-
Electric Co., LAS 3802-001), der den Eintauchkolben 95 auf- und abbewegt,
um Flüssigkeit zu verschieben, um das Fluidniveau zu dem gewünschten
Wert zurückkehren zu lassen.
Der Computer ist programmiert, um ein Fluidniveau kurz nach einer ersten Eintauchoperation zu messen, bei der das Teil eingetaucht wird
durch Bewegen des Hebewerkes tiefer in das Fluid, und bevor das Hebewerk zurück hochgehoben wird, um die nächste Schicht auf das Teil
"zu zeichnen". Das Niveau des Arbeitsfluides wird nur zu diesem spezifisehen
Zeitpunkt in dem Aufbauprozess gemessen und gesteuert. Der Computer vergleicht das Signal 233 mit dem Referenzwert nur^.zu diesem
spezifischen Zeitpunkt und erzeugt das Signal 242 zu der Schrittmotorsteuereinrichtung
245, das bestimmt, wie lange und in welcher Richtung die Schrittmotorsteuereinrichtung 245 den Schrittmotor 90 aktivieren wird.
Bei einem zusätzlichen Ausführungsbeispiel der wiederbeschichtenden
Einrichtung des Gegenstandes der Erfindung ist die Möglichkeit bereitgestellt, verschiedene Parameter, die mit dem Klingenwiederbeschichtungsprozeß
verbunden sind, zu variieren, wobei die Parameter den Klingenspalt,
was der Abstand zwischen der Abstreifklinge und der Oberfläche des Harzbades in der Wanne ist, und das Klingenspiel, was der Abstand
zwischen der Klinge und dem oberen Teil des Teiles ist, umfassen. Typischerweise wird das Klingenspiel das gleiche wie die Schichtdicke der
nächsten zu formenden Schicht sein, muß es aber nicht.
Die optimale Größe des Klingenspaltes hängt ab von dem Abwägen von
verschiedenen Betrachtungen. Ein großer Klingenspalt ist problematisch,
da er zu Knittern in der Oberfläche des Harzbades führen kann, was
Zeit brauchen wird um sich auszugleichen. Dies ist so, weil der KHngenspalt
das Ausmaß bestimmt, zu dem das Oberteil des Teiles über die
Harzoberfläche beim Überstreifen gehoben werden muß, und ebenso das
Ausmaß bestimmt, zu dem das Oberteil des Teiles danach abgesenkt
werden muß, bevor das Aushärten der nächsten Schicht beginnen kann.
Für einen Klingenspalt von 125 mil z.B. und ein gewünschtes KHngenspiel
von 20 mil muß das Oberteil des Teiles 105 mil über die Harzoberfläche gehoben werden, bevor das Überstreichen beginnen kann, und
muß dann 125 mil abgesenkt werden, bevor das Aushärten beginnen kann, so daß das Oberteil des Teiles 20 mil unter der Harzoberfläche
sein wird. Je größer die Bewegung des Oberteiles des Teiles ist, desto
&iacgr;&ogr; mehr Unterbrechung wird an der Harzoberfläche durch die Bewegung
der Plattform und der Träger und dem Rest des Teiles in mjd aus dem
Flüssigkeitsharz verursacht werden. Diese Unterbrechung ist das, was oben mit Knittern bezeichnet worden ist. Dies Knitterungen werden sich
typischerweise an den Schnittstellen zwischen dem Harz und dem Teil bilden.
Ein kleiner Klingenspalt ist ebenso problematisch, da je kleiner der
Klingenspalt ist, desto mehr Harz muß die Abstreifklinge typischerweise bei einem gegebenen Überstreifen abstreifen. Für einen 0 mil Klingenspalt
z.B., wobei die Abstreifklinge gerade an der Oberfläche des Bades gehalten wird, obwohl das Knitterproblem, auf das sich oben bezogen
wurde, reduziert werden kann, ist es erforderlich, daß die Abstreifklinge
Harz von der gesamten Wannenoberfläche abstreift. Dies kann eine kleine Strömungswelle von Harz erzeugen, die über die Seiten der
Wanne auslaufen, und die "zerplatzen" kann und Blasen auf der Harzoberfläche
bilden kann.
Es ist gefunden worden, daß ein Klingenspalt von 25 mil einen guten
Kompromiß zwischen den beiden Problemen, auf die sich oben bezogen
wurde, bereitstellt. Typischerweise wird der Klingenspalt einmal einge-
stellt werden bevor ein Teil aufgebaut wird, und er wird danach konstant
während dem Teilaufbauen bleiben.
Ein anderer Parameter, den man vorteilhaft variiert ist das Klingenspiel.
Unähnlich dem Klingenspalt jedoch ist es wünschenswert in der Lage zu sein das Klingenspiel während dem Teilaufbauen zu variieren, anstelle
von nur einem Mal vor dem Teilaufbauen.
Eine variables Klingenspiel ist vorteilhaft, weil es gestuftes Wiederbeschichten
möglich macht. Gestuftes Wiederbeschichten ist dann, wo vielfache Überstreifungen der Klinge verwendet wird-zum Wie(|erbeschichten
einer gegebenen Schicht mit einem unterschiedlichen Klingenspiel und möglicherweise Klingengeschwindigkeit bei jedem Überstreifen. Unter der
Annahme einer Schichtdicke von 20 mil für die nächste Schicht z.B. bei
is einem gestuften Wiederbeschichtungsprozeß kann das Klingenspiel für das
erste Überstreifen 60 mil sein, für das zweite 40 mil und für das dritte
20 mil. Als ein Ergebnis wird bei jedem Überstreifen eine geringere Menge von Harz weggestreift werden, als wenn ein einzelnes Überstreifen
zum Wiederbeschichten verwendet würde, und ein kleinerer Buckel von Harz wird sich vor der Klinge aufbauen, als wenn ein einzelnes
Überstreifen zum Wiederbeschichten verwendet würde. Ein großes Buckelaufbauen vor der Klinge ist problematisch, wenn ein eingeschlossenes
Volumen von Harz von der Klinge getroffen wird. Wenn ein eingeschlossenes Volumen getroffen wird, kann aufgrund der Gravitationskraft
ein großer Buckel von Harz unter die Klinge fließen und die gewünschte Schichtdicke der glatten Schicht, die sich im Kielwasser der
Klinge bildet, unterbrechen. Wenn dem Buckel nicht erlaubt wird, sich in dem ersten Augenblick aufzubauen, dann kann dieses Problem weniger
schwerwiegend gemacht werden. Dieses Problem kann veranschaulicht werden mit Fig. 13, die eine Klinge 300 in der Mitte eines Durchlaufs
zeigt. Teil 304 ist unter die Klinge um einen Abstand 303 abgesenkt,
was das Klingenspiel ist. Eine glatte Harzoberfläche 301 wird in dem
Kielwasser der Klinge gebildet, während ein Buckel von überschüssigem Harz, identifiziert durch das Bezugszeichen 302, vor der Klinge gebildet
wird. Wenn die Klinge ein eingeschlossenes Volumen von Harz trifft,
das mit dem Bezugszeichen 305 identifiziert ist, kann das Harz, wenn der Buckel 302 groß genug ist, unter die Klinge fließen, wie angezeigt,
um die Bildung der glatten Oberfläche 301 zu unterbrechen. Dieser Effekt ist weniger ausgeprägt, wo die Klinge sich über eine flache,
&iacgr;&ogr; horizontale Oberfläche eines Teiles bewegt, da dort *■ weniger Raum für
das Harz ist, um unter die Klinge zu fließen. - ^.
Ein anderer Parameter, der variiert werden kann, ist die Geschwindigkeit
der Klinge, besonders während dem abgestuften Überstreichen, wo eine
unterschiedliche Geschwindigkeit für jedes Überstreichen spezifiziert werden kann. Es ist vorteilhaft in der Lage zu sein die Klingengeschwindigkeit
passend für die Teilgeometrie zu machen. Wenn die Klinge über einen großen, horizontalen flachen Bereich eines Teiles
passiert, kann, wenn die Klinge zu schnell wandert, zuviel Harz weggestrichen
werden, aufgrund dem Mitreißen, das Harz unter der Klinge
dazu veranlassen wird sich mit einer besonderen Geschwindigkeit zu
bewegen. Wenn die Klinge z.B. mit 5 Inch pro Sekunde bewegt wird, kann Harz 1 mil unter der Klinge dazu veranlaßt werden, sich mit 4
Inch pro Sekunde zu bewegen, und Harz unter dem kann dazu veranlaßt
werden sich mit 3 Inch pro Sekunde zu bewegen. Bei einigen Beispielen kann das Mitreißen so stark über flache Bereiche sein, daß alles
flüssiges Harz von der Klinge weggestrichen wird. Daher kann es über große flache Bereiche wünschenswert sein die Klingengeschwindigkeit zu
verlangsamen, so daß das obige Problem nicht auftritt.
Auf der anderen Seite, wenn die Klinge zu langsam über eingeschlossenem
Volumen bewegt wird, kann dies dem Harz in dem Buckel mehr
Zeit geben unter die Klinge zu fließen. Daher kann es wünschenswert sein über eingeschlossenen Volumen die Geschwindigkeit der Klinge zu
erhöhen, so daß Harz keine Zeit hat darunter zu fließen. Die Geschwindigkeit
kann jedoch nicht zu stark erhöht werden, da, wenn sie zu
stark erhöht wird, eine Welle von Harz vor der Klinge gebildet werden kann, die zerplatzend Blasen bilden kann.
&iacgr;&ogr; Unglücklicherweise ist es schwierig die Geschwindigkeit der Klinge
dynamisch abhängig von der Teilgeometrie während dem Teüaufbauen zu
variieren. Wenn jedoch eine variable Geschwindigkeit für jedes Überstreichen des abgestuften Wiederbeschichtens bereitgestellt ist, kann die
Geschwindigkeit der Klinge bei jedem Überstreichen und die Anzahl von
is Überstreichungen gewählt werden, um die obigen Probleme für ein
typisches Teil zu minimieren. Zum Beispiel kann es wünschenswert für bestimmte Teile sein, wo große flache Bereiche und eingeschlossene
Volumen getroffen werden, eine große Anzahl von Überstreichungen pro
Schicht zu verwenden, in dem Bereich von 5 bis 10, mit einer relativ
niedrigen Klingengeschwindigkeit bei jedem Überstreichen. Wegen der großen Anzahl von Überstreichungen wird nur eine geringe Menge von
Harz bei jedem Überstreichen weggestrichen werden, so daß ein Buckel
nicht in der Lage sein wird sich aufzubauen und unter die Klinge zu
fließen, wenn ein eingeschlossenes Volumen getroffen wird. Auf der anderen Seite, wegen der langsamen Klingengeschwindigkeit, wird das
Problem von Wegstreichen von zuviel Harz von einer großen, flachen
horizontalen Teiloberfläche minimiert werden. Dies ist, da die Klinge nicht in der Lage sein wird, genug Mitreißen zu erzeugen, um alles Harz
wegzustreichen. Außerdem wird die niedrige Klingengeschwindigkeit kein Problem über eingeschlossenen Volumen sein, da es einem großen
Buckel nicht erlaubt sein wird sich aufzubauen, so daß es wenig oder
kein Problem geben wird von Harz, das unter die Klinge fließt, auch bei
der niedrigen Klingengeschwindigkeit.
Es ist ebenso vorteilhaft in der Lage zu sein, das Ausmaß zu variieren,
zu dem das Teil in das Harz übermäßig eingetaucht wird, bevor das Überstreichen beginnt. Wie zuvor beschrieben ist das Teil typischerweise
unter die Oberfläche des Harzes um mehr als die gewünschte Schichtdicke der nächsten Schicht eingetaucht. Zum Beispiel sind bei einem
&iacgr;&ogr; kommerziellen Ausfühmngsbeispiel einer SLA, bekannt als die SLA-250,
hergestellt von 3D Systems, dem Anmelder der vorliegenden^-JErfindung,
bevorzugte Schichtdicken Vi mm oder niedriger. Bei der SLA-250 wird
das Teil typischerweise in das Harz um 8 mm übermäßig eingetaucht, was ein Vielfaches einer typischen Schichtdicke ist. Daher ist es wünsehenswert
in der Lage zu sein diesen Paramter abhängig von der Schichtdicke zu variieren. Ein typischer Wiederbeschichtungszyklus weist
die folgenden Schritte auf: (1) tiefes übermäßiges Eintauchen des Teiles; (2) Erfassen und Einstellen des Harzoberflächenniveaus; (3) Auftauchen;
(4) Überstreichen; und (5) Verzögern, so daß die Oberfläche sich absetzt.
Übermäßiges Eintauchen um mehr als eine Schichtdicke gewährleistet nicht nur, daß ein Buckel von Harz sich auf dem Oberteil des
Teiles bilden wird, der während dem Überstreifen geglättet werden kann,
sondern es gewährleistet auch, daß Oberflächenunterbrechungen, die sich
mit der Erfassung des Harzniveaus in Schritt 2) überlagern können, sich
schneller ausgleichen. Wenn das Teil nahe der Oberfläche eingetaucht wäre, würde jede Oberflächenunterbrechung, die sich über dem Teil
bilden könnte, länger brauchen, um sich auszugleichen. Dies ist, da der
"Kanal" zwischen dem Oberteil des Teiles und der Harzoberfläche kleiner wäre und die Bewegung des Harzes, die zum Ausglätten der Unterbrechungen
benötigt wird, beschränken würde. Daher wird wegen dem
übermäßigen Eintauchen um mehr als eine Schichtdicke die Niveauerfassung
entsprechend genauer gemacht. Außerdem, würden, wenn übermäßiges
Eintauchen auf eine Schichtdicke beschränkt wäre, dann dünne Schichtdicken von einem halben Millimeter (ungefähr 20 mils) oder
weniger weniger wünschenswert sein. Aber diese Schichtdicken können notwendig sein, um bestimmte Teile mit hoher Auflösung aufzubauen.
Daher macht tiefes übermäßiges Eintauchen es auch leichter, dünne Schichten in diesem Bereich zu verwenden.
&iacgr;&ogr; Zusammenfassend, in diesem Ausführungsbeispiel stellt die Möglichkeit
den Klingenspalt, das Klingenspiel, die Tiefe des übermäßigen Eintauchens und die Klingengeschwindigkeit zu variieren und die Möglichkeit
gestuftes Wiederbeschichten zu verwenden, Mittel bereit, um besser das Wiederbeschichten durch Klingen an spezifische Teilgeometrien anzupassen,
so daß spezifische Probleme verbunden mit diesen Geometrien überwunden werden können.
In einem zusätzlichen Ausführungsbeispiel kann das Klingendesign variiert
werden, um es noch effizienter zu machen. In der SLA-250 ist der Querschnitt der Abstreifklinge ein Quadrat, das eine Breite von Ve Inch
hat. Zusätzlich wird die Klinge nur an einem Ende mit einer Trageschiene getragen, die die Bewegung der Klinge führt, so daß die Klinge
und ihr Träger einem Ausleger ähneln. Dies kann ein Problem verursachen,
das als Flattern und Verdrehen bekannt ist, wodurch das ungetragene
Ende der Klinge flattert und sich verdreht, das dadurch zu Fehlern bei dem Wiederbeschichtungsprozeß führt, wie z.B. einer nichtgleichförmigen Schichtdicke. Das Ausmaß, zu dem das ungetragene Ende
sich verdrehen und flattern wird, ist proportional zu dem Quadrat der Klingenlänge. Ein zusätzliches Problem das auftreten kann ist das
Einstellen des Klingenspaltes mit dieser Klinge. Dieser Prozeß benötigt
viele Schritte, von denen' jeder für Fehler anfällig ist, und ist auch
zeitaufwendig. Außerdem erfordert er Drehen von Schrauben, was ein
Drehmoment ausüben und daher die Klinge verbiegen kann.
In einem neueren kommerziellen Ausführungsbeispiel eines Stereolithographiesystemes,
bekannt als die SLA-500, ebenfalls von 3D Systems entwickelt, ist die Klinge neu entworfen worden bezüglich der, die in der
SLA-250 verwendet wird.
&iacgr;&ogr; Zuerst, um zu ermöglichen, daß das Klingenspalteinstellen einfacher
ausgeführt werden kann, sind Mikrometerschrauben an jedem;- Ende der
Klinge bereitgestellt, die erlauben die Höhe jedes Endes der Klinge über der Harzoberfläche unabhängig zu dem bekannten Wert in einer Toleranz
von Vi mil ohne Ausüben eines Drehmomentes auf die Klinge einzustellen.
Zusätzlich sind mit Gewinde versehene, zurückziehbare Nadeln eine an
jedem Ende der Klinge bereitgestellt, wobei jede von ihnen sich um einen bekannten Abstand von dem Unterteil der Klinge erstreckt, weleher
Abstand gleich zu dem erwarteten Klingenspalt ist. Zur Zeit erstrecken sich die Nadeln 25 mil über das Unterteil der Klinge. Wenn
ein unterschiedlicher Klingenspalt erwünscht ist, können Nadeln, die sich
um einen unterschiedlichen Betrag erstrecken, verwendet werden.
Die Nadeln sind in Fig. 14 und 15 dargestellt. Fig. 14 zeigt eine Klinge
400 mit Nadeln 401 und 402, die an jedem Ende bereitgestellt sind. Fig. 15 zeigt eine Vergrößerung einer der Nadeln, die in die Klinge
montiert ist. Wie gezeigt, hat die Nadel einen ausgedehnten Abschnitt 403, der sich um einen Abstand 404 über das Unterteil der Klinge
erstreckt. In der SLA 500 ist der Abstand 25 mils ± 0,5 mils. Wie
gezeigt, hat die Nadel einen mit einem Gewinde versehenen Abschnitt
405, der vorzugsweise ein Mikrometergewinde ist, das 60 Umdrehungen pro/inch hat.
Die Nadelhaltenmg in der Khnge ist mit dem Bezugszeichen 409 identifiziert.
Wie gezeigt hat die Halterung einen mit einem Gewinde versehenen Abschnitt 406, in den der mit einem Gewinde versehene Abschnitt
der Nadel eingeschraubt werden kann, und Anschläge 407 zum Steuern
des Ausmaßes, zu dem die Nadel über das Ende der Klinge hervorragen
&iacgr;&ogr; kann. f
c-
Um den Klingenspalt einzustellen, werden die Nadeln montiert durch
Schrauben in die Klinge bis sie um den geeigneten Betrag hervorstehen,
und dann wird die Mikrometerschraube an einem Ende der Klinge gedreht, bis die Nadel an diesem Ende die Harzoberfläche berührt.
Dies kann leicht visuell bestimmt werden, da die Spitze der Nadel einen
großen leicht beobachtbaren Miniskus mit der Harzoberfläche bilden wird, wenn sie innerhalb von 1/4-1/2 mil von ihr hegt. Demgemäß
kann die Nadel an der Oberfläche innerhalb einer Toleranz von 1/4-1/2
mil angeordnet werden. Dann wird die Mikrometerschraube an dem anderen Ende der Klinge eingestellt, bis die Nadel an diesem Ende die
Harzoberfläche berührt. Dann wird die Klinge gehoben und dann abgesenkt,
um zu sehen, ob beide Nadeln die Oberfläche zur gleichen Zeit berühren. Wenn nicht, werden weitere Schritte des obigen Zyklus gemacht,
bis sie es tun. Wenn sie es tun, wird erachtet, daß der Klingenspalt
eingestellt ist, und dann werden die Nadeln herausgeschraubt, so
daß sie nicht länger hervorstehen. Sie werden jedoch in den Halterungen verbleiben, so daß die Klingenmasse die gleiche bleibt.
Andere Einrichtungen zum Anbringen der Nadeln an der Klinge sind möglich, einschließlich der Verwendung von Sperrnadeln und Auslöseknöpfen,
ähnlich zu denen, die bei einer Spen-klinkeneinrichtung verwendet
werden.
Um Verdrehen und Flattern der Klinge zu reduzieren, wird ein zweiter
Schienenträger hinzugefügt, so daß jedes Ende der Klinge von solch einer Schiene getragen wird. Dies wird Verdrehung und Flattern reduzieren
oder eliminieren an dem ungetragenen Ende der Klinge.
Aufgrund des doppelten Schienenträgers kann die Klinge dicker für eine
erhöhte Festigkeit gemacht werden, und auch, um Flattern in der Mitte der Klinge zu reduzieren. Eine dickere Klinge mit nur einem Träger
kann nicht möglich sein, da die Klinge mehr durchhängen würde, is Derzeit sind SLA-500-Klingen mit Breiten von 1/8 inch, 3/16 inch und
1/4 inch verfügbar.
Schließlich, wie in Fig. 16 gezeigt, kann der Klingenquerschnitt geändert
werden, so daß er nicht langer rechtwinklig ist. Zuerst kann das Unterteil
der Klinge so konstruiert sein, daß die nichthorizontalen Kanten der
Klinge nahe dem Unterteil Winkel bilden, mit den Bezugszeichen 506
und 507 identifiziert, bekannt als die Angriffs- bzw. Trennwinkel mit der
Harzoberfläche. Der Angriffswinkel ist der Winkel in der Richtung der Klingenbewegung, während der Trennwinkel der Winkel an dem anderen
Ende ist. Diese Winkel werden hinzugefügt, um stärker den Harzfluß unter der Klinge zu verbessern. Ohne diese Winkel können Turbulenzen
unter der Klinge erzeugt werden, die Blasen erzeugen können. Diese
Blasen sind problematisch, da sie gemeinsam mit der Klinge unter ihr
wandern und an der Oberfläche des Teiles verbleiben, nachdem die Klinge über sie gewandert ist. Als ein Ergebnis können sie als ein
Fehler in dem Teil zum Vorschein kommen. Durch Abwinkein der Kanten der Klinge werden die Druckgradienten unter der Klinge reduziert,
was zu geringerer Fluidtrenming führt und daher zujveniger Turbulenz
und weniger Blasenbildung. Es ist gefunden worden, daß abhängig von der Teilgeometrie, diese Winkel von zwischen ungefähr 5 und 8
Grad reichen können, und zusätzlich kann der Angriffswinkel von dem
Trennwinkel unterschiedlich sein. Für die SLA-500 wird ein Angriffswinkel von 6 Grad verwendet.
&iacgr;&ogr; Die Klinge in Fig. 16 ist als bisymmetrisch gezeigt, so daß sie in jeder
Richtung überstreichen kann. Alternativ können- zwei asymmetrische Klingen abwechselnd verwendet werden, um in jeder Richtung mit Angriffswinkeln
in der Richtung der Bewegung überstreifen zu können. Andere Klingenkonfigurationen sind möglich.
Fig. 17 zeigt die Klinge von Fig. 16, wobei jeder Scheitelpunkt gerundet
ist. Dies kann weiter Turbulenz reduzieren. Fig. 18 zeigt eine Version,
wo das gesamte Unterteil gerundet ist. Fig. 19 zeigt eine Version, wo
das Unterteil ein scharfer Scheitel ist.
Die nivellierende Einrichtung der SLA-500 wird jetzt beschrieben werden.
Diese Einrichtung überwindet ein Problem, das auftreten kann mit der
Bizellen-Detektor-Einrichtung, die früher beschrieben wurde. Wie früher diskutiert wurde, kann die Bi-Zellen-Einrichtung empfindlich für Blasen
sein. Um dieses Problem in dieser Einrichtung zu überwinden, wird ein
Seitenbehälter hinzugefügt, in dem Blasen nicht gebildet werden, und das
Harzniveau wird in der Seitenwanne erfaßt. Wenn jedoch eine Schicht von Harz auf einem schweren unvermischbaren Fluid getragen wird, wie
es in der US Patentanmeldung Nr. 365,444 beschrieben ist, kann das Harzniveau in dem Seitenbehälter eine nicht genaue Bestimmung des
Harzniveaus in der Hauptwanne sein, wie es angenommen wird. Dies
ist, da während dem Teilaufbauen, Harz in der Hauptwanne unproportional
verbraucht werden kann verglichen mit dem Seitenbehälter. Wegen dieser Disproportionalität kann die Flüssigkeit in dem Seitenbehälter,
wenn als ein ganzes gesehen, nicht so dicht sein, wie die in der Hauptwanne.
Dies kann dazu führen, daß das Harzniveau in dem Seitenbehälter fälschlich als zu hoch gelesen wird.
Um dieses Problem zu überwinden, wird eine Einrichtung, die einen
&iacgr;&ogr; Schwimmer umfaßt, in der SLA-500 eingesetzt, um k das Harzniveau in
der Hauptwanne zu erfassen anstelle der Bi-Zellen-Einrichtung^· die früher
beschrieben worden ist. Der Schwimmer hat den Vorteil, daß er relativ
unempfindlich gegenüber Blasen ist, und so verwendet werden kann, um das Niveau des Harzes in der Hauptwanne gegenüber einem Seitenbehälter
zu erfassen. Dies ist, da eine Blase, die an der Seite des Schwimmers hängt, nicht seine Masse ändern wird, und daher das Niveau
auf dem er schwimmt. Daher wird ein Seitenbehälter nicht benötigt und der Schwimmer wird genau das Harzniveau erfassen, auch wenn eine
Harzschicht auf einem schweren, undurchmischbaren Fluid schwimmt.
Der Schwimmer kann viele Formen haben. Für die SLA-500 ist der Schwimmer derzeit in der Form einer kleinen Dose, die ein Volumen
von ungefähr 50 cc oder mehr hat. Zusätzlich ist der Schwimmer vorteilhaft Teflon-beschichtet, so daß jedes Harz, das auf das Oberteil
kommt, oder die Seiten des Schwimmers benetzt, schnell abtropfen oder
abgleiten wird und nicht wesentlich die Masse des Schwimmers für eine nennenswerte Zeitperiode verändern wird.
Wenn eine Blase in der Lage wäre sich selbst unter dem Schwimmer anzubringen, würde dies eine fehlerhafte Niveaumessung verursachen, da
es das Ausmaß, zu dem der Schwimmer untergetaucht ist, verändern
könnte. In diesem Beispiel sind, um dieses Problem zu bekämpfen, andere Schwimmerentwürfe möglich, wie in Fig. 20 gezeigt, die Blasen
nicht ermöglichen würden, sich unter dem Schwimmer anzubringen.
Die Schwimmereinrichtung, die derzeitig verwendet wird in dem SLA-500,
ist in Fig. 21 veranschaulicht. Wie veranschaulicht weist die eine Richtung einen Schwimmer 602, einen Tragebalken 603, ein Lager 604 und
eine optische Erfassungsschaltung 605 auf. Wie gezeigt" ist der Tragebalken
mit dem Schwimmer gekoppelt, der auf der Harzoberfläche 601 schwimmt, die in der Wanne 600 angeordnet ist. Der Balkgn ist auch
vertikal drehbar um ein Lager 604. In der SLA-500, ist das Lager 604 vorteilhaft ein Lager der Klasse 9.
is Die optische Erfassungsschaltung 605 ist im Detail in Fig. 22 gezeigt.
Wie veranschaulicht umfaßt die Schaltung ein Glied 6051, das zu dem Balken 603 gekoppelt ist, lichtausstrahlende Dioden ("LEDs") 6052 und
6053, die Lichtstrahlen 6056 bzw. 6057 aussenden und optische Detektoren 6054 und 6055, die die ununterbrochene Anwesenheit von Lichtstrahlen
6056 bzw. 6057 erfassen. Die optischen Detektoren sind elektronisch
mit einem Tauchkolben oder einer anderen Einrichtung (nicht gezeigt), die früher beschrieben wurde, gekoppelt zum Heben oder
Absenken des Harzniveaus in Antwort auf elektrische Signale von den optischen Detektoren.
Jede Änderung in dem Niveau des Fluides wird eine entsprechende vertikale Verschiebung des Schwimmers verursachen. Dies wiederum
wird den Balken 603 dazu veranlassen sich um das Lager 604 zu drehen, das das Glied 6051 dazu veranlaßt wird, vertikal um einen Abstand, der
eine Vergrößerung der Fluidverschiebung ist, sich zu verschieben.
Solange wie das Glied 6051, wie gezeigt, dazwischen angeordnet ist, und
keinen der beiden Lichtstrahlen 6056 und 6057 blockiert, deren ununterbrochene
Anwesenheit durch die optischen Detektoren 6054 bzw. 6055 erfaßt wird, wird angenommen, daß das Harzniveau auf der korrekten
Höhe ist. Nur wenn das Glied 6051 ausreichend abgelenkt wird, um den Durchgang eines der Lichtstrahlen zu seinem entsprechenden optischen
Detektor zu blockieren, was durch den Ausfall des optischen Detektors irgendwelches Licht von seiner entsprechenden LED aufzunehmen,
erfaßt wird, wird angenommen werden, daß das' Harz auf einem
&iacgr;&ogr; inkorrekten Niveau ist. In diesem Beispiel werden'ein Eintauchkolben
oder andere Einrichtungen, die elektrisch mit den optischen ^Detektoren
gekoppelt sind, entweder gehoben oder abgesenkt, um das Harzniveau und daher den Schwimmer, auf der korrekten Höhe zu positionieren.
Wenn der Strahl 6056 durch das Glied blockiert ist, was durch den
is optischen Detektor 6054 erfaßt werden wird, wird angenommen, daß das
Harzniveau zu niedrig ist, in welchem Falle ein Eintauchkolben oder ähnliches abgesenkt werden kann, bis das Harzniveau zu der korrekten
Höhe angehoben ist. Wenn der Strahl 6057 durch das Glied blockiert ist, was durch den optischen Detektor 6055 erfaßt werden wird, wird
angenommen, daß das Harzniveau zu hoch ist, in welchem Falle ein
Eintauchkolben oder ähnliches gehoben werden kann, bis das Harzniveau
zu der korrekten Höhe erniedrigt ist. Es sei bemerkt, daß sowohl die
Strahlen 6056 als auch 6057 nicht gleichzeitig durch das Glied 6051 blockiert werden können. Daher wird es selten, wenn überhaupt, eine
Zweideutigkeit bei dieser Einrichtung geben, in dem Beispiel, wo das Harzniveau an einer inkorrekten Höhe ist, hinsichtlich ob die richtige
Antwort darauf ist, das Harzniveau zu erhöhen oder abzusenken.
Die in der SLA-250 verwendete Wiederbeschichtungssoftware wird jetzt
beschrieben werden. Eine Spezifikation für die Software in der Form
eines Flußdiagrammes ist in Fig. 23 veranschaulicht. Vor der Verwendung
der Software muß ein Benutzer zuerst bestimmte Parameter spezifizieren,
die verwendet werden, um die Bewegung der Plattform zu steuern. Diese Parameter sind ZA, ZV, ZW und ZD. Wie in größerem
s Detail in der US Patentanmeldung S.N. 331,644 beschrieben, ist die
Plattform unter der Steuerung eines Computers, der als der PROZESS-Computer bekannt ist. ZA ist der Betrag, um den der Prozeß-Computer
erlauben wird, die Plattform zu beschleunigen oder abzubremsen, ZV ist
die maximale Geschwindigkeit, die der Plattform erlaubt wird zu erreichen
und ZD ist die Tiefe, um die die Plattform veranlaßt wird in das flüssige Harz vor dem Überstreichen übermäßig - einzutauchen. Wie
früher diskutiert worden ist, ist ZD typischerweise viel größer als eine Schichtdicke. ZW ist die Absetzverzögerung, die der Zeitbetrag ist, um
den der Prozeß-Computer angewiesen ist, zu warten, nachdem die Plattform
nach dem Überstreichen abgesenkt worden ist, um die obere Oberfläche der Harzschicht auf dem Oberteil des Teiles bei dem gleichen
Niveau wie das Harz in der Wanne zu plazieren. Der Prozeß-Computer wird den Zeitbetrag abwarten, der durch ZW vor dem Aushärten
des Harzes auf dem Oberteil des Teiles spezifiziert worden ist.
Neben diesen Parametern kann der Benutzer andere Variablen für jede
Schicht oder Bereich von Schichten einschließlich S.N. spezifizieren, was
die Anzahl von Überstreichungen pro Schicht ist, und GV, was für globale Geschwindigkeit steht, und anzeigt, daß alle Überstreichungen bei
der spezifizierten Geschwindigkeit gemacht werden sollen. Der Benutzer kann auch V1-V7 spezifizieren, was individuelle Geschwindigkeiten,
verbunden mit jeweiligen Überstreichungen 1-7, sind. Durch Einstellen dieser Werte zeigt der Benutzer an, daß er oder sie wünscht, daß die
Geschwindigkeit beim Überstreichen variieren soll.
Der Prozeß beginnt in Schritt 700, wenn die Schicht N gezeichnet wird.
Als nächstes, in Schritt 701, wird die Plattform unter die Harzoberfläche um ZD abgesenkt bei einer Geschwindigkeit, die durch ZA und ZV
bestimmt ist. In Schritt 703 ist eine Nach-Eintauch-Verzögerung implementiert,
um das Absetzen des Harzes zu erlauben, da die Plattform gerade bewegt worden ist.
In Schritt 704 wird ein Auslesen von dem Bi-Zellen-Detektor genommen
und für eine Vorspannung korrigiert, die von der Schaltung (identifiziert &iacgr;&ogr; als BCVAL-BIAS) eingeführt wird. Die Ablesung wird dann mit einer
oberen Grenze verglichen, als UPLIM identifiziert, und eüjer unteren
Grenze, als LOWLIM identifiziert. Wenn er zwischen diesen beiden Werten ist, wird angenommen, daß das Harzniveau auf der korrekten
Höhe ist.
Angenommen das Niveau ist auf der korrekten Höhe, in Schritt 705, dann wird ein Flag getestet, um zu sehen, ob gesetzt. Das Flag wird
gesetzt in Antwort auf eine Taste, die von dem Benutzer gedrückt wird,
die anzeigt, daß der Benutzer manuell Harz hinzugefügt oder von der
Wanne weggenommen hat. Unter der Annahme, das das Flag nicht gesetzt ist, in Schritt 708, wird eine Kontrolle gemacht, um zu bestimmen,
daß das SN, die Anzahl von Überstreichungen für die Schicht N+l, größer als 0 ist, und daß die Plattform noch in einer sicheren
Position ist, so daß die Klinge sie nicht berühren wird, während dem
Überstreichen. Die obere Grenze für die Plattformposition ist durch das Mnemonic NOSWEEP identifiziert.
Unter der Annahme, daß diese Bedingungen erfüllt sind, in Schritt 709,
wird ein interner Zähler SWEEP, zuerst zu 0 initialisiert und dann inkrementiert. In Schritt 712 wird eine Kontrolle gemacht, um zu
bestimmen, ob die Klinge an der Vorderseite oder Hinterseite der
Wanne ist Unter der Annahme, daß es die Vorderseite für den Augenblick
ist, in Schritt 713, wird die Klinge zu der Hinterseite der Wanne streichen gelassen (was ein Abstand ist, der mit SWEEPDIST spezifiziert
ist) bei einer Geschwindigkeit, die von dem derzeitigen Wert von SWEEP abhängen kann.
Wenn die Klinge den Hinterteil der Wanne erreicht hat, wird sie bei
dem gewöhnlichen Beispiel einen Schalter triggem, der mit dem Mnemonie
LIMIT SWITCH identifiziert ist. Unter der Annahme, daß der Grenzschalter aktiviert worden ist in Schritt 727, - wird eing. Kontrolle
gemacht, um zu bestimmen, ob alle die Überstreichungen, die durch SN
spezifiziert sind, für die Schicht durchgeführt worden sind. Unter der Annahme daß sie es nicht sind, wird ein Sprung zurück zu Schritt 709
is gemacht und der obige Zyklus wiederholt.
Zurückkehrend zu Schritt 714, in dem Falle wo der Grenzschalter nicht
aktiviert worden ist, wird die Klinge langsam nach hinten bei der Geschwindigkeit
von 0,5 inch/sek. bewegt und unter der Annahme, daß der Grenzschalter innerhalb zwei Sekunden aktiviert wird, wird ein Sprung zu
Schritt 722 gemacht. Unter der Annahme, daß er nicht aktiviert ist,
wird der Prozeß abgebrochen in Schritt 721.
Zurückkehrend zu Schritt 712, unter der Annahme, daß die Klinge an
dem Hinterteil der Wanne ist, in Schritt 717, wird die Klinge nach vorne
überstreichen gelassen bei einer Geschwindigkeit, die eine Funktion der
derzeitigen Überstreichungsanzahl sein kann, und in Schritt 718 wird eine Kontrolle gemacht, um zu sehen, ob der Grenzschalter aktiviert worden
ist. Unter der Annahme, daß er es wurde, wird ein Sprung zu Schritt 725 gemacht. Wenn er es nicht wurde, in Schritt 719, wird die Klinge
langsam nach vorne bei einer Geschwindigkeit von 0,5 inches/set bewegt,
und wenn der Grenzschalter innerhalb zwei Sekunden aktiviert wird, wird ein Sprung zu Schritt 722 gemacht. Wenn er es nicht ist,
wird der Prozeß in Schritt 721 abgebrochen.
Zurückkehrend zu Schritt 704, was richtig ist, nachdem die Plattform
(und das Teil) übermäßig unter die Harzoberfläche eingetaucht worden sind, wenn das Harzniveau nicht auf der geeigneten Höhe ist, wird eine
Kontrolle in Schritt 723 gemacht, um zu sehen, ob es "zu hoch oder zu
&iacgr;&ogr; niedrig ist. Wenn BCvAL-BIAS größer als UPLIM ^ist, ist das Harzniveau
zu niedrig und der Eintauchkolben muß dann abgesenkt werden. In Schritt 724 wird eine Kontrolle gemacht, um zu sehen, ob der Eintauchkolben
schon auf dem Boden der Wanne ist, und unter der Annahme daß er es nicht ist, in den Schritten 725 und 726 wird der
is Eintauchkolben abgesenkt, und die Eintauchkolbenposition, identifiziert
mit dem Mnemonic PLUNGPOS, wird aktualisiert. In Schritt 727 wird eine Verzögerung eingeleitet, um dem Harz zu erlauben sich abzusetzen,
und ein Sprung wird zu Schritt 704 gemacht, um das Harzniveau wieder
zu kontrollieren. Der obige Zyklus wiederholt sich dann.
Zurückkehrend zu Schritt 724, unter der Annahme, daß der Eintauchkolben
auf dem Boden der Wanne ist, dann ist der einzige Weg, um das Niveau zu erhöhen, Harz in die Wanne hinzuzufügen. In Schritt 732
wird das Niveau wieder kontrolliert und unter der Annahme, daß es noch zu niedrig ist, in den Schritten 733 bis 734, wird der Benutzer
gefragt, auf eine Taste zu drücken, die anzeigt, daß er oder sie manuell
Harz hinzufügen wird. Bis die Taste gedrückt wird, wird der Prozeß
leer laufen. Wenn die Taste gedrückt ist, wird ein Flag gesetzt (das gleiche Flag, das in Schritt 705 getestet wird). Während der Benutzer
vermutlich Harz zu der Wanne hinzufügt, in Schritt 739, wird der Prozeß
leer laufen bis das Harzniveäu auf dem derzeitigen Niveau ist. Wenn
es dies ist, in Schritt 740, wird eine Nachricht zu dem Benutzer gesandt,
die anzeigt, daß genug Harz hinzugefügt worden ist, und ein Sprung wird
zu Schritt 704 gemacht. Zurückkehrend zu Schritt 705, nachdem das Harz hinzugefügt worden ist, so daß das Harzniveau auf der korrekten
Höhe ist, muß das Flag zurückgesetzt werden. Diese Bedingung wird in den Schritten 705 und 706 erfaßt, und in Schritt 707 wird das Rag
zurückgesetzt.
&iacgr;&ogr; Zurückkehrend zu Schritt 723, in dem Falle wo BCVAL-BIAS kleiner als
LOWLIM ist, was anzeigt, daß das Harzniveau zu hoch ist, muß der Eintauchkolben gehoben werden. Eine Kontrolle wird gemacht in Schritt
728, um zu sehen, ob der Eintauchkolben schon an seiner höchstmöglichen
Position ist, angezeigt durch 0. Unter der Annahme, daß er es
is nicht ist, in den Schritten 729 - 730, wird der Eintauchkolben angehoben
und die Eintauchkolbenposition, identifiziert als PLUNGPOS, wird aktualisiert. Dann, in Schritt 731, wird eine Absetzverzögerung eingeleitet,
und ein Sprung wird zurück zu Schritt 704 gemacht.
Zurückkehrend zu Schritt 728, unter der Annahme, daß der Eintauchkolben
schon an seiner höchsten Position ist, und nicht mehr angehoben werden kann, muß dem Benutzer angezeigt werden, etwas Harz in der
Wanne zu entfernen. In Schritt 741 wird eine Kontrolle gemacht, um
zu bestimmen, daß das Harzniveau noch zu hoch ist, und in den Schritten
742 - 743 wird dem Benutzer eine Nachricht gesandt, die ihn oder
sie auffordert, das Harz zu entfernen, und er wird gebeten eine Taste zu
drücken um die Nachricht zu bestätigen. Bis die Taste gedrückt wird,
wird der Prozeß leer laufen. Wenn die Taste gedrückt wird, in Schritt
744, wird ein Rag gesetzt und in Schritt 745, während der Benutzer das
Harz entfernt, wird das Harzniveau kontrolliert, bis es auf der geeigneten
Höhe ist..
Bis es dies ist, wird der Prozeß leer laufen. Wenn das Niveau auf
seiner korrekten Höhe ist, in Schritt 746, wird dem Benutzer angezeigt, aufzuhören Harz zu entfernen, und ein Sprung zurück zu Schritt 704
wird gemacht. In den Schritten 705 - 707, wie früher diskutiert, wird
das Rag zurückgesetzt.
&iacgr;&ogr; Man bemerke, daß das Nivellieren nicht bei jeder Schicht durchgeführt
werden muß, sondern nur, wenn das Niveau sich geändert haben kann,
aufgrund irgendeinem des folgenden: 1) thermische Ausdehnung; 2) Schrumpfen; und 3) Änderung der Verschiebung, verursacht durch Plattformträger.
Wenn nichts von diesem vorhanden ist, muß das Nivellieren
is nicht für eine Schicht durchgeführt werden.
Zu Schritt 749 hinkehrend, wenn alle die Überstreichungen für die Schicht aus N+1 durchgeführt worden sind, wird eine Absetzverzögerung
gleich ZW eingeleitet werden, und in den Schritten 750 - 751, werden
die Vektoren für die Schicht N+1 berechnet, und die Schicht, die diese
Vektoren verwendet, in Schritt 751 gezeichnet. Mehr Detail über das
Berechnen der Vektoren und Zeichnen der Schichten ist in der US Patentanmeldung S.N. 331,644 bereitgestellt.
Der obige Zyklus wird dann für den gesamten Rest der Schichten des
Teiles wiederholt
Ein Listing der Wiederbeschichtungssoftware, Version 3.60, das in der
SLA-250 verwendet wird, wird jetzt bereitgestellt werden. Die Software
weist die folgenden Module auf, die in Turbo Pascal geschrieben sind,
von denen jedes wiederum aufgelistet ist:
Modul
UTLS WEEP.PAS
&iacgr;&ogr; SINSTEP.PAS
MACHINE.PRM
AUTOLEVELPAS
UTLAD JUST.PAS
RECOATER.PAS steuert Überstreichen während dem Teilaufbau;
verwendet in Verbindung mit BUILD
erlaubt Sinuswellen-Abstufung der.. Platform während dem Wiederbeschichten
erlaubt Sinuswellen-Abstufung der.. Platform während dem Wiederbeschichten
umfaßt Überstreichparameter input/default
führt Nivellieren zwischen dem Zeichnen der Schichten durch
verwendet um das Harzniveau vor dem Aufbauen eines Teiles einzustellen
führt Nivellieren zwischen dem Zeichnen der Schichten durch
verwendet um das Harzniveau vor dem Aufbauen eines Teiles einzustellen
verwendet obige Programme, um eine Wiederbeschichtungshandlung extern zu BUELD
durchzuführen.
Wie in mehr Detail in der U.S. Patentanmeldung S.N. 331,644 beschrie-30
ben, ist BUILD das Programm, das das Aufbauen eines Teiles leitet.
Wie oben angezeigt, werden die Programme, in dem gewöhnlichen
Beispiel; in Verbindung mit BUILD verwendet. Zusammen werden diese
Programme eine Funktionalität bereitstellen die im wesentlichen ähnlich zu der oben beschriebenen mit Bezug auf Fig. 23 ist RECOATER.PAS
stellt jedoch eine Einrichtung bereit, um Wiederbeschichten unabhängig
von BUILD durchzuführen. Die Softwarelistings folgen:
unit UTLSWEEP;
3D Systems Stereolithography System Software
UTLSWEEP.INC
SLA Recoater blade and plunger Utility include file.
11/15/88 GOF File created.
11/28/88 GOF Updated for production SLA250 board.
11/30/88 GOF Add BldSweep.inc, solidify interfaces with
Richard. Its his fault!
01/03/89 GOF Comment out all if keypressed from sweeper
code.
01/13/89 GOF Put MonitorLaserBeamDrift as a part of PD,
postdipdelay.
01/18/89 GOF Integrate with Jon's SLA 500 version.
01/24/89 JFT If requested speed is > MaxSäfeSineSpeed
then we use the old square-wave steps to move the recoater, but if it's
<= it then we use sine-wave stepping from SINSTEP.PAS unit, which we now USE here. Both
methods changed to correct speed parameters to correct velocity.
01/31/89 JFT Pass ZAccel & ZVeloc as parameters to ZFreeMove & ZMoveGivenDistance.
01/27/89 GOF Add PD2, the second post dip delay for set
plunger proc.
01/31/89 GOF Add routine to read and write Machine.prm
(MaxBladeMoves)
02/01/89 GOF Add PD2, DrainAccel, and DraiQVeloc to
sweep.prm.
02/07/89 GOF Add XP support, (extra Platform) Also change Veloc to Floatt.
02/24/89 GOF Add exit to SetPlunger if its OK the first ReadBiCell.
02/27/89 GOF Minor cleanup and comments.
0 03/07/89 JFT On PlungerUp full stroke, add better assurance of getting to top. Echo stall message if we
don't reach it.
03/17/89 JFT It's only fitting that I'm writing this on
a green display. To accomodate the SLA-500, MaxPlungeMoves has become greater than maxlnt. So,
variables in this unit that take assignment from MaxPlungeMoves are transformed to longint.
04/10/89 JFT Change Velocity to Period.
05/22/89 JFT Change blade malfunction alert to allow user to reposition blade.
07/05/89 JFT Single Coil Holding Torque.
09/20/89 JFT/RAG Added Sweeper Calibration procedure
and support for NCR.
interface
uses CRT,DOS,UTILITY1,UTLZSTAGE,SINSTEP,BUILDVAR;
{ math coprocessor support }
{$IFOPT N+}
{$DEFINE COP}
{$ELSE}
{$ELSE}
{$UNDEF COP} {$ENDIF} type
{$IFDEF COP} ;
FloatType = Single;
{$ELSE} - £
FloatType = Real; {$ENDIF}
{$1 product.inc}
const
20 { MaxPlungeMoves = 3000; }{ for the silver screw } { Now
in product.inc. }
{ MaxPlungeMoves = 2800; for the gold screw }
{ MaxPlungeMoves = 2800; for the gold screw }
defaultPeriod minplungemoves
3; { seconds per sweep } = 1;
minPeriod maxPeriod
0.1;
10;
10;
Bits: array[0..3] of Byte = ($09,$0A,$06,$05);
var
{ global variables}
NoSweep : boolean;
PlungerPos from integer for 500. }
: longint; { Made longint
MachineType
MaxBladeMoves
DefaultPlungerStepsPerMii
string; integer; real;
{ file contents }
NumSweeps
Period
BladeGap
Bias
Bias
PlungeMotorDelay
PlungStart
UpLim
LowLim
BladeGapLO
BladeGapLO
PostDipDelay
NumChecks
PD2
XP
SHOWSWEEP
SHOWSWEEP
ProcessSpeedM
integer
array[1
array[1
integer;
integer;
FloatType
integer;
integer;
FloatType
integer;
integer;
integer;
FloatType
boolean;
Real ;
7] of FloatType; 7] of integer;
{ not used }
procedure ReadSWEEPxPRMfile; procedure ReadMACHINExPRMfile;
procedure WriteMACHINExPRMfile;
procedure SweeperBack(period : real; StopCode : integer);
procedure SweeperForward(period: real; StopCode :
integer);
30 procedure MoveBlade(period: real; StopCode:integer);
30 procedure MoveBlade(period: real; StopCode:integer);
procedure PlungerHoldingTorque; {Use after any plunger
move of 1}
procedure PlungerDown(numMoves : longint; var StopCode :
integer);
35 procedure PlungerUp(numMoves : longint; var StopCode :
35 procedure PlungerUp(numMoves : longint; var StopCode :
integer);
procedure InitSweeperandPlunger(option:integer;var
StopCode : integer);
procedure InitSweeper(option:integer;var StopCode :
integer);
procedure ReadBiCell(recurs:char;var FinalLevel:integer) ;
procedure WhichBladeLimit(var LimitSwitch: integer);
{ procedure AddRemoveResin(var FinalLevel: integer); }
procedure SetPlunger(numSetPlungers:integer;var
FinalLevel:integer );
procedure DoSweep(DipDepth,LayerDepth:real;
procedure DoSweep(DipDepth,LayerDepth:real;
RelaxationTime:integer); ·
procedure expSweeperBack(speed:real);
procedure expSweeperForward(speed:real); c.
procedure expMoveBlade(period:real); procedure SweepCal;
implementation
const
LnSteps: array[1..6O] of Integer (400,200,100,060,50,45,40,35,30,25,20,18,16,14,12,10,10,
8,8,8,8,6,6,6,5,5,5,4,4,4,4,4,3,3,3,2,2,2,2,2,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0);
25
25
SwepCoil = $309;
SweepLim = $308;
SweepLim = $308;
defaultBladeGap | = 100; { | percent } |
30 defaultBias | = 0; | |
defaultPlungeMotorDelay | = 8; | |
defaultPlungStart | =3.5; { | inches - not used |
now } | ||
defaultUpLim | = 5; | |
35 defaultLowLim | = -5; | |
defaultBladeGapLO | = 0.125; | { inches between |
liquid and blade } |
defaultPostDipDelay | = 3; | .8« | { seconds } | • |
defaultNumChecks | = -l; | • 81 | { automatic mode } | * |
defaultPD2 | = 2; | .0· | • | |
defaultDA | = 1O | i; | ||
defaultDV | = 1O | |||
defaultXP | - 1O | |||
SweepDist | = 12. | |||
10 var
Steplter : integer; SweepStep : integer; PlungeStep : integer;
delaytime : integer; junkl,junksc : integer;
j unkKey : char;
procedure SweepDefaults; var
i, code : integer; begin
NumSweeps := 1; for i := 1 to 7 do begin Periodfi] := defaultPeriod;
BladeGapfi] := defaultBladeGap;
end;
Bias := defaultBias;
PlungeMotorDelay := defaultPlungeMotorDelay;
PlungStart UpLim LowLim BladeGapLO to mm }
PostDipDelay NumChecks
:= defaultPlungStart;
:= Bias + defaultUpLim; := Bias + defaultLowLim; = defaultBladeGapLO * 25.4
:= Bias + defaultUpLim; := Bias + defaultLowLim; = defaultBladeGapLO * 25.4
{ convert
:= defaultPostDipDelay; := defaultNumChecks; { automatic mode
PD2 : = defaultPD2;
DrainAccel := defaultDA;
DrainVeloc := defaultDV;
XP := RealVal (def aultXP, code.) -r
ShowSweep := false; end;
&igr; J
procedure ReadSWEEPxPRMfile; const
anyfile = $3F;
anyfile = $3F;
var ·
't. SweepFile : Text;
Line : String; c-
i,j j,kk,index : integer;
Dirlnfo : searchRec;
begin
If ShowSweep then writeln (' Reading machine.prm
file. ·);
FindFirst('\3dsys\Machine.PRM1,anyfile,Dirlnfo);
if DosError <> 0 then begin window(1,1,80,25);
ClrScr;
gotoxy(l,21); writeln;
gotoxy(l,21); writeln;
writeln(' ERROR: Machine.PRM not found.
UserWait; HaIt(I); end;
assign(SweepFile,'\3dsys\Machine.prm1);
reset(SweepFile); i := 0;
repeat
repeat
readln(sweepFile,line) until line = 'SWEEP.PRM1;
while (Not Eof(SweepFile)) and (i <= 27) do begin
readln(SweepFile,line);
if"line[lj <> ·!· then inc(i);
readln(SweepFile,line);
if"line[lj <> ·!· then inc(i);
if i = 1 then begin
NumSweeps: =
IntVal(copy(line,l,pos(·!·,line)-1),jj);
end;
if (i >= 2) and (i <= 15) then begin
end;
if (i >= 2) and (i <= 15) then begin
if (i mod 2) = 0
then Period[i div 2]:=RealVal(copy(1ine,l,pos('!·,line)-l),jj)
else BladeGap[i div
2]: =round(RealVal (copy (1 ine, l,pos( · 1 · ,line)-l) , J1J)) ;
{) { BladeGap[i div 2]:=(l/1000) * (25.4) * BladeGap[i div 2]; }
{ covert mils to mm }
if (BladeGap[i div 2] <= 0)
then BladeGap[i div 2] := 0;
if (BladeGap[i div 2] > 999)
then BladeGap[i div 2] := 999;
if (BladeGap[i div 2] <= 0)
then BladeGap[i div 2] := 0;
if (BladeGap[i div 2] > 999)
then BladeGap[i div 2] := 999;
end;
case i of
case i of
16 : Bias : =
IntVal(copy(1ine,l,pos(··',line)-l),jj) ;
17 : P1ungeMotorDe1 ay :-
IntVal(copy(1ine,l,pos(·!·,line)-l),jj);
18 : PlungStart : =
RealVal(copy(1ine,1,pos('··,line)-l),jj);
19 : UpLim : =
IntVal (copy (1 ine, l,pos(·! \line)-l) , j j) ;
20 : LowLim : =
IntVal(copy(line,l,pos(·!',line)-l),jj);
2 1 : BladeGapLO : =
(25.4)*RealVal(copy(line,l,pos(·!',line)-l),jj);
{ convert inches to mm }
{ convert inches to mm }
{){ 22 : postDipDelay :=
IntVal(copy(line,1,pos(·!',line)-l),jj); }
, . ST
2 2 .;;■· : NumChedks : =
IntVal(copy(1ine,l,pos(·&iacgr;·,line)-l),j j);
{}{ 24 : PD2 :=
IntVal( copy (line ,1,POsC ! ',line)-l), jj) ; } --·
23 : DrainAccel:= copy(line,l,pos(· ',line)-l);
23 : DrainAccel:= copy(line,l,pos(· ',line)-l);
24 : DrainVeloc:= copy(line,l,pos(· ',line)-l);
25 XP := RealVal(copy(line,l,pos('!·,line)-1),jj);
26 : ShowSweep := ( upcase(line[l]) = 1S' );
end;
end;
end;
'r.
Close(SweepFile);
Close(SweepFile);
for i := 1 to 7 do begin - <;■
if (Period[i] > maxSweepPeriod) then Period[i] :=
maxSweepPeriod;
if (Period[i] < minSweepPeriod) then Period[i] := minSweepPeriod;
end;
end;
UpLim := Bias + UpLim;
LowLim := Bias + LowLim;
if showsweep then begin
if showsweep then begin
writeln('Here are the gap percentages—·);
for i := 1 to 7 do writeln( 'Gap1, i, · is 1,BladeGapfi]);
end;
for i := 1 to 7 do writeln( 'Gap1, i, · is 1,BladeGapfi]);
end;
ZSafeSweep := ZBladeLevel + 0.060 {warp tolerance + 10
mils} + XP;
end;
end;
&zgr;******************************************************} procedure ReadMACHINExPRMfile;
const
const
anyfile = $3F;
var
var
SweepFile : Text;
Line : String;
i,jj,kk,index : integer;
Line : String;
i,jj,kk,index : integer;
$6
Dirlnfo : searchRec;
Dirlnfo : searchRec;
begin
If ShowSweep then writeln (· Reading^MACHINE.PRM
file. ·);
FindFirst(·\3dsys\Machine.PRM·,anyfile,Dirlnfo);
if DosError <> 0 then begin
window(l,l,80,25) ;
CIrSer;
gotoxy(l,21) ;
window(l,l,80,25) ;
CIrSer;
gotoxy(l,21) ;
writeln; ·-
writeln(' ERROR: Machine.prm not found.
IN.
UserWait;
HaIt(I);
HaIt(I);
end;
{ }
{ }
assign(SweepFile,'XSdsysXMachine.pnn1);
reset(SweepFile);
i := 0;
repeat
i := 0;
repeat
readln(SweepFile,line)
until line = ·MACHINE.PRM·;
until line = ·MACHINE.PRM·;
while (Not Eof(SweepFile)) and (i < 3) do begin readln(SweepFile,line);
if linefl] <> ·!· then inc(i);
case i of
1 : begin
case i of
1 : begin
MachineType := copy(1ine,1,7);
ProcessSpeedM := RealVal(copy(line, 8, 8), jj) ;
end ;
2 : MaxBladeMoves :=
IntVal(copy(line,l,pos('!',line)-l),jj);
3 : DefaultPlungerStepsPerMil :=
RealVal(copy(1ine,l,pos('!·,line)-l),jj);
end;
«&pgr;»
end; ._·.·■■
close(sweepFile); end;
{
procedure WriteMACHINExPRMfile; const
ParamFileName = 'XSDSYSXMACH
NewName = '\3DSYS\MACHINE.PRM·;
10
var
IOerr,i,m,n,valcode : integer; j : longint;
r : real;
ParamFileLine, AppendText : str80;
r : real;
ParamFileLine, AppendText : str80;
ParamFile,NewFile: text; Dirlnfo : SearchRec;
InputLine : string; 20
begin
OpenParamFile := ParamFileName;
assign(ParamFile,OpenParamFile); rewrite(ParamFile);
assign(NewFile,NewName); reset(NewFile);
while not eof(NewFile) do begin readln(NewFile,InputLine);
writeln(ParamFile,InputLine); end;
rewrite(NewFile);
IOerr := IOresult; if IOerr <> 0 then begin
OpenParamFile := ParamFileName; assign(ParamFile,OpenParamFile);
reset(ParamFile);
IOerr := IOresult;
if IOerr &ogr; 0 then OpenParamFile := ' ·
end; {10 error)
if IOerr = 0 then begin
i := 0;
i := 0;
reset(ParamFile);
repeat
repeat
readln(paramFile,paramFileLine); writeln(newFile,paramFileLine);
until paramFileLine = 'MACHINE.PRM';;
readln(paramFile,paramFileLine);
while (paramFileLine[1] = · ') or (paramFileLine[1]
= ·!·) do
begin
begin
writeln(newFile,paramFileLine); readln(paramFile,paramFileLine);
end;
writeln(newFile,paramFileLine); { This is the machine model #. }
Str(MaxBladeMoves,paramFileLine);
writeln(newFile,paramFileLine+1 1 Maximum blade
steps to cross vat');
readln(paramFile); { We just wrote a new val here
so throw old away. )
while not eof(paramFile) do
begin
begin
readln(paramFile,paramFileLine);
writeln(newFile,paramFileLine); 0 end;
end;
end;
close(NewFile);
close(ParamFile);
end;
35
close(ParamFile);
end;
35
procedure RotateStep(DirStep: Integer;var · InputByte:
Integer);
begin ' "'■
begin ' "'■
Steplter := ((Steplter + DirStep) + 4) mod 4^
InputByte := Bits[Steplter];
end;
end;
procedure BenDelay(del:integer);
var
var
&khgr; :integer;
i :integer; *
j :integer;
-Cf
begin ~
X := 0;
j := 0;
repeat
INC(X);
j := 0;
repeat
INC(X);
for i := 1 to 10 do inc(j); { 100 us } until X>= del;
end ;
end ;
function SweeperParameter(period : real): real;
{ Feed this the desired period and it will return the appropriate parameter }
{ to sweep at that period. You then feed that # to the appropriate }
{ sweeper moving procedure.
)
)
var
RoundPeriod : integer;
sweeperParam : real;
sweeperParam : real;
begin
RoundPeriod := round(period);
RoundPeriod := round(period);
if RoundPeriod < minSweepPeriod then RoundPeriod :=
minSweepPeriod;
if RoundPeriod > maxSweepPeriod then RoundPeriod maxSweepPeriod;
{ SineMoves
(* check for the machine type so the appropiate *) (* Parameter Value for the blade sweep is assigned *)
if ((ProcessSpeedM * 10) < 1) then
(* WYSE 286 values *)
case RoundPeriod of
(* WYSE 286 values *)
case RoundPeriod of
1 : sweeperParam := periodlParam; { SquareMoves start here. }
2 : sweeperParam := period2Param;·
3 : sweeperParam := period3Param,**
4 : sweeperParam := period4Param; _„
5 : sweeperParam := periodSParam; *~ 6 : sweeperParam := periodöParam;
7 : sweeperParam := period7Param; start here. }
8
9
8
9
10
11
12
13
14
11
12
13
14
25 15
16
else
begin
else
begin
if (RoundPeriod > 16) and (RoundPeriod < 21) then sweeperParam := periodl6Param
((RoundPeriod - 16) * ((periodl6Param-period21Param)/4)); if (RoundPeriod
> 20) and (RoundPeriod < 31) then sweeperParam := period21Param
((RoundPeriod - 20) * ((period21Param-period30Param)/10));
sweeperParam
sweeperParam sweeperParam sweeperParam sweeperParam sweeperParam sweeperParam
sweeperParam sweeperParam sweeperParam
= periodSParam;
= period9Param;
= periodlOParam; = periodllParam; = periodl2Param; = periodl3Param; = periodl4Param; = periodlSParam; = periodl6Param;
= period9Param;
= periodlOParam; = periodllParam; = periodl2Param; = periodl3Param; = periodl4Param; = periodlSParam; = periodl6Param;
end;
end
end
else (* NCR 386 VALUES *)
(* all NCR 386 values are sine moves *)
case RouhdPeriod of
case RouhdPeriod of
1 : sweeperParam := 1.2 ; 2 : sweeperParam := 1.2 ;
3 : sweeperParam := 1.2 ; 4 : sweeperParam : =
0.8 ;
5 : sweeperParam := 0.6 ; 6 : sweeperParam := 0.5 ;
7 : sweeperParam := 0.4 ; 8 : sweeperParam :=
0.35 ; :
9 : sweeperParam := 0.31 ; 10 : sweeperParam : = 0.26 ; - -c·
11 : sweeperParam := 0.245 ; 12 : sweeperParam : = 0.22 ;
13 : sweeperParam := 0.205 ; 14 : sweeperParam : = 0.19 ;
15 : sweeperParam :- 0.18 ; 16 : sweeperParam : =
0.16 ;
17 : sweeperParam := 0.152 ; 18 : sweeperParam :=0.1375;
19 : sweeperParam := 0.135 ; 20 : sweeperParam : = 0.13 ;
21 : sweeperParam := 0.12 ; 22 : sweeperParam :=0.115 ;
23 : sweeperParam := 0.11 ; 24 : sweeperParam :=0.105 ;
25 : sweeperParam := 0.1 ; 26 : sweeperParam :=0.097 ;
27 : sweeperParam := 0.0935 ; 28 : sweeperParam : = 0.09 ;
29 : sweeperParam := 0.087 ; 30 : sweeperParam :=0.085 ;
end (* case NCR 386 *) ;
35
35
SweeperParameter := sweeperParam;
end;
end;
^***************************************************^
function SweeperSqrVelocity(vel:real):real;
{ Converts a velocity in inches per second to the sweepers private units. Smaller trueVels correspond-to greater
velocities. }
{ This function is no longer used. }
var
trueVel : real;
begin
begin
if vel <= 1 then trueVel := 76 :
else if vel <= 2 then trueVel := (vel - 1) * (36-76) + 76 Nielse if vel
<= 3 then trueVel := (vel - 2) * (23-36) + 36
else if vel <= 4 then trueVel := (vel - 3) * (17-23) + 23
else if vel <= 5 then trueVel := (vel - 4) * (12-17)
+ 17
else if vel <= 6 then trueVel := (vel - 5) * (10-12) + 12
else if vel <= 7 then trueVel := (vel - 6) * (9-10)
+ 10
else if vel <= 8 then trueVel := (vel - 7) * (7-9) 25+9
else if vel <= 9 then trueVel := (vel - 8) * (6-7)
+ 7
else if vel <= 10 then trueVel := (vel - 9) * (6-7) + 7
else trueVel := 5;
else trueVel := 5;
SweeperSqrVelocity := truevel; end;
procedure SweeperBack(period : real; StopCode : integer);
{ StopCode 0 = normal return ( could be the limit )
1 = abnormal - limit hit before completed move ( ZStage ) .
2 = abnormal - keypressed
3 = stall }
var
var
: integer;
key : char;
speed : real;
begin
key : char;
speed : real;
begin
speed := SweeperParameter(period); {speed holds a raw
parameter now} -
if period < MinSafeSinePeriod then begin delaytime := trunc(speed); - ^0
if (ZStagePos < ZSafeSweep) then exit; port[Sweeplim] := $FF;
i := 0;
i := 0;
if ShowSweep then writeln(· SWEEPER BACK ');
repeat
if (port[SweepLim] and $40) <> $40 then begin port[SwepCoil] := $00;
BladePos := MaxBladeMoves;
StopCode := 0;
exit; { hit limit switch }
end;
inc(BladePos);
StopCode := 0;
exit; { hit limit switch }
end;
inc(BladePos);
if i <= 59 then inc(i) { ramp up
else if BladePos > (MaxBladeMoves - 60) { ramp down }
then i := MaxBladeMoves - BladePos + 1;
then i := MaxBladeMoves - BladePos + 1;
rotatestep(l,Sweepstep);
port[Swepcoil] := {(port[Swepcoil] and $F3) or} (sweepstep and $0F) ;
BenDelay(delaytime + LnSteps[i]); until {(keypressed) or } (BladePos >= MaxBladeMoves); port[SwepCoil] := $00;
BenDelay(delaytime + LnSteps[i]); until {(keypressed) or } (BladePos >= MaxBladeMoves); port[SwepCoil] := $00;
CM
{ if keypressed then begin
key := Readkey;
StopCode := 2;
key := Readkey;
StopCode := 2;
end; } _ .
if BladePos >= MaxBladeMoves then begin
if ShowSweep then writeln(' *** ERROR : STALL in Sweeper Back ');
delay(1000);
beep;
BladePos := MaxBladeMoves;
beep;
BladePos := MaxBladeMoves;
StopCode := 3; ;
end; *'
end - c.
else sinemove(MaxBladeMoves,speed,'&ggr;','&ggr;',stopcode) ;
end;
procedure SweeperForward(period : real; StopCode : integer);
var
var
i : integer;
key : char;
speed : real;
begin
key : char;
speed : real;
begin
speed := SweeperParaneter(period); {speed holds a raw
parameter now)
if period < MinSafeSinePeriod then begin delaytime := trune(speed);
if (ZStagePos < ZSafeSweep) then exit; portfSweeplim] := $FF;
i := 0;
if (ZStagePos < ZSafeSweep) then exit; portfSweeplim] := $FF;
i := 0;
if ShowSweep then writeln(· SWEEPER FORWARD ');
repeat
if (port[SweepLim] and $20) <> $20 then begin port[SwepCoil] := $00;
BladePos := 0;
StopCode := 0;
StopCode := 0;
exit; { home, limit switch }
end;
dec(BladePos); if i <= 59 then inc(i) { ramp up
else if BladePos < 60 { ramp down }
then i := BladePos + 1; rotatestep(-l,sweepstep); port[Swepcoil] := {(port[Swepcoil] and $F3) or
}(sweepstep and $0F);
BenDelay (delaytime + LnSteps[i]); '· until {(keypressed) or } (BladePos
<= rf) ; port[SwepCoil] := $00; - _,-.
{ if keypressed then begin key := Readkey;
StopCode := 2; end; }
if BladePos <= 0 then begin if ShowSweep then writeln(· *** ERROR : STALL in Sweeper Forward '); BladePos := 0; StopCode := 3; beep ;
if BladePos <= 0 then begin if ShowSweep then writeln(· *** ERROR : STALL in Sweeper Forward '); BladePos := 0; StopCode := 3; beep ;
delay(lOOO); 5 end;
end
else sinemove(MaxBladeMoves,speed,'r','11,stopcode); { We
should never reach } { this point.
end;
/*****************************************************
procedure MoveBlade(period : real; StopCode:integer);
var
RoundPeriod : integer;
sweeperParam : real;
begin
begin
{ Determine machine type. }
if ( ProcessSpeedM * 10 ) >= 1 then { NCR 920 } {Too cool! JFT)
begin
begin
if BladePos <> 0 then expsinemove( MaxBladeMoves ,
SweeperParameter( period ) , 'r1 )
else expsinemove( MaxBladeMoves , SweeperParameter( period ) , 1I' );
end else begin
{ Wyse 286 )
{ Wyse 286 )
if period >= MinSafeSinePeriod - &idiagr;·
then if BladePos <> 0 then expsinemove(MaxBladeMoves,SweeperParameter(period),'r1)
else expsinemove(MaxBladeMoves,SweeperParameter(period),1I1)
else if BladePos <> 0 then sweeperforward(period,StopCode)
else sweeperback(period,StopCode);
else sweeperback(period,StopCode);
end;
end;
end;
V )
procedure PlungerHoldingTorque;
begin
begin
if Steplter >= $09
then port[SwepCoil] := ( $08 * 16 and $F0 ) else port[SwepCoil] := ( $04 * 16 and $F0 );
0 end;
procedure PlungerDown(numMoves : longint; var StopCode :
integer);
(*** numMoves of 0 means go to Plunger limit ***} var
i,j,k : integer;
m : longint; {} {.Changed from integer to" accomodate
SLA-500. }
begin
begin
if PlungerPos >= MaxPlungeMoves then exit;
if numMoves <> 1 t h e &eegr; Read3DStateFile(ZStagePos,PlungerPos,JunkSC);
if ShowSweep then writeln(· MOVING PLUNGER DOWN setting level.');
if numMoves = 0 then m := MaxPlungeMoves else m : = numMoves;
port[SwepCoil] := ( plungeStep * 16 ana $F0 );
repeat - ^
repeat - ^
inc(k);
for j := 1 to minplungemoves do begin
rotatestep(l,plungestep);
rotatestep(l,plungestep);
port[Swepcoil] := {(port[Swepcoil] and $F0) or} (plungestep*16 and $F0);
delay(PlungeMotorDelay);
0 end;
0 end;
inc(PlungerPos);
until (k >= m) or (PlungerPos >= MaxPlungeMoves);
if numMoves <> 1 then PlungerHoldingTorque;
{ if numMoves <> 1 then }
if numMoves <> 1 then PlungerHoldingTorque;
{ if numMoves <> 1 then }
Update3DStateFile(ZStagePos,PlungerPos,JunkSC);
end;
end;
&zgr;***************************************************}
procedure PlungerUp(numMoves : longint; var StopCode : integer);
procedure PlungerUp(numMoves : longint; var StopCode : integer);
{*** numMoves of 0 means go to Plunger limit ***}
var
var
i,j,k : integer;
m : longint;
m : longint;
HitLimit : boolean;
begin
begin
HitLimit := false;
PlungerStalled :=., false;
{ If moving up full stroke, set the plunger position to twice
MaxPlungeMoves give greater assurance that the plunger reaches the top. }
StopCode := 1; { Default to stall, set to 0 when we hit switch. }
if PlungerPos <- 0 then exit;
if numMoves <>1 then Read3DStateFile(ZStagePos,PlungerPos,JunkSC);
if numMoves = 0 then PlungerPos := 2 * MaxPlungeMoves; if ShowSweep then writeln(· MOVING PLUNGER UP
setting level. ') ; ■ ^o
setting level. ') ; ■ ^o
if numMoves = 0 then m := 2 * MaxPlungeMoves else m :=
numMoves;
k := 1;
k := 1;
port[SwepCoil] := ( plungeStep * 16 and $F0 );
repeat
repeat
inc(k);
for j := 1 to minplungemoves do begin
rotatestep(-l,plungestep);
port[Swepcoil] := {(port[Swepcoil] and $F0) or }(plungestep*16 and $F0);
port[Swepcoil] := {(port[Swepcoil] and $F0) or }(plungestep*16 and $F0);
delay(PlungeMotorDelay);
5 end;
5 end;
dec(PlungerPos);
if (portfSweepLim] and $80)
<> $80 then begin
port[SwepCoil] := $00;
PlungerPos := 0;
StopCode := 0;
HitLimit := true;
port[SwepCoil] := $00;
PlungerPos := 0;
StopCode := 0;
HitLimit := true;
{ Update3DStateFile OK for numMoves = 1 }
Update3DStateFile(ZStagePos,PlungerPos,JunkSC); exit; { plunger top limit switch }
end;
Update3DStateFile(ZStagePos,PlungerPos,JunkSC); exit; { plunger top limit switch }
end;
until (k >= m) or ( PlungerPos <= 0);
if numMoves <> 1 then PlungerHoldingTorque;
{ If this was a full-stroke move, check to see if we hit the limit switch. If we didn't, then display that
situation according to OpMode. }
if numMoves = 0 then begin —
if not HitLimit then PlungerStalled := true;
end;
{ if numMoves <> 1 then }
Update3DStateFile(ZStagePos,PlungerPos,JunkSC); end;
10
10
procedure ReadBiCell (recurs:char;var FinalLevel: integer) ;
{*** recurs = R = recursive readings to check validity
N = non-recursive reading S= average of 5 simple straight bi-cell
values with no validity checks ***} const
LevelReading = 128;
var
b,i,j,count,k,newlevel,sum,stopcode : integer;
var
b,i,j,count,k,newlevel,sum,stopcode : integer;
junkstr,sign : string;
begin
begin
count := 1;
if Recurs = 1S1 then count := 5;
sum := 0;
for k := 1 to count do begin
port[780] := 12; { addr ADC port = 780 has 16 channels, use 5 }
for i := 1 to 100 do inc(j); { 10 us } i := 0;
repeat
repeat
inc(i);
b := port[$310];
newLevel := port[$30C];
newLevel := port[$30C];
until (b<128) or (i>2000); {re-repeat this loop} NewLevel := NewLevel - LevelReading;
FinalLevel .: = NewLevel;
sum := sum +FinalLevel;
if ShdwSweep then begin
{} {writeln(· NewLevel =',NewLevel,'
sum := sum +FinalLevel;
if ShdwSweep then begin
{} {writeln(· NewLevel =',NewLevel,'
clrscr;
if NewLevel > O then sign := '-1 else sign := ' + ·;
junkstr := concat('New level = ',sign,intstr(abs(NewLevel)));
centertext(junkstr,1);
centertext(junkstr,1);
delay(100); j
end;
end; { for 1 to count } - c.
end; { for 1 to count } - c.
if (ShowSweep) and ( count > 1) then begin if sum > 0 then FinalLevel := trunc((sum /
count)+0.5)
else FinalLevel := trunc((sum / count)-0.5);
{} { writeln(' AveLevel =',FinalLevel,' ');}
if NewLevel > 0 then sign := ·-· else sign := '+';
junkstr := concat('New level = ',sign,intstr(abs(NewLevel)));
centertext(junkstr,1);
delay(200);
end;
centertext(junkstr,1);
delay(200);
end;
if (Recurs = 1S1) then exit;
if (NewLevel = BIAS) and (Recurs = 1R1) then begin
{ test for laser blocked or off bi-cell ) PlungerUp(20,StopCode);
0 ReadBiCell(1N1,NewLevel);
0 ReadBiCell(1N1,NewLevel);
if NewLevel = BIAS then begin
PlungerDown(40,StopCode);
ReadBiCel1(·N·,NewLevel);
if NewLevel = BIAS then begin centertext('ERROR : Laser Beam is blocked or off Bi-CeIl.',I) ;
PlungerDown(40,StopCode);
ReadBiCel1(·N·,NewLevel);
if NewLevel = BIAS then begin centertext('ERROR : Laser Beam is blocked or off Bi-CeIl.',I) ;
UserWait;
HaIt(I);.; end;
PlungerUp(4O,StopCode);
end; —
PlungerDown(20,StopCode);
end; { NewLevel = BIAS }
end; { ReadBiCell }
procedure WhichBladeLimit(var LimitSwitch:/integer);
{ 1 = front, 2 = back, 3 = neither } begin ' -<>
if (port[SweepLim] and $20) <> $20 then begin port[SwepCoil] := $00;
LimitSwitch:= 1;
BladePos := 0; exit; { home limit switch ) end;
if (port[SweepLim] and $40) <> $40 then begin port[SwepCoil] := $00;
LimitSwitch:= 2; BladePos := MaxBladeMoves; exit; { back limit switch }
end;
LimitSwitch := 3; end;
procedure InitSweeperandPlunger(option:integer;
var StopCode : integer); var
wastekey : char;
kk : integer;
begin
kk : integer;
begin
port[$30B] := $98; { init 8255 } port[$30B] := $98; {control port}
port[Swepcoil] := O; {8255 port C} port[Sweeplim] := 0; {8255 port B}
delay(1);
WhichBladeLimit(kk); { this sets BladePos } if kk = 3 then begin
beep ;
writeln;
beep ;
writeln;
Centering CAUTION: Sweeper blade not in home
position.·);
Centerln(' You may manually reposition the blade at front of vat. ·);
userwait; - ^1
delay(1);
{}{}kk:=-1234;
{}{}kk:=-1234;
WhichBladeLimit(kk);
{}{}Window(l,l,80,25) ;
{}{}Writeln(kk);
if kk = 3 then begin
gotoxy(l,l);
{}{}Window(l,l,80,25) ;
{}{}Writeln(kk);
if kk = 3 then begin
gotoxy(l,l);
DrawBox(3,7,73,14,2);
repeat delay(100) until keypressed; junkkey := readkey;
CursorOn;
HaIt(I);
repeat delay(100) until keypressed; junkkey := readkey;
CursorOn;
HaIt(I);
end;
end;
end;
PlungerPos := MaxPlungeMoves +150; { Pad it so we KNOW it goes to limit }
0 PlungerUp(0,StopCode);
0 PlungerUp(0,StopCode);
PlungerDown((MaxPlungeMoves div 2),StopCode); PlungerPos := MaxPlungeMoves div 2;
if ShowSweep then begin
writeln(' SWEEPER, PLUNGER, AND ZSTAGE INITIALIZED
');
delay(800);
end;
end;
if keypressed then .wastekey := ReadKey; end;
procedure InitSweeper(option:integer;
var StopCode : integer); var
wastekey : char;
kk : integer;
begin '■
kk : integer;
begin '■
port[$30B] := $98; { init 8255 } &
port[$3OB] := $98; {control port}
port[Swepcoil] := 0; {8255 port C) port[Sweeplim] := 0; {8255 port B)
delay(1);
WhichBladeLimit(kk); { this sets BladePos }
if kk = 3 then begin
0 beep;
0 beep;
writeln;
Centering Sweeper blade not in home position, program aborting. ');
Centerin(· You may manually reposition the blade at
front of vat. ·);
userwait;
if (port[SweepLim] and $20) <> $20 then begin
userwait;
if (port[SweepLim] and $20) <> $20 then begin
portfSweeplim] := $00;
end else begin
gotoxy(l,l);
gotoxy(l,l);
DrawBox(3,7,73,14,2); repeat delay(100) until keypressed;
junkkey := readkey; CursorOn;
HaIt(I);
end;
end;
end;
end;
procedure LiquidStableDelay; —
{ Take bicell readings until the difference between readings is within epsilon a specified number of times in
a row. }
const
const
NumOfODeltaReadsNeeded = 5; deltaEpsilon = 3;
var
level,oldlevel : integer;
numOfODeltaReads : integer; " *» begin
numOfODeltaReads : integer; " *» begin
numOfODeltaReads := 0;
ReadBiCellCS' ,level) ;
ReadBiCell(1S',oldlevel);
ReadBiCellCS' ,level) ;
ReadBiCell(1S',oldlevel);
while (abs(level - oldlevel) > deltaEpsilon) and (NumOfODeltaReads
< NumOfODeltaReadsNeeded) do begin
ReadBiCellCS· ,level) ;
ReadBiCell('S·,oldlevel);
ReadBiCell('S·,oldlevel);
if abs(level - oldLevel) <= deltaEpsilon then inc(NumOfODeltaReads);
end;
end;
{ *************************************************** j
end;
end;
{ *************************************************** j
procedure SetPlunger(numSetPlungers:integer;var
FinalLevel:integer );
var
var
level,oldlevel, timesthru,stopcode : integer; OKfirstTry : boolean;
&zgr;Pos : real;
&zgr;Pos : real;
pPos : longint;
junksc : integer;
begin { SetPlunger )
if PMWriteFlag then begin
Read3DStateFile(zPos,pPos,j unksc);
ReadBiCell(1N1,level); -
Append(PMWriteFile);
Writeln(PMWriteFile,zPos:2:6, ' : ·, pPos:l,· : ', level:1, · SetPlunger commences...');
Close(PMWriteFile);
end;
{*****************} *)
end;
{*****************} *)
OKfirstTry := false; ,:
TimesThru := 0;
if ShowSweep then begin ' ■£"
if NumSetPlungers = -1 then writeln('AUTOMATIC
MODE·)
else writeln('Number of Level Checks=1,numSetPlungers);
end;
{} ReadBiCell(1N',level);
{} if (level < Uplim) and (level > lowlim) then begin
{} if (level < Uplim) and (level > lowlim) then begin
if ShowSweep then writeln('Bi-cell level OK first
time through SetPlunger.');
if PMWriteFlag then begin
Read3DStateFile(zPos,pPos,junksc); ReadBiCell(1N',level);
Append(PMWriteFile);
Append(PMWriteFile);
Writeln(PMWriteFile,zPos:2:6,· : ', pPos:l,' : ',
level:1, ' SetPlunger completed.');
Close(PMWriteFile);
end;
{*****************} *)
Close(PMWriteFile);
end;
{*****************} *)
exit;
end;
end;
if NumSetPlungers = -1 then NumSetPlungers := 25; repeat
if ShowSweep then writeln('READING BI-CELL·);
ReadBiCell(·N·,level);
if (NumSetPlungers = 25) and (TimesThru>=l) and
(Level<=UpLim) and (Level>=LowLim) then OKfirstTry:= true;
5
5
(* if TimesThru = 0 then begin { do a validity test here — }
oldlevel := level; PlungerUp(20,StopCode); ReadBiCell(1N',level);
if level = oldlevel then begin PlungerDown(40,Stopcode);
ReadBiCell(1N1 ,level) ; -£
if ( level = oldlevel ) and ( level = bias ) then begin
writeln;
writeln('ERROR : Laser Beam is not within a
usable bi-cell range.1); writeln;
UserWait;
UserWait;
{ AddRemoveResin(level); } HaIt(I);
end;
end else PlungerDown(20,StopCode); end; { TimesThru = 0 } *)
25
♦ if level > UpLim then begin repeat
PlungerDown(1,StopCode);
ReadBiCell(1N1,level);
until level < UpLim; end;
if level < LowLim then begin repeat
PlungerUp(l,StopCode); ReadBiCell(1N1,level);
until level > LowLim; end;
{ the state file is not updated in Plunger moves of 1 case... }
Update3 DStateFile(ZStagePos,PlungerPos,StopCode);
inc(TimesThru); —
LiquidStableDelay;
{}(* {} delay(PD2 * 1000); *)
{ if not((TimesThru > NumSetPlungers) or OKfirstTry)
then delay(PD2*1000); }
until (TimesThru > NumSetPlungers) or OKfirstTry;
if ShowSweep then writeln ( · FINAL LEVEL =',FinalLevel);
(* {*****************}
(* {*****************}
if PMWriteFlag then begin · £■
Read3DStateFile(zPos,pPos,junksc);
ReadBiCell(1N1,level);
Append(PMWriteFile);
Append(PMWriteFile);
Writeln(PMWriteFile,zPos:2:6,' : ·, pPos:l,· : ',
level:1, · SetPlunger completed.1);
Close(PMWriteFile);
end;
end;
PlungerHoldingTorque;
end; { SetPlunger }
end; { SetPlunger }
procedure OneSweep(index:integer;DipDepth,LayerDepth:real);
var
stopcode : integer;
currentZPos : real;
currentZPos : real;
junkPlungerPos : longint;
begin
begin
Read3DStateFile(currentZPos, junkPlungerPos, stopcode);
(*if currentZPos > 0 then DipDepth := 8 else DipDepth := 6;*)
if index = 1
then begin ■■-.
'
if ShowSweep then writeln(' ZMove =',(-(-DipDepth
- BladeGapLO
+ (LayerDepth * BladeGap[index]/100))
/25.4):7:3);
ZMoveGivenDistance(ZAccel,ZVeloc,-(-DipDepth
BladeGapLO +
BladeGapLO +
(LayerDepth * BladeGap[index]/100))/25.4 {conv. to inches})
end else begin
end else begin
if ShowSweep then writeln(' : ZMove =·,(-((LayerDepth * BladeGap[index]/100)-*
( L a y e r D e j? t h * BladeGap[index-l]/100))/25.4):7:3);
ZMoveGivenDistance(ZAccel,ZVeloc,-((LayerDepth *
BladeGap[index]/100)-
(LayerDepth * BladeGap[index-l]/100))/25.4);
end;
MoveBlade(Period[index],StopCode);
end;
{&igr;******************************************************}
procedure DoSweep(DipDepth,LayerDepth:real;
RelaxationTime:integer);
var
var
level,oldlevel,isweep,StopCode : integer;
currentZPos : real;
junkPlungerPos : longint;
begin
currentZPos : real;
junkPlungerPos : longint;
begin
Read3DStateFile (currentZPos, j unkPlungerPos, stopcode) ;
(*if currentZPos > 0 then DipDepth := 8 else DipDepth := 6;*)
{ ZW=RelaxationTime in seconds // ZD=DipDepth in mm
ZV=ZtableVeloc // ZA := ZtableAccel // Next Layer Thickness = LayerDepth }
ZV=ZtableVeloc // ZA := ZtableAccel // Next Layer Thickness = LayerDepth }
if ShowSweep then begin
writeln(' Layer Thickness(mm)=·,LayerDepth:5:3,
(mils)=·,(LayerDepth*1000/25.4):5:3); writeln(' ZMove =',(-DipDepth/25.4):7:3, ' inches
writeln(' =',-DipDepth:7:3,· mm ');
end;
{ Move down ZD, DipDepth. )
{ Move down ZD, DipDepth. )
ZMoveGxvenDistance(ZAccel,ZVeloc,-DipDepth/25.4);
{ wait PD }
Delay (3500) ; ^.
LiquidStableDelay;
(* delay(postDipDelay*1000); *)
(* delay(postDipDelay*1000); *)
if (numchecks <> 0) and (not demoFlag) then SetPlunger(numChecks,level);
if showsweep then begin
0 writeln('ZstagePos=',ZstagePos:7:2); writeln('BladeGapL0/25.4=·,(BladeGapLO/25.4):7:2); writeln(·DipDepth (mils)=1,(DipDepth/25.4):7:3); writeln('LayerDepth (mils)=·,(LayerDepth/25.4):7:3);
0 writeln('ZstagePos=',ZstagePos:7:2); writeln('BladeGapL0/25.4=·,(BladeGapLO/25.4):7:2); writeln(·DipDepth (mils)=1,(DipDepth/25.4):7:3); writeln('LayerDepth (mils)=·,(LayerDepth/25.4):7:3);
writeln('1-2-3+4=',( ZStagePos - (BladeGapLO/25.4)
- (DipDepth/25.4)
+ (LayerDepth/25.4) ) : 7:3);
writeln(·ZSafeSweep=',ZSafeSweep:7:3); userwait;
end;
30
writeln(·ZSafeSweep=',ZSafeSweep:7:3); userwait;
end;
30
{ no sweep case }
{ Note this critera does not involve BladeGap[i]. ) if (numSweeps
<= 0) or (( ZStagePos - (BladeGapLO/25.4) - (DipDepth/25.4)
+ (LayerDepth/25.4) ) < ZSafeSweep) then begin if ShowSweep then writeln('*** Unsafe to sweep.1);
+ (LayerDepth/25.4) ) < ZSafeSweep) then begin if ShowSweep then writeln('*** Unsafe to sweep.1);
Qo
{ Move elevator up to the 'draw next layer1 position.
if ShowSweep then writeln(·
=·,(-(LayerDepth-DipDepth)/25.4):7:3);
=·,(-(LayerDepth-DipDepth)/25.4):7:3);
ZMoveGivenDistance (ZAccel, ZVeloc, - (LayerDepth-DipDepth) /
25.4) ;
delay(5);
Delay(RelaxationTime{ZW});
exit;
exit;
end; ^
for isweep := 1 to numSweeps do begin ' ^-
OneSweep(isweep,DipDepth,LayerDepth);
end;
end;
{Now bring the system to pre-sweep plus part layer thickness.}
if ShowSweep then writeln(' ZMove
= ', (-(BladeGapLO-(LayerDepth * BladeGap[numSweeps]/100) +
LayerDepth)/25.4):7:3);
if not HopNguyen then begin
if demoFlag then ZMoveGivenDistance(ZAccel,ZVeloc,-(BladeGapLO-
(LayerDepth * BladeGap[numSweeps]/100)
)/25.4)
else ZMoveGivenDistance(ZAccel,ZVeloc,-(BladeGapLO-(LayerDepth
BladeGap[numSweeps]/100) +LayerDepth)/25.4);
end;
end;
delay(10);
end;
end;
Bi
function expSweeperSqrVelocity(vel:real):real;
{ Converts a velocity in inches per second to the sweepers private units. Smaller trueVels correspond to greater
velocities. }
var
trueVel : real;
begin
begin
if vel <= 1 then trueVel := 76 else if vel <= 2 then trueVel := (vel - 1) * (36-76)
+ 76 :
else if vel <= 3 then trueVel := (vel - 2) * (23-3 6)
+ 36 i;
else if vel <= 4 then trueVel := (vel - 3) * (17-23) + 23
else if vel <= 5 then trueVel := (vel - 4) * (12-17) + 17
else if vel <= 6 then trueVel := (vel - 5) * (10-12) + 12
else if vel <= 7 then trueVel := (vel - 6) * (9-10) + 10
else if vel <= 8 then trueVel := (vel - 7) * (7-9)
+ 11
else if vel <= 9 then trueVel := (vel - 8) * (6-7) 25+9
else if vel <= 10 then trueVel := (vel - 9) * (6-7)
+ 9
else trueVel := 5;
expSweeperSqrVelocity := truevel; end;
expSweeperSqrVelocity := truevel; end;
procedure expSweeperBack;
{ StopCode 0 = normal return ( could be the limit )
1 = abnormal - limit hit before completed move ( ZStage )
2 = abnormal - keypressed
3 = stall }
ei
var .;;■;
: integer;
key : char;
key : char;
{}{ speed : real; } - -
begin
delaytime := trunc(speed);
if (ZStagePos < ZSafeSweep) then exit; port[Sweeplim] := $FF;
:= 0;
if (ZStagePos < ZSafeSweep) then exit; port[Sweeplim] := $FF;
:= 0;
if ShowSweep then writeln(' SWEEPER BACK ·);
repeat i
if (port[SweepLim] and $40) <> $40 then begin port[SwepCoil] := $00; - ^.
BladePos := MaxBladeMoves;
exit; { hit limit switch }
exit; { hit limit switch }
end;
inc(BladePos);
if i <= 59 then inc(i) { ramp up
if i <= 59 then inc(i) { ramp up
else if BladePos > (MaxBladeMoves - 60) { ramp down }
then i := MaxBladeMoves - BladePos +1;
rotatestep(1,Sweepstep);
portfSwepcoil] := {(portfSwepcoil] and $F3) or}
(sweepstep and $0F);
BenDelay(delaytime + LnSteps[i]);
until {(keypressed) or } (BladePos >= MaxBladeMoves);
port[SwepCoil] := $00;
{ if keypressed then begin
{ if keypressed then begin
key := Readkey;
end; )
if BladePos >= MaxBladeMoves then begin if ShowSweep then writeln(· *** ERROR : STALL in Sweeper Back ■);
end; )
if BladePos >= MaxBladeMoves then begin if ShowSweep then writeln(· *** ERROR : STALL in Sweeper Back ■);
delay(1000);
beep;
beep;
BladePos := MaxBladeMoves; end;
end;
end;
procedure expSweeperForward; var
i : integer; key : char; {}{ speed : real; }
begin ;
delaytime := trunc(speed); if (ZStagePos < ZSafeSweep) then exit? &
port[Sweeplim] := $FF; i := 0; if ShowSweep then writeln(' SWEEPER FORWARD ·);
repeat if (port[SweepLim] and $20) <> $20 then begin port[SwepCoil] := $00;
BladePos := 0;
exit; { home limit switch } end; dec(BladePos);
if i <= 59 then inc(i) { ramp up }
else if BladePos < 60 { ramp down } then i := BladePos + 1;
rotatestep(-l,sweepstep); port[Swepcoil] := {(port[Swepcoil] and $F3) or
}(sweepstep and $0F);
BenDelay(delaytime + LnSteps[i]);
until {(keypressed) or } (BladePos <= 0); portfSwepCoil] := $00;
{ if keypressed then begin key := Readkey; end; } if BladePos <= 0 then begin
if ShowSweep then writeln(· *** ERROR1 : STALL in
Sweeper Forward ·); BladePos := 0;
beep; —
delay(1000);
end;
end;
end;
procedure expMoveBlade(period:real); var
SineMoveParam : real;
SineMoveParam : real;
begin i
{}{ if period < 2 then begin
if BladePos <> 0 then expsweeperforward Nielse expsweeperback;
end else begin
case period of
S ineMoveParam
S ineMoveParam S ineMoveParam S ineMoveParam S ineMoveParam
10
S ineMoveParam S ineMoveParam S ineMoveParam S ineMoveParam
= 10.5; = 6.8; = 6.2; = 6.1; = 4; = 3; = 2.98; = 2.97;
= 2.95;
end;
if BladePos <> expsinemove(MaxBladeMoves,SineMoveParam,'r')
then else
expsinemove(MaxBladeMoves,SineMoveParam,1I');
end; }
sinemoveparam := period;
{}{ if BladePos <> 0 then
expsinemove(MaxBladeMoves,SineMoveParam,'r')
else expsinemove(MaxBladeMoves,SineMoveParam,1I1);}
if BladePos <> 0 then expsweeperforward(period)
es-
.else expsweeperback(period);
end;
procedure SweepCal;
var
var
resp : integer;
theDelay : integer;
theDelay : integer;
realDelay : real;
hourl, hour2, - ^c-
mini, min2,
seel, sec2,
seel, sec2,
secllOO, sec2100 : WORD ;
begin
repeat
write( 1I) for square, 2) for sine ?' );
readln( resp );
if resp = 1 then begin
if resp = 1 then begin
write( 'Raw delay ? · );
readln( theDelay );
GetTime(hourl, mini, seel, secllOO) ;
readln( theDelay );
GetTime(hourl, mini, seel, secllOO) ;
if BladePos <> 0 then sweeperforward(theDelay,StopCode)
else
sweeperback(theDelay,StopCode);
end else if resp = 2 then begin write( 'Raw delay ? ' );
readln( realDelay );
GetTime(hourl, mini, seel, secllOO) ; if BladePos <> 0 then expsinemove(MaxBladeMoves,realDelay,'r')
end else if resp = 2 then begin write( 'Raw delay ? ' );
readln( realDelay );
GetTime(hourl, mini, seel, secllOO) ; if BladePos <> 0 then expsinemove(MaxBladeMoves,realDelay,'r')
else expsinemove(MaxBladeMoves,realDelay,1I')
&bgr;&ohacgr;
end;
GetTime(hour2, min2, sec2, sec2100) ; writelnCStart: ·, hourl, ':·, mini, ':'·, seel, ':·,
secll00:2) ;
writeln('Start: ', hour2, ':', min2, ·:', sec2, ':·,
sec2100:2) ;
until false; {forever}
end;
end;
begin
{ blade must be at the front, already checked in utlzstage init } i:
SweepDefaults;
ReadSWEEPxPRMfile;
ReadSWEEPxPRMfile;
ReadMACHINExPRMfile;
BladePos := 0;
Steplter := 0;
NoSweep := false;
ZClearBuffer;
ZClearBuffer;
Read3DStateFile(ZStagePos,PlungerPos,junkSC);
end.
unit SINSTEP;
unit SINSTEP;
3D Systems Stereolithography System Software
01/24/89 JFT Creation.
interface
uses CRT,DOS,UTLZSTAGE,UTILITYl;
const
MaxSafeSineSpeed = 1;
var
var
&bgr;*
BladePos : -integer;
BladePos : -integer;
procedure sinemove(steps: integer; SweepPeriod: real;
device,dir : char; stopcode:integer); —
procedure expsinemove(steps:integer; rawParam: real; dir : char);
procedure expsinemove(steps:integer; rawParam: real; dir : char);
implementation
const
JB = $300; {plunger, recöater address}
JBC = $308; {8255: 4 MSB: plunger}
CoilDataPort = $309; { 4 LSB: recöater}
MaxBladeMoves = 1255; { pre - microstepping }
MaxBladeMoves = 1255; { pre - microstepping }
SwepCoil = $309;
SweepLim = $308;
SweepLim = $308;
function SweeperVelocity(InchesPerSec:real):real;
{No longer used—JFT, 4/3/89 }
{No longer used—JFT, 4/3/89 }
{ Used by SineMove to correct the velocity parameter to correct speed. }
var
vel : real;
begin
begin
if InchesPerSec < 0.1 then vel := (InchesPerSec / 0.1) * 0.11
else if InchesPerSec <= 0.2 then vel : = ((InchesPerSec - 0.1) / 0.1) * (0.2375-0.11) + 0.11
else if InchesPerSec <= 0.5 then vel : = ((InchesPerSec - 0.2) / 0.1) * (0.68-0.2375) +0.2375
else if InchesPerSec <= 0.5 then vel : = ((InchesPerSec - 0.2) / 0.1) * (0.68-0.2375) +0.2375
else if InchesPerSec <- 1.0 then vel : = ((InchesPerSec - 0.5) / 0.3) * (1.55-0.68) + 0.68;
SweeperVelocity := vel;
5 end;
5 end;
, -
{} {sinemove: microstepping of recoater and plunger: see description of parameter at begin of file. Last test
results: better performance with CoProc N+, Ramp seemed to be to slow for higher velocities (>10), so AccelRampMax :=
5 2 without further tests ! Test for this procedure: MICROl.PAS (see conditional defines)}
{ No longer used. Expsinemove is used instead—JFT,
4/3/89 }
10 procedure sinemove(steps: integer; SweepPeriod: real;
device,dir : char; stopcode:integer); :
const
DAngIeArray
(10,10,10,15,15,15,30,30); AccelRampMax
RampLength
array[0..7] of integer =
integer = 2; integer - 4;
0 type
LookUpTable = array [0..45] of real;
var
stepcount
Xl, X2
FId,AccelValue
DIndex, DAngle
SinOfAngle,CosOfAngle
QuarterPi,PeriodPoint
FldTimes
BitFactor
X0Bit,XlBit,X2Bit
CoilABitl,CoilABit2
CoilBBitl,CoilBBit2
SingleBit,FLdCount
j,double,accelcount
integer; real;
integer; integer; integer; integer; LookUpTable; integer;
integer; integer; integer; integer; integer;
&bgr;?
single,null „>
· : integer;
output - _ : integer;
rep : integer;
whichLim : integer;
veloc : real;
begin
if (ZStagePos < ZSafeSweep) then exit; port[Sweeplim] := $FF;
veloc := SweeperVelocity(12.1/SweepPeriod);
if device - 'p1 then BitFactor := else BitFactor := 16; - ^?
CoilABitl := 32 div BitFactor; {20H, 2}
CoilABit2 := 16 div BitFactor; {10H, 1}
CoilBBitl := 128 div BitFactor; {80H, 8} 0 CoilBBit2 := 64 div BitFactor;
{40H, 4}
{Fid}
FId := round(100/veloc+O.5);
25
{Dangle} DIndex := round(veloc+0.5)-l;
if DIndex < 0 then DIndex := 0; if DIndex > 7 then DIndex := 7; for j := 0 to DIndex do Dangle := DAngleArray[j];
{ Set QuarterPi to one-fourth period. } QuarterPi := 90 div DAngle;
5 { Build a table of values for the five-fourths period interval. }
{ The extra quarter lets us look up cosines easily. }
for j:= 0 to (5 *.QuarterPi) do FldTimes(j] :=sin(pi / 180 * DAngle * j) * FId;
5 for stepcount := 1 to steps do begin
if (port[SweepLim] and $20) <> $20 then begin
if upcase(dir)='R' then
10 begin
10 begin
port[SwepCoil] := $00; l
7.
bladePos:=0;
StopCode : = 0; - <t
exit;
15 end;
15 end;
end else if (port[SweepLim] and $40) <> $40 then
begin
if upcase(dir)='L' then
begin
20 port[SwepCoil] := $00;
20 port[SwepCoil] := $00;
bladePos:=MaxBladeMoves;
StopCode := 0;
exit ;
end;
25 end;
exit ;
end;
25 end;
if (stepcount <= RampLength) then begin
AccelValue : =
AccelRampMax*round(veloc/3)*(RampLength-stepcount+1)
30 div RampLength; {accel}
if AccelValue < 1 then AccelValue := 1; end;
if ((steps-stepcount+1) <= RampLength) then begin
35 AccelValue : =
AccelRampMax*round (veloc/3) * (RampLength- (steps-stepcount))
.&ngr; 94
div RampLength;
if AccelValue < 1 then AccelValue := 1;
end else if (stepcount > RampLength) then
AccelValue := 1; - ■
{ Point SinOf Angle at Io or hi end of table, depending on step }
{ direction. CosOfAngle is one-quarter pi ahead of
this. }
if upcase(dir) = 1L'
if upcase(dir) = 1L'
then SinOfAngle := 0 ;
else SinOfAngle := 360 div DAngle; CosOf Angle := SinOfAngle + QuarterPi; c-
for PeriodPoint := 0 to (4 * QuarterPi) do begin
Xl := FldTimes[SinOfAngle];
if Xl > 0 then Xlbit := CoilABitl {32 20H} else if Xl
< 0 then Xlbit := CoilABit2 {16 10H) else Xlbit := 0;
X2 := FIdTimes[CosOfAngle];
if X2 > 0 then X2bit := CoilBBitl {128 80H) else if X2 < 0 then X2bit := CoilBBit2 {64 40H)
else X2bit := 0;
XOBit := 0;
XOBit := 0;
if abs(Xl) < abs(X2) then begin
double := abs(round(Xl +0.5)); SingleBit := X2bit;
end;
if abs(X2) <= abs(Xl) then begin double := abs(round(X2 +0.5)); SingleBit := Xlbit; end;
if abs(X2) <= abs(Xl) then begin double := abs(round(X2 +0.5)); SingleBit := Xlbit; end;
single := abs(round(abs(Xl)-abs(X2)+0.5));
null := Fid-double-single;
for. accelcount : = 1 to AccelValue do begin
if upcase(dir) = 1L' then begin —{left}
5
if double > 0 then begin
for j := 0 to double do port [CoilDataPort] Xlbit+X2bit;
end;
if single > 0 then begin
if single > 0 then begin
for j := 0 to single do port [CoilDataPort] SingleBit;
end; ■£'
if null > 0 then begin
for j := 0 to null do port[CoilDataPort] XOBit;
end;
{end dir ="1··}
end else begin {dir "r"}
{right}
if null > 0 then begin
for j := 0 to null do port[CoilDataPort] XOBit,·
end;
if single > 0 then begin
for j := 0 to single do port [CoilDataPort] SingleBit;
0 end;
0 end;
if double > 0 then begin
for j := 0 to double do port [CoilDataPort] Xlbit+X2bit;
end;
end; {dir "r")
end; {dir "r")
end; {accelcount}
{ Update lookup table pointers. } if upcase(dir) = 1R' then begin
SinOfAngle := SinOfAngle-1;
end else begin
SinOfAngle := SinOfAngle+1;
end;
CosOfAngle := SinOfAngle + QuarterPi;
CosOfAngle := SinOfAngle + QuarterPi;
end; {for SinOfAngle...}
end; {steps}
port[CoilDataPort] := $FF; if BladePos <= 0 then begin
{} {if ShowSweep then writeln(· *** ERROR : STALL in
Sweeper SineMove Forward ');} BladePos := 0; StopCode := 3;
0 beep;
delay(1000); end;
end;
end;
procedure expsinemove(steps:integer; rawParam: real; dir
: char);
const
DAngleArray : array[0..7] of integer =
(10,10,10,15,15,15,30,30);
AccelRampMax : integer = 2;
5 RampLength : integer = 4;
type
LookUpTable = array [0..45] of real;
var
stepcount
Xl, X2
FId,AccelValue
DIndex, DAngle
SinOfAngle,CosOfAngle
QuarterPi,PeriodPoint
FldTimes
BitFactor
X0Bit,XlBit,X2Bit
CoilABitl,CoilABit2
CoilBBitl,CoilBBit2
SingleBit,FLdCount
j,double,accelcount
single,null
output
rep
whichLim
veloc
integer;
real;
integer;
integer;
integer;
integer;
LookUpTable;
integer; :
integer;
integer;
integer;
integer;
integer;
integer;
integer;
integer;
integer;
real;
begin
if (ZStagePos < ZSafeSweep) then exit; port[Sweeplim] := $FF;
veloc := rawParam;
BitFactor : CoilABitl : CoilABit2 : CoilBBitl : CoilBBit2 :
= 16; =32 div BitFactor;
= 16 div BitFactor;
= 128 div BitFactor;
= 64 div BitFactor;
= 16 div BitFactor;
= 128 div BitFactor;
= 64 div BitFactor;
{20H, 2}
{10H, 1}
{80H, 8}
{40H, 4}
{Fid}
FId := round(100/veloc+O.5);
{Dangle}
DIndex := round(veloc+0.5)-1; if Dlndex
< O then Dlndex := O; if Dlndex > 7 then Dlndex := 7;
for j := 0 to Dlndex do Dangle := DAngleArray[j]; 5
{ Set QuarterPi to one-fourth period. } QuarterPi := 90 div DAngle;
{ Build a table of values for the five-fourths period interval. } { The extra quarter lets us look up cosines easily.
}
for j:= 0 to (5 * QuarterPi) do - ' -c-
for j:= 0 to (5 * QuarterPi) do - ' -c-
FldTimes[j]:=sin(pi / 180 * DAngle * j) * FId;
15
for stepcount := 1 to steps do begin
if (port[SweepLim] and $20) <> $20 then begin
if upcase(dir)='R' then begin portfSwepCoil] := $00;
bladePos:=0; exit; end;
end else if (port[SweepLim] and $40) <> $40 then
begin if upcase(dir)='L' then begin portfSwepCoil] := $00;
bladePos:=MaxBladeMoves; exit; end; 5 end;
if (stepcount <= RampLength) then begin
AccelValue : =
AccelRampMax*round(veloc/3)*(RampLength-stepcount+1)
div RampLength; {accel}
if AccelValue < 1 then AccelValue := l·?
end;
if ((steps-stepcount+1) <= RampLength) then begin
AccelValue : =
AccelRampMax*round (veloc/3) * (RampLength- (steps-stepcount))
div RampLength;
if AccelValue < 1 then AccelValue := 1; end else if (stepcount
> RampLength) then -c*
AccelValue := 1;
{ Point SinOf Angle at Io or hi end of table, depending on step }
{ direction. CosOfAngle is one-quarter pi ahead of this. }
if upcase(dir) = 1L1
then SinOfAngle := 0
then SinOfAngle := 0
else SinOfAngle := 360 div DAngle; CosOfAngle := SinOfAngle + QuarterPi;
for PeriodPoint := 0 to (4 * QuarterPi) do begin 25
Xl := FldTimes[SinOfAngle];
if Xl > 0 then Xlbit := CoilABitl {32 20H}
else if Xl < 0 then Xlbit := CoilABit2 {16 10H}
else Xlbit := 0;
30
30
X2 := FldTimes[CosOfAngle];
if X2 > 0 then X2bit := CoilBBitl {128 80H) else if X2
< 0 then X2bit := CoilBBit2 {64 40H) else X2bit := 0;
XOBit := 0;
XOBit := 0;
^ If
if abs(Xl) < abs(X2) then begin
double := abs(round(Xl +0.5));
SingleBit := X2bit;
end; -
if abs(X2) <= abs(Xl) then begin
double := abs(round(X2 +0.5));
SingleBit := Xlbit;
end;
end;
single := abs(round(abs(Xl)-abs(X2)+0.5));
null := Fid-double-single;
for accelcount := 1 to AccelValue do begin
1*
if upcase(dir) = 1L1 then begin {left}
15
if double > 0 then begin
for j := 0 to double do port [CoilDataPort] ::
Xlbit+X2bit;
end;
if single > 0 then begin
if single > 0 then begin
for j := 0 to single do port [CoilDataPort] : = SingleBit;
end ;
if null > 0 then begin
for j := 0 to null do port[CoilDataPort] :=
XOBit;
end;
{end dir ="1"}
end else begin {dir "r"}
{right}
if null > 0 then begin
for j := 0 to null do port[CoilDataPort] :
XOBit;
end;
if single > 0 then begin
for j :=, 0 to single do port[CoilDataPort] : = SingleBit;"
end;
if double > 0 then begin —
5 for j := 0 to double do port [Coil DataPort] : =
Xlbit+X2bit;
end;
end; {dir "r"}
end; {dir "r"}
10 end; {accelcount}
't. { Update lookup table pointers. }
if upcase(dir) = 1R1 then begin - &
SinOfAngle := SinOfAngle-1;
15 end else begin
SinOfAngle := SinOfAngle+1;
end;
CosOfAngle := SinOfAngle + QuarterPi;
CosOfAngle := SinOfAngle + QuarterPi;
20 end; {for SinOfAngle...}
end; {steps}
port[CoilDataPort] := $FF;
25 if BladePos <= 0 then begin
25 if BladePos <= 0 then begin
{} {if ShowSweep then writeln(· *** ERROR : STALL in
Sweeper SineMove Forward ·);}
BladePos := 0;
beep;
30 delay(lOOO);
BladePos := 0;
beep;
30 delay(lOOO);
end;
end;
end;
end.^Z
! Build Parameter File
! Version 3.60 "*
! Part Name: Date:
! Important Data:
! last altered:
! place options together inside of quotesj use "" if no
options
I General Parameters
&igr;
&igr;
800 Elevator board base address
100 elevator pitch
3.556 XY-only scale factor; Use 3.556 for Inches
and Slize res=1000
!!1, 0.0
MAO, 0.0
17000 X-coordinate offsets
17000 Y-coordinate offsets
5000 Max number of bytes per block in Laser Queue
26000,26000 Minimum X and Y of vat area (for graphics
viewport)
39000,39000 Maximum X and Y of vat area &iacgr;
#TOP,"DC+M &iacgr; Drift Correction on
&igr;
#BTM,"ZW 30; ! Z-axis wait time in
5 seconds
ZD 8; ! Z-axis dip depth in mm
stoo
ZV 0.2; ..,;?.' ! Z-axls velocity
parameter - "
ZA 0.2" ! Z-axis acceleration
MACHINE.PRM
! MACHINE.PRM machine parameter file 05/18/89 &igr;
SLA-250 ! machine type 620 1 maximum blade steps to cross vat
0.03 ! plunger steps per mil of elevator movement
f·.
BEAM. PRM ' i*
! PROFILE Parameters Table ! Version 3.60 &igr;
5000,32767 beam rest position &igr;
! Beam Profile Data !
3 number of profile sensors
3 second sensor channel #
63104,55452 sensor #1 changed 3-24-89 MJH
0.045 1/2 mil hole multiplier to get mW
0.0116 1 mil
0.00592 2 mils changed 3-24-89 MJH
0.00072 4 mils
1 first sensor channel #
4752,6543 sensor #2 changed 3-24-89 MJH
0.040 1/2 mil hole multiplier to get mW
0.0102 1 mil
0.00776 2 mils changed 3-24-89 MJH
0.00063 4 mils
32767,32767 position of 2 mil hole (#3)
0.040 1/2 mil hole multiplier to get mW
0.0010 1 mil
0.00605 2 mils· 0.00063 .-- " 4 mils
&igr;
! Temperature Data —
4 thermometer channel #
13 # points in thermistor calibration table
19900,10 temperature calibration table...
15720,15 format is resistance (Ohms), temperature (C)
12490,20 /
10000,25
8057,30 - £·
6531,35 5327,40 4370,45 3604,50 2986,55 2486,60 2081,65 1749,70 &igr;
! Fast, Medium & Slow Calibration Delay Values &igr;
! line format is Spiral time (ms), between points (sees,
1/10 sec res), ! between rows (sees) &igr; ■
20,0,0 Fast: 20 ms, turnaround as quickly as
possible 50,0.5,5 Medium: 50 ms, 1/2 sec, 5 sees 100,20,120 Slow: 100 ms, 20 sees, 2 minutes
&igr;
! Slew Rate Limit Parameters !
1000 maximum step in either axis
2 delay between step points in milliseconds
POWER. PRM ■ ;-- ·
! POWER V3.60 Parameters File
&igr; . — ■ ■
LASERPOWERTYPE=TOGGLe LEVEL or UNKNOWN
SWEEP.PRM
! SWEEP.PRM 05/18/89 &igr;
1 !NS nurasweeps 10 ! Pl sweep velocity 100 ! Gl blade gap as a percent of next layer
thickness (ignore if NS=I) " -£
10 ! P2 100 ! G2 10 ! P3 100 ! G3 10 ! P4 100 ! G4 10 ! P5 100 ! G5
10 ! P6 100 ! G6 10 &iacgr; &Rgr;7 100 ! Gl 0 ! BI bias when He laser is blocked
9 &iacgr; MD plunge Motor Delay : delay between plunger motor pulses (ms) 3.0 !PS PlungStart : inches plunger moves down to
its start position 4 ! UL UPLIM : bi-cell activate level ' -4 ! LL LOWLIM: bi-cell activate level
0.125 ! BG BladeGapLO - distance between liquid and
recoater blade (inches) 35-1 ! NC Number of cheeks for leveling ( 0 ->
5 or -1 for auto mode *** ) 0.3 !DA Draining elevator acceleration
0.5 ! DV Draining elevator velocity ' 0 ., -.·■.! XP extra Platform
height(mils).ZSafeSweep=ZBladeLevel+60mil+XP
noshow ! Show or No-Show sweep info ( S or N in the first column )
ZSTAGE.PRM
! ZSTAGE Parameters File
! Version 3.60
!
!
1111 command line options: /NEGZ, /S, /M
800 elevator control board I/O address .5 acceleration parameter ■ ■&
1 velocity parameter 2000000 big distance (max movement for up or down) 100000 # of microsteps per inch
2000 timeout value
10000 ZBladeLevel
10000 ZLiquidLevel
10000 ZUnloadLevel
10000 ZUnloadLevel
program AutoLevel; ...;· uses crt,utilityl,utlsweep,windows;
var
j unksc
Displaywind
ExitSave
Done
HoldKey
theLevel
integer; wind ; pointer; boolean; char;
integer;
{$F+}procedure ExitAutoLevel;{$F-} begin
CursorOn; ■ ■£·
DefaultWindow;
ClrScr;
ClrScr;
ExitProc := ExitSave; end;
procedure DrawMainScreen; begin
clrscr;
centertext('This is the Surface Position Repeatability
POD',I);
centertext('Auto-Levelling Program Vl.1',2);
centertext(·Press L to Level, X to exit.',4);
end;
procedure DoAutoLevel; begin
centertext('Auto-Levelling in progress...',6); SetPlunger(-l,theLevel); centertext('Levelled at ',6); write(PlungerPos); writeln(' ·); userwait;
centertext('Auto-Levelling in progress...',6); SetPlunger(-l,theLevel); centertext('Levelled at ',6); write(PlungerPos); writeln(' ·); userwait;
DrawMainScreen; end;
begin . ■ C
'■j ■ ■
{ Initialize program. } ExitSave := ExitProc; ExitProc := §ExitAutoLevel;
CurscrOff;
Done := false;
Done := false;
{ Initialize screen. } clrscr;
DefineWindow(Displaywind,5,5,75,20,2) ;
FrameWindow(Displaywind); ActivateWindow(Displaywind);
DrawMainScreen; 15
{ Read keys. } { 11X" key exits. } { "L" key autolevels. }
repeat
repeat
repeat
delay(100) ; until keypressed; HoldKey := upcase(ReadKey);
if HoldKey = 1X1 then Done := true;
if HoldKey = 1L1 then DoAutoLevel;
until Done;
end.^Z
end.^Z
{ 02/01/89 JFT Made into a unit from Wayne Vinson's code.
02/27/89 JFT Modified "Too High" or "Too Low" sections to read until a peak is reached, then read until the
abs (level) is less than a threshold value. -The user is adding or removing resin during this time.
03/01/89 JFT Above fix only works well for resin removal. Go to modified older method with epsilon of 5.
Change user messages.
05/04/89 JFT Fixed (?) the bug that caused repeated adjustments when the bicell was bullseyed. Changed user
messages and sounds. Removed need to press key when
r.
adjustment complete.
05/25/89 JFT Use procedure HandleKeyboardRequest in adjust resin level loops so that the user may abort
w/ctrl-c or break.
06/16/89 JFT Lengthen move done by plunger from 40 to 60 when checking to see if we're on the bicell. Also use
upLim and lowLim instead of twice upLim and twice lowLim.
08/03/89 JFT In CheckLevel, if 2nd or 3rd readings are
0 then call it off the bicell. )
unit UtIAdjust;
{ $ M 16384,0,0}
{ $ M 16384,0,0}
j*******************************************************}
interface
uses Crt,Dos,Utility1,UtlSweep,UtlZStage,Windows;
uses Crt,Dos,Utility1,UtlSweep,UtlZStage,Windows;
procedure AddRemoveResin(var FinalLevel: integer);
&rgr; r &ogr; c e d u r e procReadBiCellfdisplaydelay:integer;echo:boolean);
&rgr; r &ogr; c e d u r e procReadBiCellfdisplaydelay:integer;echo:boolean);
procedure LongReadBiCell(displaydelay:integer);
procedure procPlungerUp(echo:boolean);
procedure procPlungerDown(echo:boolean);
35
35
implementation
const -^
epsilon = 2; { +/" bias variation used in add/remove
resin }
5
5
var
opt,stopc : integer;
velocity2 : real;
key, junkkey : char;
level : integer;
velocity2 : real;
key, junkkey : char;
level : integer;
delaytime : integer;
r. onbicell,leveladjusted : boolean;
tempstring : string; - ,c·
AlertWind,DataWind : wind;
ID { j
procedure procReadBiCell(displaydelay:integer;echo:boolean);
{If echo is true then write levels to screen} var
junkStr:string;
sign :string;
begin
sign :string;
begin
ReadBiCellCN1 ,level) ;
if echo then begin
if echo then begin
if level < 0 then sign := ' + ' else sign := '-';
{Reverse signs for display)
if level = 0 then sign := "; {0 gets no
sign)
junkStr := concat('The liquid level is
',sign,IntStr(abs(level)));
centerText(junkStr,1);
end;
centerText(junkStr,1);
end;
delay(displaydelay);
end;
end;
JD { )
procedure LongReadBiCell(displaydelay:integer);
begin
repeat .,;:■
procReadBiCell(displaydelay,false); {don't echo to
levels to screen)
until keypressed; —■·■
key := Readkey; end;
procedure procPlungerUp(echo:boolean);
begin leveladjusted := false; repeat PlungerUp(10,stopc);
procReadBiCell (1, echo) ; - £·
until keypressed; junkkey := upcase(Readkey); end;
procedure procPlungerDown(echo:boolean);
begin leveladjusted := false; repeat
PlungerDown(10,stopc); procReadBiCell(1,echo);
until keypressed; junkkey := upcase(Readkey); end;
procedure DoBeep(freq,time : integer); begin sound(freq);
delay(time); nosound; end;
&ngr; )
procedure DoFinalAdjustment;
var i,level,tempint,returncode : integer;
wasteKey ,. ■ : char; begin,- ''
ActivateWindow(AlertWind); clrscr;
5 if onbicell then begin { otherwise setplunger gets pissed }
centertext('Performing automated fine adjustment of resin level.',2);
centertext('Please stand by.',5); 10 ActivateWindow(DataWind);
clrscr;
ReadBicell(1N1,level);
{}{ tempint := 8;} {do course adjustment first
15 tempint := 32; { do course adjustment first }
repeat
HandleKeyboardRequest( wasteKey ); if (level > uplim) then begin
repeat
20 for i := 1 to tempint do begin
PlungerDown(1,ReturnCode);
delay(400 div tempint); end; { of i } ReadBiCell(1N',level);
25 until level < UpLim;
end;
if (level < lowlim) then begin repeat
for i := 1 to tempint do begin 30 PlungerUp(l,returnCode);
delay(400 div tempint); end; { i }
ReadBiCell(1N',level);
until level > LowLim; 3 5 end;
clrscr;
centertext('Pausing to allow · resin to
settle.·,1);
delay(5000) ; { allow settling time } ClrScr; { Pause completed-}
tempint := 1; { now do finer adjustment }
ReadBicell(1S1,level);
until (level < uplim) and (level > lowlim);
ActivateWindow(AlertWind);
clrscr;
clrscr;
centertext('Resin level now adjusted for part
building.',4); ;
leveladjusted := true;
delay(2500) ; &
beep;
end; { if onbicell }
end; { if onbicell }
end; { of dofinaldjustment }
procedure CheckLevel;
{ reads and evaluates if on or off bicell and sets boolean bicell accordingly }
var
returncode, f irstlevel, secondlevel, thirdlevel, tempint
: integer;
begin
ActivateWindow(AlertWind);
ClrScr;
ClrScr;
onbicell := false;
Centertext('Checking resin level.',1);
Centertext('Please stand by.',5); firstlevel := 0;
secondlevel := 0;
thirdlevel := 0;
ActivateWindow(DataWind);
clrscr;
ReadBicell(1S',firstlevel);
secondlevel := 0;
thirdlevel := 0;
ActivateWindow(DataWind);
clrscr;
ReadBicell(1S',firstlevel);
if (firstlevel > 2*uplim) or (firstlevel < 2*lowlim)
then onbicell := true
else begin { first gave bias type reading .. could
still be dead on }
{ This delay added to thwart the .recurrent adjustment bug. }
Delay(3000);
ReadBicell(1S1,secondlevel);
PlungerDown(120,returncode);
{ This delay added to thwart the recurrent adjustment bug. }
Delay(3000); i
ReadBicell(1S1,thirdlevel); '*
PlungerUp(60,returncode); . ^.
{ both 2nd and 3rd must not give bias reading to be on bicell }
if not (secondlevel in[bias-epsilon..bias+epsilon]) and
not (thirdlevel in[bias-epsilon..bias+epsilon]) then OnBicell := true;
*)
(*
*)
(*
if ((secondlevel > uplim) or (secondlevel
< 1owlim)) and
((thirdlevel > uplim) or (thirdlevel < 1owlim)) then
OnBicell := true;
if ( ( secondLevel > bias + epsilon ) or ( thirdLevel < bias - epsilon ) )
then OnBicell := true;
then OnBicell := true;
{ The following was added to accomodate SLAs with biases outside of the range -1..+1. When off the bicell,
those SLAs showed as on the bicell. This should catch that case. —JFT }
if ( secondLevel = bias ) or ( thirdLevel = bias ) then OnBicell := false;
ActivateWindow(AlertWind);
end;"{ else }
end; { of checklevel }
end;"{ else }
end; { of checklevel }
procedure CenterPlunger;
var
var
returncode,midplunge,plungemove : integer;
begin
begin
midplunge := maxplungemoves div 2;
plungemove := abs(midplunge - plungerpos);
plungemove := abs(midplunge - plungerpos);
{ always put plunger in mid position before starting part }
{ for now always go all the way to top )£
plungerup(0,returncode);
plungerdown(maxplungemoves div 2,stopc);
plungerup(0,returncode);
plungerdown(maxplungemoves div 2,stopc);
update3dstatefile(zstagepos,plungerpos,returncode);
{ if tracking shows no problem then activate following instead }
{ if plungerpos < midplunge then plungerdown(plungemove,stopc);
if plungerpos > midplunge then plungerup(plungemove,stopc);}
FrameWindow(DataWind);
ActivateWindow(DataWind);
clrscr;
FrameWindow(DataWind);
ActivateWindow(DataWind);
clrscr;
centertext('Pausing to allow resin to settle.',I);
delay(10000); { wait 10 sec for level to stabilize after
delay(10000); { wait 10 sec for level to stabilize after
fast plunge move }
ActivateWindow(AlertWind);
end; { centerplunger }
end; { centerplunger }
)
procedure AddRemoveResin(var FinalLevel: integer);
const
CoarseAdjustLim = 10;
var
var
tempint,oldlevel,plungemove,option,returncode :
integer;_ - .
key,wastekey : char;
tempreal : real; ... .
PeakReached : boolean;
MaxReading : integer;
begin
begin
DefineWindow(AlertWind,10,7,70,18,2);
DefineWindow(DataWind,10,23,70,25,1); DefaultWindow;
ClrScr; ■
writeln; K
centerln(Product+· Resin Level Adjustment Utility1) ;
writeln;
centerln('Copyright (C) 1989 by 3D Systems, Inc.1); centerln('3D Systems StereoLithography System1); FrameWindow(AlertWind);
centerln('Copyright (C) 1989 by 3D Systems, Inc.1); centerln('3D Systems StereoLithography System1); FrameWindow(AlertWind);
{ FrameWindow(DataWind); }
{ DataWind is framed in CenterPlunger } ActivateWindow(AlertWind);
{ first see if already did level check } { showsweep := true; }
if not leveladjusted then begin centertext('Initializing resin adjustment apparatus.·,2);
if not leveladjusted then begin centertext('Initializing resin adjustment apparatus.·,2);
centertext('Please stand by.■,5); CenterPlunger;
CheckLevel;
Delay(300);
CheckLevel;
Delay(300);
if OnBicell then begin
ActivateWindow(AlertWind); ClrScr;
centertext('The resin level is currently in',2);
centertext (' an acceptable range' for part
building.·,3); .
centertext('Manual adjustment will be unnecessary.',5); —
. DoFinalAdjustment;
Update3DStateFile(ZStagePos,PlungerPos,stopc);
exit;
end; { if OnBicell }
ActivateWindow(AlertWind);
ActivateWindow(AlertWind);
ClrScr; ;
■f.
for tempint := 1 to 3 do begin
beep; - i-
delay(100);
end; { of tempint }
end; { of tempint }
centertext (· The resin level is not in an acceptable·,2);
centertext('range for part building.',3);
centertext(1A MANUAL adjustment will be necessary:',5);
centertext(·Look at the white leveling pointer at
the«,7);
centertext('rear of the vat.1,8);
centertext(1Is resin touching the pointer?',9);
While keypressed do wastekey := readkey; { catch
all previous keys )
Wastekey := Readkey; { get new key )
{ LEVEL TOO HIGH }
If Upcase(Wastekey) = 1Y1 then begin { level too
high }
ClrScr;
centertext('The resin level is too high.',1);
centertext('Please remove resin until the beep sounds.',5);
centertext(·Stop removing resin when you hear
the beep.·,6);
PeakReached := false;
MaxReading := 0;
Repeat
MaxReading := 0;
Repeat
HandleKeyboardRequest( wasteKey );
ActivateWindow(DataWind);
ActivateWindow(DataWind);
readbicell('N1,level); { need quick read
here }
{ delay(10);}
{ delay(10);}
ActivateWindow(AlertWind); ;
if abs (level) > MaxReading *then MaxReading := abs (level) ; - c-
if abs (level) > MaxReading *then MaxReading := abs (level) ; - c-
if (abs(level) < MaxReading) and (MaxReading >
50)
then PeakReached := true;
{}{ Until (level < bias-epsilon) or (level >
bias+epsilon);}
{}{ Until PeakReached and (abs(level) <
CoarseAdjustLim); }
Until abs(level) > uplim+l{ ( bias ) + epsilon};
{ bicell values negative at bicell top }
centertext('Press any key to continue...',8);
Repeat
centertext('Press any key to continue...',8);
Repeat
DoBeep(100,1000);
{ delay(50); }
Until keypressed;
wastekey := readkey;
clrscr;
{ delay(50); }
Until keypressed;
wastekey := readkey;
clrscr;
centertext ('User finished removing resin. ', 5) ;
CheckLevel; { to check for too much liquid removed }
if not onbicell then begin
ClrScr;
ClrScr;
centertext('Resin level not in acceptable range.·,5);
DoBeep(100,1000);
delay(2000) ; ... .
delay(2000) ; ... .
addremoveresin(stopc);
end; { if not onbicell }
DoFinalAdjustment;
Update3DStateFile(ZStagePos,PlungerPos,stopc);
DoFinalAdjustment;
Update3DStateFile(ZStagePos,PlungerPos,stopc);
exit;
end; { if level too high } ·.
end; { if level too high } ·.
{ LEVEL TOO LOW } - ■ <?
CIrSer;
centertext('The resin level is too low.',I);
centertext('The resin level is too low.',I);
centertext('Please add resin SLOWLY until the beep sounds.',5);
centertext('Stop adding resin when you hear the
beep.',6);
PeakReached := false;
MaxReading := 0;
Repeat
Repeat
HandleKeyboardRequest( wasteKey );
ActivateWindow(DataWind);
ActivateWindow(DataWind);
readbicell(1N',level); { need quick read
here }
{ delay(10);)
ActivateWindow(AlertWind);
if abs(level) > MaxReading then MaxReading 0 := abs(level);
if abs(level) > MaxReading then MaxReading 0 := abs(level);
if (abs(level) < MaxReading) and (MaxReading >
50)
then PeakReached := true;
{}{ Until (level < bias-epsilon) or (level >
bias+epsilon);}
{}{ Until PeakReached and (abs(level)
<
CoarseAdjustLim) ; }
Until abs(level) > uplim+l{( bias ) + epsilon}; -
centertext('Press any key to continue...',8);
repeat
DoBeep(100,1000) ;
delay(50) ;
until keypressed;
wastekey := readkey;
delay(50) ;
until keypressed;
wastekey := readkey;
clrscr; ;
't centertext('User finished adding resin.',5);
CheckLevel; { to be sure before attempting finaladjustment }
if not onbicell then begin
if not onbicell then begin
CenterText('Resin level not in acceptable range.■,5);
DoBeep(100,1000);
delay(2000);
delay(2000);
0 addremoveresin(stopc);
end; { if not onbicell }
DoFinalAdj ustment;
DoFinalAdj ustment;
Update3DStateFile(ZStagePos,PlungerPos,stopc) ;
exit;
end; { if not leveladjusted }
clrscr;
clrscr;
centertext('Resin level is now adjusted for part
building.',4);
delay(2500);
0 beep;
end; ( addremoveresin }
begin
leveladjusted := false;
5 end.
5 end.
-4*9
3D Systems StereoLithography System Software
RECOATER.PAS
SLA-250 Recoater wiper and plunger Control Program
Recent History:
9/12/88 Ver 3.30 first released for breadboard
9/12/88 Ver 3.30 first released for breadboard
f.
testing
10/17/88 Ver 3.301 modified c-to be utility/initialization for final SLA250
11/15/88 Ver 3.31 copied from Recoatl - use common utl*.inc files
01/11/89 Ver 3.32 remove sweeper forward back —> use move move sweeper
01/25/89 Ver 3.33 JFT removed sweeper velocity biasing —>
pass desired velocity in in/sec to MoveBlade, 0 SweeperForward or SweeperBack. Cheeks constant SIMULATION
to see if we want to run this as a simulation (no communication with SLA) (useful for running on
workstations not attached to SLAs).
01/30/89 JFT merged with Wayne's updated AddRemoveRe sin procedures.
02/01/89 USES Windows. Move AddRemoveResin to unit
UtIAdjus. USES UtIAdjus.
02/16/89 Adjust Start Position sets new ZPlungeSetPos and sends the elevator to that position.
03/07/89 JFT Added exit proc to forward sweeper.
03/07/89 JFT Added exit proc to forward sweeper.
03/09/89 JFT Recalibrated sweep periods to account for final compiler options.
03/10/89 JFT Fixed UtlAdjust so that it may be broken out of.
03/28/89 JFT Y.V3.42 Change sweep period now
bullet-proofed to input.
03/30/89 JFT V3.43 Write parameters to machine.prm
instead of zstage.prm.
05/25/89 JFT V3.61 Allow user to break out of adjust
resin level loops.
06/07/89 JFT V3.61B Make stirring easier to break out of.
06/15/89 JFT V3.61C Better stirring utility (multi-speed).
06/16/89 JFT V3.61D Better bicell check (see UtIAdjust.pas). '■
06/16/89 JFT V3.61E Fix stir utility by using the indexer 1S MA (Mode Alternate) command.
07/05/89 JFT V3.61F Single Coil Holding Torque.
07/05/89 JFT V3.61F Single Coil Holding Torque.
07/21/89 JFT V3.62 Changed version #.
07/24/89 JFT V3.63 Fixed adjust resin level (?).
}
}
{ $ M 16384,0,0)
{ $ D-;I+)
{R+}
{ $ D-;I+)
{R+}
uses Crt,Dos,Utilityl,UtlSweep, UtlZStage,windows,UtIAdj ust,Indexer;
{$I product.inc}
25
{$I product.inc}
25
const
Versionld = «3.63·;
Indent = 19;
Indent = 19;
epsilon — 1; · { +/- bias variation used in add/remove
resin )
Simulation = false; { Is this a simulation (no SLA)?
var
opt,stopc : integer;
SweepPeriod : real;
key, junkkey : char;
SweepPeriod : real;
key, junkkey : char;
level : integer; delaytime : integer; onbicell,leveladjusted : boolean;
tempstring : string; TopWind,BottomWind,IntroWind : wind; SaveExit : pointer;
Procedure CenterText(tempstring : string;RowNumber :
integer); -
begin
gotoxy(l,rownumber); - ^.
CIrEoI;
if length(tempstring) >= (lo(WindMax)-lo(WindMin))
then gotoxy(1,rownumber)
else
gotoxy(((lo(WindMax)-lo(WindMin)-length(tempstring)) div
2),rownumber);
write(tempstring); end; }
write(tempstring); end; }
procedure ExitRecoater; begin
SweeperForward(3,stopc); CursorOn;
ExitProc := SaveExit; HaIt(O);
0 end;
0 end;
procedure DisplayLevel; var
junkStr : string; sign : string[l];
begin
procReadBiCell(500,true);
end; , ·.
procedure DefaültWindow2;
begin
DefaultWindow;
begin
DefaultWindow;
window(l,1,80,22) ;
end;
end;
procedure ShowPowerMenu;
var
var
i : integer; ;
junkstr : string;
begin - &
begin - &
Defaultwindow2;
ClrScr;
ClrScr;
FrameWindow(BottomWind);
{ ActivateWindow(BottomWind);
DisplayLevel;}
Defaultwindow2;
{ ActivateWindow(BottomWind);
DisplayLevel;}
Defaultwindow2;
centertext(Product+1 Recoater Utility Control
Program·,1);
writeln;
writeln;
centertext(·Version '+Versionld+· Software Release
•+Rel_3D,2);
centertext(·Copyright (C) 1989 by 3D Systems, lnc',3);
centertext(·Copyright (C) 1989 by 3D Systems, lnc',3);
centertext('3D Systems Laser StereoLithography
System',4);
if Simulation then centertext(«SIMULATION IN
PROGRESS«,5);
for i:=l to 5 do writeln;
FrameWindow(TopWind);
ActivateWindow(TopWind);
ClrScr;
FrameWindow(TopWind);
ActivateWindow(TopWind);
ClrScr;
writelnC 1. Adjust Resin Level Utility ·);
writeln(· 2. Sweep ');
writeln(' 3. Change Sweep Period1);
writeln(' 4. Lower Liquid1);
writeln(' 5. Raise Liquid1); writeln('~ 6. Adjust Building Start Position1);
writeln(' 7. Stir Liquid1); write (· X. Exit1);
DefaultWindow2;
centertext('Please make a selection.·,18);
writeln;
end;
end;
procedure WriteZStartLevel(NewStartZLevel:real);
const ·
ParamFileName = '\3DSYS\MACHINE.XYZ · ; '*
NewName = "XSDSYSXMACHINE.PRM1 ; - c.
var
IOerr,i,m,n,valcode : integer;
j : longint;
r : real;
ParamFileLine, AppendText : str80; 20
ParamFile,NewFile: text; InchDistanceStr : str80;
Dirlnfo : SearchRec; InputLine : string; begin
OpenParamFile := ParamFileName;
assign(ParamFile,OpenParamFile); rewrite(ParamFile);
assign(NewFile,NewName); reset(NewFile);
while not eof(NewFile) do begin readln(NewFile,InputLine) ;
writeln(ParamFile,InputLine); 5 end;
rewrite(NewFile);
IOerr := IOresult;.
if IOerr <> 0 then begin OpenParamFile := ParamFileName;
assign(ParamFile,OpenParamFile); reset(ParamFile);
IOerr := IOresult;
if IOerr <> 0 then OpenParamFile := ' '
end; {10 error} if IOerr = O then begin i := 0,-reset
(ParamFile) ; : repeat readln(paramFile,paramFileLine); <?
writeln(newFile,paramFileLine); until paramFileLine = 1ZSTAGE.PRM1;
while (not eof(ParamFile)) and (i <= 9) do begin for j:=l to 255 do ParamFileLine[i]:=' ';
readln(ParamFile,ParamFileLine); if i < 7 then writeln(NewFile,ParamFileLine)
else begin
if i = 7 then appendText := ' ZLiquidLevel·;
if i = 7 then
writeln(NewFile,NewStartZLevel:12:10,appendText)
else writeln(NewFile,ParamFileLine);
end;
if (ParamFileLine[1] <> · ') and
(ParamFileLine[l] <> '!·) and (ParamFileLine[l]
<> 1111J then inc(i) ;
0 end;
while not eof(paramFile) do begin
readln(paramFile,paramFileLine); writeln(newFile,paramFileLine);
5 end;
end;
end;
ZPlungeSetPos := JtfewStartZLevel + 0.315; '{ 8mm lower
than Start; } ■ close(NewFile);
close(ParamFile); -
end ;
procedure ZSurfacePosition(var ZValue : real);
const
ZVSlow = '0.10000O1; { Slow speed for setting levels
}
var ;
key : char;
dumbkey,OK : boolean; ,c-
StopCode : integer; ZVSetZ : strlO; begin
dumbkey := false; ActivateWindow(TopWind); clrscr;
Centertext('Use up and down arrows for
positioning,',1); Centertext('space to halt,',2);
CentertextC S to shift to slow speed,',3); CentertextC and X when at the desired level.',4);
ZVSetZ := ZVeloc; repeat
OK := false; repeat
key := ' &zgr; ·; HandleKeyboardRequest(key);
key := upcase(key); if dumbkey then key:=· '; dumbkey:=false;
if key in [#72,#80,' ',1S1^X1] then OK := true;
{up and down arrows ) until OK; case key of
#72 : begin
.· /„ ' if not NegZStage then
ZFreeMov¥(ZAccel,ZVSetZ,1UP ') else
ZFreeMove(ZAccel,ZVSetZ,·DOWN·) ;
dumbkey := true; end;
#80 : begin if not NegZStage then ZFreeMove(ZAccel,ZVSetZ,'DOWN') else
#80 : begin if not NegZStage then ZFreeMove(ZAccel,ZVSetZ,'DOWN') else
ZFreeMove (ZAccel, ZVSetZ, ' UP ') ; '*
dumbkey := true;
end; ~~
1S': begin
ZVSetZ := ZVSlow; { change to slow speed }
Centertext('Shifted to slow speed',6);
Centertext(' for final positioning. · ,7) ;
0 end;
1X1: begin {} ZValue := -abs(ZStagePos);
exit; end;
2 5 end; | instring | : string; |
valcode | : integer; | |
until false; | junkStr | : string; |
end; | NewStart | : real; |
3 5 Temp | : real; | |
procedure AdjustBuildStart; | begin | |
30 var | StopKey := | = true; |
Temp := ZLiquidLevel; ActiyateWindow(BottomWind); clrscr;
Centertext('Moving elevator to current start position.·.',1);
GotoZPos(l);
Centertext('Position the elevator at the desired start
position.',1); ZSurfacePosition(ZLiquidLevel);
clrscr; ActivateWindow(BottomWind); clrscr;
junkStr := concat('A new build starting level£has been
entered.·); centertext(junkStr,1); ActivateWindow(TopWind);
clrscr; centertext('Accept this new level ?',2); repeat
delay(lOO) until Keypressed; if temp <> ZLiquidLevel then begin
if upcase(readkey)='Y' then WriteZStartLevel(ZLiquidLevel)
else ZLiquidLevel := temp; end;
StopKey := false;
GoToZPos(2); { Go to Check Resin Level position. } {}{ ZReadParms;)
0 end;
procedure SetNewDelay; var
instring : string; 5 valcode : integer; junkStr : string;
tempReal : real;
begin -.;?■'
ActivateWindow(BottomWind);
junkStr := concat('Enter sweeper period [now
1 ,RealStr(SweepPeriod,2) , 's]:');
centertext(junkStr,1);
cursoron;
readln(instring);
if instring <> ·' then begin
cursoron;
readln(instring);
if instring <> ·' then begin
tempReal := RealVal(instring,valcode);
if (tempReal > maxSweepPeriod) then tempReal :=
maxSweepPeriod;
if (tempReal < minSweepPeriod) then tempReal := minSweepPeriod; £
end;
cursoroff;
cursoroff;
if (valcode = 0) and (instringo1 ') then SweepPeriod : =
tempReal;
junkStr := concat('Sweeper period now set to
1,Realstr(SweepPeriod,2),· seconds■);
0 centertext(j unkStr, 1) ;
delay(3000);
end;
end;
procedure GetSelectionl;
begin
begin
repeat
ActivateWindow(BottomWind);
DisplayLevel;
ActivateWindow(TopWind);
HandleKeyboardRequest(key);
key := upcase(key);
if key in [1I1..'7',1X1] then exit; until false;
end;
35
DisplayLevel;
ActivateWindow(TopWind);
HandleKeyboardRequest(key);
key := upcase(key);
if key in [1I1..'7',1X1] then exit; until false;
end;
35
procedure DoBeep(freq,time : integer);
begin sound(freq); delay(time);
nosound; end;
procedure doUpLiquid; begin ActivateWindow(BottomWind);
procPlungerDown(true);
ActivateWindow(TopWind); end;
procedure doDownLiquid; begin
ActivateWindow(BottomWind); procPlungerUp(true);
ActivateWindow(TopWind); end; (***■
procedure Stir; var
wasteKey : char;
endPos : longlnt;
endPosStr : string;
abortStir,stop : boolean;
accel,veloc : string;
procedure ElevatorCommand( theCmd : string );
var
response : string; begin
if theCmd <> ·■ then if SendCmdToIndexer(theCmd+1
',ZTimeOut) <> then begin beep;
end
else, if ReadResponseFromlndexer(response,zTimeOut)
<> 0
then begin _
beep; end;
end;
begin
endPos := trunc( zStepsPerlnch * (-1) * ( zLiquidLevel
- 0.5 ) ); '
Str( endPos , endPosStr ); ActivateWindow(BottomWind); - ^.
ClrScr;
WriteC STIR fast/medium/slow (f/m/s) : ·);
repeat delay(100) until keypressed; wasteKey := UpCase(ReadKey); abortStir := false;
case wasteKey of 1S1 : begin
accel := 10.5' ;
veloc := &Iacgr;1 ; end;
1M' : begin accel := '5';
veloc := »5·; end; 1F1 : begin
accel := '10'; veloc := 1IO1;
end;
else abortStir := true; end;
if not abortStir then begin 5 ClrScr; Write( ' STIRRING : press any key to abort...' );
GoToZPos(2);
ElevatorCommand( 1E MA A' + accel + ' V1'+ veloc );
stop.:= false; EleVatorCommand( 1D1 + endPosStr + · G1 );
repeat _
if KeyPressed then stop := true;
delay(100) ;
if KeyPressed then stop := true; until ( stop ); ClrScr;
Write( ' Aborting stir operation...' );
ElevatorCommand( 1K1 );
ZGoHome;
GoToZPos(2) ; . ^.
end;
ClrScr;
ClrScr;
ActivateWindow(TopWind); end;
J
begin { ReCoater } TextBackground(Black);
TextColor(White); SaveExit := ExitProc; ExitProc := @ExitRecoater;
DefaultWindow; ClrScr;
DefineWindow(TopWind,Indent-1,7,80-Indent,16,1);
DefineWindow(IntroWind,10,7,70,11,2);
if Simulation then OnBicell := false; Read3DStateFile(ZStagePos,PlungerPos,stopc);
SweepPeriod := DefaultPeriod; LevelAdjusted := false;
delaytime := trunc(SweepPeriod); CursorOff;
FrameWindow(IntroWind); ActivateWindow(IntroWind);
ClrScr;. ■,-'' Centei-Text (' Elevator
position... ' ,2) ;
if not Simulation then GoToZPos(2);
key := ' '; DefaultWindow;
clrscr; repeat
ShowPowerMenu; ActivateWindow(BottomWind);
ActivateWindow(TopWind); GetSelectionl; case key of
AddRemoveResin(stopc);
MoveBlade(SweepPeriod,stopc);
SetNewDelay;
doDownLiquid;
doUpLiquid;
AdjustBuildStart;
Stir;
HaIt(O) ;
moving to check resin level
•I1 •2'
'3'
I4. '5' '6'
•7' 1X' end;
key := ' '; until false;
CursorOn;
{ We exit through abort... we never reach here, end.
Während die Erfindung, wie hier beschrieben, auf spezifische Ausführungsbeispiele
gerichtet war, können vielfältige Modifikationen dazu angewandt werden. Zum Beispiel während überschüssige polymerisierbare
Flüssigkeit hierin als von einer Abstreifklinge abgestreift beschrieben worden ist, können offensichtlich andere Einrichtungen für solches Entfernen
angewandt werden, wie z.B. Rechen oder ähnliches. Als ein anderes &iacgr;&ogr; Beispiel, eine Strahlungsquelle und ein Sensor sind hierin als Einrichtungen
beschrieben worden, um das Niveau der oberen Oberfläche des Bades von polymerisierbarem Fluid zu erfassen, wobei eine große Vielzahl
von mechanischen, elektronischen, pneumatischen und anderen Vorrichtungen verwendet werden kann, um dieses Niveau zu erfassen.
Zum Beispiel ist eine Einrichtung beschrieben worden, die einen Schwimmer verwendet. Andere Modifikationen und Verbesserungen können
verwendet werden, ohne von dem Anwendungsbereich der Erfindung abzuweichen. Demgemäß ist es nicht beabsichtigt, daß die Erfindung
beschränkt ist, außer durch die beigefügten Ansprüche.
Claims (79)
1. Einrichtung zum stereolithographischen Formen eines Abschnittes
eines dreidimensionalen Gegenstandes, die aufweist:
einen Behälter zum Halten eines Aufbaumaterials, das eine Arbeitsoberfläche hat, und wobei das Aufbaumaterial selektiv physikalisch
umwandelbar nach Aussetzung einer vorbeschriebenen synergistischen Stimulierung ist;
eine Einrichtung zum Bilden einer gleichförmigen Beschichtung über
die zuvor gebildete Schicht, die ein Glättglied und eine Einrichtung zum Überstreichen des Glättgliedes zumindestens einmal aufweist;
und
eine Einrichtung zum Aufbringen eines vorgeschriebenen Musters synergistischer Stimulierung auf das Aufbaumaterial auf der Arbeitsoberfläche, nach Überstreichen des Glättgliedes, um die darauffolgende
Schicht zu bilden.
2. Einrichtung gemäß Anspruch 1 , worin die Einrichtung zum Bilden
einer gleichförmigen Beschichtung eine Einrichtung zum Überstreichen des Glättgliedes zumindest einmal in einer Richtung unterschiedlich
von einer Richtung, die bei einer vorherigen Überstreichung des Glättgliedes überstrichen wurde, aufweist.
3. Einrichtung von Anspruch 2, worin die Richtung des Überstreichens
mit aufeinanderfolgenden Überstreichungen abwechselt.
4. Einrichtung gemäß irgendeinem der Ansprüche 1-3, worin die eine
Einrichtung zum Bilden einer gleichförmigen Beschichtung eine Einrichtung zum Überstreichen des Glättgliedes zumindest zweimal
aufweist.
5. Einrichtung gemäß einem der Ansprüche 1 - 4, worin die Einrichtung
zum Bilden einer gleichförmigen Beschichtung aufweist:
eine Einrichtung zum Streichen eines Glättgliedes über die zuvor gebildete Schicht zumindest einmal mit einer ersten Glättgliedgeschwindigkeit;
eine Einrichtung zum Überstreichen des Glättgliedes zumindest ein zweites Mal mit einer zweiten Glättgliedgeschwindigkeit; und
eine Einrichtung zum Veranlassen, daß die ersten und zweiten Glättgliedgeschwindigkeiten unterschiedlich sind.
6. Einrichtung gemäß einem der Ansprüche 1-5, worin die Einrichtung
zum Bilden einer gleichförmigen Beschichtung aufweist:
eine Einrichtung zum Überstreichen eines Glättgliedes zumindest einmal über die zuvor gebildete Schicht mit einem ersten Spiel
zwischen einer niedrigeren Oberfläche des Glättgliedes und einer oberen Oberfläche der zuvor gebildeten Schicht;
eine Einrichtung zum Überstreichen des Glättgliedes zumindest ein zweites Mal über die zuvor gebildete Schicht mit einem zweiten
Spiel zwischen der niedrigeren Oberfläche des Glättgliedes und der oberen Oberfläche der zuvor gebildeten Schicht;
eine Einrichtung zum Veranlassen, daß das zweite Spiel kleiner als
das erste Spiel ist.
7. Einrichtung gemäß einem der Ansprüche 1-5, worin die Einrichtung
zum Bilden einer gleichförmigen Beschichtung aufweist:
eine Einrichtung zum Überstreichen des Glättgliedes über die zuvor
gebildete Schicht mit einem Wert eines Spieles zwischen einer niedrigeren Oberfläche des Glättgliedes und einer oberen Oberfläche
is der zuvor gebildeten Schicht, der unterschiedlich von der Schichtdicke
ist.
8. Einrichtung gemäß einem der Ansprüche 1 - 5, worin die Einrichtung
zum Bilden einer gleichförmigen Beschichtung aufweist:
Eine Einrichtung zum Überstreichen des Glättgliedes ein erstes Mal
über die zuvor gebildete Schicht mit einem ersten Spiel zwischen einer niedrigeren Oberfläche des Glättgliedes und einer oberen
Oberfläche der zuvor gebildeten Schicht;
eine Einrichtung zum Überstreichen des Glättgliedes ein zweites Mal
über die zuvor gebildete Schicht mit einem zweiten Spiel zwischen der niedrigeren Schicht des Glättgliedes und der oberen Oberfläche
der zuvor gebildeten Schicht; und
eine Einrichtung zum Veranlassen, daß das erste und zweite Spiel unterschiedlich ist, und daß eines der ersten und zweiten Spiele
unterschiedlich von der Schichtdicke ist.
9. Einrichtung gemäß einem der Ansprüche 1 - 8, worin das Glättglied
zumindest einmal über die zuvor vorgebildete Schicht mit einer
ersten Glättgliedgeschwindigkeit überstrichen wird, die weiterhin
aufweist:
&iacgr;&ogr; eine Einrichtung zum Bilden einer gleichförmigen Beschichtung von
gewünschter Dicke über die darauffolgende Schicht in Vorbereitung zum Bilden einer zweiten darauffolgenden Schicht des dreidimensionalen
Gegenstandes, die eine Einrichtung zum Überstreichen eines Glättgliedes über die darauffolgende Schicht zumindest einmal mit
is einer zweiten Glättgliedgeschwindigkeit aufweist;
eine Einrichtung zum Veranlassen, daß die ersten und zweiten
Glättgliedgeschwindigkeiten unterschiedlich sind;
eine Einrichtung zum Aufbringen eines vorgeschriebenen Musters synergistischer Stimulierung auf das Aufbaumaterial auf der Arbeitsoberfläche, um zumindest einen Abschnitt des Aufbaumaterials
umzuwandeln, um die zweite darauffolgende Schicht zu bilden.
10. Einrichtung gemäß einem der Ansprüche 1 - 9, worin die Einrichtung
zum Bilden einer gleichförmigen Beschichtung aufweist:
eine Einrichtung zum Aufbringen einer Beschichtung auf das Material
über eine Oberfläche einer zuvor gebildeten Gegenstandsschicht, die von einem Gegenstandsträger getragen wird;
eine Einrichtung zum relativen Verschieben der zuvor gebildeten Schicht, so daß die Beschichtung, wenn aufgebracht, über die Arbeitsoberfläche
verschoben wird;
eine Einrichtung zum Überstreichen des Glättgliedes über die zuvor
gebildete Schicht, wenn die Beschichtung über die Arbeitsoberfläche verschoben wird.
11. Einrichtung gemäß einem der Ansprüche 1-9, worin die Einrichtung
zum Bilden einer gleichförmigen Beschichtung aufweist:
eine Einrichtung zum Aufbringen einer Beschichtung auf das Material
über einer Oberfläche der zuvor gebildeten Schicht, die von einem Gegenstandsträger getragen wird;
eine Einrichtung zum relativen Verschieben der Oberfläche der zuvor gebildeten Schicht über die Arbeitsoberfläche;
eine Einrichtung zum Überstreichen des Glättgliedes über die zuvor
gebildete Schicht, wenn die Oberfläche der zuvor gebildeten Schicht über die Arbeitsoberfläche verschoben wird.
12. Einrichtung gemäß einem der Ansprüche 1-9, worin die Einrichtung
zum Bilden einer gleichförmigen Beschichtung aufweist:
eine Einrichtung zum Aufbringen einer Beschichtung auf das Material
auf eine Oberfläche der zuvor gebildeten Schicht, die von einem Gegenstandsträger getragen wird;
eine Einrichtung zum relativen Verschieben der Oberfläche der zuvor gebildeten Schicht weniger als eine Schichtdicke unter die
Arbeitsoberfläche;
eine Einrichtung zum Überstreichen des Glättghedes über die zuvor gebildete Schicht, wenn die Oberfläche der zuvor gebildeten Schicht
weniger als eine Schichtdicke unter die Arbeitsoberfläche verschoben wird.
&iacgr;&ogr;
13. Einrichtung gemäß einem der Ansprüche 1 - 9, worin die Einrichtung
zum Bilden einer gleichförmigen Beschichtung aufweist:
eine Einrichtung zum Überstreichen des Glättghedes in einer Ebene über der gewünschten Arbeitsoberfläche.
14. Einrichtung gemäß einem der Ansprüche 1 - 13, worin die Einrichtung
zum Bilden einer gleichförmigen Beschichtung aufweist:
Einstellschrauben, die an dem Glättglied angebracht sind, zum Einstellen
seiner vertikalen Position; und
Nadeln, die an dem Glättglied angebracht sind, zum Einstellen eines
Spaltes zwischen einer niedrigeren Oberfläche des Glättghedes und der Arbeitsoberfläche.
15. Einrichtung von Anspruch 14, worin die Nadeln zurückziehbar sind.
16. Einrichtung gemäß einem der Ansprüche 1 - 15, worin das Glättglied
steif ist.
17. Einrichtung gemäß einem der Ansprüche 1 - 16, worin das Glättglied
eine Abstreifklinge ist.
18. Einrichtung gemäß einem der Ansprüche 1 - 17, die weiterhin eine
Einrichtung aufweist, um das Glättglied in einer horizontalen Ebene
zu bewegen.
19. Einrichtung gemäß einem der Ansprüche 1 - 18, die zusätzlich aufweist:
eine Einrichtung zum Halten der Arbeitsoberfläche bei einem im wesentlichen festen Niveau.
20. Einrichtung gemäß einem der Ansprüche 1 - 19, die zusätzlich is aufweist:
eine Einrichtung zum Erfassen eines Oberflächenniveaus des Aufbaumaterials;
und
eine Einrichtung zum Einstellen des erfaßten Oberflächenniveaus zu
der gewünschten Arbeitsoberfläche.
21. Einrichtung gemäß einem der Ansprüche 1 - 20, worin die Einrichtung
zum Aufbringen eines vorgeschriebenen Musters synergistischer Stimulierung aufweist:
eine Quelle synergistischer Stimulierung, die eine Strahlung erzeugt,
die aus der Gruppe ausgewählt ist, die aus ultravioletter Strahlung, Infrarot-Strahlung, sichtbarem Licht, Elektronenstrahlen, Röntgenstrahlen
und Gamma-Strahlen besteht.
22. Einrichtung von Anspruch 21, worin das Aufbaumaterial umwandelbar
ist nach Aussetzung zu ultravioletter Strahlung, und wobei die Quelle der synergistischen Stimulierung ultraviolette Strahlung erzeugt.
23. Einrichtung gemäß einem der Ansprüche 1 - 22, die aufweist:
eine Einrichtung zum Überstreichen des Glättgliedes bei einer Geschwindigkeit
von ungefähr 6 - 250 mm/s.
24. Einrichtung zum stereolithographischen Formen eines drei-dimensionalen
Objekts aus einer Vielzahl von verfestigten und anhaftenden Schichten, enthaltend eine Einrichtung zur Formung aufeinanderfolgender
Schichten von Aufbaumaterial über jeder vorher verfestigten Schicht des Objekts, enthaltend ein Glättglied, mit dem jede vorher
geformte Schicht des Objekts überstrichen wird, um das Aufbaumaterial gleichförmig über die vorher verfestigten Schichten zu verteilen,
eine Einrichtung zur Verfestigung der aufeinanderfolgenden Materialschichten
zur Formung aufeinanderfolgender Schichten des dreidimensionalen Objekts, und eine Einrichtung zum Zweck des Haftens
der aufeinanderfolgenden Schichten des drei-dimensionalen Objekts auf der jeweils vorher geformten Schicht des Objekts, gekennzeichnet
durch
eine Einrichtung zum Überstreichen mit dem Glättglied in einer ersten Richtung bei einem ersten Strich, wobei das Glättglied in Kontakt mit dem Aufbaumaterial ist, und
eine Einrichtung zum Überstreichen mit dem Glättglied in einer ersten Richtung bei einem ersten Strich, wobei das Glättglied in Kontakt mit dem Aufbaumaterial ist, und
eine Einrichtung zum Überstreichen mit dem Glättglied in einer zweiten Richtung bei einem zweiten Strich, während das Glättglied
in Kontakt mit dem Aufbaumaterial ist, wobei die erste und zweite Richtung verschieden sind.
25. Einrichtung nach Anspruch 24, wobei die Richtung des Strichs mit
aufeinanderfolgendem Überstreichen wechselt.
26. Einrichtung nach den Ansprüchen 24 oder 25, ferner enthaltend eine
Einrichtung, um den ersten und zweiten Strich unmittelbar über die gleiche vorher verfestigte Schicht herbeizuführen.
27. Einrichtung nach den Ansprüchen 24 oder 25, ferner enthaltend eine
Einrichtung, um den ersten und zweiten Strich unmittelbar über
&iacgr;&ogr; verschiedene vorher verfestigte Schichten herbeizuführen.
28. Einrichtung zum stereolithographischen Formen eines drei-dimensionalen
Objekts aus einer Vielzahl von verfestigten und anhaftenden Schichten, enthaltend eine Einrichtung zur Formung aufeinanderfolgender
Schichten von Aufbaumaterial über jeder vorher verfestigten Schicht des Objekts, enthaltend ein Glättglied, mit dem jede vorher
geformte Schicht des Objekts überstrichen wird, um das Aufbaumaterial gleichförmig über die vorher verfestigten Schichten zu verteilen,
eine Einrichtung zur Verfestigung der aufeinanderfolgenden Materialschichten zur Formung aufeinanderfolgender Schichten des dreidimensionalen
Objekts, und eine Einrichtung zum Zweck des Haftens der aufeinanderfolgenden Schichten des drei-dimensionalen Objekts
auf der jeweils vorher geformten Schicht des Objekts, gekennzeichnet durch
eine Einrichtung zum Überstreichen mit dem Glättglied, während es im Kontakt mit dem Aufbaumaterial ist, wenigstens zweimal über
eine vorher geformte Schicht des drei-dimensionalen Objekts, um eine nachfolgende Schicht von Aufbaumaterial zu formen.
- 10 -
29. Einrichtung zum stereolithographischen Formen eines drei-dimensionalen
Objekts aus einer Vielzahl von verfestigten und anhaftenden Schichten, enthaltend eine Einrichtung zur Formung aufeinanderfolgender
Schichten von Aufbaumaterial über jeder vorher verfestigten Schicht des Objekts, enthaltend ein Glättglied, mit dem jede vorher
geformte Schicht des Objekts überstrichen wird, um das Aufbaumaterial gleichförmig über die vorher verfestigten Schichten zu verteilen,
eine Einrichtung zur Verfestigung der aufeinanderfolgenden Materialschichten zur Formung aufeinanderfolgender Schichten des dreidimensionalen
Objekts, und eine Einrichtung zum Zweck des Haftens der aufeinanderfolgenden Schichten des drei-dimensionalen Objekts
auf der jeweils vorher geformten Schicht des Objekts, gekennzeichnet durch
eine Einrichtung zum Überstreichen mit dem Glättglied wenigstens
eine Einrichtung zum Überstreichen mit dem Glättglied wenigstens
is einmal über eine vorher geformte Schicht des Objekts mit einem
ersten Spiel zwischen einer unteren Oberfläche des Glättglieds und
einer oberen Oberfläche der unmittelbar vorher geformten Schicht des Objekts, das verschieden von der Schichtdicke ist.
30. Einrichtung nach Anspruch 29, wobei das erste Spiel größer ist als
die Dicke einer zu verfestigenden Schicht.
31. Einrichtung nach Anspruch 30, ferner enthaltend eine Einrichtung
zum Überstreichen mit dem Glättglied wenigstens ein zweites Mal über die vorher geformte Schicht mit einem zweiten Klingenspiel,
das von dem ersten Klingenspiel verschieden ist.
32. Einrichtung nach Anspruch 31, enthaltend eine Einrichtung, um das
zweite Klingenspiel kleiner als das erste Klingenspiel einzustellen.
- 11
33. Einrichtung zum stereolithographischen Formen eines ' drei-dimensionalen
Objekts aus einer Vielzahl von verfestigten und anhaftenden Schichten, enthaltend eine Einrichtung zur Formung aufeinanderfolgender
Schichten von Aufbaumaterial über jeder vorher verfestigten Schicht des Objekts, enthaltend ein Glättglied, mit dem jede vorher
geformte Schicht des Objekts überstrichen wird, um das Aufbaumaterial gleichförmig über die vorher verfestigten Schichten zu verteilen,
eine Einrichtung zur Verfestigung der aufeinanderfolgenden Materialschichten zur Formung aufeinanderfolgender Schichten des dreidimensionalen
Objekts, und eine Einrichtung zum Zweck des Haftens der aufeinanderfolgenden Schichten des drei-dimensionalen Objekts
auf der jeweils vorher geformten Schicht des Objekts, gekennzeichnet durch
eine Einrichtung zum Überstreichen mit dem Glättglied über eine
eine Einrichtung zum Überstreichen mit dem Glättglied über eine
is vorher geformte Schicht des Objekts wenigstens einmal mit einer
ersten Glättgliedgeschwindigkeit;
eine Einrichtung zum Überstreichen mit dem Glättglied über eine zweite vorher geformte Schicht des Objekts wenigstens einmal mit
einer zweiten Glättgliedgeschwindigkeit; und
eine Einrichtung, die die erste und zweite Glättgliedgeschwindigkeit
verschieden hält.
34. Einrichtung nach Anspruch 33, wobei die erste und die zweite vorher geformte Schicht verschieden sind.
35. Einrichtung nach Anspruch 34, wobei die erste und zweite vorher
geformte Schicht die gleiche Schicht sind.
36. Einrichtung zum stereolithographischen Formen eines drei-dimensionalen
Objekts aus einer Vielzahl von verfestigten und anhaftenden
- 12 -
Schichten, enthaltend eine Einrichtung zur Formung aufeinanderfolgender
Schichten von Aufbaumaterial über jeder vorher verfestigten Schicht des Objekts, enthaltend ein Glättglied, mit dem jede vorher
geformte Schicht des Objekts überstrichen wird, um das Aufbaumaterial gleichförmig über die vorher verfestigten Schichten zu verteilen,
eine Einrichtung zur Verfestigung der aufeinanderfolgenden Materialschichten zur Formung aufeinanderfolgender Schichten des dreidimensionalen
Objekts, und eine Einrichtung zum Zweck des Haftens der aufeinanderfolgenden Schichten des drei-dimensionalen Objekts
&iacgr;&ogr; auf der jeweils vorher geformten Schicht des Objekts, gekennzeichnet
durch
eine Einrichtung zum Überstreichen mit der unteren Oberfläche des Glättglieds in einer Ebene über einer gewünschten Arbeitsoberfläche
des Aufbaumaterials.
37. Einrichtung zum stereolithographischen Formen eines drei-dimensionalen
Objekts aus einer Vielzahl von verfestigten und anhaftenden Schichten, enthaltend eine Einrichtung zur Formung aufeinanderfolgender
Schichten von Aufbaumaterial über jeder vorher verfestigten Schicht des Objekts, enthaltend ein Glättglied, mit dem jede vorher
geformte Schicht des Objekts überstrichen wird, um das Aufbaumaterial gleichförmig über die vorher verfestigten Schichten zu verteilen,
eine Einrichtung zur Verfestigung der aufeinanderfolgenden Materialschichten zur Formung aufeinanderfolgender Schichten des dreidimensionalen
Objekts, und eine Einrichtung zum Zweck des Haftens der aufeinanderfolgenden Schichten des drei-dimensionalen Objekts
auf der jeweils vorher geformten Schicht des Objekts, gekennzeichnet durch
Einstellschrauben, die mit dem Glättglied zum Zweck der Einstellung seiner vertikalen Position verbunden sind.
Einstellschrauben, die mit dem Glättglied zum Zweck der Einstellung seiner vertikalen Position verbunden sind.
- 13 -
38. Einrichtung nach Anspruch 37, enthaltend an dem Glättglied befestigte
Nadeln zur Einstellung eines Spalts zwischen einer unteren Oberfläche des Glättglieds und einer Arbeitsoberfläche des Aufbaumaterials.
39. Einrichtung nach Anspruch 38, wobei die Nadeln rückziehbar sind.
40. Einrichtung nach einem der Ansprüche 24 - 39, dadurch gekennzeichnet,
daß das Glättglied starr ist.
41. Einrichtung nach einem der Ansprüche 24 - 40, wobei das Glättglied
eine ärztliche Klinge ist.
42. Einrichtung nach einem der Ansprüche 24 - 41, enthaltend eine is Einrichtung zur Bewegung des Glättglieds in einer horizontalen
Ebene.
43. Einrichtung nach einem der Ansprüche 24 - 42, enthaltend eine Einrichtung, um die Arbeitsoberfläche des Aufbaumaterials im wesentlichen
auf festem Niveau zu halten.
44. Einrichtung nach einem der Ansprüche 24 - 42, enthaltend eine Einrichtung zur Feststellung des Oberflächenniveaus des Aufbaumaterials,
und eine Einrichtung zur Einstellung des festgestellten Oberflächenniveaus zu einer gewünschten Arbeitsoberfläche.
45. Einrichtung nach einem der Ansprüche 24 - 44, wobei die Mittel
zur Verfestigung eine Quelle synergistischer Stimulation umfassen, die eine Strahlung aussendet, ausgewählt aus der Gruppe bestehend aus
- 14 -
ultravioletter Strahlung, infraroter Strahlung, sichtbarem Licht, Elektronenstrahlen,
Röntgenstrahlen und Gammastrahlen.
46. Einrichtung nach Anspruch 45, wobei die Mittel zur Verfestigung
ultraviolette Strahlung erzeugen.
47. Einrichtung nach einem der ,Ansprüche 24 - 46, enthaltend eine
Einrichtung zum Überstreichen mit dem Glättglied mit einer Geschwindigkeit von ungefähr 0,25 - 10' pro Sekunde.
48. Einrichtung nach einem der Ansprüche 24 - 47, wobei das Aufbaumaterial
ein polymerisierbares Material ist.
49. Stereolithographiesystem zum Bilden dreidimensionaler Gegenstände,
das aufweist:
(a) eine Gegenstandstrageeinrichtung;
(b) eine Einrichtung zum Aufbringen einer dünnen Schicht polymerisierbarer Flüssigkeit auf eine Oberfläche der Gegenstandstrageeinrichtung;
(c) eine Einrichtung zum Abstreifen überflüssiger polymerisierbarer
Flüssigkeit von der aufgebrachten Schicht darauf, um eine geglättete Schicht polymerisierbarer Flüssigkeit gewünschter
Dicke bereitzustellen;
(d) eine Einrichtung zum Aufbringen eines aushärtenden Medi
ums in einem vorbestimmten Muster auf der geglätteten
Schicht polymerisierbarer Flüssigkeit.
- 15 -
50. Stereolithographisches System gemäß Anspruch 49, das einen Behälter
aufweist, der angepaßt ist, um ein Bad von polymerisierbarer Flüssigkeit darin zu enthalten.
51. Stereolithographisches System nach Anspruch 50, das eine Einrichtung
zum Anheben und Absenken der Gegenstandtrageeinrichtung in dem Behälter aufweist.
52. Stereolithographiesystem von Anspruch 49, worin die Abstreifeinrichtung
eine Abstreifklinge ist.
53. Stereolithographiesystem von Anspruch 49, worin eine Einrichtung
bereitgestellt ist, um die Abstreifklinge in einer horizontalen Ebene zu bewegen.
54. Stereolithographiesystem von Anspruch 51, worin die Einrichtung zum
Anheben und Absenken der Gegenstandtrageeinrichtung eine Einrichtung aufweist, um die Gegenstandtrageeinrichtung abzusenken in
ein Bad polymerisierbarer Flüssigkeit, um eine dünne Schicht der polymerisierbaren Flüssigkeit auf einer Oberfläche zu bilden, die auf
der Gegenstandstrageeinrichtung bereitgestellt ist.
55. Stereolithographiesystem von Anspruch 54, worin die Einrichtung zum
Heben und Absenken der Gegenstandtrageeinrichtung eine Einrichtung aufweist, um die Schicht polymerisierbarer Flüssigkeit auf der
Oberfläche der Gegenstandtrageeinrichtung über die obere Oberfläche des Bades zu heben.
56. Stereolithographiesystem von Anspruch 55, worin die Abstreifeinrichtung
einer Abstreifklinge ist.
- 16 -
57. Stereolithographiesystem von Anspruch 55, worin die Einrichtung zum
Heben und Absenken der Gegenstandstrageeinrichtung eine Einrichtung aufweist, um die geglättete Schicht polymerisierbarer Flüssigkeit
auf der Oberfläche der Gegenstandtrageeinrichtung in das Bad abzusenken, wobei die obere Oberfläche der Schicht ein Niveau mit
der oberen Oberfläche des Bades in dem Behälter bildet.
58. Stereolithographiesystem von Anspruch 50, das eine Einrichtung
aufweist, um das Niveau des Bades in dem Behälter zu steuern.
59. Stereolithographiesystem von Anspruch 58, worin die Einrichtung zum
Steuern des Niveaus des Bades in dem Behälter einen Kolben aufweist, der in dem Bad angeordnet ist, der gehoben oder abgesenkt
darin werden kann.
60. Stereolithographiesystem von Anspruch 59, das eine Einrichtung
aufweist, um das Niveau von polymerisierbarer Flüssigkeit in dem Behälter zu erfassen, und eine Einrichtung, um die vertikale Position
des Kolbens in dem Bad in Antwort auf das erfaßte Niveau einzustellen.
61. Stereolithographiesystem von Anspruch 60, das eine Einrichtung
aufweist, um ein Signal zu erzeugen, das das erfaßte Badniveau darstellt, und eine Einrichtung, um das Niveausignal mit einem
Referenzsignal zu vergleichen, das das gewünschte Badniveau darstellt, und weiter eine Einrichtung, um die vertikale Position des
Kolbens in Antwort auf den Unterschied zwischen dem erfaßten Signal und dem Referenzsignal einzustellen.
- 17 -
62. Stereolithographisches System von Anspruch 49, das einen Laser
aufweist, um ultraviolettes Licht zu erzeugen, um die polymerisierbare Flüssigkeit auszuhärten.
63. Stereolithographisches System von Anspruch 62, worin der Laser ein
HeCd-Laser ist.
64. Stereolithographisches System von Anspruch 62, das ein Computersteuerungssystem
aufweist, um die Bewegung und die Ausgabe des
&iacgr;&ogr; Lasers zu steuern.
65. Stereolithographiesystem von Anspruch 64, das ein Computersteuersystem
aufweist, um die Bewegung der Gegenstandtrageinrichtung zu steuern.
66. Einrichtung zum Messen des Niveaus einer Oberfläche eines Fluides,
die aufweist:
(a) eine Einrichtung zum Erzeugen und Richten eines Strahles elektromagnetischer Strahlung längs eines ersten optischen Pfades,
um auf die Oberfläche des Fluides aufzutreffen, so daß ein erfaßbarer Abschnitt des Strahles von der Oberfläche des Fluides
längs eines zweiten optischen Pfades wegreflektiert wird;
(b) Sensor, der ein elektrisches Signal in Antwort auf die Bewegung
eines auftreffenden elektromagnetischen Strahles über dem Sensor variiert; und
(c) eine Einrichtung zum Montieren des Sensors bei einem Abstand senkrecht zu dem Niveau des Fluides und längs des zweiten
- 18 -
optischen Pfades, so daß der reflektierende Strahl den Sensor schneidet.
67. Einrichtung gemäß Anspruch 66, die weiterhin eine Einrichtung aufweist zum Ändern des Niveaus des Fluides in Antwort auf das
elektrische Signal von dem Sensor.
68. Einrichtung gemäß Anspruch 66, die weiter eine Einrichtung aufweist,
zum Anzeigen des Niveaus des Fluides in Antwort auf das
&iacgr;&ogr; elektrische Signal von dem Sensor.
69. Einrichtung zum Messen des Niveaus an der Oberfläche eines Fluides,
die aufweist:
is (a) einen Laser, wobei die Ausgabe von dem Laser von über der
Oberfläche des Fluides längs einem ersten optischen Pfad zu der Oberfläche des Fluides gerichtet wird, so daß die Ausgabe
des Lasers von der Oberfläche des Fluides längs einem zweiten optischen Pfad reflektiert;
(b) eine Vielzahl von verbundenen Fotozellen, wobei jede Fotozelle
eine Ausgabe hat und ein elektrisches Signal auf die Ausgabe erzeugt, die mit der Intensität des auf die Fotozelle auftreffenden
Lichtes variiert; und
(c) eine Einrichtung zum Montieren der Vielzahl von verbundenen Fotozellen über der Oberfläche des Fluides längs dem zweiten
optischen Pfad, wobei die verbundenen Fotozellen eine über der anderen in einer Richtung senkrecht zu dem Niveau der Ober-
- 19 -
fläche des Fluides ausgerichtet sind, worin die Laserausgabe auf eine oder mehr der verbundenen Fotozellen auftrifft.
70. Einrichtung gemäß Anspruch 69, die weiter eine Vergleichsschaltung
aufweist, die eine Vielzahl von Eingaben und eine Ausgabe hat,
worin jede Eingabe zu einer verschiedenen Ausgabe einer einer Vielzahl von verbundenen Fotozellen gekoppelt ist, um die relativen
Amplituden der elektrischen Signale, die von jeder der verbundenen Fotozellen erzeugt werden zu vergleichen, und um ein Signal zu
&iacgr;&ogr; erzeugen, in Antwort auf die Ausgabe der Vergleichsschaltung.
71. Einrichtung gemäß Anspruch 70, die weiter eine Einrichtung aufweist,
die mit der Vergleichsschaltung gekoppelt ist, um das Niveau des Fluides antwortend auf die Ausgabe der Vergleichsschaltung zu
machen.
72. Einrichtung gemäß Anspruch 71, in der die niveauvariierende Einrichtung
auf Änderungen in dem Signal von der Vergleichsschaltung antwortet, um das Niveau des Fluides zu einem vorbestimmten
Niveau zurückzubringen.
73. Stereolithographische Einrichtung, die aufweist:
(a) einen Körper von Fluidmedium, das in der Lage ist, seinen physikalischen Zustand in Antwort auf synergistische Stimulierung
umzuwandeln;
(b) eine Einrichtung zum Erzeugen eines Strahles elektromagnetischer
Strahlung;
- 20 -
(c) eine Einrichtung zum Richten des Strahles elektromagnetischer Strahlung von der erzeugenden Einrichtung längs eines ersten
optischen Pfades, um auf die Oberfläche des Fluidmediums aufzutreffen, so daß ein erfaßbarer Abschnitt des Strahles von
der Oberfläche des Fluidmediums längs einem zweiten optischen Pfad wegreflektiert wird;
(d) einen Sensor, der ein elektrisches Signal in Antwort auf Änderungen
in der Position variiert, auf die ein elektromagnetischer
&iacgr;&ogr; Strahl auf dem Sensor auftrifft; und
(e) eine Einrichtung zum Montieren des Sensors bei einem Abstand senkrecht zur der Oberfläche des Fluidmediums und längs dem
zweiten optischen Pfad, so daß der reflektierte Strahl den Sensor schneidet.
74. Stereolithographieeinrichtung zum Bilden einer zweiten Teileschicht,
die eine vorbestimmte Dicke auf dem Oberteil einer ersten Teileschicht hat, die aufweist:
eine Einrichtung zum Eintauchen der ersten Schicht in ein im wesentlichen konstantes Volumen einer polymerisierbaren Flüssigkeit
um mehr als die vorbestimmte Dicke:
eine Einrichtung zum Heben der ersten Schicht, so daß eine Schicht
polymerisierter Flüssigkeit auf der ersten Schicht ist;
eine Abstreifklinge zum Glätten der Flüssigkeitsschicht durch Abstreifen
überflüssiger Flüssigkeit bis die Flüssigkeitsschicht auf der vorbestimmten Dicke ist; und
- 21 -
eine Einrichtung zum Bilden der zweiten Schicht durch Unterwerfen
der geglättenen Flüssigkeitsschicht unter synergistische Stimulierung.
75. Einrichtung von Anspruch 74, die weiter aufweist:
eine Wanne zum Halten des im wesentlichen konstanten Volumens einer polymerisierbaren Flüssigkeit, wobei das Volumen ein Niveau
hat;
&iacgr;&ogr; eine Einrichtung zum Erfassen des Niveaus der polymerisierbaren
Flüssigkeit in der Wanne und Vergleichen des erfaßten Niveaus mit einem vorbestimmten Niveau; und
einen Eintauchkolben, antwortend auf die erfassende Einrichtung
is zum Heben oder Absenken in die Flüssigkeit in der Wanne bis das
Flüssigkeitsniveau im wesentlichen bei dem vorbestimmten Niveau ist.
76. Einrichtung von Anspruch 75, die weiter einen Seitenbehälter aufweist,
der zu der Wanne gekoppelt ist, so daß Flüssigkeit zwischen der Wanne und dem Seitenbehälter fließen kann, was gewährleistet,
daß das Flüssigkeitsniveau in dem Seitenbehälter repräsentativ für das Flüssigkeitsniveau in der Wanne ist, worin die niveauerfassende
Einrichtung ein Bi-Zellen-Detektor ist, der das Niveau der Flüssigkeit
in dem Seitenbehälter erfaßt.
77. Einrichtung von Anspruch 75, worin die niveauerfassende Einrichtung
aufweist:
einen Schwimmer, der auf der Flüssigkeit in der Wanne schwimmt;
- 22 -
einen Balken, der ein erstes Ende, gekoppelt mit dem Schwimmer,
hat und ein zweites Ende, wobei der Strahl drehbar mit einem festen Punkt zwischen den Enden gekoppelt ist, so daß eine vertikale
Verschiebung des Schwimmers in einer verstärkten vertikalen Verschiebung des zweiten Endes des Balkens resultieren wird; und
eine Einrichtung zum Erfassen, ob das zweite Ende außerhalb eines vorbestimmten Verschiebungsbereiches ist, was anzeigt, daß das
Flüssigkeitsniveau nicht im wesentlichen auf dem vorbestimmten &iacgr;&ogr; Niveau ist.
78. Einrichtung von Anspruch 74, worin die Abstreifklinge einen Querschnitt
hat, und wobei der Querschnitt eine nichthorizontale Kante an dem unteren Teil der Klinge in der Richtung der Klingenbewegung
hat, die einen Winkel mit der Horizontalen bildet.
79. Einrichtung von Anspruch 78, worin der Winkel innerhalb eines Bereiches von ungefähr 5°-8° ist.
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US24939988A | 1988-09-26 | 1988-09-26 | |
US26503988A | 1988-10-31 | 1988-10-31 | |
EP89309762A EP0361847B1 (de) | 1988-09-26 | 1989-09-26 | Auftragen von stereolithographischen Schichten |
Publications (1)
Publication Number | Publication Date |
---|---|
DE8916116U1 true DE8916116U1 (de) | 1993-11-04 |
Family
ID=27232796
Family Applications (3)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
DE8916227U Expired - Lifetime DE8916227U1 (de) | 1988-09-26 | 1989-09-26 | Neubeschichten von stereolithographischen Schichten |
DE8916116U Expired - Lifetime DE8916116U1 (de) | 1988-09-26 | 1989-09-26 | Einrichtung zur Neubeschichtung von stereolithographischen Schichten |
DE8916228U Expired - Lifetime DE8916228U1 (de) | 1988-09-26 | 1989-09-26 | Neubeschichten von stereolithographischen Schichten |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
DE8916227U Expired - Lifetime DE8916227U1 (de) | 1988-09-26 | 1989-09-26 | Neubeschichten von stereolithographischen Schichten |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
DE8916228U Expired - Lifetime DE8916228U1 (de) | 1988-09-26 | 1989-09-26 | Neubeschichten von stereolithographischen Schichten |
Country Status (1)
Country | Link |
---|---|
DE (3) | DE8916227U1 (de) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE4414775A1 (de) * | 1994-04-14 | 1995-10-19 | Eos Electro Optical Syst | Vorrichtung und Verfahren zum Herstellen eines dreidimensionalen Objekts |
DE4417083A1 (de) * | 1994-05-16 | 1995-11-23 | Eos Electro Optical Syst | Beschichtungsvorrichtung, insbesondere für eine Einrichtung zum stereolithographischen Bilden eines dreidimensionalen Objekts |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE102014108634A1 (de) * | 2014-06-18 | 2016-01-07 | Heraeus Kulzer Gmbh | Effizienteres Verfahren zur Herstellung dreidimensionaler Objekte mittels Rapid-Prototyping |
-
1989
- 1989-09-26 DE DE8916227U patent/DE8916227U1/de not_active Expired - Lifetime
- 1989-09-26 DE DE8916116U patent/DE8916116U1/de not_active Expired - Lifetime
- 1989-09-26 DE DE8916228U patent/DE8916228U1/de not_active Expired - Lifetime
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE4414775A1 (de) * | 1994-04-14 | 1995-10-19 | Eos Electro Optical Syst | Vorrichtung und Verfahren zum Herstellen eines dreidimensionalen Objekts |
DE4417083A1 (de) * | 1994-05-16 | 1995-11-23 | Eos Electro Optical Syst | Beschichtungsvorrichtung, insbesondere für eine Einrichtung zum stereolithographischen Bilden eines dreidimensionalen Objekts |
Also Published As
Publication number | Publication date |
---|---|
DE8916227U1 (de) | 1995-08-17 |
DE8916228U1 (de) | 1995-08-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
DE68924952T2 (de) | Auftragen von stereolithographischen Schichten. | |
US5174931A (en) | Method of and apparatus for making a three-dimensional product by stereolithography | |
US5651934A (en) | Recoating of stereolithographic layers | |
DE69218572T2 (de) | Stereolithographische Vorrichtung und Verfahren zur Herstellung eines Modells | |
US5922364A (en) | Stereolithography layering control system | |
KR100301733B1 (ko) | 컴퓨터제어에의해컴퓨터데이타로부터3-차원대상체를제조하는방법및장치 | |
EP2905121B1 (de) | Vorrichtung sowie verfahren zur erzeugung dreidimensionaler strukturen | |
Renap et al. | Recoating issues in stereolithography | |
EP1250997A1 (de) | Vorrichtung zum Herstellen eines dreidimensionalen Objekts | |
EP3507074A1 (de) | Verfahren zum verfestigen eines photopolymerisierbaren, diffus reflektierenden materials | |
DE8916116U1 (de) | Einrichtung zur Neubeschichtung von stereolithographischen Schichten | |
JP2715636B2 (ja) | 立体形状形成装置における樹脂貯留槽の液面制御機構 | |
Kizito et al. | Experimental free coating flows at high capillary and Reynolds number | |
JP2001287273A (ja) | 立体造形方法及び装置 | |
KR0178874B1 (ko) | 평탄화 기구를 사용하여 매질의 층을 형성하는 스테레오리토그라피에 의하여 3차원 물체를 형성하는 방법 및 장치 | |
JPH08156105A (ja) | 液面高さ制御装置付き光硬化造形装置 | |
JP3419724B2 (ja) | 液面レベル測定装置および立体造形装置 | |
JP3294833B2 (ja) | 立体造形方法及び装置 | |
Jeng et al. | Over-curing reduction of parts fabricated by the solid laser-diode plotter rapid prototyping system using the Taguchi method | |
EP4237223A1 (de) | 3d-druckvorrichtung, 3d-druckverfahren und mit diesem verfahren erhaltene dreidimensionale rohrförmige gegenstände | |
DE19631205A1 (de) | Verfahren und Vorrichtung zur Erfassung der Geometrien von dreidimensionalen Objekten | |
EP4341751A1 (de) | Verfahren zum erzeugen einer dreidimensionalen zielstruktur in einem lithographiematerial mittels einer laserlithographie-vorrichtung | |
WO2022253591A1 (de) | Lithographisches verfahren zur aufprägung von dreidimensionalen mikrostrukturen mit übergrossen strukturhöhen in ein trägermaterial | |
IL309788A (en) | Treatment of waste obtained in the additive manufacturing process | |
JPH06134873A (ja) | 光造形装置 |