Optimalisering van het materiaalverbruik bij flexibele
automatisering van de fabrikage van stripprodukten
Citation for published version (APA):
Gool, van, J. M. C. (1986). Optimalisering van het materiaalverbruik bij flexibele automatisering van de fabrikage van stripprodukten. (TH Eindhoven. Afd. Werktuigbouwkunde, Vakgroep Produktietechnologie : WPB; Vol. WPB0258). Technische Hogeschool Eindhoven.
Document status and date: Gepubliceerd: 01/01/1986
Document Version:
Uitgevers PDF, ook bekend als Version of Record
Please check the document version of this publication:
• A submitted manuscript is the version of the article upon submission and before peer-review. There can be important differences between the submitted version and the official published version of record. People interested in the research are advised to contact the author for the final version of the publication, or visit the DOI to the publisher's website.
• The final author version and the galley proof are versions of the publication after peer review.
• The final published version features the final layout of the paper including the volume, issue and page numbers.
Link to publication
General rights
Copyright and moral rights for the publications made accessible in the public portal are retained by the authors and/or other copyright owners and it is a condition of accessing publications that users recognise and abide by the legal requirements associated with these rights. • Users may download and print one copy of any publication from the public portal for the purpose of private study or research. • You may not further distribute the material or use it for any profit-making activity or commercial gain
• You may freely distribute the URL identifying the publication in the public portal.
If the publication is distributed under the terms of Article 25fa of the Dutch Copyright Act, indicated by the “Taverne” license above, please follow below link for the End User Agreement:
www.tue.nl/taverne Take down policy
If you believe that this document breaches copyright please contact us at: openaccess@tue.nl
providing details and we will investigate your claim.
Optimalisering van het materiaalverbruik bij flexibele automatisering van de
fabricage van stripprodukten
J.M.C. van Gool
Rapportnr. WPB.0258
Verslag van de Il-opdracht uitgevoerd bij de vakgroep WPB.
Afstudeerdocent: prof. ire J.M. van Bragt Begeleider ing. J.J.M. Schrauwen
SAMENVATTING
Dit is het verslag van de 11-opdracht, uitgevoerd binnen de vakgroep WPB door J.M.C. van Gool in het Kader van zijn studie tot werktuigbouwkundig ingenieur, aan de Technische Hogeschool te Eindhoven.
De opdracht luidt:"Optimalisering van het materiaalverbruik bij flexibele autontatisering van de fabricage van stripprodukten-. Dit betekent dat strippen met verschillende lengten, moeten worden gesneden, uit een lange uitgangslengte die dezelfde dikte en dezelfde breedte heeft .
In het eerste hoofdstuk worden eerst de drie belangrijkste van hetprobleem beschreven. De oplossings-strategien voor aanpak
eerste is eenvoudige compensatie waarbij uit een uitgangslengte steeds de grootst mogelijke nog te produceren strip gesneden wordt, totdat een restlengte onstaat die Kleiner is dan de kleinste nog te produceren strip. De tweede is lokale optimalisatie waarbij wOldt gestreefd naar een minimale hoeveelheid afval per versneden uitgangslengte. De derde methode is globale optimalisatie. Zoals uit hoofdstuk 3 zal blijken moeten de eisen hiervoor nog opgesteld worden. Vanuit de ontwikkeld. eerste twee Hoofdstuk 2 strategien moet als
werden enkele programmats een handleiding bij deze programma's worden gezien. Deze handleiding is geschreven voor degene die dit onderzoek eventueel voortzet. VOOI de gebruiker van de programmatuur is hij overbodig.
In hoofdstuk 3 worden enkele problemen besproken diezich voordoen bij gebruik van de programma's. Door tijdgebrek is de uitvoering van de opdracht beperkt gebleven tot minimalisatie van afval. Om tot werkelijke optimalisatie te Komen is een vervolgstudie noodzakelijk. Hiervoor worden een aantal suggesties gedaan.
INHOUD SAMENVATTING INHOUD INLEIDING HOOFDSTUK I 1.1 De orientatie 1. 2 StrategH~n 1.3 Toepassingen HOOFDSTUK II 2.1 Wijzbest.pas 2.2 Comp1.pas 2.2.1 Het hoofdprogramma 2.2.2 Function totstripprod 2.2.3 Function prodaanm 2.2.4 Procedure sorteer 2.2.5 Procedure produceer 2.2.6 Function leesint 2.3 Comp2.pas 2.3.1 Het hoofdprogramma 2.3.2 Procedure produceer 2.4 Lok.pas 2.4.1 Het hoofdprogramma 2.4.2 Procedure produceer pag. I I I 1 2 2 2 4 7 7 1 7 8 9 9 9 10 10 10 10 12 12 13
HOOFDSTUK III
3.1 Nadelen van de programma's 3.2 Minimalisatie en optimalisatie 3.3 Vervolgstudie 3.4 Conc1usie LITERATUURLIJST BIJLAGEN 17 17 19 19 20 IV
Inleidinq
Dit is het verslag van de 11-opdracht uitgevoerd door J.M.C. v. Gool in het kader van zijn studie aan de T.R. te Eindhoven. De opdracht werd uitgevoerd bij de vakgroep W.P.B.
De opdracht luidt :-Optimalisering van het materiaalverbruik bij flexibele automatisering van de fabricage van stripprodukten". Deze opdracht komt voort uit de afstudeer-opdracht van R.P.J. Hoens uitgevoerd bij Brink B.V. te Staphorst. (Rapportnr. WPB 0134)
Brink B.V. produceert trekhaken voor personenauto's en bestelwagens. In deze trekhaken zijn vele strippen verwerkt van verschillende
dikte, breedte en lengte. Deze strippen worden gesneden uit
materiaal met de juiste dikte en breedte en een uitgangslengte van 6 meter. Het grootste gedeelte, ongeveer 75\, is rechthoekig van vorm en de overige hebben een of twee schuine uiteinden. De productie van deze strippen moet worden geoptimaliseerd naar materiaalverbruik. Hiervoor moet een programma worden geschreven. De uitvoer van dit programma zal in een later stadium gegevens voor de besturing van het snijden van de strippen moeten opleveren.
HOOFDSTUK I
In dit hoofdstuk zal ingegaan worden op het zoeken naar en vinden van oplossings-strateqien voer het probleem van optimale productie van strippen.
1.1 De orientatie
Als eerste is in de literatuur gezocht naar eventuele eerdere oplossingen van het probleem. Deze werden echter niet gevonden. WeI werden aanwijzingen voor oplossing van soortgelijke problemen gevonden. Hierbij ging het om de zogenaamde "Cutting stock problems". [1] Dit is het snijden van rechthoeken uit een grote rechthoek. Dit doet zich bijvoorbeeld voor in de vlakglas industrie. Deze theorien worden eventueel toegepast in combinatie met "Knapsack functions". [2] Met deze theorien is het mogelijk om, binnen een "cutting stock problemY, aan te geven welke stukken bij voorkeur eerder verwerkt moeten worden. Hierop wordt in hoofdstuk 3 nog nader ingegaan. De theorie van ·cutting stock problems" bleek echter niet geschikt voor het oplossen van dit probleem, temeer omdat nesten van produkten hierin niet mogelijk is. Onder nesten wordt verstaan het zodanig snijden van produkten met veschillende vorm uit een plaat, dat zo weinig mogelijk afval onstaat. Verder zijn er gesprekken geweest met Dhr. Keulemans en Prof. Benders van de afdeling Wiskunde. Een speciale wiskundige techniek of theorie voor oplossing van het probleem bleek niet te bestaan.
WeI werden enkele strategien vaor het benaderen van het probleem gevonden. [3]
1.2 Strateqien
De drie· voornaamste strategien z~Jn eenvoudige compensatie,lokale optimalisatie en globale optimalisatie. (fig 1 )
De eerste strategie werkt als voIgt: uit de uitgangslengte wordt de grootste nog te produceren strip gesneden. Uit de ontstane momentane
..
restlengte wordt steeds de grootst mogelijke nog te produceren strip gesneden. De uiteindelijke restlengte is dan kleiner (statistisch de helft) dan de kleinste nog te produceren strip.
; 1. Kompen.sotie
Res.t!. :
11
b
~
200h
b
~
200 12h
~
800 14l4
~
2600 2. Lokole optimoli.50tieb
13h
1 012
14
14
1 011
~
1900h
~
1900 3. Globole ophmoli.50tle11
13~
200h
b
~
200 1214
14
I
a
5
-
3400figuur 1 . de drie gekozen oplossings strategien
uitgangslengte: 5100 mm, lengte 1: 3200 mm 2 stuks,
lengte 2: 2600 mm stuk, lengte 3: 1700 mm 3 stuks,
lengte 4: 1250 mm 2 stuks. Bij lokale
afvallengte
optimalisatie
per nieuwe
wordt steeds gestreefd naar een minimale uitgangslengte. Als hiervoor meerdere oplossingen bestaan dan wordt die gekozen waarin het kleinste aantal strippen verwerkt is. Dit betekent dan dat er zoveel mogelijk gebruik is gemaakt van de langere strippen.
Bij globale optimalisatie wordt ook gestreefd naar een zo laag mogelijk afvalpercentage, echter met als voorwaarde dat het "afval"
zoveel mogelijk aan een stuk zit. Oat zal namelijk verdere verwerking in volgende productie-runs vereenvoudigen.
Voor de eerste twee strategien zijn programma's geschreven. V~~r de
derde zou dit nog moeten geheuren. Hierop wordt in hoofdstuk 3 _nag nader ingegaan.
1.3 Toepassingen
De uitgangslengte van een nieuw stuk matariaal is 6 meter min de lengte nodig voor het klemmen. De gemiddelde striplengte ligt een
factor 25 lager. Oit hetekent dat gemiddeld uit een uitgangslengte
25 strippen gesneden kunnen worden. Vanwege deze verhouding is in eerste instantie gekozen voor gebruik van eenvoudige compensatie. Het eerste programma dat geschreven werd, afgezien van het programma voor het aanmaken en onderhouden van een hestand, maakt dan ook
gebruik van compensatie. Oit programma heet HCOMP1.PAS". Het
verwerkt echter aIleen rechthoekige strippen.
Daarom is dit programma na het testen uitgebreid en zodaniq veranderd dat ook strippen met schuine uiteinden verwerkt kunnen
worden. Oit is ·COMP2.PAS". Hierin wordt dus naast eenvoudige
compensatie ook nesting toegepast. Voor het toepassen van deze combinatie werd de volqende oplossinq gekozen: voor elkestrip worden twee lengten en twee hoeken gedefinieerd en voor de momentane restlengte twee lengten en een hoek. (fig 2 ) De eerste hoek is altijd positief, de tweede positief of negatief. Van de lengten L1 en L2 is L1 altijd de langste zijde.
Tijdens het versnijden worden nu, vaar elke snede, aile nag te produceren strippen hekeken, waarbij gezocht wordt naar een strip
met een hoek ("PHI1H of "PHI2") die zo dicht mogelijk bij "PHIR"
ligt. Zijn er meerdere van die strippen dan wordt die met de grootste lengte qekozen. Een betere hoek heeft dus voorrang op een grotere lengte. Oit is om het afval in de sneden zoveel mogelijk te
beperken-. Bij het zoeken naar de beste hoek wordt onderscheid
qemaakt tussen hoeken groter en hoeken kleiner als "PHIRH
• Van be ide
PHIl L2
,---fl---r--:
-=--=--=--=--=---r-;(----'
Ll PHI2 (positief)
PHI1 L2 PHI2 (negatief)
Lt-: ---1<
PHIR/f
L1 L2 momentane restlengte L1figuur 2 definities hoeken en lengten.
Ais aIle strippen bekeken zijn heeft men twee strippen. Een met de beste grotere hoek en een met de beste kleinere hoek. Nu wordt gekeken welke van deze twee het minste snedeverlies geeft. (fig 3 )
d = b*(tan PHI1 - tan PHIR)
HI1
BGRH
.,... ... ....:PHIR
BILH
d
=
b*{tan PHrR - tan PHI1)momentane restlengte
restlengte
figuur 3 snedeverlies bij twee veschillende hoeken
.
.
~\
.
\~
Omdat delta evenredig is met het verliesoppervlak in de snede, zal de strip met de kleinste delta verwerkt worden.
Bij het werken met ·COMP1.PAS" kan het afval van een
verwerkingslengte soms beperkt worden door enkele korte strippen te
verwerken in plaats van
een
of meerdere lange. Invcering van dezeachteraf uitgevoerde verbetering in het bestaande programma zou een behoorlijke uitbreiding van dit programma tot gevolg hebben. Daarom is gekozen voor strategieverandering. De nieuwe strategie werd aanpak via lokale oPtimalisatie, waarmee een zelfde resultaat
bereikt wordt. Deze aanpak is gerealiseerd in het programma
ALOI.PAS-. Dit programma verwerkt alleen rechthoekige strippen. De
HOOFDSTUK II
Alle programma's zijn op de PR1ME, in Pascal geschreven. Ze zijn zoveel mogelijk modulair opgebouwd. Dit betekent dat elke specifieke functie die het programma vervult gebeurt door een aparte procedure of function. Buiten de programma's voor snedebepaling is er ook een programma voor het aanmaken en onderhouden van een bestand. In dit bestand zijn aIle trekhaken opgeslagen met daarachter de strippen die nodig zijn om de trekhaak te fabriceren. In de volgende paragrafen zullen aIle programma's besproken worden.
2.1 WIJZBEST.PAS
Het programma "WIJZBEST.PAS" (bijlage 1) dient voor het aanmaken en onderhouden van "BESTANDft. Dit bestand is een database voor de programma's uit 2.2 en 2.4 en is opgebouwd uit records waarin achtereenvolgens staan: trekhaaknummer, dikte, breedte, lengte, aantal. Als een trekhaak meerdere strippen bevat dan staat in het bestand voor elke strip een regel. In het bestand voor het programma uit 2.3 zijn er drie extra gegevens in het bestand. Hierop wordt later teruggekomen. V~~r dit programma wordt dan ook "WIJZBESTSCH.PAS" (bijlage 2) gebruikt. Dit programma levert "BESTANDSCH" op. Beide pascalprogramma's zijn programma-technisch hetzelfde opgebouwd.
Het programma levert de gebruiker steeds keuzemenu's waardoor het steeds duidelijk is wat als invoer verlangd wordt. Vanwege de werking met keuzemenu's is de opbouw van het programma zo duidelijk dat verdere toelichting overbodig is.
2.2 COMP1.PAS
~ Ret hoofdprogramma
Ret programma "COMP1.PAS" (bijlage 3) is een programma dat werkt volgens het principe van eenvoudige compensatie. Dit programma kan
in tegenstelling tot "COMP2.PAS· aIleen rechthoekige strippen verwerken. Het werkt echter sneller.
De invoer bestaat uit een of meerdere trekhaaknummers met daarachter het verlangde aantal. De uitvoer bestaat uit gegevens omtrent de wijze van versnijden. Naast deze berekeningen houdt het programma "MAGAZIJN" bij. In deze file zijn aIle eerder geproduceerde restlengten opgeslagen. Ret hoofdprogramma vraagt eerst om de invoer. Dit wordt opgeslagen in RPRODINV". Daarna worden een aantal functions en procedures doorlopen. Deze worden in de volgende paragrafen besproken. De volgorde waarin ze doorlopen worden is hieronder aangegeven.
--1--"Stel een lijst op van aIle te produceren strippen" REPEAT
--2-- RStel een lijst op van aIle strippen met dezelfde dikte*breedte die nog geproduceerd moeten worden"
--3--"Zet deze strippen op volgorde van lengte" --4--MBepaal de snedeverdeling"
UNTIL "Alle strippen geproduceerd" 1= Function RTOTSTRIPPROD" 3= Procedure ·SORTEER"
2.2.2 Function " TOTSTRIPPROD "
2= Function "PRODAANM" 4= Procedure "PRODUCEERu
Deze function stelt een lijst op van aIle te producer en strippen. Het maakt hierbij gebruik van de eerder genoemde file's "BESTAND" en "PRODINVd
• Als invoerparameter wordt het aantal trekhaken in
·PRODINV· meegegeven.
" TOTSTRIPPROD" neemt een trekhaak uit "PRODINV". Dan wordt in het bestand gezocht welke strippen hierbij horen. Deze strippen worden in array "AANMTOT" opgeborgen met daarachter het benodigde aantal en het trekhaaknummer. Als een ingevoerde trekhaak niet in het bestand voorkomt dan wordt dit gemeld. De uitvoer van deze function bestaat dus uit het array nAANMTOT". De waarde van deze function wordt gelijk aan het aantal strippen in "AANMTOT".
2.2.3 Function ·PRODAANM"
Deze function stelt uit "AANMTOT" een lijst op van aIle strippen met
dezelfde dikte*breedte. De eerste strip die wordt genomen is de
bovenste nog te produceren strip in ~AANMTOT". Deze nieuwe lijst
wordt opgeslagen iIi .. AANMAAK". Ala een strip langer is dan de
uitgangslengte dan wordt dit gemeld.
·PRODAANMR krijgt als invoerwaarde het aantal strippen in "AANMTOT"
mee en krijgt zelf de waarde van het aantal verschillende
striplengten in RAANMAAK".
u..!
Procedure ·SORTEER"Hierin wordt "AANMAAK" zodanig gewijzigd dat aIle strippen op
volgorde van lengte staan. De langste strip staat hierbij in het
eerste record.
Als invoerparameter wordt het aantal lengten in "AANMAAK" (=waarde
van ·PRODAANMW
) meegegeven.
~ Procedure "PRODUCEER"
Deze procedure heeft dezelfde invoerparameter als de vorige
procedure. Aan de hand van het gesorteerde array ·AANMAAK" bepaalt
deze procedure hoe de strippen versneden moeten worden. Het
verwerken gebeurt volgens het principe van eenvoudige compensatie zoals omschreven in hoofdstuk 1. Deze procedure zorgt tevens voor uitvoer van de berekende gegevens.
V~~r het versnijden wordt eerst zoveel mogelijk gebruik gemaakt van oude restlengten. Deze staan opgeslagen in HMAGAZIJN·.
Binnen de procedure "PRODUCEER" worden twee andere procedures
gebruikt. De eerste is de function "BEGINLENGTEH die als invoer de
kleinste nog te producer en striplengte meekrijgt. Als in het magazijn nog een restlengte ligt die groter is dan deze waarde dan krijgt " BEGINLENGTE " de waarde van die lengte en anders de waarde
"UITGLENGTED
• Dit is een constante die in de kop van het
hoofdprogramma een waarde krijgt. Deze waarde is gelijk aan de uitgangslengte van een nieuw stuk materiaal min de klemlengte. Onder klemlengte wordt verstaan de lengte die nodig is om het stuk in te
"BERGopn. Deze bergt een restlengte, die ontstaat na het versnijden,
op in "MAGAZIJW.
2.2.6 Funtion aLEESINT"
Deze functie leest alle invoerwaarden. In dit pro9ramma zijn ddt de trekhaaknummers en hun aantallen. Er is hier gebruik gemaakt van een procedure omdat bij het rechtstreeks inlezen van getallen met een read-statement het programma gestopt wordt wanneer een ander karakter als een getal zelfs maar wordt aangeraakt. Deze procedure voorkomt dit,
iets verkeerds
en vraagt om de waarden opnieuw in te geven als er wordt ingegeven. Deze procedure komt in aIle
programma's v~~r.
2.3 COMP2.PAS
2.3.1 Het hoofdprogramma
Het programma "COMP2.PAS" (bijlage 4) werkt net als het vorige met het principe van eenvoudige compensatie. Naast rechthoekige strippen verwerkt dit programma ook strippen met schuine uiteinden.
Het hoofdprogramma is op de ontbrekende procedure "SORTEER" na hetzelfde als "COMP1.PAS". AIle procedures zijn echter verschillend. Voor de functions "TOTSTRIPPROD" en "PRODAANM" beperken de verschillen zich tot drie extra variabelen. (zie 1.3). Ook het bestand, in dit geval HBESTANDSCH", kent deze extra variabelen. In een record voor een strip uit het bestand staan achtereenvolgens de volgende waarden: trekhaaknummer, dikte, breedte, lengte1, lengte2, hoek1, hoek2, aantal. De verschillen tot nu toe genoemd zijn van boekhoudkundige aard. Het echte verwerkingsverschil zit in de hierna te bespreken procedure.
~ Procedure " PRODUCEER "
In deze procedure worden, voor elke te snijden strip, aIle strippen
uit "AANMAAK" opnieuw bekeken. In HAANMAAKH staan aIle nog te
producer en strippen. Hieruit worden dan twee strippen geselecteerd
neem volgende MOMSTR ~ __________ ~~ __________ ,
uit AANMAAR
BRLH : = MOMSTR ,"--E--""
procedure BERIJRHOER
~+--~----f verwerk de beste strip
procedure BEGINLENGTE
neem eerste MOMSTR
uit AANMAAK ~----~~----~.
+
-
EINDE GENEREERDeze twee strippen zijn RBGRH" en " BKLH " , waarin de eerste staat voor de strip die tijdens het zoeken de beste hoek groter als "PHIR" bezit, en de tweede voor de Reste KLeinere Hoek. Een hoek gelijk aan ·PHIR ft komt in "BKLHft te staan. Hieruit wordt dan de strip gekozen die het minste afval geeft in de snede. De werking van uGENEREER" staat weergegeven in figuur 4 . Hierin is " MOMSTR" de MOMentane STRip, d.i. de strip die op dit moment bekeken wordt.
De procedure " BEKIJKHOEK " kijkt of "PHI1" van "MOMSTRu
groter of kleiner is dan HPHIR". Ais de hoek "PHI1 H kleiner is dan ·PHIR" wordt deze strip vergeleken met UBKLH". Als "PHI1" nu dichter bij
"PHIR" ligt dan "BKLH" dan wordt "BKLH" gelijk aan "MOMSTRO.
Zijn de hoeken van "MOMSTR" en "BKLH" gelijk dan wordt gekeken of "MOMSTR U langer is dan "BKLH". Ais dit het geval is ook dan krijgt "BKLH" de waarde van HMOMSTR". Als HPHI11t groter is dan HPHIR" wordt
"PHI1ft vergeleken met RBGRHH.
Daarna wordt uBEKIJKHOEK" met hoek "PHI2M doorlopen.
De procedure " BEGINLENGTE " zorgt ervoor, dat eerst alle lengten uit "MAGAZIJN" , met een zelfde dikte*breedte als de te producer en strippen, op bruikbaarheid getest worden. Pas daarna worden door deze procedure nieuwe uitgangslengten voor productie aangeboden. De procedure "BERGOP" zet ontstane restlengten weg in "MAGAZIJN". De procedure -STRIPTEKST" verzorgt, in de uitvoer, het gedrukte kopje boven elke volgende startlengte.
In het diagram staat een blok met de tekst 'verwerk beste strip'. Hierin wordt eerst gekeken wat de meest gunstige oplossing is, "BKLH- of "BGRH". De beste strip wordt dan afgeboekt in "AANMAAK" en 'afgesneden' van de momentane restlengte. Natuurlijk wordt bij alle berekeningen rekening gehouden met lengte-verschillen die ontstaan bij het afsnijden van een strip met een andere hoek als "PHIR".
2.4 LOK.PAS
2.4.1 Het hoofdprogramma
Het programma "LOK.PAS H (bijlage 5) verwerkt alleen rechthoekige strippen volgens het principe van lokale optimalisatie.
Ret hoofdprogramma Ioopt hetzeIfde ais het programma in 2.3. Ook zijn, op de procedure "PRODUCEER" na, aIle procedures hetzelfde. Daarom wordt hier volstaan met het bespreken van ·PRODUCEER".
2.4.2 Procedure " PRODUCEER "
Deze procedure werkt globaal als weergegeven in figuur 5.
maak nieuwe matrix met startwaarden
procedure GENEREER
verwerk gegevens
procedure BERGOP
EINDE PRODUCEER
In figuur 5 is te zien dat binnen de procedure ·PRODUCEER H drie andere procedures gebruikt zijn.
De eerste is -BEGINLENGTEH
• Deze kijkt in gMAGAZIJN 8
of er nog bruikbare restlengten zijn. Indien niet aanwezig wordt een nieuwe uitgangslengte geleverd.
De procedure HBERGOP" zet de bij verwerking onstane restlengten weg in -MAGAZIJNH
•
De procedure -GENEREER" staat 5chematisch weergegeven In figuur 6.
i:=i+1
figuur 6
bereken Tn ,....,~~. +
i
=
indexN
=
aantal verschillende lengten Ai= aantal nog te produceren strippenmet lengte Li
Ti= aantal strippen met lengte Li in de bekeken combinatie U
=
uitgangslengte i-1 SOM=[
Tj*Lj j=1 diagram dGENEREER"Deze procedure krijgt als startwaarden aIle nog te producer en lengten met hun aantallen mee. Deze staan in de startmatrix WINOOT".
Hiermee doorloopt deze procedure systematisch aIle mogelijke
combinaties van strippen en onthoudt steeds die met het minste afval. Als een oplossing gevonden wordt met een afvallengte die ligt tU5sen 0 en "GRENS· dan wordt het zoeken gestaakt voordat aIle combinaties zijn geprobeerd, met als eindresultaat deze oplossing. De constante " GRENS " kan in de programmakop gegeven worden. ftGRENS· moet groter of gelijk 0 zijn en kleiner dan de kleinste te producer en lengte. De uitvoer van deze procedure, zijnde de manier waarop een uitgangslengte vesneden moet worden, wordt geleverd in de matrix "INOOTft.
De manier waarop systematisch aIle mogelijke oplossingen bekeken worden is als voIgt. Stel dat 4 stuks L1, 2 stuks L2 en 3 stuks L3
gesneden moeten worden, waarbij L1>L2>L3. De volgorde waarin de
mogelijke oplossingen doorlopen worden wordt dan:
000 100 200 400 010 110 210 410 020 420 001 101 201 4 0 1 0 1 1 1 1 2 1 4 1 1
o
2 1 421 002 003 102 103 202 203 402 403 0 1 2 0 1 3 1 1 2 1 1 3 2 1 2 2 1 3 4 1 2 413 022 023 422 423De volgorde is hier sterk vereenvoudigd weergegeven en moet
kolomsgewijs gelezen worden.
Om het rekenwerk sterk te verminderen wordt nu een methode
toegepast, die het overbodig maakt om aIle mogelijke combinaties van
voorschrijft, kan men het aantal benodiqde L1 15 rechtstreek5
berekenen. Biertoe wordt eerst het verschil tussen de uitgangslengte en de som van de striplenqten L2 en L3 bepaald. Dit verschi! wordt qedeeid door de lenqte van de lanqste strip (L2) en naar beneden
afgerond. Hiermee wOLdt ht:=l.: aantal te doorlopen combinaties
verkleind met een factor die even groat is als het aantal te produceren strippen L1 plus een.
bOO b 0 1 b 0 2 b 0 3
b 1 0 b 1 1 b 1 2 b 1 3
b 2 0 b 2 b 2 2 b 2 3
Verder worden aIle combinaties waarin de uitganqslenqte zou worden overschreden overgeslagen.
ROOFDSTUK III
In dit hoofdstuk zuIIen de problemen besproken worden die zich voordoen bij het qebruik van de hiervoor gepresenteerde proqramma's. Weqens tijdqebrek is de uitvoerinq van de qeqeven opdracht beperkt qebleven tot het zoeken naar minimalisatie van het materiaalverbruik. Om tot werkelijke optimalisatie te komen is verdere studie noodzakelijk. Riertoe worden in dit hoofdstuk enkele suqqesties qedaan.
3.1 Nadelen van de programma's
Ret probleem dat zich voordoet bij het qebruik van "COMP1.PAS" is al eerder in dit verslaq ter sprake qekomen. Ret afval dat ontstaat bij het werken met dit proqramma zou soms aanzienlijk verminderd kunnen worden door een of meerdere lange strippen in een verwerkingslenqte te vervangen door enkele kleinere strippen. In fiquur kan bijvoorbeld in de derde snede strip 3 vervangen worden door twee strippen 4 waarmee de restlenqte nihil wordt. Oit probleem doet zich in ·COMP2.PAS· noq sterker voor omdat daar een qunstiqe hoek voorranq heeft op een qunstiqer lenqte. Oit probleem is inherent aan het qebruik van eenvoudige compensatie. Bij gebruikmakinq van lokale optimalisatie wordt met dit probleem afqerekend. Riermee bleek achteraf qezien een ander probleem te ontstaan. Oit probleem wordt hieronder omschreven.
In het vervolq van dit hoofdstuk wordt onder productie-run het snijden van aIle te produceren striplenqten met dezelfde dikte*breedte verstaan. In het proqramma "LOK.PAS" wordt, voor elke nieuwe te versnijden uitqanqslenqter qestreefd naar een restlenqte
die liqt tussen 0 en "GRENS". Ais "GRENS· nul wordt qesteld betekent dit dat er qestreefd wordt naar de minimale hoeveelheid afval per uitqangslenqte.Oit betekent qeenszins dat de hoeveelheid afval over de gehele productie-run minimaal is. Cit kan men ala voIgt inzien: Stel dat in een bepaalde productie-run een combinatie gevonden wordt die een uitqanqslenqte versriijdt zonder afval. Ala in deze
combinatie de strippen voorkomen in een verhouding die gelijk is aan de verhouding van de nog te produceren lengten in deze run, dan is die combinatie ideaal. Oit betekent namelijk dat aIle strippen zonder afval geproduceerd kunnen worden.
Gesteld dat de gevonden combinatie naar verhouding meer langere strippen bevat, dan betekent dit dat in een later stadium van de run kortere strippen overblijven die nog geproduceerd moeten worden. Oit gaat makkelijk met betrekkelijk weinig afval. Oaarom komt men ook met deze combinatie tot een goede oplossing.
Bevat de gevonden combinatie in verhouding meer kleine strippen dan onstaat er een probleem. Eerst worden een aantal uitgangslengten verwerkt zonder dat dit afval oplevert. Als de kleinere strippen dan geproduceerd zijn, wordt naar een oplossing gezocht waarin aIleen nog de grotere strippen verwerkt worden. Oeze oplossing veroorzaakt dan vaak grote stukken afval. De aldus ontstane hoeveelheid afval kan zelfs de hoeveelheid die zou onstaan bij gebruik van eenvoudige
compensatie overtreffen. Oit probleem was niet voorzien toen
begonnen werd met het maken van een programma voor lokale
optimalisatie.
In het laatstgenoemde geval kan de hoeveelheid afval verminderd
worden door ·GRENS· te verhogen naar b.v. 50 mm. Oit betekent dat
eerder gestopt wordt met het doorlopen van ale mogelijke combinaties namelijk wanneer een oplossing gevonden wordt met een restlengte tussen 0 en 50 mm. In verband met de volgorde waarin de combinaties doorlopen worden zal in de verhouding van de gebruikte strippen in de gevonden oplossing een verschuiving optreden naar meer langere strippen en dus minder kleine. Oit betekent dat in het begin wat meer afval toegelaten wordt. Maar aangezien er nu meer kleinere strippen overblijven wordt de hoeveelheid afval in een later stadium van de run kleiner. In totaal zal de hoeveelheid afval afnemen maar de verdere verwerking hiervan in volgende productie-runs wordt moeilijker omdat de afvallengten kleiner zijn. Hiermee komen we aan het hoofdprobleem van het versnijden van strippen.
3.2 Minimalisatie en optimalisatie
Met het programma "LOK.PAS· kan men door geschikte keuze van "GRENSR
komen tot een minimum aan "afval". Afval staat hier tussen
aanhalingstekens omdat later zal blijken dat een gedeelte van dit
afval verder verwerkbaar is. De geschikte keuze van " GRENS " zou door het programma zelf kunnen geschieden door een aantal keren dezeIfde produktie te laten genereren waarbij "GRENS" steeds wordt opgehoogd. De run met het beste resultaat wordt onthouden.
Een minimale hoeveelheid a·fval betekent niet dat de produktie optimaal is. Dit komt omdat die minimale hoeveelheid afval, zeker wanneer er veel strippen geproduceerd moeten worden, vaak gevonden
wordt met " GRENS " ongelijk O. Hierdoor onstaan dan vele kleine
stukjes afval. Deze kleine stukjes zijn moeilijker verder te verwerken in volgende productie-runs en eisen veel heen en weer geloop naar het magazijn. Als deze stukjes in een latere run verwerkt worden zal dit gebeuren door er kleine strippen uit te snijden. Dit betekent dan weer dat de hoeveelheid kleine strippen in deze run kleiner wordt. Hierdoor ontstaat dan weer meer afval ais begonnen wordt met het versnijden van nieuwe uitgangslengten
Als -GRENS· nul wordt gesteld is de hoeveelheid afval vaak groter
maar het zijn minder stukken met elk een grotere lengte. Hierdoor worden ze makkeIijker verwerkbaar in een volgende run en het heen en weer lopen naar het magazijn wordt verminderd.
Welke van de twee besproken situaties in de zin van minimale
productie- en materiaalkosten optimaal is, is niet zonder meer te
zeggen omdat bIijkbaar meer factoren dan aIleen materiaalverbruik een rol spelen. Om hierover te oordelen is het nodig een langere periode met meerdere productie-runs te bekijken.
3.3 Vervolqstudi,
Zoals reeds werd geschreven is productie met een minimum aan afval niet hetzelfde als optimale productie. Om tot dit laatste te komen zal eerst een kosten-analyse gemaakt moeten worden. aierin moeten de
verkoopprijs voor afval, kosten rekentijd, magazijnkosten, verliestijden door magazijn-handelingen, verliestijden door opspannen op de machine.
Sommige van deze factoren zullen bekeken moeten worden over enkele achtereenvolgende productie-runs. De in dit verslag gepresenteerde programma's zullen hierbij een goed hulpmiddel zijn. Uit deze analyse zal bijvoorbeeld moeten blijken of het rendabel is, om een restlengte waaruit later nog maar een strip gesneden kan worden, weg te brengen naar het magazijn. Deze strip moet in een volgende run weer worden opgehaald en opgespannen om er een strip uit te snijden. Dit zijn nogal wat handelingen om een strip te produceren en waarschijnlijk is het veel goedkoper om die restlengte te verkopen als afval.
Met de kosten-analyse kan een eisenpakket opgesteld worden waaraan een programma voor optimale productie moet voldoen. In dit programma kan eventueel gebruik worden gemaakt van "Knapsack functions". Daarmee is men in staat een voorkeur voor de volgorde van bewerking aan te geven, door aIle strippen een waarde te geven. Hoe hoger die waarde hoe hoger de prioriteit. V~~r elke verwerkingslengte moet dan een compromis worden gevonden tussen een juiste hoeveelheid afval en een maximum aan punten. De hoeveelheid afval zal hierdoor toenemen, maar hiertegenover staat dat men binnen een weekproductie kan aangeven welke trekhaak voorrang heeft.
3.4 Conclusie Om tot optimale noodzakelijk. Het analyse. Hieruit
productie te komen is een vervolgstudie beste kan hierin worden gestart met een kosten-kan dan ais eerste worden geconcludeerd of een eventueel nieuw programma nog wezenlijk veel verbetering zal geven ten opzichte van "LOK.PAS". Misschien blijkt een wijziging van "LOR.PAS· zoals genoemd in paragraaf 3.2 reeds voldoende.
Als hetnoodzakelijk blijkt te zijn om een totaal nieuw programma te schrijven, dan kan uit de kostenanalyse een eisenpakket worden opgesteld, waaraan dit programma moet voldoen.
De in dit verslag besproken programma's zullen een goed hulpmiddel zijn om tot een kosten-analyse te kornen. Verder zullen ze een goede basis vormen voor een eventueel nieuw programma.
LITERATUUR
[1] P.Y. Wang. Two algorithms for constrained two-dimensional cutting stock problems. Operations research Vol. 31 1983 [2] P.C. Gilmore and R.E. Gomory
The theory and computation of Knapsack functions. Operations research Vol. 14 1966
[3] B. Wirsam. Optimierter rohmaterialeisatz durch rechnerunterstUtzte verschnittberechnung
PROGRAM WIJZBEST(INPUT,OUTPUT,BESTAND); TYPE STRIP=RECORD
TRHNR,DIK,BREED,LANG,AANT:INTEGER; END;
VAR BESTAND:FILE OF STRIP; A:STRIP;
RECNR,J,Z,GELIJK,I,T:INTEGER; VR1,VRO,VR:CHAR;
OPNIEUW:BOOLEAN;
{ { { { { { { { { {{ { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { {{ { { { { { { { { { { { { { { { { { { { { { {{ { { { { { { { { {}
{\\} FUNCTION LEESINT : INTEGER; {\\}
{~DEZE FUNCTION ZORGT ERVOOR OAT BIJ HET INLEZEN VAN*}
{*EEN REALWAARDE HET PROGRAMMA NIET STOPT ALS *}
{~PER ONGELUK lETS ANDERS DAN EEN GETAL WORDT INGEVOERD*}
VAR I : INTEGER; A :CHAR; F :TEXT; BEGIN
WHILE NOT (INPUT· IN ['+', '-', '0' .. '9']) DO BEGIN
IF INPUT·=' , THEN GET{INPUT)
END; REWRITE (F) ; REPEAT READ (A); ELSE BEGIN WRITELN;
WRITELN{'ALLEEN INTEGERS INVOEREN'); GET ( INPUT) ;
OPNIEUW:=TRUE; END;
IF A IN ['+', '-', '0' .. '9'] THEN WRITE {F,A}; UNTIL EOLN OR NOT (A IN ['+', '_', '0' .. '9']); RESET(F) ;
READ{F, I); LEESINT:=I; END;
BEGIN OPEN (BESTAND); Z: =-1 ; VRO:='D' j WHILE VRO<>'S' DO BEGIN
IF(VRO='A')OR(VRO='L'}OR(VRO='V')THEN VR1:=VRO ELSE VR1:='D'; CASE VR1 OF
'A' : BEGIN
WRITE('HOEVEEL GEGEVENS WILT U INVOEREN'); WRITELN; REPEAT OPNIEUW:=FALSEj T:=LEESINT; READLN; IF OPNIEUW=TRUE THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL OPNIEUW=FALSEj
WRITELN('BEGIN MET INVOER')j
WRITE{'GEEF (GESCHEIDEN DOOR 1 OF MEER SPATIES) 'l;
WRITELN('ACHTEREENVOLGENS DE VOLGENDE WAARDEN.')j WRITE('TREKHAAKNUMMER DIKTE BREEDTE LENGTE AANTAL '); WRITELN;WRITELN; WRITELN; FOR 1:=1 TO T DO END; BEGIN SEEK(BESTAND,LASTREC(BESTAND)+1)j WITH A DO REPEAT OPNIEUW:=FALSE; TRHNR:=LEESINT; DIK:=LEESINT; BREED:=LEESINTj tANG:=LEESINTj AANT:=LEESINT; READLN; IF OPNIEUW=TRUE THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL OPNIEUW=FALSE;
WRITE(BESTAND,A); END;
'V' : BEGIN WRITELN; VR:='Y' ;
WHILE VR='Y' DO BEGIN
WRITELN('WELK GEGEV~~NUMMER WILT U VERANDEREN')i WRITELN('VOOR NUMMERS ZIE GEGEVENS LEZEN')i WRITELN; REPEAT OPNIEUW:=FALSE; J:=LEESINTi READLN; IF OPNIEUW=TRUE THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL OPNIEUW=FALSE; IF J<=LASTREC(BESTAND)THEN BEGIN SEEK(BESTAND,J)i GET (BESTAND) i A : = BESTANDA i
WRITELN('DIT ZIJN DE HUIDIGE GEGEVENS');
WRITELN('TRHAAKNR DIKTE BREEDTE LENGTE AANTAL');_ WITH A DO BEGIN
WRITELN(TRHNR,DIK,BREED,LANG,AANT); WRITELN('WAT WILT U VERANDEREN'); WRITELN('(D) DIKTE')i WRITELN(' (B) BREEDTE'); WRITELN('(L) LENGTE'); WRITELN('(A) AANTAL'); READLN (VRO) ; IF(VRO='D')OR(VRO='B')OR(VRO='L')OR(VRO='A')THEN CASE VR1 OF '0' : BEGIN VR1 :=VRO ELSE VR1:='S' ; WRITELN{'WAT WORDT DE NIEUWE WAARDE'); REPEAT
OPNIEUW:=FALSE; DIK:=LEESINT; READLN;
IF OPNIEUW=TRUE THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL OPNIEUW=FALSEi
SEEK(BESTAND,J)i WRITE(BESTAND,A); END;
'B' :BEGIN
WRITELN('WAT WORDT DE NIEUWE WAARDE'); REPEAT
OPNIEUW:=FALSE; ·BREED:=LEESINTi
READtN;
IF OPNIEUW=TRUE THEN
WRITELN('VOER DE HEtE LAATSTE REGEL OPNIEUW IN'); UNTIL OPNIEUW=FALSE;
SEEK(BESTAND,J) ; WRITE(BESTAND,A)i
END;
'L' : BEGIN
WRITELN{'WAT WORDT DE NIEUWE WAARDE'); REPEAT
OPNIEUW:=FALSE; LANG:=LEESINT; READLN;
IF OPNIEUW=TRUE THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL OPNIEUW=FALSE;
SEEK (BESTAND I J) ;
WRITE{BESTAND,A); END;
'A I :BEGIN
WRITELN('WAT WORDT DE NIEUWE WAARDE'); REPEAT
OPNIEUW:=FALSE; AANT:=LEESINT; READLN;
IF OPNIEUW=TRUE THEN
WRlTELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL OPNIEUW=FALSE;
SEEK(BESTAND,J) ; WRITE(BESTAND,A);
END;
'S':WRITELN('VERKEERDE LETTER');
END; {EtNDE CASE STATEMENT}
END; {EINDE WITH A DO}
END; (EINDE IF J<= STATEMENT}
WRITE('WILT U NOG EEN GEGEVEN VERANDEREN (YIN)'); WRITELN;
READLN(VR) ; WRITELN;
END; {EINDE WHILE VR='Y' DO}
END.
'L' : BEGIN {DIT STUKJE PRINT BESTAND UIT}
WRITE ( , NUMMER I ) ;
WRITELN('TRHAAKNR DIKTE BREEDTE LENGTE AANTAL')j
WRITELN;
RECNR:=LASTREC(BESTAND); SEEK(BESTAND,1);
GET (BEST AND) ;
FOR J:=1 TO RECNR DO BEGIN
END; '0' :BEGIN WRITELNj WRITE(J) ; READ(BESTAND,A); WITH A DO WRITELN (TRHNR,DIK,BREED,LANG,AANT); END;
IF Z=-1 THEN WRITELN ELSE BEGIN
IF Z=O THEN WRITELN('ALLEEN KEUZELETTERS INGEVEN') ELSE IF Z=1 THEN WRITELN
('LAATSTE WAARSCHUWING. ALLEEN KEUZELETTERS INVOEREN') ELSE BEGIN WRITELN
('IK KAP ERMEE. HAAL MAAR IEMAND ANDERS DIE ER MEER VERSTAND'); WRITELN('VAN HEEFT!! '); END; Z:=Z+1i END; VRO:='S'j END; END;
IF VRO='S' THEN VRO:='S' (STOP ERMEEl ELSE BEGIN
WRITELN{'WILT U AANVULLEN (A) ,LEZEN (L) ,VERANDEREN (V)');
WRITELN('STOPPEN (S}'); WRITELN; READLN (VRO) ; END; END; CLOSE (BESTAND) ;
PROGRAM WIJZBESTSCH(INPUT,OUTPUT,BESTANDSCH); TYPE STRIP=RECORD
TRHNR,DIK,BREED,AANT:INTEGER; L1,L2,FI1,FI2:REAL i
END;
VAR BESTANDSCH~FrLE OF STRIP;
A:STRIPj
RECNR,J,GELIJK,I,T,Z:INTEGERi VR1, VRO, VR:CHAR;
OPNIEUW:BOOLEANi
{ { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { {{ { { { { { { { { { { { { { { { { { { {{ { { { { { { { { { { {}
{\\} FUNCTION LEESINT : INTEGER; {\\}
{*DEZE FUNCTION ZORGT ERVOOR OAT BIJ HET INLEZEN VAN*} {*EEN REALWAARDE HET PROGRAMMA NIET STOPT ALS *}
{*PER ONGELUK lETS ANDERS DAN EEN GETAL WORDT INGEVOERD*} VAR I : INTEGER;
A : CHAR;
F : TEXT; BEGIN
WHILE NOT (INPUT· IN ['+', '-' 1'0' .. '9 ' ]) DO
BEGIN
IF INPUT·=' , THEN GET{INPUT)
END; REWRITE (F) ; REPEAT READ (A) ; ELSE BEGIN WRITELN;
WRITELN('ALLEEN INTEGERS INVOEREN')i GET ( INPUT) i
OPNIEUW:=TRUE; END;
IF A IN ['+' I ' - ' , '0' .. '9'] THEN WRITE (F,A);
UNTIL EOLN OR NOT (A IN ['+' I ' - ' ,'0' .. '9']);
RESET(F) i
READ(F,I); LEESINT:=Ii END;
{%%} FUNCTION LEESREAL : REAL; {%%}
{*DEZE FUNCTION ZORGT ERVOOR DAT BIJ HET INLEZEN VAN*} {tEEN REALWAARDE HET PROGRAMMA NIET STOPT ALS t} {*PER ONGELUK tETS ANDERS DAN EEN GETAL WORDT INGEVOERD*}
BEGIN
VAR I :REALi A : CHAR; F : TEXT j WHILE NOT (INPUT4
IN ['+' I'. " '-' 1'0' .. '9']) DO
BEGIN
IF INPUT·=' , THEN GET(INPUT)
END· REWRITE(F) ; REPEAT READ (A) j ELSE BEGIN WRITELNj
WRITELN('ALLEEN INTEGERS INVOEREN')i GET ( INPUT) ;
OPNIEUW:=TRUE; ENDi
IF A IN ["+' I'.' 1'-', '0' .. '9'] THEN WRITE (F,A); UNTIL EOLN OR NOT (A IN ["+','. ", '-', '0' .. '9']); RESET(F) ; READ(F,I); LEESREAL:=I; ENDj { { { { { { { { { { { { {{ { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { ( { { { { { { { { { { { ( {} BEGIN OPEN (BESTANDSCH): VRO: ='D' i Z:=-1j WHILE VRO<>'S' DO BEGIN
IF(VRO='A')OR(VRO='L')OR(VRO='V')THEN VR1:=VRO ELSE VR1:='D'j CASE VR1 OF
'A' :BEGIN
WRITE('HOEVEEL GEGEVENS WILT U INVOEREN'); WRITELN; REPEAT OPNIEUW:=FALSEj T:=LEESINT; READLNi IF OPNIEUW THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'}; UNTIL NOT OPNIEUW;
WRITELN('BEGIN MET INVOER. GEEF ACHTEREENVOLGENS'); WRITE('TREKHAAKNUMMER,DIKTE,BREEDTE,L1,L2' );
WRITELN(' ,FI1,FI2,AANTAL')j
WRITE('ALLE WAARDEN MOETEN OP EEN REGEL GESCHEIDEN'); WRITELN(' DOOR SPATIES WORDEN INGEVOERD. ');
WRITELN('D£ WAARDEN VOOR: L1 = LANGSTE ZIJDE ');
WRITELN(' L2 = RORTSTE ZIJDE');
WRITELN(' FI1 = LINRERHOER (POSITIEF)');
WRITE(' FI2 = RECHTERHOER (POSITIEF');
WRITELN{'OF NEGATIEF)');
WRITELN('MOETEN DEClMAAL WORDEN INGEVOERD')j WRITELN; FOR 1:=1 TO T DO END; BEGIN SEEK(BESTANDSCH,LASTREC(BESTANDSCH)+1); WITH A DO BEGIN. REPEAT OPNIEUW:=FALSE; TRHNR:=LEESINT; DIK:=LEESINT; BRE£D:=LEESINT: L1:=LEESREAL; L2:=LEESREALj F11:=LEESREAL; FI2: =LEESREAL; AANT:=LEESINT; READLNi IF OPNIEUW THEN
WRITELN('VOER DE HEtE LAATSTE REGEl, OPNIEUW IN'); UNTIL NOT OPNIEUW;
END; WRITE{BESTANDSCH/A)i END; 'V' : BEGIN WRITELN; VR:='Y' ; WHILE VR='Y' DO BEGIN
WRITEtN('WELK GEGEVENNUMMER WILT U VERANDEREN'); WRITELN('VOOR NUMMERS ZIE GEGEVENS LEZEN'}; WRITELN; REPEAT OPNIEUW:=FALSE; J:=LEESINT; READtN; IF OPNIEUW THEN
WRITELNC'VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL NOT OPNIEUWi
IF J<=LASTREC(BESTANDSCH)THEN BEGIN SEER(BESTANDSCH,J); GET (BESTANDSCH) ; A := BESTANDSCHA ;
WRITELN('OIT ZIJN DE HUIDIGE GEGEVENS');
WRITE ( • TRHNR DIR BREED L 1 t 2 ' ) ;
WITH A DO BEGIN
WRITE(TRHNR:7,DIK:5,BREEO:5,L1:10:2,L2:10:2); WRITELN(FI1:10:2,FI2:10:2,AANT:4);
WRITELN('WAT WILT U VERANDEREN'); WRITELN{'(D) DIKTE'); WRITELN('(B} BREEDTE'); WRITELN(' (L) LI Ji WRITELN('(M) L2'); WRITELN('(F) FI1'); WRITELN('(G) FI21); WRITELN(' (A) AANTAL'); READLN(VRO) ; IF(VRO='D')OR(VRO='B')OR(VRO='L')OR(VRO='M') OR (VRO='F')OR(VRO='G')OR(VRO='A') THEN CASE VR1 OF '0' : BEGIN VR1 :=VRO ELSE VR 1: =:' S' ;
WRITELN('WAT WORDT DE NIEUWE WAARDE'); REPEAT
OPNIEUW:=FALSE; DIK:=LEESINT; READLN;
IF OPNIEUW THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL NOT OPNIEUWi
SEEK(BESTANDSCH,J); WRITE{BESTANDSCH,A); END;
'B' :BEGIN
WRITELN('WAT WORDT DE NIEUWE WAARDE'); REPEAT
OPNIEUW:=FALSE; BREED:=LEESINT: READLN;
IF OPNIEUW THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL NOT OPNIEUW;
SEEK(BESTANDSCH,J); WRITE(BESTANDSCH,A); END;
'L' : BEGIN
WRITELN('WAT WORDT DE NIEUWE WAAROE'}i REPEAT
OPNIEUW:=FALSE; L 1 : =LEESREAL i
READLN;
IF OPNIEUW THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL NOT OPNIEUWi
SEEK{BESTANDSCH,J); WRITE{BESTANDSCH,A); END;
'M' : BEGIN
WRITELN('WAT WORDT DE NIEUWE WAARDE'); REPEAT
OPNIEUW:=FALSE; L2:=LEESREAL; READLN;
IF OPNIEUW THEN
WRITELN('VOER OE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL NOT OPNIEUWj
SEEK(BESTANDSCH,J); WRITE(BESTANDSCH,A}; END;
'F' : BEGIN
WRITELN('WAT WORDT DE NIEUWE WAARDE')i REPEAT
OPNIEUW:=FALSE; FI 1 : =LEESREAL i
READLNi
IF OPNIEUW THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL NOT OPNIEUW;
SEEK(BESTANDSCH,J);
WRITE(BESTANDSCH,~);
END; 'G' :BEGIN
WRITELN('WAT WORDT DE NIEUWE WAARDE')i REPEAT
OPNIEUW:=FALSEi FI 2 : =LEESREAL; READLN;
IF OPNIEUW THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL NOT OPNIEUWj
SEEK(BESTANDSCH,J); WRITE{BESTANDSCH,A); END;
'A' : BEGIN
WRITELN('WAT WORDT DE NIEUWE WAARDE'); REPEAT
OPNIEUW:=FALSE; AANT:=LEESINT; READLN;
IF OPNIEUW THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL NOT OPNIEUWi
SEEK(BESTANDSCH,J); WRITE(BESTANDSCH,A); END;
END.
's' :WRITELN('VERKEERDE LETTER');
END; {EINDE CASE STATEMENT} END; {EINDE WITH A DO}
END; {EINDE IF I<= STATEMENT}
WRITE('WILT U NOG EEN GEGEVEN VERANDEREN (YIN)'); WRITELN;
READLN(VR) ; WRITELN;
END; {EINDE WHILE VR='Y' DO} END; {EINDE 'V'}
'L' : BEGIN {DIT STUKJE PRINT BESTANDSCH UIT} WRITE (' NR');
WRITE(' TRHNR DIK BREED L1 L2 ');
WRITELN ( , FI 1 FI2 AANT' ) ; WRITELN;
RECNR:=LASTREC(BESTANDSCH); SEEK(BESTANDSCH,1);
GET (BESTANDSCH) ;
FOR J:=1 TO RECNR DO BEGIN
WRITE(J:3); READ{BESTANDSCH,A); WITH A DO BEGIN WRITE(TRHNR:7,DIK:5,BREED:5,L1:10:2,L2:10:2); WRITELN(FI1:10;2,FI2:10:2,AANT:4); END; '0' : BEGIN WRITELN; END; END;
IF Z=-1 THEN WRITELN ELSE BEGIN
IF Z=O THEN WRITELN('ALLEEN KEUZELETTERS INGEVEN') ELSE IF Z=1 THEN WRITELN
('LAATSTE WAARSCHUWING. ALLEEN KEUZELETTERS INVOEREN') ELSE BEGIN WRITELN
('IK KAP ERMEE. BAAL MAAR IEMAND ANDERS DIE MEER VERSTAND .'); WRITELN('HEEFT DAN JIJ. BOEREN ... !! ');
END; Z:=Z+1; END; VRO: =' S I; END; END;
IF VRO='S' THEN VRO:='S' {STOP ERMEE} ELSE BEGIN
WRITELN('WILT U AANVULLEN (A) ,LEZEN (L) ,VERANDEREN (V)'); WRITELN('STOPPEN (S)');
WRITELN; READLN{VRO) ;
END; END;
PROGRAM COMP1 (INPUT,OUTPUT,BESTAND,MAGAZIJN)i
CONST MAXTRH=10i MAXSTR=60; {ONGEVEER 6 STRIPPEN PER TRHAAK} UITGLENGTE=6000; TYPE STRIPAANM=RECORD AANT,LANG,TRRNR:INTEGER; END; STRIP=RECORD TRHNR,DIK,BREED,LANG,AANT:INTEGER; END; AFVAL=RECORD D,BR,RESTL:INTEGERi END;
VAR PRODINV:ARRAY[1 .. MAXTRH] OF RECORD
TRHNR,AANTAL:INTEGER; END;
BESTAND:FILE OF STRIP; MAGAZIJN:FILE OF AFVAL;
AANMAAK:ARRAY[1 .. MAXSTR] OF STRIPAANM; AANMTOT:ARRAY[1 .. MAXSTR] OF STRIP; I,J,K,TOTAANTSTR,RECNR,TRHNR,AANTTRH, BREEDTE,DIKTE,PRODAANT:INTEGER; OPNIEUW : BOOLEAN; A:STRIP; C:AFVAL; { { { { { { { { { { { {{ { { { { { { { { { { ( ( { { ( { { { { {{ { { { { { { { { { { { { { { ( { { { { { { { { { ( { { { { { ( { { ( { { { { { { {}
{\\} FUNCTION LEESINT : INTEGER; (\\}
(*DEZE FUNCTION ZORGT ERVOOR OAT BIJ HET INLEZEN VAN*} {*EEN REALWAARDE HET PROGRAMMA NIET STOPT ALS *} {*PER ONGELUK lETS ANDERS DAN EEN GETAL WORDT INGEVOERD*}
VAR I : INTEGER; A :CHAR; F :TEXT; BEGIN
WHItE NOT (INPUT· IN ('+','-', '0' .. '9']) DO BEGIN
IF INPUT· = , I THEN GET(INPUT}
END; REWRITE(F) ; REPEAT READ(A) ; ELSE BEGIN WRITEtN;
WRITELN('AtLEEN INTEGERS INVOEREN'); GET (INPUT) ;
OPNIEUW:=TRUE; END;
IF A IN ['+' , '-', '0' .. '9'] THEN WRITE (F,A); UNTIL EOLN OR NOT (A IN ['+','-' 1'0'. ,'9']); RESET{F) ;
READ(F,I); tEESINT:=I; END;
{\\} FUNCTION TOTSTRIPPROD(AANTALTREKHAKEN:INTEGER):INTEGER; {\\} {*DEZE FUNCTION STELT DE TOTALE STRIPPRODUKTIE OP AAN*}
{*DE HAND VAN DE INGEGEVEN TE MAKEN TREKHAKEN *} VAR AANTSTR,I,J,K,AANTAL,AANTTRHN : INTEGER;
AANWEZIG:BOOLEAN; BEGIN
AAN'tSTR : =0 ;
AANTTRHN:=AANTALTREKHAKEN;
FOR I:=AANTTRHN DOWNTO 1 DO {HIER WORDT DE TOTALE STRIPPROD OPGESTELD}
BEGIN RECNR:=LASTREC(BESTAND); SEEK(BESTAND,1); GET (BESTAND) ; TRHNR:=PRODINV[I].TRHNR; AANTAL:=PRODINV[I].AANTAL; AANWEZIG:=FALSE; FOR J:=1 TO RECNR DO BEGIN READ (BESTAND I A) ; IF A.TRHNR=TRHNR THEN BEGIN AANWEZIG: =TRUE; A.AANT:=A.AANT*AANTAL; AANTSTR:=AANTSTR+1; AANMTOT[AANTSTR]:=A; WITH A DO WRITELN{DIK,BREED,LANG,AANT,TRHNR); END; END;
IF NOT AANWEZIG THEN
WRITELN('TREKHAAK',TRHNR,' ZIT NIET IN HET BESTAND') END;
TOTSTRIPPROD:=AANTSTR;
{\\} FUNCTION PRODAANM(TOTAALAANTALSTRIPPEN:INTEGER):INTEGER; {\\} {*****DEZE FUNCTION ZOEKT UtT DE AANMTOT ALLE STRIPPEN*****}
{*****VAN GELIJKE DIKTE EN BREEDTE EN ZET DIE IN AANMAAK****} VAR I,J,AANTAL:INTEGER;
BEGIN
AANTAL:=TOTAALAANTALSTRIPPEN; 1:=1;
J:=1i
WHILE (AANMTOT[I].DIK=O) AND (I<=AANTAL)DO 1:=1+1; IF I (AANTAL+1 THEN BEGIN DIKTE:=AANMTOT(I].DIK; BREEDTE:=AANMTOT[I].BREEDi REPEAT IF (AANMTOT[I].DIK=DIKTE) AND (AANMTOT[I].BREED=BREEDTE) THEN BEGIN AANMAAKfJJ·LANG::AANMTOTIIJ.LANGi AANMAAK JJ.AANT:=AANMTOT[IJ.AANTi AANMAAK[J).TRHNR:=AANMTOT[I).TRHNRj AANMTOT[I].DIK:=O; J:=J+1 ; END; 1:=1+1; UNTIL I=AANTAL+1; END; PRODAANM:=J-1;
END; {EINOE FUNCTION PRODAANM}
{{{{{{{l{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{l{{{{{{{{{{{{{}
{ { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { (} {\\\\\} PROCEDURE SORTEER{AANTAL:INTEGER}i {\\\\\}
{*****OEZE PROCEDURE ZET RECORDS OF VOLGORDE VAN LENGTE*****} VAR I,IMAX,J:INTEGER; MAX:STRIPAANM; BEGIN FOR J:=1 TO AANTAL-1 00 BEGIN MAX:=AANMAAK[AANTAL]; lMAX:=AANTALi
FOR I:=AANTAL-1 OOWNTO J 00 IF AANMAAK(I].LANG>MAX.LANG THEN BEGIN MAX:=AANMAAK(I]; lMAX:=Ij ENOi AANMAAK[IMAX]:=AANMAAK[J]i AANMAAK[J]:=MAXi END;
{\%\\%} PROCEDURE PRODUCEER ( AANTAL:INTEGER); {\\\\\}
{***** DEZE PROCEDURE PRODUCEERT DE STRIPVERDELING*****} VAR MAXNR,MINNR,MOMNR,STRIPNR,RESTL:INTEGERi
MAX, MIN ,MOM :STRIPAANM ;
AANMOP : BOOLEAN;
{I!!!!} PROCEDURE BERGOP; {!! !l!}
VAR G:AFVALi Q:INTEGER; BEGIN C.RESTL:=RESTL; C.BR:=BREEDTE; C.D:=DIKTE; RECNR:=LASTREC(MAGAZIJN)i SEEK(MAGAZIJN,1); GET (MAGAZIJN) i Q:=Oi REPEAT READ(MAGAZIJN,G); Q:=Q+1 ;
UNTIL (G.RESTL=O) OR (Q=RECNR)i IF G.RESTL=O THEN BEGIN SEEK(MAGAZIJN,Q)j MAGAZIJNA :=C; PUT (MAGAZIJN) j END ELSE BEGIN SEEK(MAGAZIJN,LASTREC(MAGAZIJN)+1); WRITE(MAGAZIJN,C); END;
END; {EINDE PROCEDURE BERGOP}
{!! !!!} PROCEDURE BEGINL; {I!!!!}
VAR Q:INTEGER; GOED : BOOLEAN; BEGIN RECNR:=LASTREC(MAGAZIJN); SEEK(MAGAZIJN,1); GET (MAGAZIJN) ; Q:=Oi REPEAT READ(MAGAZIJN,C); Q:=Q+1 ;
GOED:= (C.BR=BREEDTE) AND (C.D=DIKTE) AND
(C.RESTL>=MIN.LANG) i
UNTIL (GOED=TRUE) OR (Q=RECNR); IF GOED=TRUE THEN
BEGIN
WRITELN('===================================================');
BEGIN
WRITELN('VERBRUIK OUDE RESTLENGTE VAN' ,RESTL,' MM !!! ')j
WRITELN(' LENGTE TRHNR'); WRITELN('---'); C.RESTL:=O; SEEK(~AGAZIJN,Q). MAGAZ IJN A : =C. PUT (MAGAZIJN) ; END ELSE BEGIN RESTL:=UITGLENGTEj STRIPNR:=STRIPNR+1; WRITELN('=================================================='); WRITELN('STRIPNUMMER=' ,STRIPNR); WRITELN(' LENGTE TRHKNR'); WRITELN('---'); END;
END; {EINDE PROCEDURE BEGINL} WRITELN;
WRITELN('***********************************************************'); WRITELN('***********************************************************').
WRITELN('DIKTE*BREEDTE=' ,DIKTE,' *' ,BREEDTE); {MOET VERANDERD}
WRITELN('***********************************************************'); MAXNR: =1 ; MAX:=AANMAAK[MAXNR]; MINNR:=AANTAL; MIN:=AANMAAK[MINNR]; AANMOP:=FALSE;
WHILE (MAX.LANG)UITGLENGTE) AND (AANMOP=FALSE) DO BEGIN
WRITELNj
WRITELN('EEN STRIP VAN TREKHAAK' ,MAX.TRHNR,' IS TE LANG!!!! !!! !').
IF MAXNR=MINNR THEN AANMOP:=TRUE; MAXNR : =MAXNR+ 1 ;
MAX: =AANMAAK [MAXNR] •
END;
. STRIPNR:=O;
WHILE NOT AANMOP DO BEGIN BEGINLj WHILE(RESTL-MAX.LANG)=O)AND(AANMOP=FALSE)DO BEGIN RESTL:=RESTL-MAX.LANGj MAX.AANT:=MAX.AANT-1; WRITELN(MAX.LANG,MAX.TRHNR); IF MAX.AANT=O THEN
BEGIN IF MAXNR<>MINNR THEN BEGIN REPEAT MAXNR:=MAXNR+1; MAX:=AANMAAK[MAXNR]i UNTIL(MAX.AANT<>O); END ELSE AANMOP:=TRUE; END; END; MOMNR:=MAXNR; WHILE(RESTL-MIN.LANG>=O)AND(NOT AANMOP)DO BEGIN REPEAT MOMNR:=MOMNR+1; MOM:=AANMAAK[MOMNR]i
UNTIL (RESTL-MOM.LANG>=O) AND (MOM.AANT>O); RESTL:=RESTL-MOM.LANG;
MOM.AANT:=MOM.AANT-1;
AANMAAK(MOMNR].AANT:=AANMAAK[MOMNR].AANT-1;
WRITELN(MOM.LANG,MOM.TRHNR); {MOET VERANDERD}
IF (MOM. AANT=O) AND (MOMNR=MINNR) THEN BEGIN REPEAT MINNR:=MINNR-1; MIN:=AANMAAK[MINNR]; UNTIL MIN.AANT<>O; END; MOMNR:=MOMNR-1; END;
WRITELN('AFVALLENGTE=',RESTL); {MOET VERANDERD}
WRITELNi BERGOP; END;
END; {EINDE PROCEDURE PRODUCEER}
{ { { {{ { {{ {{ { { { { { {{ {{ { { { {{ {{ { {{ { { { { { { {{ { {{ { { ( { { ({ { { { { { { {{ { { { { { { { { { { { { { { { {{ { { {}
{! ! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! }
{ •••••• HET PROGRAMMA •••••• } BEGIN
OPEN (BESTAND); OPEN (MAGAZ IJN) ;
RECNR:=LASTREC(MAGAZIJN)+1; IF RECNR=1 THEN BEGIN C.D:=O;
END;
C.BR:=O; C.RESTL:=O;
SEEK(MAGAZIJN,1); WRITE(MAGAZIJN,C);
WRITELN('BEGIN MET DE INVOER.GEEF EERST HET TREKHAAKNUMMER')i WRITELN('GEVOLGD DOOR EEN SPATIE EN HET AANTAL. ');
WRITELN('GEEF DAN EEN RETURN.')i
WRITELN('SLUIT DE INVOER AF MET 0 0');
AANTTRH:=O; REPEAT
AANTTRH:=AANTTRH+1;
WITH PRODINV[AANTTRH] DO REPEAT
OPNIEUW:=FALSE; TRHNR:=LEESINT; AANTAL:=LEESINT; READLN;
IF OPNIEUW=TRUE THEN
WRITELN('VOER DE HELE LAATSTE REGEL OPNIEUW IN'); UNTIL OPNIEUW=FALSE;
UNTIL PRODINV[AANTTRH].TRHNR=O; TOTAANTSTR:=TOTSTRIPPROD(AANTTRH-1); REPEAT
PRODAANT:=PRODAANM{TOTAANTSTR);
IF PRODAANT)O THEN PRODUCEER(PRODAANT); UNTIL PRODAANT=O;
END.
PROGRAM COMP2 (INPUT,OUTPUT,BESTANDSCH,MAGAZIJNSCH)i
CONST MAXTRH=10i MAXSTR=70; {ONGEVEER 6 STRIPPEN PER TRHAAK} UITGLENGTE=6000.0; PI=3.14 i TYPE STRIPAANM=RECORD AANT,TRHNR:INTEGER; L1,L2,PHI1,PHI2:REAL; END; STRIP=RECORD
TRHNR,DIK, BREED, AANT: INTEGER; L1,L2,PHI1,PHI2:REAL; END; AFVAL=RECORD D,BR:INTEGER; LANG1,LANG2,PHIR:REAL; END;
VAR PRODINV:ARRAY[1 .. MAXTRH] OF RECORD
TRHNR,AANTAL:INTEGER; END;
BESTANDSCH:FILE OF STRIP; MAGAZIJNSCH:FILE OF AFVAL;
AANMAAK:ARRAY[1 .. MAXSTR] OF STRIPAANMi AANMTOT:ARRAY(1 .. MAXSTR] OF STRIP;
I,J,K,TOTAANTSTR,RECNR,TRHNR,AANTTRH,BREEDTE,DIKTE, PRODAANT:INTEGER;
OP,OPNIEUW:BOOLEAN; A:STRIP; D:AFVAL;
{{ { { {{ {{ { {{ {{ { {{ { { { { { { { { { { { { { { { { { {{ { { {{ { {{ { { {{ { { { { {{ H { { {{ {{ { { { { { { {{ { { {{ {{ {} {%%} FUNCTION LEESINT : INTEGER; {%%}
{tDEZE FUNCTION ZORGT ERVOOR DAT BIJ HET INLEZEN VAN*} {tEEN INTEGERWAARDE HET PROGRAMMA NIET STOPT ALS *} {*PER ONGELUK lETS ANDERS DAN EEN GETAL WORDT INGEVOERD*}
BEGIN
VAR I : INTEGER; A : CHAR; F :TEXT;
WHILE NOT (INPUT· IN ['+','-' 1'0' .. '9']) DO BEGIN IF INPUTA : , , THEN GET(INPUT) ELSE BEGIN END; REWRITE (F) ; REPEAT READ (A) ;
WRITELN; WRITELN('ALLEEN INTEGERS INVOEREN'); GET(INPUT); OpNIEUW:=TRUE;
END;
IF A IN ['+', '-' 1'0' .. '9'] THEN WRITE (F,A); UNTIL EOLN OR NOT (A IN ['+', '-', '0' .. '9']); RESET{F) ;
READ(F I I);
LEESINT:=I; END;
{%%} FUNCTION TOTSTRIPPROD(AANTALTREKHAKEN:INTEGER):INTEGER; {%%} {*DEZE PROCEDURE STELT DE TOTALE STRIPPRODUKTIE OP AAN*}
{*DE HAND VAN DE INGEGEVEN TE MAKEN TREKHAKEN *} VAR AANTSTR,I,J,K,AANTAL : INTEGER;
AANWEZIG:BOOLEANi
BEGn~
AANTSTR:=O;
FOR I:=AANTALTREKHAKEN DOWNTO 1DO BEGIN RECNR:=LASTREC(BESTANDSCH); SEEK (BESTANDSCH, 1); GET(BESTANDSCH); TRHNR:=PRODINV[I].TRHNR; AANTAL:=PRODINV[I].AANTAL; AANWEZIG:=FALSE; FOR J:=1 TO RECNR DO BEGIN READ(BESTANDSCH,A); IF A.TRHNR=TRHNR THEN BEGIN AANWEZIG:=TRUEi A.AANT:=A.AANT*AANTAL; AANTSTR:=AANTSTR+1i AANMTOT[AANTSTR]:=A;
WITH A DO WRITELN(DIK:4/BREED:4/L1:8:2 ,L2:8:2/PHI1:8:2, PHI2:8:2,AANT:5,TRHNR:8);
END; END;
IF NOT AANWEZIG THEN
WR1TELN('TREKHAAK',TRHNR,' ZIT NIET IN HET BESTAND') END;
TOTSTRIPPROD:=AANTSTRj
END; {EINDE FUNCTION TOTSTRIPPROD}
{%%}FUNCTION PRODAANM(VAR TOTAALAANTALSTRIPPEN:INTEGER):INTEGERjt%%} {*****DEZE PROCEDURE ZOEKT urT DE AANMTOT ALLE STRIPPEN*****}
{*****VAN GELrJKE DIKTE EN BREEDTE EN ZET DIE IN AANMAAK****} VAR I,J,AANTAL:INTEGER; BTANPHI:REAL; WEIG:BOOLEANi BEGIN AANTAL:=TOTAALAANTALSTR1PPEN; I:=1jJ:=1;
WHILE (AANMTOT[I].DIK=O) AND (I<=AANTAL)DO 1:=1+1; IF I<=AANTAL THEN BEGIN DIKTE:=AANMTOT[I].DIK; BREEDTE:=AANMTOT[I).BREED; J:=1 ; REPEAT IF (AANMTOT[I].DIK=DIKTE) AND (AANMTOT[I].BREED=BREEDTE) THEN
BEGIN
AANMAAK[J].L1:=AANMTOT[I].L1; AANMAAK[J].L2:=AANMTOT[I].L2j AANMAAK[J].PHI1:=AANMTOT[I].PHI1; AANMAAK[J].PHI2:=AANMTOT[I].PHI2; AANMAAK[ J] . AAliT : =AAl'lMTOT[ I] . AANT ; AANMAAK[J].TRHNR:=AANMTOT[1].TRHNRi AANMTOT[I].DIK:=Oi WITH AANMAAK[J] DO BEGIN WEIG:=FALSE; BTANPHI:=BREEDTE~(SIN(PHI1*PI/180.0)/COS(PHI1*PI/180.0»; IF PHI2>O.O THEN BEGIN
IF PHI2)PHI1 THEN BEGIN
IF L1+BTANPHI)UITGLENGTE THEN WEIG:=TRUEi END
ELSE IF L2+BTANPHI>UITGLENGTE THEN WEIG:=TRUE; END
ELSE IF L1>UITGLENGTE THEN WEIG:=TRUEi IF WEIG=TRUE THEN
BEGIN J:=J-1;
WRITELN('EEN STRIP VAN TREKHAAK' ,TRHNR,' MET')i
WRITELN('~IKTE' ,DIKTE, I EN BREEDTE' ,BREEDTE );
WRITELN('IS LANGER ALS ' ,UITGLENGTE,' MM. • ); END; END; J:=J+1; END; 1:=I+1; UNTIL I=AANTAL+1; END; PRODAANM: =J -1 i
{%%%%%} PROCEDURE PROOUCEER ( AANTAL:INTEGER)j {%%%%%}
{***** DEZE PROCEDURE PRODUCEERT DE STRIPVERDELING*****} VAR TEL,TELBEW,STRIPNR,TELMAG:INTEGERj
L,DELTAKL,DELTAGR,OPP,LANG1,LANG2,PHIR,TANPHIR, TANPHIKL, TANPHIGR: REAL;
MOMSTR,BGRH,BKLH:STRIPAANM;
AANMOP, NWESTR, RESTL, DRUKKOP: BOOLEANj
{!!!!!} PROCEDURE BEGINLENGTE j {!!!!!}
{***** DEZE PROCEDURE LEVERT EEN BEGINLENGTE AF *****} {***** DIT IS EEN OUDE RESTL. OF EEN NIEUWE. *****}
VAR AANTMAG : INTEGER;
C :AFVALj BEGIN IF STRIPNR=-1 THEN BEGIN STRIPNR:=O; TELMAG:=O; END; RESTL:=FALSE; AANTMAG:=LASTREC(MAGAZIJNSCH)j IF TEI.MAG(AANTMAG THEN BEGIN SEEK(MAGAZIJNSCH,TELMAG+1); GET (MAGAZIJNSCH); REPEAT READ (MAGAZIJNSCH,C); TELMAG:=TELMAG+1;
UNTIL (C.BR=BREEDTE) AND (C.D=DIKTE) OR (TELMAG=AANTMAG);
IF (C.BR=BREEDTE) AND (C.D=DIKTE) THEN BEGIN LANG1 : =C. LANG 1 ; LANG2:=C.LANG2; PHIR:=C.PHIR; RESTL:=TRUE; C.LANG1:=O.O; SEEK(MAGAZIJNSCH,TELMAG); MAGAZIJNSCH· :=C; PUT (MAGAZIJNSCH); END; END;
IF NOT RESTL THEN BEGIN LANG1:=UITGLENGTE; LANG2:=UITGLENGTE; PHIR:=O.O; STRIPNR:=STRIPNR+1; END;
{I!!!!} PROCEDURE ZETSTRIPTEKST; {!!!!!} BEGIN IF RESTL THEN BEGIN RESTL:=FALSE;
WRITELN('==================================================');
WRITE('VERWERKING VAN OUDE RESTLENGTE' J; WRITELN(LANG1:10:2,LANG2:10:2,PHIR:10:2); WRITELN:
WRITE(' L1 L2 PHIR PHI1');
WRITELN{' PHI2 TRHNR AANT'};
WRITELN{'---'); END
ELSE IF (LANG1=UITGLENGTE) AND (LANG2=UITGLENGTE) THEN BEGIN
WRITELN('==================================================');
WRITELN('STRIPNUMMER =' ,STRIPNR);
WRITE ( , L 1 L2 PHIR PHIl' ) ;
WRITELN(' PHI2 TRHNR AANT');
WRITELN('---'); END;
END; {EINDE PROCEDURE ZETSTRIPTEKST}
{I!!!!} PROCEDURE BERGOP; {!!!!!}
VAR G,C:AFVAL; Q: INTEGER; BEGIN C. LANG 1 : =LANG1 ; C.LANG2:=LANG2; C.PHIR:=PHIR: C.BR:=BREEDTE; C.D:=DIKTE; RECNR:=LASTREC(MAGAZIJNSCH}; SEEK(MAGAZIJNSCH,1); GET(MAGAZIJNSCH)i Q:=O; REPEAT READ(MAGAZIJNSCH,G); Q:=Q+1 ;
UNTIL (G.LANG1=0.O) OR (Q=RECNR); IF G.LANG1=0.0 THEN BEGIN SEEK(MAGAZIJNSCH,Q); MAGAZIJNSCH4 :=Cj PUT (MAGAZIJNSCH); END ELSE BEGIN SEEK(MAGAZIJNSCH,LASTREC{MAGAZIJNSCH)+1); WRITE(MAGAZIJNSCH,C)j END;
{!!!!!} PROCEDURE BEKIJKHOEK ( HOEK1,HOEK2:REAL ) i {!!!!!}
{***** DEZE PROCEDURE KIJKT OF HHOEK1P GROTER OF KLEINER IS *****} {***** ALS PHIR EN ZOEKT UIT OF DE MOMENTANE STRIP BETER IS *****} {***** ALS DE VORIGE GEVONDEN BESTE STRIP. *****} (***** KIJK OF HOEK1 DICHTER.BIJ PHIR L!GT. *****} {***** ALS DE VORIGE. JA! DIT WORDT DE BESTE HOEK *****}
VAR TANPHIR,TANHOE:REALi BEGIN WITH MOMSTR DO BEGIN TANPHIR:=SIN(PHIR*PI/180.0)/COS(PHIR*PI/180.0); TANHOE:=SIN(HOEK1*PI/180.0)/COS(HOEK1*PI/180.0); IF HOEK1<PHIR THEN BEGIN DELTAKL:=BREEDTE*(TANPHIR-TANHOE);
IF (HOEK1)BKLH.PHI1) AND (L1+DELTAKL<=LANG1) AND (L2<=LANG2) THEN BEGIN BKLH:=MOMSTR; BKLH.PHI1:=HOEK1: BKLH.PHI2:=ABS(HOEK2)i BKLH.AANT:=TELi NWESTR:=FALSE; END ELSE BEGIN
IF (HOEK1=BKLH.PHI1) AND (L1+DELTAKL<=LANG1) AND (L2<=LANG2) AND (L1)BKLH.L1) AND
(L2)BKLH.L2) THEN BEGIN BKLH:=MOMSTR: BKLH.PHI1:=HOEK1; BKLH.PHI2:=ABS{HOEK2): BKLH.AANT:=TEL; NWESTR:=FALSE; END: END; END ELSE BEGIN DELTAGR:=BREEDTE*(TANHOE-TANPHIR);
IF (HOEK1<BGRH.PHI1) AND (L1<=LANG1) AND (L2+DELTAGR<=LANG2) THEN BEGIN BGRH:=MOMSTR; BGRH.PHI1:=HOEK1: BGRH.PHI2:=ABS(HOEK2); BGRH.AANT:=TEL; NWESTR:=FALSE: END ELSE
BEGIN WRITELNj
ELSE BEGIN
IF (HOEK1=BGRH.PHI1) AND (L1(=LANG1) AND
(L2+DELTAGR<=LANG2) AND (L1)BGRH.L1) AND (L2)BGRH.L2) THEN BEGIN BGRH:=MOMSTRi BGRH.PHI1:=HOEK1; BGRH.PHI2:=ABS(HOEK2); BGRH.AANT:=TEL; NWESTR:=FALSE, END; END; END;
END; {EINDE WITH MOMSTR DO } END; (EINDE PROCEDURE BEKIJKHOEK
WRITELN('~***~**~************~**************************************')j WRITELN('*~~******************~**~***************~******************');
WRITELN('DIKTE*BREEDTE=',DIKTE:3,' *' ,BREEDTE:4);
WRITELN('***********************************************************'); AANMOP:=FALSE; STRIPNR:=-1;
WHILE NOT AANMOP DO BEGIN
BEGINLENGTEj DRUKKOP:=TRUE; NWESTR:=FALSE; WHILE NOT NWESTR DO BEGIN
TEL:=OjBKLH.PHI1:=-1.0;BGRH.PHI1:=89.0,NWESTR:=TRUE; REPEAT TEL:=TELt1 UNTIL (AANMAAK(TEL].AANT>O) OR
(TEL>AANTAL) ; IF TEL>AANTAL THEN AANMOP:=TRUE
ELSE TEL:=TEL-1;
WHILE (TEL(AANTAL) AND (AANMOP=FALSE) DO BEGIN
REPEAT TEL:=TEL+1 UNTIL (AANMAAK[TEL].AANT<>O) OR (TEL>AANTAL) ;
IF TEL<=AANTAL THEN BEGIN
MOMSTR:=AANMAAK[TEL]; WITH MOMSTR DO BEGIN
IF (PHI1=PHIR) OR (ABS(PHI2)=PHIR) THEN BEGIN
IF (PHI1=PHIR) AND (PHI2>PHI1) THEN BEGIN
L:=L1;L1:=L2;L2:=L; END;
IF (ABS{PHI2)=PHIR) AND (PHI1<>PHIR) AND (PHI2>O.O) AND (PHI2<PHI1) THEN BEGIN
L:=L1;L1:=L2;L2:=L; END;
IF (L1<=LANG1) AND (L2<=LANG2) THEN BEGIN IF BKLH.PHI1=PHIR THEN BEGIN IF (L1)BKLH.L1) AND (L2)BKLH.L2) THEN BECIN BKLH:=MOMSTR; BKLH.AANT:=TEL; NWESTR:=FALSE,
IF (ABS(PHI2)=PHIR) AND (PHI1<>PHIR) THEN BEGIN
BKLH.PHI1:=ABS(PHI2); BKLH.PHI2:=PHI1; END; END ELSE BEGIN BKLH:=MOMSTR; BKLH.AANT:=TEL; NWESTR:=FALSE; END;
IF (ABS(PHI2)=PHIR) AND (PHI1<>PHIR) THEN BEGIN
BKLH.PHI1:=ABS(PHI2); BKLH. PHI2 : =PHI 1 ; END;
END; END
ELSE IF BKLH.PHI1<>PHIR THEN BEGIN
END;
IF PHI2)PHll THEN BEGIN L:=L1; L1:=L2; L2:=L END; BEKIJKHOEK(PHI1,PHI2);
IF PHI2>PHI1 THEN BEGIN L:=L1,L1:=L2,L2:=L END; IF (PHI2)0.0) AND (PHI2<PHI1) THEN BEGIN
PHI2:=ABS (PHI2); BEKIJKHOEK(PHI2,PHI1); END;
END; {END VAN WITH MOMSTR DO} END;
END;
IF NOT NWESTR THEN BEGIN IF DRUKKOP THEN BEGIN ZETSTRIPTEKST; DRUKKOP:=FALSE; END; L:=L1 ; L1:=L2; L2:=L; END; TANPHIR:=SIN(PHIR*PI/180.0)/COS(PHIR*PI/180.0); TANPHIKL:=SIN(BKLH.PHI1*PI{180.0)/COS(BKLH.PHI1*PI/180.0); TANPHIGR:=SIN{BGRH.PHI1*PI/180.0)/COS(BGRH.PHI1*PI/180.0); DEtTAKt:=BREEDTE*(TANPHIR-TANPHIKL);