Skip to content

Latest commit

 

History

History
238 lines (184 loc) · 12 KB

barcode.md

File metadata and controls

238 lines (184 loc) · 12 KB
                            B A R C O D E S 
                                             
      
      Dit tekstje  gaat over barcodes en het lezen daarvan. Het is 
      ook voor degenen die geen barcode reader hebben geschikt.
      
      Voor   onze  MSX   computers  zijn   heel  wat  interessante 
      cartridges uitgebracht,  zoals de cartridge met sensoren uit 
      Japan,  de robotarm van Spectravideo, de Sanyo Lightpen (als 
      je die  hebt, bel  me dan  eens!) en  de barcode  reader van 
      Philips.  Aangezien ik  de laatste in mijn bezit heb, ben ik 
      er wat  mee gaan rommelen, waarvan dit artikel het resultaat 
      is.
      
      Ik  ben niet  de eerste die dat doet; in MCM 47 staat er een 
      artikeltje  over,   maar  toen   ik  mijn   MCM-stapel  eens 
      uitmestte,  bleek  het  dat nr.  47 slechts  schitterde door 
      afwezigheid... Ik moet het dus allemaal zelf uitzoeken...
      
      
                          D E   W E R K I N G 
      
      Allereerst heb ik de reader maar eens opengeschroefd. Al het 
      werk wordt gedaan door een speciaal barcode IC. De gebruiker 
      hoeft  slechts de  pen over  de barcode  te halen  en het IC 
      verwerkt het  signaal en  slaat de barcode op in een buffer. 
      De communicatie met de MSX verloopt via I/O poort &H18, maar 
      door  middel van  een jumper kan ook I/O poort &HB8 gebruikt 
      worden. We  zullen dus eerst moeten weten via welke poort de 
      communicatie verloopt. Een handige oplossing hiervoor is het 
      volgende  BASIC programma,  dat ook  op disk  staat onder de 
      naam BAR-ADR.BAS:
      
      10 P=&H18:GOSUB 40:P=&HB8:GOSUB 40:P=0
      20 PRINT "Poort: ";HEX$(P)
      30 END
      40 IF PEEK(P)=255 THEN RETURN ELSE RETURN 20
      
      N.B. Als P=0 dan is er geen barcode reader aanwezig.
      
      Vervolgens moeten we een (BASIC-)programma hebben om de code 
      ook daadwerkelijk uit te kunnen lezen. Dit staat ook op disk 
      onder de naam BAR-READ.BAS.
      
      Als we de pen over een barcode halen, dan zal de code in een 
      buffer  worden opgeslagen. Dat betekent dat er geen commando 
      nodig is  om het lezen te starten. Ook tijdens een programma 
      kan  je dus  een barcode inlezen, omdat de hardware het hele 
      zaakje afhandelt.  De code  blijft in de buffer staan totdat 
      die  uitgelezen wordt  of totdat  een nieuwe barocde gelezen 
      wordt. We  hoeven dus  alleen de  buffer uit te lezen via de 
      I/O  poort die  ingesteld is. In het vervolg van het artikel 
      ga ik  voor het  gemak uit  van I/O poort &H18. Bit 7 is het 
      status  bit. 0 betekent dat de barcode gelezen kan worden en 
      1 dat het einde van de barcode bereikt is.
      
      We hoeven alleen iets te lezen als de code gereed staat, dus 
      als bit  7 laag  is. Dat  wil zeggen dat het getal op de I/O 
      poort  kleiner dan  128 is. Daarom wordt de eerste regel van 
      het uitleesprogramma:
      
      10 B=INP(&H18):IF B>127 THEN 10
      
      Als dat  niet zo is, dan is de waarde van belang en moet dus 
      bewaard  worden.  Uiteindelijk  is het  de bedoeling  dan de 
      string  B$ de  code bevat.  We zetten  de waarde  van de I/O 
      poort dus in B$:
      
      20 B$=CHR$(B)
      
      Vervolgens  kunnen  we  de rest  van de  code uitlezen,  dus 
      totdat  het eind  van de code bereikt is en bit 7 hoog wordt 
      (en de waarde van de I/O poort dus groter dan 127 wordt):
      
      30 B=INP(&H18):B$=B$+CHR$(B AND 127): IF B<128 THEN 30
      
      Merk op  dat de  waarde waarbij  bit 7  geset wordt  nog wel 
      meetelt!  Je moet  dus eerst de waarde opslaan en DAARNA pas 
      kijken of  die groter dan 127 wordt (en dus de laatste was). 
      De  AND 127  dient daar  voor, want een AND 127 maakt immers 
      altijd bit  7 laag  en zorgt  er dus voor dat ook de laatste 
      waarde juist is.
      
      Vervolgens geven we een BEEP ten teken dat de code ingelezen 
      is en we printen de string op het scherm.
       
      40 BEEP:PRINT B$  
      
      De  code bevat  eerst een letter. Dit geeft het type barcode 
      aan. Er  zijn namelijk verschillende manieren om een barcode 
      te  maken. Leuk  om te weten, veel heb je er niet aan. In de 
      meeste gevallen  (zeker bij supermarktprodukten) zal het een 
      D  zijn. Wat  echter wel interessant is aan die letter is of 
      het een  hoofd- of  kleine letter  is, of anders gezegd : of 
      bit 5 van de eerste waarde van de code geset is of niet. Bit 
      5  geset betekent  namelijk dat  de barcode  van rechts naar 
      links is  gelezen en  Bit 5  gereset (laag)  betekent dat de 
      barcode van links naar rechts is gelezen.
      
      
              D E   O P B O U W   V A N   E E N   C O D E 
      
      Nu het  mogelijk is om een barcode in te lezen, gaan we eens 
      kijken  hoe die  opgebouwd is.  Om de code optisch te kunnen 
      lezen, wordt  elk getal weergegeven door 2 witte en 2 zwarte 
      strepen, elk met een lengte varierend tussen 1 en 4 modulen. 
      Hoe  de  code  precies  gecodeerd  is,  heb  ik niet  kunnen 
      achterhalen.
       
      De  cijfers  zelf  hebben  ook  nog  een  betekenis,  als ze 
      tenminste aan  de internationale  norm voldoen.  Dat zal bij 
      supermarkt  produkten zeker  het geval  zijn. Soms gebruiken 
      bedrijven  etc.  eigen  (interne)  streepjescodes. Een  mooi 
      voorbeeld is de handleiding van mijn CM11342 RGB-monitor van 
      Philips, daarin  worden niet alleen cijfers maar ook letters 
      gebrukt;  het typenummer  staat in  de streepjescode.  In de 
      Times  staat  een  voorbeeld,  DEMO2,  van  zo'n  afwijkende 
      streepjescode. Deze is afkomstig van een zending van Philips 
      en bevat mijn adres. Dit soort codes is dus niet standaard.
      
      Binnen de standaard kunnen we 3 types onderscheiden:
      
      1. De code voor boeken
      
      Deze beginnen  met 97 en de rest is ISBN-nummer. Het laatste 
      cijfer is een controlecijfer, meer hierover bij 2.
      
      2. De code voor produkten per stuk (met een vaste prijs)
      
      Deze zijn  op allerlei  etenswaren te vinden. De eerste twee 
      cijfers  bevatten de landcode, bijvoorbeeld 87 is Nederland. 
      De   volgende   5   cijfers   bevatten   de   producentcode, 
      bijvoorbeeld 10400  is Albert  Heijn Huismerk, de volgende 5 
      cijfers bevatten het artikelnummer, en het laatste cijfer is 
      een  controlecijfer. Als je dit cijfer optelt bij de som van 
      de even  cijfers (excl.  controlegetal) en 3 maal de som van 
      de  oneven cijfers (excl. controlegetal) precies een tiental 
      opleveren.
      
      Om het  een en  ander te verduidelijken volgt een voorbeeld. 
      We gebruiken de in de Times afgebeelde code, DEMO1:
      
      2263182000062
       
      Dat shrijven we voor het gemak even als :
      
      22 63182 00006 2
      
      Het controle  cijfer is  zoals je  ziet 2.  Controle of  het 
      klopt:
      
      Som v.d. even cijfers : 2+2+6+8+2+6         =  26
      3 keer de som v.d. oneven cijfers : 3*(3+1) =  12
      Het controlegetal                           =   2  +
      ----------------------------------------------------
                                                     40
      
      En dat  is een  tiental! Het  komt ook  voor dat een bepaald 
      artikel  1 code heeft voor producent/artikel. De code is dan 
      5 tekens korter.
      
      
      3. De artikelen per gewicht
      
      Van bepaalde produkten is de prijs niet van te voren bekend, 
      zoals  groente  en  fruit,  kaas,  brood,  vlees/vleeswaren, 
      zelfbedieningssnoepgoed etc.  Op de  bon verschijnt dan vaak 
      een streepjescode. Deze heeft als landcode een cijfer tussen 
      20  en  29.  de volgende  5 cijfers  geven het  product aan, 
      vervolgens   5  cijfers  voor  de  prijs  en  tenslotte  het 
      controlecijfer.
      
      Als voorbeeld een code van Nasivlees voor � 4.36:
      
      2221001004363
      
      22   : Geeft aan  dat het  om een  artikel uit de groep "per 
             gewicht" gaat
      21001: Nasivlees
      00436: De prijs (in centen)
      3    : Controlecijfer
      
      
                         D E   S O F T W A R E 
      
      Al  het bovenstaande is verwerkt in een programma, dat op de 
      disk staat  onder de  naam BARCODE.BAS. Het is geschikt voor 
      alle MSX'en en het werkt op SCREEN 0 met WIDTH80 of WIDTH40. 
      Dit programma is in BASIC, maar voor assembler of een andere 
      programmeertaal geldt natuurlijk precies hetzelfde.
      
      Dit  programma  herkent de  hierboven genoemde  soorten. Het 
      programma  gebruikt  de  datafile  BARCODE.DAT. Als  het een 
      barcode  herkent,  dan  wordt  de informatie  op het  scherm 
      gezet, anders  wordt je  gevraagd de  gegevens in  te typen. 
      Landcodes  en  producentcodes  die al  ooit ingegeven  zijn, 
      worden  herkend, dus  van sommige  dingen hoef je alleen het 
      artikel in te geven.
      
      De besturing werkt geheel met de reader. Daarvoor zijn er in 
      de  Times  5  besturingsstreepjescodes  afgedrukt.  Dit zijn 
      gewoon    afgeknipte   bonnetjes    uit   de    Albert-Heijn 
      groenteweegschaal, maar ze worden door het programma herkend 
      als zijnde  een besturingscode.  In theorie  is het mogelijk 
      dat  groente of  fruit van  Albert Heijn  als besturingscode 
      wordt gezien, maar in de praktijk is dat vrijwel onmogelijk, 
      omdat ik  een gewichtje van 10 gram gebruikt heb en speciale 
      soorten groente/fruit. Want wie koopt er nou 10 gram appels?
      
      Als  eerste, voor  het opstarten  van de software, moet je 2 
      keer over  een streepjescode  heengaan. Als  je de  computer 
      aanzet,  staat er namelijk rommel in de buffer van de reader 
      en als  je een  code leest  is dat  weg. Daarna  kun je  het 
      programma starten met RUN"BARCODE.BAS".
      
      Op  disk  staat  een  voorbeeldfile  met een  aantal bekende 
      produkten  erin, zodat je niet alles hoeft in te typen en er 
      ook in  het eerste  begin al wat herkend wordt. Hierbij moet 
      je  denken aan Albert Heijn en Melkunie melk, Pickwick Thee, 
      DE  Koffie  etc.  Het  is  ook  mogelijk om  zonder file  te 
      beginnen, u  kunt BARCODE.DAT  dus ook wissen. Het programma 
      maakt dan een nieuwe aan zodra je iets ingeeft.
      
      In  het begin  van het programma moet u een barcode ingeven. 
      Op dat  moment zijn  ook de keuzes STOP en HELP mogelijk. In 
      de  rest van  het programma wordt aangegeven welke keuzes je 
      kunt maken.
      
      Het  programma  is  nog  niet  volmaakt,  zo  kunt  je niets 
      verbeteren  en  ook niets  wissen. Als  je zin  hebt om  het 
      programma uit te breiden, ga je gang! Ik zou het leuk vinden 
      als je  het ons  opstuurde, zodat het op de volgende Special 
      geplaatst kan worden. Ook andere toepassingen met behulp van 
      de  barcode reader  zijn welkom.  Stuur deze  dan naar  mijn 
      adres en niet naar de postbus.
      
                                                   Rob Augusteijn