• No results found

Optimalisering van het materiaalverbruik bij flexibele automatisering van de fabrikage van stripprodukten

N/A
N/A
Protected

Academic year: 2021

Share "Optimalisering van het materiaalverbruik bij flexibele automatisering van de fabrikage van stripprodukten"

Copied!
66
0
0

Bezig met laden.... (Bekijk nu de volledige tekst)

Hele tekst

(1)

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.

(2)

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

(3)

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.

(4)

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

(5)

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

(6)

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.

(7)

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

(8)

..

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

~

200

h

b

~

200 12

h

~

800 14

l4

~

2600 2. Lokole optimoli.50tie

b

13

h

1 0

12

14

14

1 0

11

~

1900

h

~

1900 3. Globole ophmoli.50tle

11

13

~

200

h

b

~

200 12

14

14

I

a

5

-

3400

figuur 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"

(9)

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

(10)

PHIl L2

,---fl---r--:

-=--=--=--=--=---r-;(----'

Ll PHI2 (positief)

PHI1 L2 PHI2 (negatief)

Lt-: ---1<

PHIR

/f

L1 L2 momentane restlengte L1

figuur 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

.

.

~

\

.

\~

(11)

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 deze

achteraf 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

(12)

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

(13)

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".

(14)

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

(15)

"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

(16)

neem volgende MOMSTR ~ __________ ~~ __________ ,

uit AANMAAR

BRLH : = MOMSTR ,"--E--""

procedure BERIJRHOER

~+--~----f verwerk de beste strip

procedure BEGINLENGTE

neem eerste MOMSTR

uit AANMAAK ~----~~----~.

+

-

EINDE GENEREER

(17)

Deze 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.

(18)

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

(19)

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

=

index

N

=

aantal verschillende lengten Ai= aantal nog te produceren strippen

met lengte Li

Ti= aantal strippen met lengte Li in de bekeken combinatie U

=

uitgangslengte i-1 SOM

=[

Tj*Lj j=1 diagram dGENEREER"

(20)

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 423

De 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

(21)

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.

(22)

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

(23)

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.

(24)

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

(25)

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.

(26)

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.

(27)

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

(28)

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;

(29)

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;

(30)

'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;

(31)

'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}

(32)

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) ;

(33)

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;

(34)

{%%} 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. ');

(35)

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 ' ) ;

(36)

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;

(37)

'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;

(38)

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;

(39)

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;

(40)

{\\} 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;

(41)

{\\} 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;

(42)

{\%\\%} 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

(43)

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

(44)

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);

(45)

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.

(46)

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;

(47)

{%%} 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

(48)

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

(49)

{%%%%%} 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;

(50)

{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;

(51)

{!!!!!} 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

(52)

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;

(53)

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);

Referenties

GERELATEERDE DOCUMENTEN

, MECHANISATIEGRAAD 100 96 FLEXIBEL 50 oIo GEAUTOMATISEERD HANDMATIG 10 STAR GEMECHANISEERD 103 104 IOS 106 IOT - SERIEGROOTTE 102.. Literatuur en bezoeken aan bedrijven met één

In diezelfde file staan ook de diver-serienummers, de lengte van de kabel waaraan de divers hingen in de piëzometer en de nummer van de piëzometers zoals ze op de

Therefore, based on these results of the crystallization unit exergy performance of Chapter 3, an integrated biorefinery concept was developed for the valorisation of A-molasses

De werkingscoëfficiënten voor stikstof uit organische producten variëren van 0% voor veen, 10% voor compost tot 60% voor drijfmest.. De stikstofgebruiksnorm is sterk beperkend voor

Therefore, the main purpose of our research was to investigate whether daily supplementation with high doses of oral cobalamin alone or in combination with folic acid has

Gezocht wordt naar een sedlmentoloog of een doctoraal student sedimentologie, die hetzij wil helpen mat de interpretatie van reeds verzamelde gegevens, oftewel bereid is

Na de tweeling heeft Petra bovendien een doodgeboren kindje ter wereld gebracht, haar zuster blijkt vroeger door een oom (van wie beiden halverwege de roman een fortuin erven)

Alleen in bijzondere gevallen is sprake van een negatief effect van de airbag, Dat is het geval bij inzittenden (bestuurders en passagiers) die zich niet in een normale zithoudl