DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦8d3507e93⟧ TextFile

    Length: 138496 (0x21d00)
    Types: TextFile
    Names: »D115«

Derivation

└─⟦2520239fd⟧ Bits:30005867/disk13.imd Dokumenter (RCSL m.m.)
    └─⟦this⟧ »D115« 

TextFile

                   I_N_T_R_O_D_U_K_T_I_O_N_ _T_I_L_ _R_C_ _M_O_S_A_I_K_ 
           
1_._ _ _ _ _ _ _ _ _R_C_ _M_O_S_A_I_K_ _o_g_ _v_i_r_k_s_o_m_h_e_d_e_n_s_ _s_t_y_r_i_n_g_ 1.
           
          RC MOSAIK>s opgave er at forsyne virksomhedens medarbejdere med
relevante informationer til de beslutninger, der løbende skal ta-
ges i det daglige arbejde, og til den løbende kontrol af beslut-
ningernes økonomiske konsekvenser. 
           
          Arbejdet med RC MOSAIK kan opdeles således: 
           
             Registrering af grundbilag og kartoteksoplysninger 
             Daglig styring af vare- og pengestrømme 
             Kontrol af den økonomiske udvikling 
           
          R_e_g_i_s_t_r_e_r_i_n_g_ _a_f_ _g_r_u_n_d_b_i_l_a_g_ _o_g_ _k_a_r_t_o_t_e_k_s_o_p_l_y_s_n_i_n_g_e_r_ 
           
          Registreringsopgavens gennemførelse er en vigtig forudsætning for
          anvendeligheden af systemets informationer. Grundbilagene skal
          registreres hurtigt, således at systemets oplysninger til stadig-
          hed udtrykker de fysiske realiteter for virksomheden. 
           
          I selve registreringsprocessen, som  foregår ved dataskærme, er
          der indbygget både fejlkontroller og styringskontroller. 
           
          Fejl optræder, når man behandler systemet forkert. Man bliver
          straks gjort opmærksom på fejlen og kan ikke fortsætte, før den
          er rettet. 
           
          Styringskontroller skal sikre, at uønskede situationer ikke op-
          står. F.eks. kommer der en advarsel ved salgsordreregistreringen,
          hvis kunden har forfalden saldo, har overskredet kreditgrænsen,
          eller hvis disponibelt lager overskrides. De forskellige advars-
ler, der kan fremkomme, skal resultere i, at man undersøger situ-
ationen og lader den ansvarlige tage beslutningen om, hvad der
bør gøres i den aktuelle situation.\f

          De forskellige styrekontroller blokerer ikke arbejdet ved skær-
          men, og ordren kan registreres, selv om kundens saldo er over
          kreditmaksimum. Alle advarsler fra styrekontroller fremkommer
          igen ved dagsslut som anmærkninger på de forskellige journaler. 
           
          D_a_g_l_i_g_ _s_t_y_r_i_n_g_ _a_f_ _v_a_r_e_-_ _o_g_ _p_e_n_g_e_s_t_r_ø_m_m_e_ 
           
          Den daglige styring af vare- og pengestrømme tager sit udgangs-
          punkt i de aftaler, der indgås med kunden, når salgsordre afta-
          les. Det er derfor vigtigt at vide, hvad man kan tilbyde kunden i
          form af priser, betalingsfrister, mængder, leveringstider etc.,
          og det er vigtigt hurtigt at kontrollere, at de indgåede aftaler
          er i overensstemmelse med indkøbs- eller produktionsplaner samt
gældende politikker. 
           
          RC MOSAIK udfører disse styrekontroller ved registreringen og kan
          desuden producere en række planlægningsoversigter baseret på
          salgsordrebeholdningen, planlagt produktion, indkøbsordrebehold-
          ningen og de aktuelle varelagre. 
           
          Den daglige styring kan opdeles i følgende hovedopgaver: 
           
             Kundeordrebehandling 
             Leveringskontrol og fakturering 
             Produktion, indkøb og varelagerstyring 
             Styring af ind- og udbetalinger 
           \f

          K_o_n_t_r_o_l_ _a_f_ _d_e_n_ _ø_k_o_n_o_m_i_s_k_e_ _u_d_v_i_k_l_i_n_g_ 
           
          Den økonomiske styring af et firma er almindeligvis baseret på
          opstilling af nogle m_å_l_ i form af handlingsplaner, budgetter og
          en månedlig k_o_n_t_r_o_l_ af handlingernes gennemførelse i form af den
          regnskabsmæssige budgetopfølgning og afvigelsesforklaringer. Kon-
          trollen kan give anledning til, at handlingsplanerne må ændres
          for at kunne nå det opstillede mål. 
           
          RC MOSAIK>s opgave er at udføre en del af budgetkontrollen samt
at give forskellige analyser til brug for afvigelsesforklaringer-
ne. Det er så ledelsens opgave at vurdere og forklare afvigelser-
ne som baggrund for ændring i handlingsplaner. 
           
          Rapporteringen i forbindelse med den økonomiske styring er opdelt
          således: 
           
               Resultatrapport 
               Likviditetsanalyse 
               Salgsanalyse 
               Produktions- og lageranalyse 
          Debitorlister 
Kreditorlister 
Balancer \f

          Systemet er i stand til at behandle flere adskilte firmaer med
          fælles registre. 
           
          I denne forbindelse er behovet for sikkerhed løst via et bruger-
          katalog, hvori hvert firma har et specielt "password", som tilla-
          der adgang til firmaets specifikke del af registrene. 
           
          Systemet kan logisk opdeles i følgende undersystemer eller modu-
          ler: 
           
          S_a_l_g_s_f_u_n_k_t_i_o_n_e_n_ 
           
          salgsordremodul 
          fakturamodul 
           
          K_ø_b_s_f_u_n_k_t_i_o_n_ 
           
          købsordremodul 
          registrering af lagertilgang 
          behandling af leverandørfakturaer 
           
          P_r_o_d_u_k_t_i_o_n_ _o_g_ _l_a_g_e_r_s_t_y_r_i_n_g_s_f_u_n_k_t_i_o_n_ 
           
          Planlægnings- og ordremodul 
           
          Ø_k_o_n_o_m_i_f_u_n_k_t_i_o_n_ 
           
          Debitormodul 
          Kreditormodul 
          Finansmodul 
 
                   I de følgende 2 kapitler er redegjort for: 
           
RC MOSAIK i dagligdagen som løsning på firmaets registreringsbehov. 
 
RC MOSAIK som managementværktøj. \f

 
           
           
          (skema) 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           \f

         2_._ _ _ _ _ _ _ _ _R_C_ _M_O_S_A_I_K_ _i_ _d_a_g_l_i_g_d_a_g_e_n_ 2.
           
          Tegningen på den foregående side viser i sammenfattet form firma-
          ets registreringsmæssige opgaver. 
           
           
          S_a_l_g_s_f_u_n_k_t_i_o_n_ 
           
          K_u_n_d_e_o_r_d_r_e_b_e_h_a_n_d_l_i_n_g_ 
           
          Alle kundeordrer kan registreres i systemet. Ved registreringen
          er der kontrol af leveringsevnen for den ønskede vare og af kun-
          dens betalingssituation (forfalden saldo, kreditgrænse, overskre-
          det). Hvis systemet reagerer på styrekontrollen, kan ordren stop-
          pes, og en ansvarlig leder kan vurdere, om den pågældende ordre
          skal ændres eller om andre ordrer eller planer skal ændres. Til
          brug for disse vurderinger kan systemet på dataskærmen vise ter-
          minsopdelte leveringsplaner for kunder og varer, således at man
          kan finde frem til de kunder, varer og ordrer, det kunne blive
          aktuelt at ændre. 
 
          Når salgsordren er registreret, kan den kaldes frem på skærmen,
          og den kan udskrives på en formular til brug for ordrebekræfti-
          gelse og ekspedition. 
           
          Ved dagens slutning udskrives en "ordrebevægelsesliste" og "va-
          rers anmærkninger", hvor de ordrer og varer, der har fået signa-
          ler ved styrekontrollen er særligt markeret. 
           
Ordreformularerne er typisk: 
    
   - ordrebekræftigelse til kunden 
   - følgeseddel til kunden 
   - forsendelsesseddel til lager \f

 
           
           
           
           
           
           
           
           
           
          (tegning) 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           \f

                   Udover almindelige on-line forespørgsler om kunder, leverandører
          og ordrer, er der mulighed for at foretage forespørgsler på et
          antal sammenhængende informationer, som gør det muligt for ordre-
          administrationen at give øjeblikkelig svar på spørgsmål fra kun-
          der og spørgsmål om alternative leveringsbetingelser o.s.v. 
           
          Disse forespørgsler er: 
               
          1)  L_e_v_e_r_i_n_g_s_p_l_a_n_,_ _k_u_n_d_e_ 
            - hvilken ordre har kunden, 
              hvornår skal ordren leveres,
              og hvilke produkter skal
              leveres? 
               
          2)  L_e_v_e_r_i_n_g_s_p_l_a_n_,_ _p_r_o_d_u_k_t_e_r_ 
            - hvilke ordrer, til hvilke 
              kunder, hvornår skal de leveres? 
               
          3)  L_a_g_e_r_p_r_o_f_i_l_ 
            - hvordan vil lagerbeholdningen 
              udvikle sig over en nærmere 
              specificeret periode, når 
              mængden af salgsordrer, 
              købsordrer, vare i produktion 
              samt planlagt produktion er  
              taget i betragtning? 
               
               
          F_a_k_t_u_r_e_r_i_n_g_ 
           
          Inddata til fakturamodulet er ekspeditionspapirer fra lageret
korret for faktiske leveringer m.v. 
           \f

                   På baggrund af behandlede ekspeditionspapirer kaldes ordrerne
          frem til fakturering 
           
          Hvis en ordre ikke kan faktureres fuldt ud, registreres det fak-
tiske antal varer der er leveret. Herefter genererer systemet
automatisk en restordre, medmindre andet ønskes. 
           
          Under faktureringen bliver alle relevante lager-, debitor- og fi-
          nanskonti automatisk opdateret. 
           
           
                U_d_d_a_t_a_ 
           
          Uddata fra systemet er: 
           
          1)  Fakturaer 
          2)  Fakturaliste/journal 
          3)  Varesalgsjournal 
           
           \f

 
           
           
           
           
          (tegning) 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           \f

                   I_n_d_k_ø_b_s_f_u_n_k_t_i_o_n_ 
           
           
              K_ø_b_s_o_r_d_r_e_m_o_d_u_l_ 
           
          På basis af EDB-genererede uddata som f.eks. lagerprofil og be-
          hovsanalyse kan indkøbsafdelingen udfærdige indkøbsforslag. 
           
          De egnede forslag registreres i systemet. 
           
          Registreringer i købsordremodulet foretages parallelt til
salgsordremodulet. 
           
          Registrerede købsordrer danner basis for senere registrering og
          kontrol af lagertilgange samt registrering og kontrol af leveran-
          dørfakturaer. 
           
           
                 U_d_d_a_t_a_ 
           
          De daglige uddata er: Ordrebevægelsesliste 
           
           
          On-line forespørgsler fra salgsordremodulet anvendes også i købs-
          ordrermodulet. 
           
                   L_a_g_e_r_t_i_l_g_a_n_g_ 
           
          Når de fysiske lagertilgange finder sted, anvendes leverandør-
          fragtbrevet, leverandørfaktura, o.s.v. til kontrol. 
           
          Fragtbrevet registreres i systsemet, hvor de faktiske lagertil-
          gange sammenlignes med bestilte kvanta. 
           \f

                   Hvis købsordren ikke leveres fuldt ud, genererer systemet
automatisk en restordre medmindre andet ønskes. 
           
          Under registreringen bliver lagerregistret opdateret. 
           
           
                K_ø_b_s_f_a_k_t_u_r_a_-_r_e_g_i_s_t_r_e_r_i_n_g_ 
           
          Når en købsfaktura modtages registrers den i systemet med infor-
          mationer om priser og antal. Såfremt antallet på fakturaen varie-
          rer fra de registrerede lagertilgange bliver der givet alarm på
          terminalen. 
           
          Ligeledes gives der alarm, hvis priserne varierer mere end "x%"
          fra tidligere registreret kostpris. 
           
          De ovennævnte alarmer bliver opsamlet i løbet af dagen i en an-
          mærkningsliste. 
           
          Under registrering bliver kreditor-, lager- og finanskonti auto-
          matisk opdateret af systemet. 
           
           
                 U_d_d_a_t_a_ 
           
          De daglige uddata består af: 
           
          Købsfakturaliste/journal 
          Anmærkningsliste 
           
           
           
           
           
           
           \f

 
           
           
           
           
           
           
           
          (tegning) 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           \f

                   S_t_y_k_l_i_s_t_e_b_e_h_a_n_d_l_i_n_g_ 
           
          Planlægning og ledelse af produktionen er baseret på anvendelse
af "styklister". 
           
          Til dette formål anvender systemet et styklisteregister, som
          indeholder informationer om prisen på komponenter, specificeret på: 
           
          1)  Råmaterialer og halvfabrikata 
          2)  Lønomkostninger udtrykt i minutter opdelt på funktioner el- 
              ler afdelinger. 
          3)  Diverse hjælpematerialer. 
           
           
            P_r_o_d_u_k_t_i_o_n_s_-_ _o_g_ _l_a_g_e_r_s_t_y_r_i_n_g_ 
           
          Datagrundlaget for produktions- og lagerstyringsmodulet hentes
          fra 
           
                    Produktionsplaner 
                    produktionsordrer 
                    Lagertilgange 
           
           
                  P_r_o_d_u_k_t_i_o_n_s_p_l_a_n_e_r_ 
           
          Den overordnede produktionsplanlægning foretages udenfor RC-MOSAIK 
          og resulterer i en række produktionsplaner. 
           
          Produktionsplanerne registreres i systemet til vurdering af frem-
          tidig leveringsevne. Produktionsordrer genereres ikke automatisk
          og der foretages ingen automatisk reservation af råmaterialer.
          Men produktionsplaner kan nedbrydes til standard råmaterialemæng-
          der. 
           \f

               P_r_o_d_u_k_t_i_o_n_s_o_r_d_r_e_ 
           
          Når varerne sættes i produktion, registreres en produktionsordre
          i systemet. Herefter kan der genereres et produktionsordredokument.
           
          Hvis der refereres til en produktionsplan, bliver planen tilsva-
          rende ændret. 
           
          Registreringen reserverer automatisk råmaterialer og halvfabrika-
          ta ifølge standardoplysninger (jf. styklisten). 
           
           
                L_a_g_e_r_t_i_l_g_a_n_g_ 
           
          Når en produktion er afsluttet, returneres ordredokumentet med
          relevante lagertilgange til registrering i systemet. 
           
          Reservationer af råmaterialer annulleres og lagerbeholdninger
ændres tilsvarende. 
           
          Hvis lagertilgange ikke stemmer overens med antallet der er be-
          stilt, forbliver resten som en restordre med mindre andet øns-
          kes. 
           
          Både produktionsplaner og ordrer kan udelades. Hvis et firma væl-
          ger ikke at registrere produktionsordrer, f.eks. fordi produktio-
          nens udførelsestid kun er nogle få timer, kan lagertilgange hen-
          vises til en produktionsplan, som så vil blive reduceret tilsva-
          rende. 
           
           
           
           \f

 
           
           
           
           
           
           
          (tegning) 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           \f

                   Ø_k_o_n_o_m_i_f_u_n_k_t_i_o_n_e_n_ 
           
           
                  D_e_b_i_t_o_r_m_o_d_u_l_ 
           
          Systemet kan valgfrit arbejde efter åben postmetoden eller saldo-
          metoden til debitorstyring. 
           
          Fakturaer og kreditnotaer posteres automatisk fra fakturamodulet
          til debitorkonti. 
           
          Debitorudbetalinger registreres analogt til kreditorudbetalinger,
          udgiftsbilag o.s.v. og er yderligere behandlet under finans-
          modulet. 
           
          Systemet tillader postering af fakturaer og betalinger til kunder
          i fremmed valuta. I særlige tilfælde, hvor der anvendes postering
          af fakturaer og betalinger i mere end en valuta, åbnes en konto
          for hver valuta. 
           
          Systemet kan behandle salg gennem kædeforretninger (indkøbsfore-
          ninger), hvor betalinger finder sted gennem et centralt beta-
          lingskontor, og hvor detailafsætningsmarkedet er individuelle
          kunder set ud fra en salgsstatistisk synsvinkel. 
           
           
              K_r_e_d_i_t_o_r_m_o_d_u_l_ 
           
          Dette modul fungerer principielt analogt til debitormodulet med
          følgende nøgleord: 
                    - enten åben post eller saldometode 
                    - betaling i forskellige valuta 
                    - automatisk postering af købsfakturaer 
                       
           
           \f

                   F_i_n_a_n_s_m_o_d_u_l_ 
           
          Udover automatiske posteringer, der stammer fra andre systemmodu-
          ler, består finansmodulet bl.a. af: 
           
                    - alle former for kontante udgiftsbilag. 
                    - journal bilag 
                    - kontante kvitteringer 
           
          Systemet behandler et bilag ad gangen og ingen postering accepte-
          res inden der er foretaget bogholderimæssig afstemning. 
           
           \f

 
           
           
           
           
          (tegning) 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           \f

         3_._ _ _ _ _ _ _ _ _R_C_ _M_O_S_A_I_K_ _s_o_m_ _l_e_d_e_l_s_e_s_r_e_d_s_k_a_b_ 3.
           
           
          R_e_s_u_l_t_a_t_r_a_p_p_o_r_t_ 
           
          Resultatrapporten bruges til den overordnede kontrol af virksom-
          hedens økonomiske resultater og til kontrol af kapacitetsomkost-
          ningerne. Resultatrapporten udskrives på grundlag af finanskonto-
          planen, og den viser i hovedgrupper tallene for selskabets drift
          i perioden og år til dato og både realiserede tal og budgettal. 
           
          L_i_k_v_i_d_i_t_e_t_s_a_n_a_l_y_s_e_ 
           
          Likviditetsanalysen bruges til kontrol af den planlagte lidvidi-
          tetsudvikling. Likviditetsanalysen er baseret på driftskontienes
          tal for perioden og på statuskontienes saldoforskydninger. 
           
          Likviditetsanalysen omfatter også på særlige linier en opfølgning
          af de gemmenførte investeringers likviditetsvirkninger og af be-
          vægelserne på de forskellige finansieringslån. 
           \f

          S_a_l_g_s_a_n_a_l_y_s_e_r_ 
           
          Salgsanalyser bruges til budgetopfølgning af omsætning, stk.salg
          og dækningsbidrag. 
           
          Der findes følgende standard salgsstatistikker i RC MOSAIK. 
           
          R_e_n_t_a_b_i_l_i_t_e_t_s_l_i_s_t_e_ - udskrives på anfordring og indeholder pr.
          varegruppe: stk.salg, omsætning og dækningsbidrag for salg måned
          til dato, ordrer til levering i måneden, i alt månedens forvente-
          de salg, budget og difference mellem budget og forventet salg. 
           
          Rentabilitetslisten anvendes i den daglige opfølgning og danner
          bl.a. grundlag for besvarelse af forespørgsler om månedens for-
          ventede omsætning før måneden er slut. 
           
          S_a_l_g_s_-_ _o_g_ _d_æ_k_n_i_n_g_s_b_i_d_r_a_g_s_s_t_a_t_i_s_t_i_k_ - udskrives pr. måned. Inde-
          holder en hovedopdeling på eksternt og internt salg og inden for
          disse pr. varegruppe: stk.salg, omsætning og dækningsbidrag for
          måned, år til dato, budget år til dato og sidste år til dato. 
           
          Salgs- og dækningsbidragsstatistikken følger en defineret vare-
          gruppeopdeling og indgår i månedsrapporteringen. Statistikken kan
          danne baggrund for en analyse af budgetafvigelserne og afvigel-
          serne i forhold til sidste år, således at afvigelserne pr. vare-
          gruppe kan opdeles i: 
           
               afvigelse på grund af ændret stk.salg 
                    (til budgetteret salgspris og dækningsbidrag) 
           \f

               afvigelse på grund af ændret gennemsnitlig salgspris 
                    (salgsprisændringer eller mixændringer) 
           
               afvigelse på grund af ændret gennemsnitlig dækningsgrad 
                    (kostprisændringer eller mixændringer) 
           
          K_u_n_d_e_g_r_u_p_p_e_/_v_a_r_e_g_r_u_p_p_e_s_t_a_t_i_s_t_i_k_ - udskrives almindeligvis pr. må-
          ned og indeholder pr. kundegruppe salget fordelt på varegrupper
med følgende oplysninger: stk-salg, omsætning, dækningsbidrag,
månedens tal og år til dato, månedens budget og budget år til
dato.  
           
          Som standard statistik findes desuden: 
           
          V_a_r_e_s_a_l_g_s_s_t_a_t_i_s_t_i_k_ - udskrives almindeligvis pr. måned. Indehol-
          der pr. varenr.: stk,salg, omsætning og dækningsbidrag for måne-
          den og år til dato. 
           
          Ud over de her nævnte standard statistikker er det muligt at få
          udskrevet en række kunde/vare- og vare/kundestatistikker. 
           
          Yderligere salgsanalyser på gruppeniveau kan udskrives efter be-
          hov. 
           \f

          Hvilke statistikker man ønsker, bør planlægges over en længere
          periode, da det ikke er praktisk at ændre det i løbet af perio-
          den. 
           
          Det samlede kompleks af salgsstatistikker gør det muligt at ana-
          lysere salg og dækningsbidragsindtjeningen på mange kriterier,
          således at man kan finde frem til de mest lønsomme områder at
          sætte ind på. 
           
          P_r_o_d_u_k_t_i_o_n_s_-_ _o_g_ _l_a_g_e_r_a_n_a_l_y_s_e_r_ 
           
          Den nødvendige opfølgning af produktionens gennemførelse og lag-
          renes størrelse er baseret på en sammenligning af faktisk forbrug
          og standardforbrug ifølge standard kalkulationer. 
           
          Principperne for standardomkostningskontrollen kan beskrives så-
          ledes: 
           
          1. Råvarelager primo til stand.kostpris                     xxx 
               (iflg. lagerregnskab/edb) 
           
          2. Varekøb til indkøbspriser                              + xxx 
               (iflg. kostprisafvigelser/edb) 
           
          3. Prisdifference på varekøb-stand.pris/indkøbspris     +/- xxx 
               (iflg. kostprisafvigelsesliste/edb) 
           
          4. Udbetalt arbejdsløn                                    + xxx 
               (iflg. lønbogholderi) 
           
          5. Prisdifference på arbejdsløn-stand.timeløn/faktisk   +/- xxx 
               (beregnes)                               timeløn 
           
          6. Standardforbrug månedens produktion                  +/- xxx 
               (iflg. stk.omk. producerede varer/edb) 
           
          7. Mer/mindre forbrug materialer                        +/- xxx 
               (lagerændringer efter optælling af råvarelager/edb) \f

          8. Mer/mindre forbrug arbejdsløn                        +/- xxx 
               (beregnes af punkt 4, 5 og 6) 
           
          9. Råvarelager ultimo til standard/kostpris                 xxx 
               (iflg. lagerregnskab/edb)                          ======= 
           
          Som det fremgår af henvisningerne i parantes, leverer RC MOSAIK
          de fleste af oplysningerne til standardomkostningskontrol 
           
          Mer/mindre forbrug af råvarer opgøres efter en fysisk lageroptæl-
          ling, da produktionens vareforbrug ikke registreres direkte, men
          fratrækkes i råvarebeholdningen i edb-systemet med det standard-
          forbrug, der svarer til månedens produktion. 
           
          Standardomkostningskontrollen kan opdeles på råvaregrupper. 
           
          Færdigvarelagrene afstemmes således: 
           
          Færdigvarelager primo til stand.kostpris                    xxx 
             (iflg. varelagerliste/edb) 
           
          Månedens produktion til stand-omk.                        + xxx 
             (iflg. edb) 
           
          Månedens salg til stand.omk.                              - xxx 
             (iflg. edb)                                            _ _ _ _ _ 
           
          Færdigvarelager ultimo til stand.kostpris                   xxx 
             (iflg. edb)                                            ====== \f

           
          De her nævnte opstillinger og statistikker kan danne grundlag for
          en periodisk oversigt over produktionens økonomi. 
           
          En meget vigtig del af standardomkostningskontrollen er de kalku-
          lerede standardomkostninger, der ligger i systemet på hver enkelt
          vare. Disse forbrugssatser og priser er budgettet for produktio-
          nens gennemførelse, og det er disse kalkulationer, der kontrolle-
          res i standardomkostningskontrollen. 
           \f

         4_._ _ _ _ _ _ _ _ _A_n_d_r_e_ _m_u_l_i_g_h_e_d_e_r_ _i_n_d_e_n_f_o_r_ _R_C_ _M_O_S_A_I_K_ 4.
           
                   Ved udviklingen af RC MOSAIK er der lagt vægt på tre hovedfor-
          mål: 
           
          1)  At udvikle et standardsystem, som kan tilfredsstille behov
              hos et bredt udsnit af mindre- og mellemstore virksomheder
              som producerer og/eller afsætter massevarer/varer. 
               
          2)  At systemet let skal kunne modificeres. Dette betyder at: 
              a)  Programkomplekset skal kunne forsyne programmøren med et
                  sæt af værktøjer, som muliggør det for selv relativt uer-
                  farne programmører at arbejde med systemet. 
                   
              b)  Programmøren skal kunne være overbevist om at modifika-
                  tioner ikke giver konsekvenser andre steder i programkom-
                  plekset. 
                   
          3)  At skabe en basis ramme, t_o_t_a_l_t_ _u_a_f_h_æ_n_g_i_g_ af RC MOSAIK, en
              struktur, som er i stand til at klare a_l_l_e_ basisbehov for et
              edb-system. 
           
           
           
          G_e_n_e_r_e_l_ _p_r_o_g_r_a_m_s_t_r_u_k_t_u_r_ 
           
                Den generelle struktur består af: 
           
          A_._ _E_t_ _s_æ_t_ _e_k_s_t_e_r_n_e_ _p_r_o_c_e_d_u_r_e_r_ 
           
          Disse procedurer indeholder beskrivelse af den database, som
          skal anvendes. 
           
          Strukturen er trimmet til anvendelse af RC database system. 
           \f

          B_._ _S_t_r_u_k_t_u_r_ _i_ _e_t_ _o_n_-_l_i_n_e_ _s_y_s_t_e_m_,_ _i_ _h_v_i_l_k_e_t_ _a_t_ _d_a_t_a_f_a_n_g_s_t_ _o_g_
          b_e_h_a_n_d_l_i_n_g_ _k_a_n_ _u_d_f_ø_r_e_s_ _e_n_k_e_l_t_ _o_g_ _s_i_k_k_e_r_t_ 
           
           
          Strukturen giver bl.a., følgende karakteristiske træk: 
           
          1)  Adskillige typer programkørsler 
              a)  Batchmode, som skal bruges ved 
                  - konvertering af registre fra andre systemer 
                  - testning af system. 
                   
                  Denne facilitet er værdifuld for programmøren, fordi det
                  giver ham en oversigt over programforløbet, men også en
                  detaljeret forklaring på fremgangsmåderne. 
                   
              b)  On line mode 
                   
              c)  Speciel mode til reetablering efter afbrydelse 
                   
              d)  Speciel mode til at periodisere kontering. 
                   
          2)  Et detaljeret sæt sikkerhedsprocedurer f.eks.: 
              - back-up i tilfælde af systemsvigt 
              - kontrol af databasekonsistensen. Det er umuligt at køre
                programmet, hvis databasen og back-up registrer er inhomo-
                gene 
              - automatisk udvidelse af registre. 
                afslag på kørsel af programmer, hvis ressourcer er util-
                strækkelige 
              - alarm, hvis en fil kræver reorganisation 
                Alarm starter normalt ca. en uge før det kritiske punkt er
                nået. 
                Hvis alarmen vedvarende bliver ignoreret, vil systemet la-
                ve en kontrolleret nedlukning. 
                Eventuel forsøg på at genstarte on-line programmet er \f

                         således umulig til filen er blevet reorganiseret. 
              - trappoint faciliteter 
                I tilfælde af program-fejl vil systemet gøre alt muligt for
                at få en kontrolleret nedlukning og desuden bevare databa-
                sen konsistent. 
              - automatisk behandling af hardware fejl på terminaler, prin-
                ter etc. 
          3)  Terminal-behandling 
               
          4)  mulighed for valg af outputmedie 
               
              Brugeren kan valgfrit få output på terminalen og/eller 
                              printere 
                              printfil  
                              via PRIMO 
               
          5)  Automatisk anvendelse af MIPS/TS - operativsystem 
               
          6)  Faciliteter og back-up register til at klare problemerne med
              afbrydelse i bogholderi funktionen. 
               
          7)  Et generelt sæt af database-access-procedurer. 
               
           C_._ _B_a_t_c_h_._p_r_o_g_r_a_m_s_t_r_u_k_t_u_r_ 
               
          Strukturen har, bl.a. følgende karakteristiske træk: 
               
          1)  Strukturen tillader at køre batch-programmer, enten på inter-
              aktive basis i menneske-maskine dialog, eller ved at trimme
              programmet til permanente rutiner. 
               
          2)  Mulighed for valg af output til 
                              printere eller spoolområde (baggrundsområde)
               
          3)  Automatisk anvendelse af MIPS/TS \f

                   4)  Et generelt sæt af database access og fil handling procedu-
              rer.  
          Den generelle struktur ovenfor betyder en betydelig mindskning af
          programmeringsopgaverne såvel under udvikling af nye applikatio-
          ner som under modificering af de eksisterende. 
           
           \f

 
 \f

 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
                             COROUTINE MONITOR 
           
                                 (ALGOL 8) 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           \f

1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_C_T_I_O_N_._ 1.
           
          With the introduction of the activity concept in algol8 (ref 1)
          is available, a set of powerful tools for programming parallel
          activities within an algol program. 
           
          These fundamental tools are directly accessible from an algol
          program. However, there is a need for concepts and functions on
          higher levels. The present coroutine monitor is such a set of
          high level tools for programming parallel activities. 
           
          The coroutine monitor supports coroutines internally synchroni-
          zing and communicating via semaphores and externally synchroni-
          zing and communicating via the low level send message - wait an-
          swer functions and the high level i/o procedures (read, write,
          inrec etc.). 
           
          The actual implementation is based in the proposal for a reen-
          trant coroutine monitor for RC8000 (common to several processes)
          as described in ref. 2. 
           
          The coroutine and semaphore concepts are outlined below (readers
          who are familiar with these concepts may skip the rest of this
          chapter): 
           
          The use of the term "coroutine" has not yet been standardized in
          the technical literature, and consequently appears confusing, as
          the word "coroutine" is used about programming tools ranging from
          subroutine-like modules calling each other in a highly symmetric
          way, to tasks running in a general multiprogrammed system, inter-
          acting in a certain simple way. 
           
          The name "coroutine" was coined by Conway in 1958. He used it for
          subroutines in a system, where each subroutine is written as if
          it is the main program and the others simple subroutines called
          by it. This is done by merging of call and return, and dynamical-
          ly changing entry points in the routine. The mecanism is descri-\f

          bed in detail in ref. 3. The concept is found as well in SIMULA
          67. 
           
          Some of the charateristics of such a system are: 
           
          - one coroutine at a time is active (using the CPU). This means
            that a coroutine always runs in "disables" mode and consequent-
            ly has free and exclusive access to any variable in the sys-
            tem. 
             
          - protection of data areas shared between coroutines against si-
            multaneous access is not critical. 
             
          - the scheduling of CPUtime is "primitive" - each coroutine uses
            as musch CPUtime as needed. No protection exists against one
            coroutine monopolizing the CPU. Implementation of the call me-
            chanism is very simple. 
             
          - as each coroutine may be written as if it is the main program
            calling sunroutines, a certain amount of modularity and inde-
            pendence between modules is enforced on the programmer. 
             
          An important extension to this simple coroutine system is found
          in the book by D.E. Knuth. A coroutine is allowed to activate se-
          veral other coorutines before stopping, i.e. in he terminology of
          subroutines simultaneously to branch to several entry points. Ac-
          tivation of another coroutine and suspending own executing are
          thus seperate functions (figure 3). The "current entry point"
          (figure 2) is replaced by a "waiting point". 
           
          Selection of the coroutine which is allowed to run next (in case
          of several activated coroutines), is done by a central logic. 
           
           \f

           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 3. Coroutine System, several acticated coroutines. 
           
           
          A primitive sort of internal event has been added in form of the
          activate/wait pair. A coroutine may further wait for a specified
          time ("delay 2 secs"), which can be cinsidered as a hidden timing
          coroutine activating the caller after the specified interval of
          time. Scheduling of the CPU is still "primitive", but the central
          logic has decisional abilities and is extended with a timing
          function. 
           
          The present RC8000 Algol Coded Coroutine Monitor consists of a
          central logic and a collection of coroutine monitor procedures.
          It has developed from the system mentioned above by emphasizing\f

          the role of internal and external events and by making the corou-
          tines more independant. These design principles are flund in the
          RC4000 operating system BOSS2, too. 
           
          An RC8000 c_o_r_o_u_t_i_n_e_ is either active (activated) or waiting for
          some internal or external event. An active coroutine is always
          placed in the ready queue, i.e. activated and waiting for access
          to the CPU. The first coroutine in the ready queue is the singu-
          lar coroutine executing instructions. 
           
          A waiting coroutine may wait for timer, internal events signalled
          by other coroutines (see below) or incomming messages and an-
          swers. It is possible to wait for more than one type of event at
          a time. 
           
          Coroutines can cooperate by sending signals on semaphores to each
          other. 
           
          A s_e_m_a_p_h_o_r_e_ is a data structure containing a state variable and
          some additional information about queues of waiting coroutines
          and signalled events. A semaphore is in one of three states: 
           
          - neutral:     The number of signals equal the number of waits.
                         The semaphore is initially in this state. 
                          
          - open:        There has been more signals than waits. This means
                         that a coroutine is not delayed when executing a
                         wait. 
                          
          - closed:      There has been more waits than signals. Conse-
                         quently, a signal will activate one waiting
                         coroutine. 
                          \f

           Two types of semaphores are supported: 
           
          - simple semaphores:     No data is sifnalled. The semaphore only
                                   counts the number of signals/waits. 
                                    
          - chained semaphores:    Data (operations) are signalled. A sig-
                                   nal specifies an operation type. A wait
                                   selects the set  of operation types,
                                   which should cause an activation of the
                                   coroutine. 
                                    
          A coroutine may be placed in one of the following queues. 
           
          - The ready queue:       User of or waiting for the CPU 
          - A semaphore queue:     Waiting for a signal 
          - The timer queue:       Waiting for a timer event 
          - The idle queue:        Waiting for an external event or closed 
           
          The coroutine concept appears to be very similar to the process
          concept. Howeverm there are important differences as illustrated
          in the following comparison: 
           
          Concept        Process Solution         Coroutine solution 
                         several processes.       several coroutines in 
                                                  one process. 
           _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
           
          Module:        = process.               = coroutine 
           
          Communication  Other process known by   Other coroutines only 
          between        n_a_m_e_. Messages/answers   known to a limited 
          modules:       are exchanged.           extend. Communication 
                                                  done by signal/wait 
                                                  using common semaphores. 
           \f

          Critical       Exclusive access to      Exclusive access is 
          region and     data areas is ensured    ensured between waiting 
          shared data    by associating access    point. If exclisive 
          with exclu-    with a certain message/  access is wanted for a 
          sive access:   answer. The current ow-  piece of code containing 
                         ner of the message/an-   several waiting points, 
                         swer has exclusive ac-   signal/wait is used. 
                         cess. 
           
                         Critical regions, i.e.   Critical regions are 
                         non-entrant code shared  protected automatically 
                         between several proces-  by placing them between 
                         ses may be protected in  waiting points. 
                         the same way or by pre- 
                         venting a process shift 
                         by disabling interrupts. 
           
          CPU overhead:  Low to high depending    Very small. 
                         hardware facilities. 
           
          CPU            Yes, depending on rela-  No, a loop in a coroutine 
          guaranteed:    tive priority. A loop    will stop the whole sys- 
                         in another process with  tem of coroutines. 
                         same or lower priority 
                         can not prevent execu- 
                         tion. 
           
          Short          Processes with high      No. 
          realtime       priority have immidiate 
          response       response. 
          guaranteed: 
           
          CPU usage      Any range of CPU load    CPU load preferably low. 
           \f

          Core           Process descriptor -     As shift to another 
          overhead:      contains a save area for coroutine happens at 
                         all hardware and soft-   well defined places, 
                         ware registers used by   overhead can be kept 
                         the processes, as an     small. 
                         interrupt and shift to 
                         other proces may happen 
                         at any instance of the 
                         execution. 
           
          Use when:      Closely interacting      Closely interacting 
                         activities with medium   activities, i/o or event 
                         to high CPU usage.       bound, low CPU usage. 
                         Dynamic environment.     Static environment. 
           
           \f

2_._ _ _ _ _ _ _ _ _B_A_S_I_C_ _E_N_T_I_T_I_E_S_._ 2.
           
          The basic entities of the coroutine system are: coroutines, sema-
          phores, operations (buffers) and extensions for sending messages
          (message extensions) and for receiving messages (process exten-
          sions). 
           
          In this section are described the use and the formats of these
          basic utilities. However, the programmer using the coroutine mo-
          nitor does not have to know these things in detail, as they are
          all accessed via coroutine monitor functions. 
           
           
2_._1_ _ _ _ _ _ _ _C_o_r_o_u_t_i_n_e_s_._ 2.1
           
          Each of the parallel activities that may coexist and cooperate
          within this system is performed by a coroutine. A coroutine may
          communicate with other coroutines within the system and with pro-
          cesses outside the system by using the coroutine monitor func-
          tions. Each individual coroutine looks very much like a sequen-
          tial program eventually forming an endless log, in which there is
          at least one waiting point (a program point in which the corou-
          tine waits for some event from another coroutine or from some
          foreign process). 
           
          A coroutine is implemented as an activity (algol 8 activity) ex-
          tended with a coroutine description of the following format: 
           
          -2 
          +0    UUUcoroutine chain fieldsDDD 
          +2 
          +4    UUUtimer chain fieldsDDD 
          +6 
          +8    UUUoperation chain fieldsDDD 
          +10   time to timeout 
          +12   coroutine identification 
          +14   coroutine priority 
          +16   operation type set, testmask \f

 
           
2_._2_ _ _ _ _ _ _ _S_i_m_p_l_e_ _S_e_m_a_p_h_o_r_e_s_._ 2.2
           
          The simple semaphore is mainly a synchronizing primitive. The
          format of a simple semaphore is: 
           
          -2 
          +0    UUUchain head for waiting coroutinesDDD 
          +2    semaphore value 
           
          The semaphore value indicates, whether the semaphore is open or
          not. Whem the value is negative, it indicates the number of co-
          routines waiting for a signal to arrive on the semaphore. When
          the value os positive, it indicates the number of signals that
          have arrived withour being asked for. 
           
           
2_._3_ _ _ _ _ _ _ _C_h_a_i_n_e_d_ _S_e_m_a_p_h_o_r_e_s_._ 2.3
           
          The chained semaphore is both a synchronizing and a message ex-
          change primitive at the same time. The format of a chained sema-
          phore is: 
           
          -2 
          +0    UUUchain for waiting coroutinesDDD 
          +2 
          +4    UUUchain for waiting operationsDDD 
           
          Messages exchanged via chained semaphores are called operations
          (explained below). As operations signalled on a gives semaphore
          may be of differnet types and as coroutines may ask (wait) for
          operations of specific types to arrive, both coroutine chain and
          operation chain may be nonempty at the same time. 
           
           \f

2_._4_ _ _ _ _ _ _ _O_p_e_r_a_t_i_o_n_s_._ 2.4
           
          An operation is a programmer defined buffer with a head of this
          format: 
           
          -6    size of buffer (excluding the head) 
          -4    operation type 
          -2 
          +0    UUUchain fieldsDDD 
          +2 
          +4 
          +6 
          .     UUUmessage or buffer areaDDD 
          . 
          . 
           
          The programmer never has to worry about the contents of the
          head. 
           
          An operation is identified by an integer array field value and if
          this value resides in an integer array field variable "op", the
          programmer may access the message or bugger area as "d.op(1)",
          "d.op(2)" etc. 
           
           
2_._5_ _ _ _ _ _ _ _E_x_t_e_n_s_i_o_n_s_._ 2.5
           
          Extension (message extensions and process extensions) are used by
          the coroutine monitor to establish the connections between a mes-
          sage and the sending coroutine and between a message receiver (a
          pseudo process) and a coroutine, handling messages arrived at
          this receiver. 
           \f

          A message extension looks like this: 
           
               messref (N)    message buffer address 
               messop (N)     coroutine or operation address 
               messcode (N)   state of extension, action to be performed
                              when the answer arrives. 
                               
          A process extension is very simular and looks like this: 
           
               procref (N)    (pseudo) process descriptor address 
               procop (N)     coroutine or operation address 
               proccode (N)   state of extension, action to be performed
                              when message arrives. 
                               
                               \f

 3_._ _ _ _ _ _ _ _ _B_A_S_I_C_ _F_U_N_C_T_I_O_N_S_._ 3.
           
          The present section describes in details the basic functions of-
          fered by the coroutine monitor and the exact conventions for u-
          sing these functions. The functions are grouped according to
          their nature and according to the basic entities on which they
          may operate. In this section is only described the functions used
          during the very execution of a number of coroutines, while the
          resource allocation and initialization functions are described in
          later chapters. 
           
           
3_._1_ _ _ _ _ _ _ _S_c_h_e_d_u_l_i_n_g_ _F_u_n_c_t_i_o_n_s_._ 3.1
           
          A coroutine system as the present one is totally depending on the
          behaviour of each individual coroutine, as a running coroutine
          will keep running until it reaches a waiting point. The coroutine
          monitor contains two procedures, "pass" and "delay", both of
          which help coroutines by avoiding monopoly. 
           
           
3_._1_ _1_ _ _ _ _ _P_a_s_s_._ 3.1.1
           
          THIS IS A WAITING POINT PROCEDURE! 
           
          Delcaration: 
                    procedure pass; 
           
          Function: 
                    moves the calling coroutine from the head of the ready
                    queue (the queue of coroutines that are ready for exe-
                    cution) down below all ready coroutines of equal or
                    higher priority. 
                     
                     \f

3_._1_._2_ _ _ _ _ _D_e_l_a_y_._ 3.1.2
           
          THIS IS A WAITING POINT PROCEDURE 
           
          Declaration: 
                    Procedure delay (timeout); 
                    value timeout; integer timeout; 
                     
          Function: 
                    delays the coroutine a number of seconds as specified
                    by "timeout". Please note that the timer function of
                    the coroutine monitor is controlled by an optional in-
                    spection interval, which is very much controlling the
                    accuracy of all timeout functions. 
                     
                     
3_._2_ _ _ _ _ _ _ _F_u_n_c_t_i_o_n_s_ _C_o_n_c_e_r_n_i_n_g_ _S_i_m_p_l_e_ _S_e_m_a_p_h_o_r_e_s_._ 3.2
           
          The functions that may be performed on simple semaphores are
          "signal", "wait" and "inspect". 
           
           
3_._2_._1_ _ _ _ _ _S_i_g_n_a_l_._ 3.2.1
           
          Declaration: 
                    procedure signal (semaphore); 
                    value semaphore; integer value; 
                     
          function: 
                    increases the value of the actual semaphore by 1. In
                    case one or more coroutines were waiting at the sema-
                    phore, the first one of them is moved to the ready
                    queue to be activated. 
                     
                     \f

3_._2_._2_ _ _ _ _ _W_a_i_t_._ 3.2.2
           
          THIS IS A WAITING POINT PROCEDURE 
           
          Declaration: 
                    procedure wait (semaphore); 
                    value semaphore; integer semaphore; 
                     
          Function: 
                    decreases the value of the actual semaphore by 1. In
                    case the avlue of the semaphore is negative after the
                    decrease, the calling coroutine is stopped and linked
                    into the chain of coroutines waiting at this sema-
                    phore. 
                     
                     
3_._2_._3_ _ _ _ _ _I_n_s_p_e_c_t_._ 3.2.3
                     
          Declaration: 
                    procedure inspect (semaphore, elements); 
                    value semaphore; integer semaphore, elements; 
                     
          Function: 
                    delivers the actual value of the semaphore in an
                    integer variable and leaves the semaphore unchahged.
                    The interpretation of elements (after the execution of
                    this procedure) is: 
                      elements =0: elements = 1*no of waiting coroutines 
                      elements '=0: elements = no of signals not waited for 
           
           
3_._3_ _ _ _ _ _ _ _F_u_n_c_t_i_o_n_s_ _C_o_n_c_e_r_n_i_n_g_ _C_h_a_i_n_e_d_ _S_e_m_a_p_h_o_r_e_s_._ 3.3
           
          The functions that may be performed on chained semaphores are
          "signalch", "waitch" and "inspectch". 
           
           \f

3_._3_._1_ _ _ _ _ _S_i_g_n_a_l_c_h_._ 3.3.1
           
          Declaration: 
                    procedure signalch (semaphore, operation, 
                                                   operaitontype); 
                    value semaphore, operation, operationtype; 
                    integer semaphore, operation; 
                    boolean operationtype; 
                     
          function: 
                    delivers an operation of the specified type at the ac-
                    tual semaphore. If one or more coroutines are waiting
                    for an operation of that kind, it is given to he first
                    one of them and this coroutine is put into the ready
                    queue (for activation). If no coroutine waits for ope-
                    ration of the specified kind, the operation is linked
                    to the semaphore, waiting for a coroutine to take it by
                    "waitch". The boolean "operationtype" is trated as a
                    bit mask and the condition for matching types are ex-
                    plained under "waitch". 
                     
                     
3_._3_._2_ _ _ _ _ _W_a_i_t_c_h_._ 
           
          THIS IS A WAITING POINT PROCEDURE! 
           
          Declaration: 
                    procedure waitch (semaphore, operation, operation- 
                                                 typeset, timeout); 
                    value semaphore, operationtypeset, timeout; 
                    integer semaphore, operation, timeout; 
                    boolean operationtypeset; 
                     
          function: 
                    fetches an operation of the specified type (or just be-
                    longing ro the specified set of types) at the actual
                    semaphore. In case a matching operation has arrived al-\f

                    ready, this operation is given to the coroutine which
                    then resumes execution. If no matching operation is
                    ready, the coroutine is linked to the semaphore, wai-
                    ting for a matching operation to be delivered by "sig-
                    nalch". 
                     
                    The m_a_t_c_h_i_n_g_ _c_o_n_d_i_t_i_o_n_ is a bit pettern test, performed
                    on the boolean "operationtype" (as defined at "signal-
                    ch") and the boolean "operationtypeset" (as defined at
                    "waitch"). If these two bitpatterns do overlap an one
                    or more bit positions, the delivered operation matches
                    the fetching coroutine. 
                     
          The timeout function of the coroutine monitor makes it possible
          to define a maximum waiting time. If "timeout" is positive, it is
          expected to be the maximum number of seconds that the coroutine
          will wait. If no matching operation arrives within that period of
          time, the coroutine is put into the ready queue with the return
          value "operation" set to zero, indicating that the function is
          "timed out". If "time out" is not positive, the coroutine will
          keep waiting undefinitely until a matching operation arrives. 
           
           
3_._3_._3_ _ _ _ _ _I_n_s_p_e_c_t_c_h_._ 3.3.3
           
          Declaration: 
                    procedure inspectch (semaphore, operationtypeset, 
                                                          operations; 
                    value semaphore, operationtypeset; 
                    integer semaphore, operations; 
                    boolean operationtypeset; 
                     
          Function: 
                    scans the queue of operations at the actual semaphore,
                    counts the number of matching operation (the matching
                    condition is explained in section 3.3.2) and delivers
                    the result in the return variable "operations". The se-
                    maphore (including the queue of operations) is unchan-
                    ged. \f

3_._4_ _ _ _ _ _ _ _E_x_t_e_r_n_a_l_ _C_o_m_m_u_n_i_c_a_t_i_o_n_._ 3.4
           
          When a coroutine wants to communicate with foreign processes u-
          sing the message communication primitives of the monitor (ref
          4.), this may be done in three different ways: 
           
          - using the high level zone procedures (read, write, inrec, out-
            rec ...) 
          - using the low level zone procedures (monitor, getzone, setzone
            ...) 
          - using the coroutine monitor functions for external communica-
            tion 
             
          The conventions for activities performing external communication
          via zones are described in ref. 1. The present section only deals
          with the coroutine monitor functions for external communication.
          These functions are: "csendmessage", "cwaitanswer", "cwaitmes-
          sage", "cregretmessage", "semsendmessage", "semwaitmessage" and
          "semregretmessage". As indicated by the names these functions
          fall into two different groups: 
           
          1. (names prefixed by "c"). 
             Functions totally separating external and internal communica-
             tion. The most important effect is that a coroutine waiting
             for an external event may not be activated internally and it
             may only wait for one specific event at a time. 
              
          2. (names prefixed by "sem"). 
             Functions converting answers and messages from foreign proces-
             ses to operations, thus enabling a coroutine to wait for a
             number of external and/or internal events at the same time. 
              
              \f

3_._4_._1_ _ _ _ _ _C_s_e_n_d_m_e_s_s_a_g_e_._ 3.4.1
           
          Declaration: 
                    procedure csendmessage (receiver, mess, messextension); 
                    real array receiver; 
                    integer array mess; 
                    integer messextension; 
                     
          Function: 
                    sends a message, specified by "mess", to the process
                    specified by "receiver". Both arrays are assumed to
                    s_t_a_r_t_ _a_t_ _e_l_e_m_e_n_t_ _n_o_ _1_. The integer array "mess" should
                    be of a_t_ _l_e_a_s_t_ _8_ _i_n_t_e_g_e_r_s_. The real array "receiver" is
                    assumed to contain a process name in element 1 and 2,
                    and it m_u_s_t_ _c_o_n_t_a_i_n_ _e_l_e_m_e_n_t_ _3_ _t_o_ _h_o_l_d_ _t_h_e_ _n_a_m_e_ _t_a_b_l_e_
                    a_d_d_r_e_s_s_. At return from the procedure, the variable
                    "messextension" holds an implicit reference to the
                    message sent, and this reference must be used when
                    awaiting the answer by "cwaitanswer" or when regretting
                    the message by "cregretmessage". 
                     
                     
3_._4_._2_ _ _ _ _ _C_w_a_i_t_a_n_s_w_e_r_._ 3.4.2
                     
          THIS IS A WAITING POINT PROCEDURE! 
                     
          Declaration: 
                    procedure cwaitanswer (messextension, answer, result, 
                                                                timeout); 
                    value messextension, timeout; 
                    integer messextension, result, timeout; 
                    integer array answer; 
                     
          Function: 
                    awaits an answer to arrive. The message to be answered
                    was sent by "csendmessage" and "messextension" is the
                    identification of this message. At return from the pro-\f

                    cedure, the answer is delivered in the integer array
                    "answer", which is supposed to s_t_a_r_t_ _a_t_ _e_l_e_m_e_n_t_ _n_o_ _1_
                    and to be of a_t_ _l_e_a_s_t_ _8_ _i_n_t_e_g_e_r_s_. The result is deli-
                    vered in the variable "result". If the parameter "time-
                    out" is positive, the function may be "timed out". If
                    the answer does not arrive within the number of seconds
                    specified by timeout, the coroutine will be activated
                    and "result" will be zero, indicating that the answer
                    did not arrive. If the function is "timed out", and in
                    case the actual message was not an i/o message, the
                    coroutine may perform a "cregretmessage" to unclaim the
                    message buffer involved. 
                     
                     
3_._4_._3_ _ _ _ _ _C_w_a_i_t_m_e_s_s_a_g_e_._ 3.4.3
                     
          THIS IS A WAITING POINT PROCEDURE! 
           
          Declaration: 
                    cwaitmessage (processextension, mess, messbufferref, 
                                                            timeout); 
                    value processextension, timeout; 
                    integer processextension, messbufferref, timeout; 
                    integer array mess; 
                     
          Function: 
                    awaits a message to arrive at the pseudoprocess (or the
                    internal process in which the whole system runs) poin-
                    ted out by "processextension" (the value of processex-
                    tension was defined during initialization (see chapter
                    5)). At return the integer array "mess" contains the
                    message arrived, and the integer variable "messbuffer-
                    ref" is the message buffer address to be used by the
                    coroutine, when returning an answer to the sender. If
                    "timeout" is positive, it specifies the maximum number
                    of seconds that the coroutine will wait for a message
                    to arrive. If the function is "timed out", the return\f

                    value of messbufferref is zero, indicating that no mes-
                    sage arrived. If "timeout" is not positive, the corou-
                    tine will wait indefinitely until a message arrives. 
                     
                     
3_._4_._4_ _ _ _ _ _C_r_e_g_r_e_t_m_e_s_s_a_g_e_._ 3.4.4
                     
          Declaration: 
                    procedure cregretmessage (messextension); 
                    value messextension; integer messextension; 
                     
          Function: 
                    regrets a message sent by "csendmessage". Please note
                    that i/o messages are not regretable. In case "cwait-
                    answer" is "timed out", and in case the actual message
                    was not an i/o message, the resources allocated for
                    this message (message buffer and message extension)
                    will be released by calling "cregretmessage".
                    "messextension" contains the value returned by
                    "csendmessage" to identify the message. 
                     
                     
3_._4_._5_ _ _ _ _ _S_e_m_s_e_n_d_m_e_s_s_a_g_e_._ 3.4.5
                     
          Declaration: 
                    procedure semsendmessage (receiver, mess, semaphore, 
                                                operation, operationtype); 
                    value semaphore, operation, operationtype; 
                    real array receiver; 
                    integer array mess; 
                    integer semaphore, operation; 
                    boolean operationtype; 
                     
          Function: 
                    sends a message, specified by "mess", to the process
                    specified by "receiver" and defines the "signalch"
                    function to be performed by the coroutine monitor, when\f

                     
                    The integer array "mess" contains the message to be
                    sent, and it is assumed to s_t_a_r_t_ _a_t_ _e_l_e_m_e_n_t_ _n_o_ _1_ and to
                    contain a_t_ _l_e_a_s_t_ _8_ _i_n_t_e_g_e_r_s_. 
                     
                    The real array "receiver" contains the name of the re-
                    ceiving process. It is assumed to s_t_a_r_t_ _a_t_ _e_l_e_m_e_n_t_ _n_o_ _1_
                    and to contain a_t_ _l_e_a_s_t_ _3_ _r_e_a_l_s_ (receiver(3) is used
                    for the name table address). 
                     
                    When the answer arrives, the coroutine monitor will co-
                    py the answer to the first 8 integers of the operation,
                    put the result into the 9>th integer and then perform a
                    "signalch (semaphore, operation, operationtype)". Be-
                    cause of this mechanism, the coroutine may await its
                    answer to arrive or some other internal or external e-
                    vent to arrive by performing a "waitch (semaphore, ope-
                    ration, operationtypeset, timeout)" where the opera-
                    tiontype defined at calling "semsendmessage" must match
                    "operaiontypeset". 
                     
                    Please note that the size of the operation (buffer)
                    must be at least 18 halfwords (9 integers). 
                     
                     
3_._4_._6_ _ _ _ _ _S_e_m_w_a_i_t_m_e_s_s_a_g_e_._ 3.4.6
                     
          Declaration: 
                    procedure semwaitmessage (processextension, semaphore, 
                                                operation, operationtype); 
                    value processextension, semaphore, operation, 
                                                           operationtype; 
                    integer processextension, semaphore, operation; 
                    boolean operationtype; 
                     \f

          Function: 
                    defines a "signalch" function to be performed by the
                    coroutine monitor, when a message arrives at the pseudo
                    process (or the internal process in which the system
                    runs) specified by "processextension". 
                     
                    When the message arrives, the coroutine monitor will
                    copy the message into the first 8 integers of the ope-
                    ration, put the message buffer address into the 9>th
                    integer and then perform a "signalch (semaphore, opera-
                    tion, operationtype)". Thus a message is converted to 
                    an operation and it may be awaited by performing a 
                    "waitch(semaphore, operation, operationtypeset, time- 
                    out)" where the operationtype defined at calling
                    semwaitmessage must match "operationtypeset". 
                     
                    Please note that the size of the operation (buffer)
                    must be at least 18 halfwords (9 integers). 
                     
                     
3_._4_._7_ _ _ _ _ _S_e_m_r_e_g_r_e_t_m_e_s_s_a_g_e_._ 3.4.7
                     
          Declaration: 
                    procedure semregretmessage (operation); 
                    value operation; 
                    integer operation; 
                     
          Function: 
                    regrets the message that has been sent by "semsendmes-
                    sage" and for whom the answer should be returned in the
                    operation identified by "operation".  
                    Only messages to whom the answer has not yet arrived 
                    may be regretted by this procedure. 
                     
                    The result field of the operation is set to zero, indi-
                    cating, that the message was regretted. 
                     
                    This function is primarily intended for releasing re- 
                    sources (message buffers, message extensions and opera-
                    tions) occupied by unanswered messages. \f

                    Please note that i/o messages are not regretable. 
                     
                     \f

4_._ _ _ _ _ _ _ _ _A_S_S_O_C_I_A_T_E_D_ _F_U_N_C_T_I_O_N_S_._ 4.
           
          In the former chapter are described the basic functions of the
          coroutine monitor. These functions include scheduling,
          synchronizing and internal and external communication. In this
          section are described some associated functions, some of which
          have already been mentioned in the former section. The functions
          to be described in this section are: 
           
          - event handling strategy 
          - timeout functions 
          - types of operations (buffers) 
          - testoutput facilities 
           
           
4_._1_ _ _ _ _ _ _ _S_c_h_e_d_u_l_i_n_g_ _S_t_r_a_t_e_g_y_._ 4.1
           
          In this section is described the strategy for handling external
          and internal events. The strategy of the coroutine monitor de-
          fines the order in which events are handled and coroutines are
          served. The strategy is used each time a coroutine enters a wai-
          ting point procedure. 
           
           
4_._1_._1_ _ _ _ _ _C_o_r_o_u_t_i_n_e_ _P_r_i_o_r_i_t_i_e_s_._ 4.1.1
           
          The coroutine monitor includes a straightforward coroutine sche-
          duling based on coroutine priorities (defined at initialization).
          The scheduling strategy is realized like this: 
           
          - whenever a coroutine is linked into a queue, it is placed in
            the queue according to its priority (immediately ahead of the
            first coroutine of lower priority) 
          - whenever a coroutine is selected from a queue, the queue is
            scanned from the head. 
             
          By doing this, the system will always select a coroutine of the\f

          highest priority available and if more coroutines are of equal
          priority, the one that has spent the longest time on the queue is
          selected. 
           
           
4_._1_._2_ _ _ _ _ _E_x_t_e_r_n_a_l_ _E_v_e_n_t_s_._ 4.1.2
           
          Each time a coroutine enters a waiting point procedure, the co-
          routine monitor will scan all external events that have arrived.
          For each external event it is checked, whether it is waited for
          and if that is the case, the corresponding action will be taken
          (put waiting coroutine into ready queue, convert event to
          operation and signal semaphore etc.). After scanning the queue of
          external events, the first coroutine of the ready queue is
          activated. 
           
          This strategy implies that external events are handled (schedu-
          led) as fast as possible and the priority of the corresponding
          coroutine defines the internal scheduling. By doing so, the co-
          routine monitor is able to run a system including coroutines with
          severe response time demands and coroutines permanently running
          background activities. 
           
           
4_._2_ _ _ _ _ _ _ _T_i_m_e_o_u_t_ _F_u_n_c_t_i_o_n_s_._ 4.2
           
          The coroutine monitor includes a set of timer functions. All
          these functions are based on a timer queue into which all corou-
          tines currently waiting for a timeout (and eventually some other
          kind of event) are linked. At the end of each inspection inter-
          val, the timerqueue is scanned. Coroutines for whom the timeout
          period has expired are moved to the ready queue with proper indi-
          cation of the cause. 
           
          The inspection interval is a system option, defining the accuracy
          (and the overhead) of the timeout function. 
           
           \f

4_._3_ _ _ _ _ _ _ _T_y_p_e_s_ _o_f_ _O_p_e_r_a_t_i_o_n_s_._ 4.3
           
          As explained in section 3, the functions concerning chained sema-
          phores are extended to cover the "operation type" concept. 
           
          The "operation types" are introduced to enable coroutines to wait
          for a selected type or a set of selected types of operations. The
          present concept even allows different coroutines to wait for dif-
          ferent (maybe overlapping) sets of operation types, thus offering
          facilities that it would not be possible to implement even by
          using a number of different semaphores. 
           
          The condition for an operation to match a waiting coroutine is,
          that the type of the operation overlaps the typeset defined by
          the coroutine (usually an operationtype is represented by a sin-
          gle bit and the condition is that the typeset of the waiting co-
          routine includes the type of the operation). 
           
           
4_._4_ _ _ _ _ _ _ _T_e_s_t_o_u_t_p_u_t_ _F_a_c_i_l_i_t_i_e_s_._ 4.4
           
          The coroutine monitor may currently generate testoutput to be
          used for tracing and debugging purposes. 
           
          The testoutput mechanism may be switched off totally, as
          explained in section 6. Even when included, it is possible to
          select different kinds of testoutput for each individual
          coroutine. 
           
          The testoutput records generated by the coroutine monitor are
          grouped like this: 
           \f

          n_a_m_e_ _o_f_ _g_r_o_u_p_:_ _ _ _ _ _ _G_e_n_e_r_a_t_e_s_ _t_e_s_t_o_u_t_p_u_t_ _a_t_:_ 
           
          semtest             signal 
                              wait 
                              inspect 
           
          semchtest           signalch 
                              waitch 
                              inspectch 
           
          ceventtest          csendmessage 
                              cwaitanswer 
                              cwaitmessage 
                              cregretmessage 
           
          semeventtest        semsendmessage 
                              semwaitmessage 
          semregretmessage 
           
          schedulingtest      pass 
                              delay 
                              + each time a coroutine is activated after 
                                a waiting point 
           
           
          The testoutput is controlled by a bit pattern with a bit repre-
          senting each of the groups listed above. Each coroutine has its
          own bit pattern, which is defined at initialization (see section
          5) and stays unchanged during its lifetime. 
           
          It is possible for a coroutine to generate its own testrecords by
          using the following testoutput procedures (the private testre-
          cords will be written into the global testoutput area): 
           \f

          - procedure test _0 (recordid); 
            value recordid; 
            integer recordid; 
             
               generates a testrecord identified by "recordid" 
                
          - procedure test _val (recordid, integervalue); 
            value recordid, integervalue; 
            integer recordid, integervalue; 
             
               generates a testrecord identified by "recordid" and inclu-
               ding the value of "integervalue". 
                
          - procedure test _val _val (recordid, ivalue1, ivalue2); 
            value recordid, ivalue1, ivalue2; 
            integer recordid, ivalue1, ivalue2; 
             
               generates a testrecord identified by "recordid" and inclu-
               ding the values of "ivalue1" and "ivalue2". 
                
          - procedure test _arr (recordid, iarr, size); 
            value recordid, size; 
            integer recordid, size; 
            integer array iarr; 
             
               generates a testrecord identified by "recordid" and
               including size/2 integers from the array "iarr" (iarr(1),
               iarr(2), ..... iarr(size/2)) 
                
          - procedure test _arr _val (recordid, iarr, size, ivalue); 
            value recordid, size, ivalue; 
            integer recordid, size, ivalue; 
            integer array iarr; 
             
               generates a testrecord identified by "recordid" and inclu-
               ding size/2 integers from the array"iarr" (iarr(1),
               iarr(2),.... iarr(size/2)) and the value of "ivalue". \f

 
          When generating private testrecords, "recordid" should not be
          less than 100 to avoid confusion with records generated by the
          coroutine monitor. 
           
          The program "ctrace" may print selected parts of the testarea. 
           
          Each testrecord contains a record identification, a time stamp
          (time relative to startup) and an identification of the coroutine
          explicitly or implicitly generating the testrecord. The rest of a
          testrecord is printed as a series of integers and the interpreta-
          tion is individual to each record type (see chapter 8). 
           
           \f

5_._ _ _ _ _ _ _ _ _R_E_S_O_U_R_C_E_ _A_L_L_O_C_A_T_I_O_N_._ 5.
           
          The present algol8 coroutine monitor is implemented as a skeleton
          program, establishing the environment of the coroutines. The
          coroutine monitor administers the allocation and initialization
          of the basic entities (coroutine descriptors, semaphores,
          extensions and operations). Because of the scope rules etc. of
          algol, the resource allocation has been split into a number of
          different steps, concerning: 
           
          - claiming of basic entities 
          - declaration of procedures and common variables 
          - initialization of basic entities, common variables and activi-
            ties (coroutines) 
          - reserving stackspace for each individual activity (coroutine). 
             
          As it is explained in section 6, a dedicated merging program is
          capable of merging a number of files into the skeleton program
          text. The steps mentioned above are reflected by a number of
          points in the skeleton program, at which the individual corouti-
          nes may append algol program pieces for claiming, declaration
          etc. 
           
           
5_._1_ _ _ _ _ _ _ _C_l_a_i_m_i_n_g_ _o_f_ _B_a_s_i_c_ _E_n_t_i_t_i_e_s_._ 5.1
           
          The basic entities are claimed simply by adding a number to a
          counter. There is a counter for each type of resource. The coun-
          ters are: 
           
          maxcoru         the number of coroutines claimed so far 
          maxsem          the number of simple semaphores claimed so far
          
          maxsemch        the number of chained semaphores claimed so far
                           
          maxop           the number of operations claimed so far 
          maxnettoop      the accumulated number of halfwords claimed for
                          operation buffers (not including the head of the
                          operations, which are counted by "maxop"). \f

          maxmessext          the number of message extensions claimed so
                              far. 
               maxprocext          the number of process extensions claimed so
                              far. 
                               
          The following rules apply when claiming the basic entities for a
          coroutine or a set of coroutines (the example discussed in sec-
          tion 7 may be helpful as an illustration to these rules): 
           
          maxcoru             add 1 for each coroutine 
          maxsem              add 1 for each simple semaphore (please note
                              that even though a semaphore is normally used
                              by several coroutines, it should only be
                              claimed once) 
          maxsemch            add 1 for each chained semaphore 
          maxop               add 1 for each operation 
          maxnettoop          add the number of halfwords occupied by each
                              operation (operations may be of variable
                              length) 
          maxmessext          add the largest number of messages that may
                              be in use at a time (a message is in use from
                              the call of "csensmessage" to the return from
                              "cwaitanswer" or from the call of "semsend-
                              message" to the return from the "waitch",
                              fetching the operation in which the answer is
                              signalled) 
          maxprocext          add 1 for each pseudoprocess that is used to
                              receive messages 
                               
                               
5_._2_ _ _ _ _ _ _ _I_n_i_t_i_a_l_i_z_a_t_i_o_n_._ 
           
          At startup, the claimed resources should be initialized. The ba-
          sic entities are initialized by means of the following set of i-
          nitializing procedures: 
           \f

          - integer procedure nextcoru (ident, prioroty, testmask); 
            value ident, priority, testmask; 
            integer ident, priority; 
            boolean testmask; 
             
               this procedure initializes the next descriptor from the pool
               of claimed coroutine descriptors. 
                
               "ident" should be a number between 0 and 8000. It is used to
               identify the testrecords generated by this coroutine. The
               identification in the testrecord is "ident"*1000+coroutine
               no (coroutine no = activity no). 
                
               "priority" may be any integer value, but it is important for
               the behaviour of the total system that priorities of all co-
               routines are harmonized. 
                
               "testmask" defines the kind of testrecords that should be
               generated by this coroutine (see section 4.4). "false" means
               no testoutput, "true" means full testoutput and selected
               testoutput may be defined for instance by stating: "schedu-
               lingtest or ceventtest". 
                
               The return value "nextcoru" is the coroutine number of the
               actual coroutine. T_h_i_s_ _n_u_m_b_e_r_ _n_u_s_t_ _b_e_ _u_s_e_d_,_ _w_h_e_n_ _c_a_l_l_i_n_g_
               "_n_e_w_a_c_t_i_v_i_t_y_"_ to start up a coroutine. 
                
          - integer procedure nextsem; 
                
               this procedure initializes the next simple semaphore in the
               pool of claimed semaphores. The semaphore is initialized to
               be in neutral state (value = 0). 
                
               The return value "nextsem" is the semaphore identification
               to be used when performing the basic functions signal, wait
               and inspect. 
                \f

          - integer procedure nextsemch; 
               this procedure initializes the next chained semaphore in the
               pool of claimed semaphores. The semaphore is initialized to
               be in neutral state (no coroutines waiting, no operations
               ready). 
                
          - integer procedure nextop (size); 
            value size; 
            integer size; 
                
               this procedure initializes the next operation in the pool of
               operations. It allocates an operationhead, and immidiately
               following the head it allocates "size" halfwords for the o-
               peration buffer. 
                
               The return value "nextop" is an identification of the opera-
               tion and at the same time it is a field value to be used
               when addressing the buffer area. (If "op" contains the value
               returned by "nextop", the buffer may be accessed like this:
               d.op(1), d.op(2), d.op(3) ....). 
                
          - integer procedure nextprocext (processref); 
            value processref; 
            integer processref; 
                
               this procedure initializes the next process extension in the
               pool of claimed process extensions. 
                
               "processref" must be the process description address of a
               pseudo process belonging to the internal process, in which
               the system runs - or the internal process itself. 
                
               The return value "nextprocext" is an identification of the
               process extension (and implicitly of the process) to be
               used, when calling "cwaitmessage" or "semwaitmessage". 
                \f

          (Message extensions are all automatically initialized by the co-
          routine monitor - they are all free at startup). 
           
          During and after the initialization phase, the coroutine monitor
          checks that no unclaimed entities are initialized and that all
          claimed entities are initialized. The check only concerns the to-
          tal number of entities of each kind, so the system cannot pin-
          point errors (however, it is possible to merge a single file into
          the skeleton program at a time and then check resourceconsisten-
          cy for each individual coroutine file). 
           
           
5_._3_ _ _ _ _ _ _ _C_l_a_i_m_i_n_g_ _S_t_a_c_k_s_p_a_c_e_ _f_o_r_ _a_ _C_o_r_o_u_t_i_n_e_._ 5.3
           
          The actual implementation of activities in algol8 (as described
          in ref 1.) allows each activity (coroutine) to have its own stack
          surviving as a part of the main stack, even when the coroutine is
          left (in a waiting point). The local coroutine stack is handled
          almost like a usual algol stack, when the coroutine is running.
          Entering a procedure or a block will cause the running system to
          allocate stack space on top of the coroutine stack. As the
          coroutine stack is an inner part of the main stack, the pos-
          sibilities for allocating local stack space is limited. 
           
          The need for local stack space must be known in advance and the
          convention is that a coroutine will get allocated the maximum a-
          mount of stack space that is claimed from the startup of the co-
          routine, till it reaches a waiting point. 
           
          To support this stack reservation mechanism, the coroutine moni-
          tor includes the following procedure: 
           
            procedure stackclaim (size); 
            value size; 
            integer size; 
             \f

               this procedure allocates an array of "size" halfwords and
               then returns. The effect is that the running system will set
               the limit for maximum available stack space to be approxi-
               mately size (halfwords) more than what is in use when the
               procedure is called. 
                
                \f

6_._ _ _ _ _ _ _ _ _H_O_W_ _T_O_ _M_A_K_E_ _A_ _C_O_R_O_U_T_I_N_E_ _A_N_D_ _I_N_C_O_R_P_O_R_A_T_E_ _I_T_ _I_N_ _A_ _C_O_R_O_U_T_I_N_E_ _S_Y_S_T_E_M_._ 6.
           
          The coroutine monitor is implemented as a skeleton program for-
          ming the environment of the coroutines. This concept is directly
          reflected by the way of incorporating texts into the skeleton
          program text. 
           
          The skeleton program contains a set of merging labels (program
          points) defining a gap for insertion of coroutine text portions. 
           
          In this section is described the text merging program and the
          types of coroutine text portions to be inserted at each merging
          label. 
           
           
6_._1_ _ _ _ _ _ _ _T_e_x_t_ _M_e_r_g_i_n_g_ _P_r_o_g_r_a_m_._ 6.1
           
          A text merging program (usually called "cmerge" for "coroutine
          merge") is capable of merging a number of source files into a
          master file, generating an object file. 
           
          The program is called like this: 
           
r              obj.file'= cmerge masterfile' source   .source file'  0UUU*DDDDDD1UUU5  skip  .number'
  0UUU*DDDDDD1UUU5 
           
          The skeleton program is used as masterfile while the coroutine
          files are source files. 
           \f

          The merging procedure may be visualized like this: 
           
           
           
                    (TEGNING) 
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           \f

          As it appears from the example, the first part of a source file
          is neglected (considered to be a comment,  and the first line of 
          this comment is written on current output during the merging 
          process). A source file does not have to include all kinds of
          program parts. The program parts are identified by their leading
          merging label. 
           
          A merging label must be the first part of a text line and it must
          obey the following syntax: 
           
              merging label'::= :digit': 
              digit'::= 12345 
           
          The merging program may skip selected parts of master and source
          files depending on the skip parameters of the program call. 
           
          Special algol comments of the forms 
           
              *+digit'*'  and  *-digit'*' 
           
          are defined to be skip brackets and they are interpreted like
          this (they must always be placed on the very first positions of 
          a text line as it is the case for merging labels): 
           
               Whenever an opening bracket is met (*+...*') it is checked,
               whether the number of this bracket is included in the skip
               numbers from the program call. If this is the case, all text
               will be skipped upto the corresponding closing bracket
               (*-...*') regardless of other brackets eventually met in
               between. 
                
                
6_._2_ _ _ _ _ _ _ _C_o_r_o_u_t_i_n_e_ _T_e_x_t_ _P_o_r_t_i_o_n_s_._ 6.2
           
          To build up a coroutine system, the programmer will have to write
          a number of coroutine text portions, forming one or more source
          files and then merge these files with the coroutine monitor text.
          The coroutine text portions may belong to these five kinds: 
           \f

          1. declaration of trimming variables (configuration parame-
             ters). 
              
          2. initialization of trimming variables. 
              
          3. claiming of basic entities (as described in section 5.1). 
              
          4. declaration of variables and procedures (including common va-
             riables and procedures and individual activity procedures). 
              
          5. Initialization of basic entities, common variables and activi-
             ties (coroutines). 
              
              
6_._2_._1_ _ _ _ _ _D_e_c_l_a_r_a_t_i_o_n_ _o_f_ _T_r_i_m_m_i_n_g_ _V_a_r_i_a_b_l_e_s_._ 6.2.1
           
          When creating a coroutine system, a number of resources etc. may
          be subject to variations when used in different configurations or
          for different purposes. So it is of great interest to control re-
          source allocation by a small number of configuration (trimming)
          parameters. 
           
          In this text portion, the programmer may declare that kind of va-
          riables. 
           
          (For practical purposes, it would be nice to collect all trimming
          variables (and their initialization) and put them into a single
          source file). 
           
          Example: 
           
               :1: trimming variables 
               integer maxcarswaiting, maxcarwashers; 
           
           \f

6_._2_._2_ _ _ _ _ _I_n_i_t_i_a_l_i_z_a_t_i_o_n_ _o_f_ _T_r_i_m_m_i_n_g_ _V_a_r_i_a_b_l_e_s_._ 6.2.2
           
          The trimming variables mentioned in the previous section should
          be initialized in the source file in which they were declared. 
           
          Example: 
           
               :2: trimming 
               maxcarwashers:= 3; 
               maxcarswaiting:= 25; 
           
           
6_._2_._3_ _ _ _ _ _C_l_a_i_m_i_n_g_ _o_f_ _B_a_s_i_c_ _E_n_t_i_t_i_e_s_._ 6.2.3
           
          The claiming of basic entites is explained in section 5.1. 
           
          Example: 
           
               :3: claiming of basic entities 
               *one coroutine per carwasher*' 
               maxcoru:= maxcoru+maxcarwashers; 
               *one simple semaphore (the washers telephone)*' 
               maxsem:= maxsem+1; 
           
           
6_._2_._4_ _ _ _ _ _D_e_c_l_a_r_a_t_i_o_n_ _o_f_ _V_a_r_i_a_b_l_e_s_ _a_n_d_ _P_r_o_c_e_d_u_r_e_s_._ 6.2.4
           
          This text portion is used for declaring common variables and pro-
          cedures (common to a number of coroutines) and for declaring the
          activity (coroutine) procedures. 
           
          Typically, the identification of semaphores (used by several com-
          municating coroutines) are held in integer variables declared in
          this text portion (the variables are initialized during initiali-
          zation as shown in section 6.2.5). 
           \f

          The very coroutine code (the activity procedure) is declared in
          this text portion, too, and it is up to the programmer to
          initialize the activity in the initialization part by calling
          "newactivity". 
           
          Example: 
           
               :4: variables and procedures 
               * common variable for time measure *' 
               real timebase; 
               * common time stamp procedure *' 
               integer procedure now; 
               begin real r; 
                  systime (1, timebase, r); 
                  now:= r; 
               end; 
           
               car generator coroutine *' 
               procedure cargenerator; 
               begin 
                  real array washingprocess(1:3); 
                  integer array carmessage, caranswer(1:8); 
                  integer messageref, result, i; 
                  for i:= 1 step 1 until 8 do carmessage(i):= 0; 
                  system(6, i, washingprocess); 
                  stackclaim(60); 
                  repeat 
                     delay (random(i)*4); 
                     csendmessage (washingprocess, carmessage, messageref); 
                     cwaitanswer (messageref, caranswer, result, 0); 
                  until false; 
               end; 
           
           \f

6_._2_._5_ _ _ _ _ _I_n_i_t_i_a_l_i_z_a_t_i_o_n_._ 6.2.5
           
          This text portion is used for initializing common variables, ba-
          sic entities and activity procedures (coroutines). 
           
          The initialization of basic entities is performed by using the
          initialization procedures described in section 5.2. After the
          claiming are allocated pools of uninitialized entities, and each
          call of an initializing procedure will initialize the next
          uninitialized entity of the actual type and return an
          identification of it to be used when calling basic functions,
          operating on this entity. 
           
          The programmer declared common variables are initialized by ordi-
          nary algol assignments. 
           
          The activities are initialized by calling "newactivity" with the
          following syntax: 
           
r            lcause':=  0UUU1DDDDDD0UUU5  newactivity (act.no', act.proc'  ,param'
  0UUU*DDDDDD0UUU5 ) 
           
          lcause' is the result from newactivity. lcause' is a long and
          the interpretation of it is described in ref.... 
           
          act.proc.' is the activity procedure as declared in a coroutine
          text portion of type :4:. 
           
          param' is some kind of actual parameter corresponding to the
          formal parameter of the activity procedure: act.proc'. 
           
          Please note that the correspondence is not automatically checked
          by the system, so the programmer must check it carefully
          himself. 
           \f

          Example: 
           
               :5: initialization 
               j:= nextcoru (3, 10, true); 
               newactivity (j, j, cargenerator); 
           
          Please note that "newactivity" must not be situated in an inner
          algol block because of the stack manipulations performed when
          initializing an activity. 
           
           \f

7_._ _ _ _ _ _ _ _ _A_N_ _E_X_A_M_P_L_E_ _O_F_ _A_ _C_O_R_O_U_T_I_N_E_ _S_Y_S_T_E_M_ _U_S_I_N_G_ _T_H_E_ _A_L_G_O_L_8_ _C_O_R_O_U_T_I_N_E_7.
          M_O_N_I_T_O_R_._ 
           
          In this chapter is shown and explained an example of a coroutine
          system using a variety of the facilities of the algol8 coroutine
          monitor. 
           
          The example is based on a simulation experiment that is slightly
          modified to include as many basic functions as possible. 
           
          The simulation model and the transformation into a coroutine
          system is described, and the actual source files are listed and
          commented. 
           
          The results from running the simulation model is shown and fi-
          nally a printout of some testoutput generated by this model is
          shown. 
           
           
7_._1_ _ _ _ _ _ _ _S_i_m_u_l_a_t_i_o_n_ _M_o_d_e_l_._ 7.1
           
          The simulation concerns a car washing company and the behaviour
          of the system is described like this: 
           
          - cars arrive with some intensity to the company to get washed. 
          - to get his car washed the car driver will have to buy a ticket
            from the ticket clerk. 
          - when the driver has got a ticket, the car enters the waiting
            line, where it may have to spend some time before getting
            served. 
          - the ticket clerk monitors the waiting line, and in case the
            queue of waiting cars is too long, he will call for another
            washer (if they are not all busy at the moment). 
          - cars are washed manually by a number of car washers (one washer
            for each car) and all washers may wash simultaneously. 
          - when some washer has been waiting for some time for a car to
            arrive on the waiting line, and no cars arrive, he will enter
            the tearoom and stay there until he is called for. \f

          - if for some (long) period of time no cars arrive, the company
            is closed. 
             
             
7_._2_ _ _ _ _ _ _ _T_r_a_n_s_f_o_r_m_i_n_g_ _t_h_e_ _S_i_m_u_l_a_t_i_o_n_ _M_o_d_e_l_ _i_n_t_o_ _a_ _C_o_r_o_u_t_i_n_e_ _S_y_s_t_e_m_._ 7.2
           
          When some system is going to be transformed into a coroutine sys-
          tem of the kind supported by the algol8 coroutine monitor, the
          following rules of thumb will often apply: 
           
          - active entities (entities actively operating on objects) should
            be transformed into coroutines). 
          - passive entities manipulated by and/or transferred among a num-
            ber of active entities should be transformed into operations or
            common objects guarded by access semaphores. 
          - queues should be transformed into chained semaphores. 
          - simple communication should be realized via simple semaphores. 
          - communication including exchange of data should be realized via
            chained semaphores and operations. 
             
          With these rules in mind, the simultation model would naturally
          be transformed like this: 
           
          - the active parts of the system are the ticket clerk (putting
            cars into the waiting line and calling for washers if neces-
            sary) and the car washers (awaiting cars at the waiting line,
            washing them and going to the tearoom in free periods). 
            Therefore each carwasher is represented by a "carwasher corou-
            tine" and the ticket clerk is represented by a "ticket clerk
            coroutine". 
           
          - The passive parts are the cars, manipulated by ticket clerk and
            car washers. Cars arrive and cars leave, and there is no
            limitation on the number of cars passing the system, so it
            would not be reasonable to allocate an operation to each car.
            However, there is a maximum number of cars within the system at
            any moment (i.e. the maximum number of cars in the waiting\f

            line) so an operation representing each car position on the
            waiting line will do. 
          - The waiting line is a queue and it is naturally represented by
            a chained semaphore. 
          - the tearoom in which the car washers are waiting when they are
            free, may be thought of as a synchronizing entity (here washers
            wait until the ticket clerks call for them - triggers them).
            Thus the tearoom is represented by a simple semaphore. 
             
          The only thing that is left is to decide, how cars enter the sys-
          tem and how they are generated. 
           
          There are several possibilities and the one used here is pre-
          ferred mainly because it uses some other coroutine functions than
          what has been used by the former coroutines. 
           
          The ticket clerk receives cars by receiving messages. These mes-
          sages may be generated by other processes (for instance by termi-
          nals sending attention messages) or they may be generated by a
          coroutine within the simulation system. 
           
          Consequently a car generator coroutine has been created to send
          messages (representing cars) with some intensity. The car genera-
          tor awaits an answer to each message which means that cars are
          only generated while the ticket clerk is able to put them onto
          the waiting line (simulating that cars, arriving when the queue
          is full, leave at once). 
           
          Now the main decisions have been made, concerning the structure
          of the coroutine system. The actual layout of the operations etc.
          is not discussed here. 
           
           
7_._3_ _ _ _ _ _ _ _S_o_u_r_c_e_ _F_i_l_e_s_ _f_o_r_ _C_o_r_o_u_t_i_n_e_ _S_y_s_t_e_m_._7.3
           
          In this section is shown an implementation of the car washing
          simulation. \f

           
          The source files are organized according to the following rules: 
           
          - all trimming variables (including declaration and initializa-
            tion) are put into one source file together with all common
            variables and procedures (including claiming, declaration and
            initialization). 
          - all variables and procedures local to a specific c_o_r_o_u_t_i_n_e_ _t_y_p_e_
            are put into one source file (including claiming, declaration
            and initialization). 
             
          When following these rules, the car washing system will contain
          the following set of files: 
           
          - a trimming file 
          - a ticket clerk file 
          - a car washer file 
          - a car generator file 
           
           \f

          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          1.   INTRODUCTION .......................................     2 
           
          2.   BASIC ENTITIES .....................................     9 
               2.1   Coroutines ...................................     9 
               2.2   Simple Semaphores ............................    10 
               2.3   Chained Semaphores ...........................    10 
               2.4   Operations ...................................    11 
               2.5   Extensions ...................................    11 
           
          3.   BASIC FUNCTIONS ....................................    13 
               3.1   Scheduling Functions .........................    13 
                     3.1.1   Pass .................................    13 
                     3.1.2   Delay ................................    14 
               3.2   Functions Concerning Simple Semaphores .......    14 
                     3.2.1   Signal ...............................    14 
                     3.2.2   Wait .................................    15 
                     3.2.3   Inspect ..............................    15 
               3.3   Functions Concerning Chained Semaphores ......    15 
                     3.3.1   Signalch .............................    16 
                     3.2.2   Waitch ...............................    16 
                     3.3.3   Inpsectch ............................    17 
               3.4   External Communication .......................    18 
                     3.4.1   Csendmessage .........................    19 
                     3.4.2   Cwaitanswer ..........................    19 
                     3.4.3   Cwaitmessage .........................    20 
                     3.4.4   Cregretmessage .......................    21 
                     3.4.5   Semsendmessage .......................    21 
                     3.4.6   Semwaitmessage .......................    22 
                     3.4.7   Semregretmessage .....................    23 
           
          4.   ASSOCIATED FUNCTIONS ...............................    25 
               4.1   Scheduling Strategy ..........................    25 
                     4.1.1   Coroutine Priorities .................    25 
                     4.1.2   External Events ......................    26 \f

          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _(_C_O_N_T_>_D_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
               4.2   Timeout Functions ............................    26 
               4.3   Types of Operations ..........................    27 
               4.4   Testoutput Facilities ........................    27 
           
          5.   RESOURCE ALLOCATION ................................    31 
               5.1   Claiming of Basic Entities ...................    31 
               5.2   Initialization ...............................    32 
               5.3   Claiming Stackspace for a Coroutine ..........    35 
           
          6.   HOW TO MAKE A COROUTINE AND INCORPORATE IT IN A 
               COROUTINE SYSTEM ...................................    37 
               6.1   Text Merging Program .........................    37 
               6.2   Coroutine Text Portions ......................    39 
                     6.2.1   Declarations of Trimming Variables ...    40 
                     6.2.2   Initialization of Trimming Variables .    41 
                     6.2.3   Claiming of Basic Entities ...........    41 
                     6.2.4   Declaration of Variables and 
                             Procedures ...........................    41 
                     6.2.5   Initialization .......................    43 
           
          7.   AN EXAMPLE OF A COROUTINE SYSTEM USING THE ALGOL8 
               COROUTINE MONITOR ..................................    45 
               7.1   Simultation Model ............................    45 
               7.2   Transforming the Simultation Model into a 
                     Coroutine System .............................    46 
               7.3   Source Files for Coroutine System ............    47 
           \f

          R_C_ _s_y_s_t_e_m_ _F_L_E_X_ _o_g_ _v_i_r_k_s_o_m_h_e_d_e_n_s_ _s_t_y_r_i_n_g_._ 
           
          RC system FLEX opgave er at forsyne virksomhedens medarbejdere
          med relevante informationer til de beslutninger, der løbende skal
          tages i det daglige arbejde, og til den opfølgende kontrol af be-
          slutningernes økonomiske konsekvenser. 
           
          Arbejdet med RC system FLEX kan opdeles således: 
           
             Registrering af grundbilag og kartoteksoplysninger 
             Daglig styring ad vare- og pengestrømme 
             Kontrol af den økonomiske udvikling 
           
          R_e_g_i_s_t_r_e_r_i_n_g_ _a_f_ _g_r_u_n_d_b_i_l_a_g_ _o_g_ _k_a_r_t_o_t_e_k_s_o_p_l_y_s_n_i_n_g_e_r_._ 
           
          Registreringsopgavens gennemførelse er en meget vigtig forudsæt-
          ning for anvendeligheden af systemets informationer. Grundbilage-
          ne skal registreres hurtig, således at systemets oplysninger til
          stadighed udtrykker de fysiske realiteter for virksomheden. 
           
          I selve registreringsprocessen, som  foregår ved dataskærme, er
          der inbygget både fejlkontroller og styringskontroller. 
           
          Fejl optræder, når man behandler systemet forkert. Man bliver
          straks gjort opmærksom på fejlen og kan ikke fortsætte, før den
          er rettet. 
           
          Styringskontroller skal sikre, at uønskede situationer ikke op-
          står. F.eks. kommer der en advarsel ved salgsordreregistreringen,
          hvis kunden har forfalden saldo, har overskredet kreditgrænsen,
          eller hvis varen er under lagerminimum. De forskellige advarsler,
          der kan fremkomme, skal resultere i, at man undersøger situatio-
          nen og lader den ansvarlige tage beslutningen om, hvad der så
          skal ske. 
           \f

          De forskellige styrekontroller blokerer ikke arbejdet ved skær-
          men, og ordren kan registreres, selv om kundens saldo er over
          kreditmaksimum. Alle advarsler fra styrekontroller, der ikke er
          blevet taget hensyn til, fremkommer igen ved dagsslut som anmærk-
          ninger på de forskellige journaler. 
           
          D_a_g_l_i_g_ _s_t_y_r_i_n_g_ _a_f_ _v_a_r_e_-_ _o_g_ _p_e_n_g_e_s_t_r_ø_m_m_e_._ 
           
          Den daglige styring af vare- og pengestrømme tager sit udgangs-
          punkt i de aftaler, der indgås med kunden, når salgsordre afta-
          les. Det er derfor vigtigt at vide, hvad man kan tilbyde kunden i
          form af priser, betalingsfrister, mængder, leveringstider etc.,
          og det er vigtigt hurtigt at kontrollere, at de indgåede aftaler
          er i overensstemmelse med planerne og gældende politikker. 
           
          RC system FLEX udfører disse styrekontroller ved registreringen
          og kan desuden producere en række planlægningsoversigter baseret
          på salgsordrebeholdningen, planlagt produktion, indkøbsordrebe-
          holdningen og de aktuelle varelagre. 
           
          Den daglige styring kan opdeles i følgende hovedopgaver: 
           
             Kundeordrebehandling 
             Leveringskontrol od fakturering 
             Produktion, indkøb og varelagerstyring 
             Styring af ind- og udbetalinger 
           
          K_o_n_t_r_o_l_ _a_f_ _d_e_n_ _ø_k_o_n_o_m_i_s_k_e_ _u_d_v_i_k_l_i_n_g_._ 
           
          Den økonomiske styring af et firma er almindeligvis baseret på
          opstilling af nogle m_å_l_ i form af handlingsplaner, budgetter og
          en månedlig k_o_n_t_r_o_l_ af handlingernes gennemførelse i form af den
          regnskabsmæssige budgetopfølgning og afvigelsesforklaringer.
          Kontrollen kan give anledning til, at handlingsplanerne må ændres
          for at kunne nå det opstillede mål. \f

           
          RC System FLEX opgave er at udføre en del af budgetkontrollen
          samt at give forskellige analyser til brug for afvigelsesforkla-
          ringerne. Det er så ledelsens opgave at vurdere og forklare afvi-
          gelserne og eventuelt at beslutte at ændre i handlingsplanerne. 
           
          Rapporteringen i forbindelse med den økonomiske styring er opdelt
          således: 
           
               Resultatrapport 
               Likviditetsanaluse 
               Salgsanalyse 
               Produktions- og lageranalyse 
           
          Systemet er i stand til at behandle flere adskildte firmaer med
          fælles registre. 
           
          I denne forbindelse er behovet for sikkerhed løst via et bru-
          gerkatalog, hvori hvert firma har et specielt "password", som
          tillader adgang til firmaets specifikke del af registrene. 
           
          Systemet kan logisk opdeles i følgende undersystemer eller
          moduler: 
           
          S_a_l_g_s_f_u_n_k_t_i_o_n_e_n_ 
           
          salgsordremodul 
          fakturamodul 
           
          K_ø_b_s_f_u_n_k_t_i_o_n_ 
           
          købsordremodul 
          registrering af lagertilgang 
          behandling af leverandørfakturaer 
           \f

          P_r_o_d_u_k_t_i_o_n_ _o_g_ _l_a_g_e_r_s_t_y_r_i_n_g_s_f_u_n_k_t_i_o_n_ 
           
          Planlægnings- og ordremodul 
           
          Ø_k_o_n_o_m_i_f_u_n_k_t_i_o_n_ 
           
          Debitormodul 
          Kreditormodul 
          Finansmodul 
           
          I de følgende 2 kapitler er redegjort for: 
           
          1) RC System FLEX som løsning på firmaets registreringsbehov. 
              
          2) RC System FLEX managementværktøj. 
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              \f

              
              
              
              
              
              
              
              
              
          R_C_ _S_Y_S_T_E_M_ _F_L_E_X_ _S_O_M_ _L_Ø_S_N_I_N_G_ _P_Å_ _F_I_R_M_A_E_T_S_ _R_E_G_I_S_T_R_E_R_I_N_G_S_B_E_H_O_V_._ 
           
          Tegningen på den foregående side viser i sammenfattet form firma-
          ets registreringsmæssige opgaver. 
           
           
          S_a_l_g_s_f_u_n_k_t_i_o_n_._ 
           
          K_u_n_d_e_o_r_d_r_e_b_e_h_a_n_d_l_i_n_g_._ 
           
          Alle kundeordrer kan registreres i systemet. Ved registreringen
          er der kontrol af leveringsevnen for den ønskede vare og af
          kundens betalingssituation (forfalden saldo, kreditgrænse,
          overskredet). Hvis systemet reagerer på styrekontrollen, kan
          ordren stoppes, og en ansvarlig leder kan vurdere, om den på-
          gældende ordre skal ændres eller om andre ordrer eller planer
          skal ændres. Til brug for disse vurderinger kan systemet på
          dataskærmen vise terminsopdelte leveringsplaner for kunder og
          varer, således at man kan finde frem til de kunder, varer og
          ordrer, det kunne blive aktuelt at ændre. 
 
          Når salgsordren er registreret, kan den kaldes frem på skærmen,
          og den kan udskrives på en formular til brug for ordrebekræfti-
          gelse og ekspedition. 
           \f

          Ved dagens slutning udskrives en "ordrebevægelsesliste" og
          "varers anmærkninger", hvor de ordrer og varer, der har fået
          signaler ved styrekontrollen er særligt markeret. 
           
          Ordreformularerne er typisk: 
              
             - ordrebekræftigelse til kunden 
             - følgeseddel til kunden 
             - forsendelsesseddel til lager 
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              
              \f

                   Udover almindelige on-line forespørglser om kunder, leverandører
          og ordrer, er der muligheden for at foretage forespørgsler på et
          antal sammenhængende informationer, som gør det muligt for
          ordreadministrationen at give øjeblikkelig svar på spørgsmål fra
          kunder og spørgsmål om alternative leveringsbetingelser o.s.v. 
           
          Disse forespørgsler er: 
               
          1)  L_e_v_e_r_i_n_g_s_p_l_a_n_,_ _k_u_n_d_e_ 
            - hvilken ordrer har kunden, 
              hvornår er ordren blevet le- 
              veret, og hvilken produkter 
              skal leveres? 
               
          2)  L_e_v_e_r_i_n_g_s_p_l_a_n_,_ _p_r_o_d_u_k_t_e_r_ 
            - hvilke ordrer, til hvilke 
              kunder, hvor skal de leveres? 
               
          3)  L_a_g_e_r_p_r_o_f_i_l_ 
            - hvordan vil lagerbeholdningen 
              udvikle sig over en nærmere 
              specificeret periode, når 
              mængden af salgsordrer, 
              købsordrer, vare i produktion 
              samt planlagt produktion er  
              taget i betragtning? 
               
               
          F_a_k_t_u_r_e_r_i_n_g_. 
           
          Input til fakturamodulet er ekspiditionspapirer fra lageret
          korrigeret for faktiske leveringer m.v. 
           
                   På baggrund af behandlede ekspiditionspapirerne kaldes ordrerne
          frem til fakturering \f

            P_r_o_d_u_k_t_i_o_n_s_-_ _o_g_ _l_a_g_e_r_s_t_y_r_i_n_g_. 
           
          Datagrundlaget for produktions- og lagerstyringsmodulet hentes
          fra 
           
                    Produktionsplaner 
                    produktionsordrer 
                    Lagertilgange 
           
           
                  P_r_o_d_u_k_t_i_o_n_s_p_l_a_n_e_r_. 
           
          Den overordnede produktionsplanlægning foretages udenfor
          RC-system FLEX og resulterer i en række produktionsplaner. 
           
          Produktionsplanerne retistreres i systemet til vurdering af
          fremtidig leveringsevne. Produktionsordrer genereres ikke
          automatisk og der foretages ingen automatisk reservation af
          råmaterialer. Men produktionsplaner kan nedbrydes til standard
          råmaterialemængder. 
           
               P_r_o_d_u_k_t_i_o_n_s_o_r_d_r_e_. 
           
          Når varerne sættes i produktion, registreres en produktionsordre
          i systemet. Herefter genereres et produktionsordredokument
          systemet.  
           
          Hvis der referes til en produktionsplan, bliver planen
          tilsvarende reduceret. 
           
          Registreringen reserverer automatisk råmaterialer og
          halvfabrikata ifølge standardoplysninger. 
           
           
                L_a_g_e_r_t_i_l_g_a_n_g_. \f

           
          Når en produktion er afsluttet returneres ordredokumentet med
          relevante lagertilgange til registrering i systemet. 
           
          Reservationer af råmaterialer annuleres og lagerbeholdning
          reduceres tilsvarende. 
           
          Hvis lagertilgange ikke stemmer overens med antallet der er
          bestilt forbliver resten som en restordre med mindre andet ønskes
           
          Både produktionsplaner og ordrer kan udelades. Hvis et firma
          vælger ikke at registrere produktionsordrer, f.eks. fordi
          produktionens udførelsestid kun er nogle på timer, kan
          lagertilgange henvises til en produktionsplan, som så vil blive
          reduceret tilsvarende. 
           
           
           
           
          SHI        System for handels- og industrivirksomheder 
           
          RC = HIS   (Handels- og industrisystem) 
           
          N_F_ _A_p_p_l_i_c_a_t_i_o_n_._ 
           
          Indhold: 
           
                    1) Kort om A/S xxxxxxxx 
                        
                    2) Applikationen som løsning på firmaets registrerings-
                       behov. 
                        
                    3) Applikationen som ledelsesværltøj. 
                        \f

                    4) Andre applikationelle muligheder udenfor NF-syste-
                       met. 
                        
                        
               afvigelse på grund af ændret gennemsnitlig salgspris 
                    (salgsprisændringer eller mixændringer) 
           
               afvigelse på grund af ændret gennemsnitlig dækningsgrad 
                    (kostprisændringer eller mixændringer) 
           
          K_u_n_d_e_g_r_u_p_p_e_/_v_a_r_e_g_r_u_p_p_e_s_t_a_t_i_s_t_i_k_ - udskrives almindeligvis pr.
          måned. indeholder pr kundegruppe salget fordelt på varegrupper
          med følgende oplysninger: stk-salg, omsætning, dækningsbidrag,
          månedens tal og år til dato, månedens budget og budget år til
          dato. Denne salgsstatistik skal også indgå i x månedsrapport-
          ering. 
           
          De foran nævnte salgsstatistikker er komprimerede informationer
          til brug for selskabets ledelse og til brug for koncernledelsen. 
           
          Som standard statistik findes desuden: 
           
          V_a_r_e_s_a_l_g_s_s_t_a_t_i_s_t_i_k_ - udskrives almindeligvis pr. måned.
          Indeholder pr. varenr.: stk,salg, omsætning og dækningsbidrag for
          måneden og år til dato. 
           
          Ud over de her nævnte standard statistikker er det muligt
          at få udskrevet en række kunde/vare- og vare/kundestatistikker. 
           
          Yderligere salgsanalyser på gruppeniveau kan udskrives efter
          behov. 
           
          Hvilke statistikker man ønsker, bør planlægges over en længere
          periode, da det ikke er praktisk at ændre det i løbet af
          perioden. \f

           
          Det samlede kompleks af salgsstatistikker gør det muligt at ana-
          lysere salg og dækningsbidragsindtjeningen på mange kriterier,
          således at man kan finde frem til de mest lønsomme områder at
          sætte ind på. 
           
          P_r_o_d_u_k_t_i_o_n_s_-_ _o_g_ _l_a_g_e_r_a_n_a_l_y_s_e_r_._ 
           
          Den nødvendige opfølgning af produktionens gennemførelse og lag-
          renes størrelse er baseret på en sammenligning af faktisk forbrug
          og standardforbrug ifølge standard kalkulationer. 
           
          Principperne for standardomkostningskontrollen kan beskrives så-
          ledes: 
           
          1. Råvarelager primo til stand.kostpris                     xxx 
               (iflg. varelagerliste/edb) 
           
          2. Varekøb til indkøbspriser                              + xxx 
               (iflg. varekøbsstatistik/edb) 
           
          3. Prisdifference på varekøb-stand.pris/indkøbspris     +/- xxx 
               (iflg. kostprisafvigelsesliste/edb) 
           
          4. Udbetalt arbejdsløn                                    + xxx 
               (iflg. lønbogholderi) 
           
          5. Prisdifference på arbejdsløn-stand.timeløn/faktisk   +/- xxx 
               (beregnes)                               timeløn 
           
          6. Standardforbrug månedens produktion                  +/- xxx 
               (iflg. stk.omk. producerede varer/edb) 
           
          7. Mer/mindre forbrug materialer                        +/- xxx 
               (lagerændringer efter optælling af råvarelager/edb) \f

           
          8. Mer/mindre forbrug arbejdsløn                        +/- xxx 
               (beregnes af punkt 4, 5 og 6) 
           
          9. Råvarelager ultimo til standard/kostpris                 xxx 
               (iflg. varelagerliste/edb)                         ======= 
           
          Som det fremgår af henvisningerne i parantes, leverer RC System
          FLEX de fleste af oplysningerne til standardomkostningskontrol 
           
          Mer/mindre forbrug af råvarer opgøres efter en fysisk
          lageroptælling, da produktionens vareforbrug ikke registreres
          direkte, men fratrækkes i råvarebeholdningen i edb-systemet med
          det standardforbrug, der svarer til månedens produktion. 
           
          Standardomkostningskontrollen kan opdeles på råvaregrupper. 
           
          Færdigvarelagrene afstemmes således: 
           
          Færdigvarelager primo til stand.kostpris                    xxx 
             (iflg. varelagerliste/edb) 
           
          Månedens produktion til stand-omk.                        + xxx 
             (iflg. edb) 
           
          Månedens salg til stand.omk.                              - xxx 
             (iflg. edb)                                            _ _ _ _ _ 
           
          Færdigvarelager ultimo til stand.kostpris                   xxx 
             (iflg. edb)                                            ====== 
           
          De her nævnte opstillinger og statistikker kan danne grundlag for
          en periodisk oversigt over produktionens økonomi. 
           \f

          En meget vigtig del af standardomkostningskontrollen er de kalku-
          lerede standardomkostninger, der ligger i systemet på hver enkelt
          vare. Disse forbrugssatser og priser er budgettet for
          produktionens gennemførelse, og det er disse kalkulationer, der
          kontrolleres i standardomkostningskontrollen. 
           
          De foran nævnte tilpasninger er indregnet i prisaftalerne med A/S
          Regnecentralen. 
           
                   A_n_d_r_e_ _m_u_l_i_g_h_e_d_e_r_ _i_n_d_e_n_f_o_r_ _R_C_ _s_y_s_t_e_m_ _F_L_E_X_. 
           
          Ved udviklingen af RC system FLEX er der lagt vægt på tre
          hovedformål: 
           
          1)  At udvikle et standardsystem, som kan tilfredsstille behov
              hos et bredt udsnit af middelstore fabrikanter som producerer
              og afsætter massevarer. 
               
          2)  At systemet let skal kunne modificeres. Dette betyder at: 
              a)  Programkomplekset skal kunne forsyne programmøren med et
                  sæt af værktøjer, som muliggør det for selv relativt
                  uerfarene programmører at arbejde med systemet. 
                   
              b)  Programmøren skal kunne være overbevist om at
                  modifikationer ikke giver konsekvenser andre steder i
                  programkomplekset. 
                   
          3)  At skabe en basis ramme, t_o_t_a_l_t_ _u_a_f_h_æ_n_g_i_g_ af
              RC system FLEX, en struktur, som er i stand til at klare a_l_l_e_
              basisbehov for et edb-system. 
           
          Det 4. formår er genstand for yderligere diskussion i dette
          kapitel. 
           
           \f

                G_e_n_e_r_e_l_ _p_r_o_g_r_a_m_s_t_r_u_k_t_u_r_. 
           
          Den generelle struktur består af: 
           
          A_._ _E_t_ _s_æ_t_ _e_k_s_t_e_r_n_e_ _p_r_o_c_e_d_u_r_e_r_ 
           
          Disse procedurer indeholder beskrivelse af den database, som
          skal anvendes. 
           
                   Strukturen er trimmet til anvendelse af RC database system. 
           
          B_._ _S_t_r_u_k_t_u_r_ _i_ _e_t_ _o_n_-_l_i_n_e_ _s_y_s_t_e_m_,_ _i_ _h_v_i_l_k_e_t_ _a_t_ _d_a_t_a_f_a_n_g_s_t_ _o_g_
          b_e_h_a_n_d_l_i_n_g_ _k_a_n_ _u_d_f_ø_r_e_s_ _e_n_k_e_l_t_ _o_g_ _s_i_k_k_e_r_t_. 
           
           
          Strukturen giver bl.a., følgende karakteristiske træk: 
           
          1)  Adskillige typer programkørsler 
              a)  Batchmode, som skal bruges ved 
                  - reorganisering af registre 
                  - konvertering af registre fra andre systemer 
                  - testning af system. 
                   
                  Denne facilitet er værdifuld for programmøren, fordi det
                  uden xxxx giver ham en xxxxx copy af programforløbet, men
                  også en detaljeret forklaring på fremgangsmåderne. 
                   
              b)  On line mode 
                   
              c)  Speciel mode til reetablering efter afbrydelse 
                   
              d)  Speciel mode til at afbryde kontering 
                   
          2)  Et detaljeret sæt sikkerhedsprocedurer f.eks.: 
              - back-up til i tilfælde af systemsvigt \f

«eof»