30
BASIC-ohjelmointikieli E.Korhonen Katsaus Basic-ohjelmointikielen kehitykseen: Basic-ohjelmointikieli levisi opiskelijoiden ohjelmoinnin harjoittelukieleksi 1970- luvulla ja jokaiseen kotitietokoneeseen mikrotietokoneiden myötä 1980-luvun alussa. Joissakin koneissa, kuten legendaarisessa Commodore 64:ssa, se oli oikeastaan käyttöjärjestelmän asemassa. Ohjelmoituja sovellutuksia: tekstinkäsittelyä ja pelejä, ajettiin kääntävän BASIC-tulkin avulla. Silloinen ohjelma koostui rivinumeroiduista komennoista, jotka ohjelma suoritti peräjälkeen 100 PRINT ”KERRO NIMESI” 110 INPUT N$ 120 PRINT ”HASSU NIMI ”;N$ Ohjelmaan kuuluivat rivinumerot, ja käyttöliittymä järjesti ohjelman aina rivinumeroiden mukaiseen järjestykseen. Hyppyosoitteena käytettiin rivinumeroita. 130 GOTO 100 Ensimmäiset työstökoneiden tietokoneliitännät Suomessa, tietokoneille talletettujen ohjelmien vaihdot NC-koneille, ja ohjelmointi NC-kooditekstinä, tehtiin 1980-luvun alussa näillä koneilla ja BASIC-ohjelmilla, Ylivieskan teknillisen oppilaitoksen vanhimman robotin, 1980-luvulla tehdyn portaalirobotin, ohjelmointikieli on hyvin lähellä perus-Basicia lisättyinä liikekäskyillä: 200 MOVEXYZ(1000,1000,200) Ja tulojen ja lähtöjen lukemista ja asettamista 300 IF INP(47)=0 THEN GOTO 300 320 OUT(45)=1 (Jos tulon 47 arvo on nolla, hypätään takaisin riville 300. Kun tulon arvo muuttuu

BASIC-ohjelmointikieli E.Korhoneneeroko/Opetus/OhjausjarjestelmienJatkokurssi/BASICJU… · mukaan kehittyneemmät Basicin versiot, Basica ja GWBasic. Niiden mukana tulleet asialliset

  • Upload
    lamtram

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

BASIC-ohjelmointikieli E.Korhonen Katsaus Basic-ohjelmointikielen kehitykseen: Basic-ohjelmointikieli levisi opiskelijoiden ohjelmoinnin harjoittelukieleksi 1970-luvulla ja jokaiseen kotitietokoneeseen mikrotietokoneiden myötä 1980-luvun alussa. Joissakin koneissa, kuten legendaarisessa Commodore 64:ssa, se oli oikeastaan käyttöjärjestelmän asemassa. Ohjelmoituja sovellutuksia: tekstinkäsittelyä ja pelejä, ajettiin kääntävän BASIC-tulkin avulla. Silloinen ohjelma koostui rivinumeroiduista komennoista, jotka ohjelma suoritti peräjälkeen 100 PRINT ”KERRO NIMESI” 110 INPUT N$ 120 PRINT ”HASSU NIMI ”;N$ Ohjelmaan kuuluivat rivinumerot, ja käyttöliittymä järjesti ohjelman aina rivinumeroiden mukaiseen järjestykseen. Hyppyosoitteena käytettiin rivinumeroita. 130 GOTO 100 Ensimmäiset työstökoneiden tietokoneliitännät Suomessa, tietokoneille talletettujen ohjelmien vaihdot NC-koneille, ja ohjelmointi NC-kooditekstinä, tehtiin 1980-luvun alussa näillä koneilla ja BASIC-ohjelmilla, Ylivieskan teknillisen oppilaitoksen vanhimman robotin, 1980-luvulla tehdyn portaalirobotin, ohjelmointikieli on hyvin lähellä perus-Basicia lisättyinä liikekäskyillä: 200 MOVEXYZ(1000,1000,200) Ja tulojen ja lähtöjen lukemista ja asettamista 300 IF INP(47)=0 THEN GOTO 300 320 OUT(45)=1

(Jos tulon 47 arvo on nolla, hypätään takaisin riville 300. Kun tulon arvo muuttuu

ykköseksi, jatketaan eteenpäin, ja asetetaan päälle lähtö 45.) Muuttujien nimillä on portaalirobotissa sama rajoitus kuin joissakin laskimissa: Vain isoja kirjaimia ja korkeintaan kirjain ja numero 400 X1=X0+I*100 410 MOVEX(X1) IBM PC:n ja myöhemmin AT:n myötä 1980-luvun puolivälissä tulivat tietokoneisiin mukaan kehittyneemmät Basicin versiot, Basica ja GWBasic. Niiden mukana tulleet asialliset parannukset ohjelmointiin olivat pienet, ympäristö vain muuttui standardisoiduksi PC:ksi edellisten merkkikohtaisten viritelmien jälkeen. 1980-luvun loppupuolella Borland toi markkinoille menestyksekkäitten Turbo Pascalin ja Turbo C:n rinnalle Turbo Basic-ohjelmointikielen ja Microsoft kilpailevan Quick Basicin. Nämä tekivät teknillisen hyppäyksen Basic-kielen kehityksessä tarjotessaan rivinumeroista riippumattoman ohjelmoinnin ja kääntäjän, jotka kilpaileviin Pascal ja C-kieliin kuuluivat luonnostaan. Kääntäjän avulla alunperin tekstinä laadittu ohjelmakoodi muutetaan konekieliseksi, itsenäisenä ajettavaksi .EXE –sovellutukseksi, DOS tai nykyisin Windows-ympäristössä. Käännetty ohjelma on huomattavasti tulkkaavaa nopeampi toiminnaltaan, millä on merkitystä paljon laskentaa, porttiliikennettä tms. vaativissa sovellutuksissa. Käännösvaiheessa voidaan myös ottaa käyttöön ohjelmalle valmiiksi laadittuja lisäkirjastoja, lisätoimintoja. Visual Basicin .exe –koodi ei kylläkään ole konekieltä, vaan sitä tulkataan ajon aikana ja siksi se on hidasta Quick Basicin ilman kääntäjää oleva, tulkkaava versio QBasic on kuulunut Dos-käyttöjärjestelmäpakettiin 80-luvun lopusta lähtien Rivinumeroinnista riippumaton ohjelmakoodi puolestaan tekee mahdolliseksi rakenteellisen ohjelmoinnin, ohjelman pilkkomisen erilaisiin toiminnallisiin osiin, aliohjelmiin, joita kutsutaan parametrien avulla, ja jotka palauttavat arvon. Rivinumeroinnista luopumisen jälkeen ohjelman etenemistä ohjataan pääasiassa aliohjelmakutsuilla ja tarvittaessa hyppyosoitteilla: ON ERROR GOTO LOPPU

’määrittely ohjelman alussa . Ohjelmakoodia . . LOPPU: ’sanan tuntee osoitteeksi kaksoispisteestä : close ’suljetaan tiedostot ja portit END ’Ohjelman loppu Aiemmin mainituissa Basic-versioissa ääkköset kelpasivat vain merkkijonojen sisältöön, ei vielä muuttujiin eikä hyppyosoitteisiin. Visual Basic 1990-luvun puolivälissä läpimurron tehnyt Microsoftin Visual Basic (Markkinoilla on nyt versio 6.0, jonka erot edellisiin 3.0 ja 4.0 versioihin ovat pienet) tuntee lähes koko vanhempien Basic-kielten käskykannan ja paljon lisää ja osaa seurata enimmäkseen vanhojenkin ohjelmien rakennetta. Ongelmia aiheuttavat lähinnä suorat laiteohjaukset portteihin, muistiin ja näyttöön ja muuttujien näkyvyysalueet. Vanha viivekomento Delay on myös jätetty syrjään, mikä hankaloittaa laiteohjauksessa tarpeellisten viiveiden ohjelmointia. Ajatuksellisesti Visual Basic lähestyy käyttäjää eri tavalla kuin aikaisemmat ohjelmat: Vanhat Basic-ohjelmat (Niin myös Pascal, C, Fortran ja LISP) etenevät käynnistyksen jälkeen rivi riviltä, jäävät johonkin odottamaan käyttäjän syöttämää arvoa ja jatkavat edelleen, hyppäävät ehtojen mukaan mahdollisesti alkuun. Visual Basic-käyttöliittymä reagoi tapahtumiin, keskeytyksiin Visual Basic on rakennettu käyttöliittymältään keskeytysajatuksen pohjalle. Ohjelman käyttöliittymä odottaa käyttäjän tekemää tapahtumaa, esim. johonkin kontrolliin vaikuttamista, painikkeen klikkaamista. Painikkeen klikkaaminen aktivoi painikkeeseen liitetyn aliohjelman suorittamisen. Visual Basicin kilpailijoiksi ovat ilmestyneet Borlandin Delphi (tehty Pascal-pohjalle ja Visual C++, tehty C-kielen pohjalle) Kontrolleihin vaikuttamisella käynnistettävät aliohjelmat ovat rakenteeltaan sitten

perinteisempää Basic-koodia muistuttavia, SUB()…. END SUB –aliohjelmia. Selvimpinä eroina perinteisiin Basic-ohjelmiin ovat viittaukset lomakkeella oleviin kontrolleihin: Leveys = Val(Text1.Text) Sijoituslause toimii niin kuin perinteisen Basicin sijoituslause: Oikean puolen arvo sijoitetaan vasemman puolen muuttujalle.

Text1.Text viittaa teksti-ikkunaan Text1 (kontrollin nimi) kirjoitettuun ominaisuuteen .Text, joka voi olla käyttäjän syöttämä lukuarvo, näkyy tekstinä

Jotta tekstiä voidaan käsitellä lukuna Leveys, sen arvo, value pitää lukea funktiolla Val( )

Toinen ero on muuttujien näkyvyys:

Välillä Sub().. End Sub siellä käsitellyllä muuttujalla, esim Leveys on sille syötetty arvo. Muualla ohjelmassa, muissa aliohjelmissa, muuttujan Leveys arvoa ei tunneta ja sitä pidetään todennäköisesti nollana.

(Jos ei erikseen käydä määrittelemässä ohjelmalle muuttuja Leveys sellaiseksi, että sen arvo tunnetaan kaikkialla) Visual Basic on samalla myös Microsoft Accessin ja Excelin sovellutusten ohjelmointikieli. Haluttaessa voidaan näihin ohjelmoida tapahtumia esim. laskun viitenumeron tarkistussumman laskenta koodaamalla tapahtuma Access-raporttiin Basicin käskyillä. Ohjelman pilkkominen kontrolleja seuraavaksi rivi riviltä etenevän, pääohjelman ja aliohjelmakutsujen mukaan etenevän sijasta tekee siitä helposti sekavan, vaikean hallita. Siksi Visual Basic sopii lähinnä pieniin, yhden ihmisen tekemiin sovellutusohjelmointitehtäviin, koneiden käyttöliittymiin jne.

Basicin muuttujat: Kaikilla ohjelmassa käytettävillä muuttujilla on nimi, muutaman merkin mittainen merkkijono. Aikaisemmin ääkkösiä piti välttää, mutta ei enää Windows95 –ympäristöstä ja Visual Basicista alkaen Muuttujanimissä ei edelleenkään siedetä välilyöntejä, väliviivoja – (sekoittuu miinusmerkkiin) eikä pisteitä. Väliviivan sijasta voidaan haluttaessa käyttää alaviivaa Suurin_Arvo = 1000 Basic toisin kuin C ja Lisp ei erottele suuria ja pieniä kirjaimia, joten niiden käytölle ei ole sääntöjä. Luettavuutta helpottaa erikokoisten kirjainten sopiva yhdistely Portaalirobotin MS Basic ei hyväksi lainkaan pieniä kirjaimia (Sama koskee yleisesti NC-koneita ja osin liikeohjaimia) Muuttujanimet ovat useimmiten kirjaimien ja numeroiden yhdistelmiä: A, A1, Alku, loppu, kerroin jne ovat lukuja

Tarkemmin ottaen lukutyyppisiä muuttujia on vielä muutamaa eri lajia, kokonaislukuja ja liukulukuja eri pituisina.

A=10 ’Muuttujalle A sijoitetaan lukuarvo 10 Kerroin=0.5 ’Desimaalipiste eikä pilkku Input "Montako ",Loppu ’Kysymys ja talletus muuttujaan Loppu A%, Alku% jne% ’% tarkoittaa kokonaislukuja, Integer (edellisiä nopeampia ’käsitellä, vähemmän muistiavieviä, alue n. –320000 ….+32000)

A%=8

DIM Lavoja as Integer ’Muuttujan esittely kokonaisluvuksi Kokonaislukujen lukualue Integer kattaa luvut n. –32000 (+32000. Jos nämä eivät riitä, esim pulssilaskennassa, pitää käyttöön ottaa tyyppi Long Integer, nimessä &, Pulssit& jne, jossa on kaksinkertainen määrä bittejä ja lukualue nousee toiseen potenssiin. Integer-lukutyyppiä käytetään tyypillisesti luonnollisille luvuille, kappalemäärille, järjestysnumeroille jne. Järjestysnumeroksi desimaaliluku 0.5 tms ei kelpaakaan. Jos luvun tyyppiä ei määritellä tarkemmin, sitä käsitellään liukulukuna. (Kerroin x 10 potenssiin potenssi) Tästä on harmia silloin, kun laskutoimitusten jälkeen tulee pyöristysvirheitä, ja arvoksi tai järjestysnumeroksi esim 4.99999, tai kun pitäisi käsitellä tarkasti suuria kokonaislukuja kuten pulssimääriä. Useimmiten lukutyyppiset muuttujat toimivat kuitenkin hankaluuksitta ilman tyyppimäärittelyä, kunhan ei syötetä mielettömiä arvoja. A$, Mjono$, Polku$, Nimi$ Ovat merkkijonoja A$="ALKU" Polku$="C:\PB\" Input "Nimesi ",Nimi$ ’Vanhaa Basicia Nimi$=Text1.Text ’Visual Basic-lause Tiedosto$="Tiedot.lst"

INDEKSOIDUT MUUTTUJAT: Indeksoituun muuttujaan viitataan nimen ja indeksin, järjestysnumeron avulla A(i) Lukuja A(1), A(2)... A%(2) Kokonaislukuja A%(1), A%(2) jne DIM Nimi$(100) as String ’varaudutaan sataan nimeen ohjelman ’esittelyosassa Nimi$(nro%)=… Merkkijonoja Nimi$(1), Nimi$(2) jne Nimi$(1)=”Eero” Taulukko$(1,2) Merkkijonotaulukko Kun käytetään indeksointia, samalla muuttujan nimellä voidaan osoittaa eri muuttujiin, kuten 1- tai 2-ulotteisen taulukon eri ruutuihin, joissa rivi- ja sarakenumero ovat indekseinä. Etunimi$=Taulukko$(i%,1) Sukunimi$=Taulukko$(i%,2) Tässä i% voisi olla juokseva numero esim 0 - 100 Jos indeksoitujen muuttujien lukumäärä, järjestystä osoittava indeksi on suurempi kuin 10, ohjelman alussa on tehtävä muistin varaus DIM-lauseella, esim DIM A%(1000) DIM Nimi$(100) Samanlainen DIM-esittely Visual Basic-ohjelman General-alueella tekee muuttujan arvon näkyväksi koko ohjelmassa. Indeksoidut kontrollit VB:ssa Visual Basicin kontrolleja kopioitaessa ohjelma kysyy, tehdäänkö kontrolleista Array,

tämä tarkoittaa indeksoitua kontrollia. Myönteinen vastaus tuottaa indeksoidun kontrollijoukon, jota on helppo käsitellä ohjelmallisesti: Text1(0). Text1(1). jne

Muuttujan arvon asettaminen Ohjelmointikielten sijoituslause on yleensä tyyppiä: A = 10 A = A+1 Pituus = Len(Luetturivi$) Ala = Pi*(D/2)^2 Se tarkoittaa, että katsotaan = merkin oikealla puolella olevien muuttujien senhetkinen arvo ja tehdään tarvittavat matemaattiset operaatiot. Lopputulos sijoitetaan vasemmanpuoleisen muuttujan arvoksi Siksi matemaattisesti järjetön lause sopii ohjelmointiin oikein hyvin A = A+1 Matematiikassa on todella vaikea löytää lukua, johon voidaan lisätä yksi ja se silti säilyy ennallaan. Ohjelmoinnissa lause tarkoittaa sitä, että luetaan muuttujan A arvo ja sijoitetaan sen paikalle yhtä suurempi luku. Sijoituslauseella asetetaan aina = Merkin vasemmanpuoleinen arvo, ei oikeanpuoleista A = B Asettaa A:n arvon B:n mukaiseksi, ei päinvastoin. = merkin oikealla puolella on usein kasa funktiokutsuja, jotka palauttavat arvon. Funktio Len( ) palauttaa sille syötetyn merkkijonon pituuden. Pituus=Len(Merkkijono$) Jotta sijoitus onnistuisi ja = merkin oikean puolen arvo voidaan sijoittaa vasemman puolen muuttujalle, näiden täytyy olla muuttujatyypiltään samanlaisia: Kokonaislukutyyppiseen muuttujaan nimenpituus voidaan sijoittaa luku, esim

Nimenpituus = Len(Nimi$). Merkkijonomuuttujaan Nimi$ voidaan lukea esim Visual Basicin teksti-ikkunaan kirjoitettu teksti Nimi$ = Text1.Text Funktion palauttama arvo ja sen tyyppi määritellään funktion sisällä. Matemaattiset funktiot palauttavat yleensä luvun. Minkätyyppinen luku saadaan palautteena, vaihtelee. Merkkijonoja käsittelevät funktiot palauttavat usein merkkijonon. Merkkijono$=”Eero Korhonen” Alku$=Left$(Merkkijono$,3) ’Vasemman laidan 3 merkkiä Eer Merkki4$=Mid$(Merkkojono$,4,1) ’Tulee neljäs merkki o Jos muuttujalle ei aseteta mitään arvoa, se on nolla, satunnainen tai edellisellä käyttökerralla muistiin jäänyt arvo. Viimeinen on tyypillinen tilanne esim. robotiikassa. Koneen omaan muistiin, rekisteriin kirjoitettu säilyy kunnes se tietoisesti muutetaan tai nollataan. Siksi ohjelman käyttämät muuttujat kannattaa ohjelmallisesti nollata ennen niiden käyttöönottoa, esim MenossaOlevaLava = 0

BASICIN TAVALLISIMMAT LUUPIT Luuppi = Silmukka, jota ohjelma kiertää ehtojensa mukaan Halutun toistomäärän tekevä luuppi on useissa ohjelmointikielissä For…Next For-Next –rajattua ohjelmanosaa kierretään for-lauseessa määritetyn ehdon mukaan Esim: summa=0 ’alkuarvon nollaus ’luuppi kierretään muuttujan i arvoilla 1,2,3 jne …10 For i = 1 to 10 'luupin alku summa = summa + i next i 'luupin loppu print "Lukujen 1…10 summa on ";summa For-luupista päästään ulos haluttaessa sen sisällä olevalla goto-hypyllä tai ehtolauseella If (…..mikälie ehto) then exit for Esim. Laippojen poiminta-ja pinoamiskorkeuden laskeminen portaalirobotilla 200 CLS 210 INPUT "LAIPPOJA PINOSSA ",N 220 INPUT "LAIPANPAKSUUS ",L1 230 Z1=500 ’(Kuormalavan pinnan z-koordinaatti)

240 FOR I=1 TO N ’(poimitaan kaikki) 250 Z2=Z1-( N-I )*L1 ’(poimintakorkeus) …ajo poimintapaikkaan ja kappaleen poiminta mukaan MOVEZ(Z2) … 300 Z3=Z1-I*L1 ’(pudotuskorkeus) …ajo pudotuspaikkaan ja kappaleen pudotus MOVEZ(Z3) … NEXT I END

Esim. Sanan kääntäminen takaperin (Palindromin teko) VB:llä Lomakkeelle tarvitaan kaksi tekstiruutua Text1 ja Text2 Käännös saa tapahtua esim kun tekstiruudun Text1 sisältö muuttuu Sub Text1_Change()

Sana$ = Text1.Text

Pituus = Len(Sana$)

Nurin$ = ”” ’aloitetaan tyhjästä merkkijonosta

if pituus>1 then For i = Pituus to 1 step –1 ’luetaan merkit takaperin Merkki$ = Mid$(Sana$,i,1) ’merkit käsittelyyn yksi kerrallaan

Nurin$ = Nurin$ + Merkki$ ’Lisätään Merkki$ merkkijonoon Nurin$

Next i Text2.Text = Nurin$

end if End Sub

Epämääräiseen määrään toistokertoja sopii While-Wend –luuppi, jota kierretään, kun ehto on tosi Esim. Tekstitiedoston luku ja Näyttäminen listaikkunassa VB:llä Ruudulla tarvitaan 3 alkiota: Toiminnan käynnistävä komentopainike (Command Button) CommonDialog –alkio, jolla Windowsissa etsitään tiedostoja Listaikkuna List1 Komentopaikikkeen klikkaamisella aktivoituvaksi koodiksi sopii esim: Sub Command1_Click() CommonDialog1.Filter=”(*.*) |*.*|” CommonDialog1.FilterIndex=1 CommonDialog1.Action=1 ’avataan lukemista varten, kirjoitus olisi 2 Tiedosto$ = ”” Tiedosto$ = CommonDialog1.FileName If Tiedosto$ <> ”” ’jos on valittu tiedoston nimi List1.Clear ’listaikkunan putsaus

Open Tiedosto$ for input as #1 'tiedoston avaus While NOT EOF(1) 'luetaan tiedoston loppuun saakka Line input #1,Rivi$ ’luetaan tiedosto ’rivi kerrallaan ja talletetaan ’kunkin rivin teksti muuttujaan Rivi$ List1.AddItem Rivi$ ’Lisätään rivi alkioksi listaikkunaan

Wend ’While…Wend alueen loppu close #1 'tiedoston sulku end if ’oliko valittu tiedosto End sub ’Aliohjelman loppu

While-wend-luupille voidaan antaa mikä tahansa suoritusehto: While Ulos<>1 ohjelmaa ...

luupista poistutaan vasta kun muuttuja Ulos saa arvon 1, esim homma tehty loppuun

Wend Vanhoissa Basic ohjelmissa käytettiin paljon GOTO-hyppyjä Niillä on vieläkin omat käyttökohteensa esim Ohjelman alussa On Error GOTO Katsovirhe GOTO-käskyä vastaavat ehdottomat ja ehdolliset hyppytoiminnat kuuluvat myös useiden koneohjausten ohjelmakäskyihin. Goto-hypyn muoto QBasicissa ja Visual Basicissa on: Alku: 'Hyppyosoite ohjelmaa ... If Lopetetaan=1 then goto ulos GOTO Alku 'Ehdoton hyppy alkuun Ulos: End tai vaihtoehtoisesti Alku: Ohjelmaa If Ulos<>1 then GOTO Alku 'Ehdollinen hyppy End

Aliohjelmakutsu, jolla käväistään suorittamassa aliohjelma ja jatketaan sitten ohjelmaa kutsua seuraavalta riviltä on Basiceissa GOSUB Pääohjelmassa … GOSUB Aliohjelmannimi END Aliohjelmannimi: ’tunnetaan nimeksi kaksoispisteestä … palataan takaisin, kun löydetään loppumerkki RETURN

PORTTILIIKENNE Tietokoneen ohjaamassa automaatiossa keskeisessä liitäntään, sarjaliikenneporttiin kirjoitetaan perinteisissä ohjelmointikielissä niin kuin kirjoitetaan avattuun tiedostoon. Portti avataan kirjoittamista varten kuten tiedosto, kertoen samalla liikenneparametrit ja mahdollisesti kättelyt Useassa Basicissa portinavaus tehdään muodossa Open ”COM2:9600,N,8,1,RS,CS,DS,CD” as #1 Tämän jälkeen porttiin voidaan kirjoittaa Print #1, NCohjelmanrivi$

’Print #1 komento kirjoittaa porttiin rivin ja heittää perään rivinvaihtomerkit Vastaavasti portista voidaan myös lukea Visual Basicissa em menettely ei toimi, vaan porttiin kirjoitetaan Windows-ohjaimien avulla. Porttiliikennettä varten on oma kontrolli, ensimmäinen niistä on nimeltään MSComm1. Sille kerrotaan ominaisuuksiksi vähintään liikenneparametrit, käytetty portti ja kättelytyyppi. Tavallisimmin koneiden tiedonsiirtoon käytetään porttia COM2, koska COM1 on usein hiiren käytössä. Kontrollin nimellä MSComm1 ei ole tekemistä portin kanssa. Käyttöä varten portti on avattava esim lomaketta avattaessa Sub Form_Load() MSComm1.PortOpen=True

End sub Ja käytön jälkeen se kannattaa sulkea MSComm1.PortOpen=False Windows sallii vain yhden sovellutuksen kerrallaan hallita sarjaliikenneporttia, ja avoin portti estää mm. Windowsin omien terminaaliohjelmien käytön. Esim. Listaikkunan sisällön syöttäminen porttiin Edellä kuvattu tekstitiedoston haku listaikkunaan sopii yksinkertaiseksi NC-ohjelman siirto-ohjelmaksi, kun se täydennetään tiedonsiirto-ominaisuudella. Lomakkeella pitää olla tiedonsiirtoobjekti MsComm1, jolle on määritelty sopivat liikenneparametrit, esim Portti 2 9600,E,7,1 Portti avataan esim lomaketta ladattaessa (Windows sallii vain yhden hallintaohjelman portille kerrallaan) Sub Form_Load() MsComm1.PortOpen = True End sub Sub LähetäKoodi_Click() ’Komentopainikkeelle sijoitettu koodi For i=0 to List1.ListCount-1 ’listan rivinumerot juoksevat nollasta lähtien List1.ListIndex=i ’Millä rivillä ollaan menossa

MSComm1.Output=List1.Text+chr$(13)+chr$(10) ’rivin perään Enter-rivinvaihtomerkit CR ja LF next i End Sub

Jotkin laitteet vaativat monimutkaisemman protokollan tarkistussummineen Esim Omron CPM1:n datamuistin kirjoittaminen ja lukeminen Kirjoitusprotokolla alkaa merkkijonolla @00WD0000 joka on kirjoitettu tekstiruutuun Text1 Datamuistiin kirjoitettava uusi arvo esim 0050 kirjoitetaan tekstiruutuun Text2 Merkkijono tarkoittaa logiikan nro 00 Datamuistin kirjoittamista osoitteesta DM0000 alkaen Perään pitää sitten lisätä uusi arvo neljällä Heksadesimaalimerkillä Näiden perään liitetään kahden heksadesimaalimerkin pituinen tarkistussumma, * ja Enter Lomakkeelle tarvitaan kaksi tekstiruutua tiedon syöttöön Text1 ja Text2 Datamuistia kirjoitettaessa tekstiruutuun Text1 kirjoitetaan lukukomento @00WD0000 ja samaa datamuistia luettaessa @00RD0000 Datamuistia kirjoitettaessa tekstiruutuun Text2 kirjoitetaan uusi arvo esim 50 ja datamuistia luettaessa siihen kirjoitetaan luettavien muistisanojen määrä esim 1 kaksi tarvitaan tekstiruutua palautteen lukemiseen Text3 ja Text4

Porttiin liikennöimiseen tarvitaan objekti Mscomm1, jonka ominaisuudet ovat esim Portti 2 9600, E,7,2 (Baudit, pariteetti Even, 7 Databittiä, 2 stop.bittiä) Portin lukemiseen sopii ajastin, Timer1, jonka käyntiväli, interval on esim 1000 millisekuntia Komentopainike aktivoi viestin kirjoittamisen, sen nimeksi esim KirjoitaViesti (Nimessä ei saa olla välilyöntejä) Ohjelmakoodiksi riittää: Private Sub Form_Load() MSComm1.PortOpen = True Timer1.Enabled = True End Sub Private Sub KirjoitaViesti_Click() ’Komentopainikkeen koodi Timer1.Enabled = False uusiarvo$ = Right$("0000" + Trim(Text2.Text), 4) ’Edellinen rivi tekee esim tekstistä 50 merkkijonon 0050 Kokoteksti$ = Text1.Text + uusiarvo$ ’Tarkistussumma lasketaan XOR-opetaariolla merkkijonon kaikille merkeille peräjälkeen tarksumma = 0 pituus=Len(Kokoteksti$) ’Katsotaan viestin pituus For i = 1 To pituus

merkki = Mid$(Kokoteksti$, i, 1) ’Yksi merkki kerrallaan käsittelyyn tarksumma = tarksumma Xor Asc(merkki) Next i Tarkhex$ = Hex$(tarksumma) ’Luku Heksadesimaalimerkiksi Tarkhex$=Right$(”00”+Tarkhex$,2) ’tarvitaan aina kaksi merkkiä, ’tämä lisää tarvittaessa nollia eteen ’ja jättää jäljelle 2 merkkiä ’Porttiin kirjoitetaan tekstilitania, perään tarkistussumma, * ja Enter MSComm1.Output = Kokoteksti$ + Tarkhex$ + "*" + Chr$(13) Timer1.Enabled = True ’Käynnistetään porttia lukeva ajastin End Sub Private Sub Timer1_Timer() ’Tämä koodinpätkä suoritetaan aika-ajoin ’Kun Timer1 on Enabled Vastaus$ = MSComm1.Input ’Portin sisältö Text3.Text = Vastaus$ ’Näkyviin ruudulle ’Etsitään vastauksesta olennainen tieto If Len(Vastaus$) > 10 Then Maara$ = Right$(Vastaus$, 12) Luku$ = Left$(Maara$, 4)

Text4.Text = Luku$ End If End Sub

Lyhyt yhteenveto BASICien peruskäskykannasta, jossa on pieniä versiokohtaisia eroja ABS( n ) luvun n absoluuttiarvo, etumerkitön luku ASC( merkki$ ) merkin Ascii-arvo, luku arvoltaan 0 - 255 ATN( n ) kulman arcus-tangentti,

palauttaa arvon -pi/2….pi/2, kulman radiaaneina 90 asteen tasajaolla erikoistapauksissa virhetilanne tai väärä tulkinta CHR$( n ) ascii-numeron n mukainen merkki tavallisimpia erikoismerkkejä ovat rivinvaihtomerkit yms, joita pitää kirjoittaa näillä MsComm1.Output = Chr$(13) Tabulaattori$ = chr$(9) Enter$ = Chr$(13) + Chr$(10) ’Carriege Return ja Line Feed CLOSE #n Tiedoston #n sulkeminen CLS Ruudun putsaus COS( n ) kulman n (radiaaneja) kosini DATE$( ) päivämäärä DIM vektori( n) indeksoidun muuttujan muistinvaraus EOF( #n ) end-of-file –tieto luettaessa tiedostosta #n While not EOF(1)

Line input #1, Rivi$ List1.AddItem Rivi$ Wend END ohjelman loppu EXP( n ) e^n FOR...NEXT luuppi For i=1 to 10 Print i next i GET #h, n random access muistinluku tiedostosta #h tavu n GOSUB osoite aliohjelmakutsu IF PortissaOnTavaraa then Gosub LueSisältö GOTO osoite hyppykäsky if OnAikaLopettaa then Goto Loppu IF… THEN ehdollinen toiminta kirjoitetaan perään Jos yksi rivi, kirjoitetaan samalle riville IF I<10 THEN rivi=1 Jos rajataan useampi rivi, ehtorivi lopetaan Then

seuraaville riveille koodia End If IF THEN … ELSE …

END IF Monimutkaisempi rakenne Inkey$ Näpäytetty merkki

Merkki$=Inkey$ INP(portti) I/O-portista luettu tavu (Ei Visual Basic) PrintteriPortinTila=INP(889) INPUT luettu merkkijono Enteriin saakka INPUT #h,muuttuja luetaan avatusta tiedostosta nro #h arvo muuttujalle INPUT$( #h, n ) luetaan n merkkiä avatusta tiedostosta nro #h INSTR(merkkijono$,merkit$) etsitään merkkijonosta sisältö merkit$ ja palautetaan

löytökohta 1…, jos ei löydy, palautetaan 0 PilkunPaikka=Instr(Merkkijono$,”,”) INT( n ) luku n katkaistuna kokonaisluvuksi jos halutaan pyöristys ylöspäin, lisätään 0.5

Sopii hyvin myös desimaalien määrän rajoittamiseen, seuraavassa kahteen

Luku=2/3 ’tulee lujasti desimaaleja Luku=Int(100*Luku+.5)/100 ’desimaalit vähenevät KILL tiedosto$ Tuhoaa tiedoston tiedosto$, jos se on olemassa, muuten tulee virhetila LEFT$( merkkijono$, n ) merkkijonon vasemmasta laidasta n merkkiä jos ei riitä, virhetila if len(Merkkojono$)>3 then Alku$=Left$(Merkkijono$,4) end if

LEN( merkkijono$ ) merkkijonon$ pituus LINE INPUT rivin lukeminen tiedostosta rivinvaihtomerkkiin saakka LOG( n ) luonnollinen logaritmi n:stä LCASE$( merkkijono$ ) merkkijonos$ pikkukirjaimilla MID$( merkkijono$,i,n) merkkijonosta otettu pätkä, n merkkiä paikasta i alkaen pituus=len(merkkijono$) for i=1 to pituus Merkki$=Mid$(merkkijono$,i,1) print asc(Merkki$) next i OPEN avaa tiedosto tai portti (portti ie VB:ssa käy näin) Open ”MikäHyvänsä.txt” for input as #1 While not EOF(1) line input #1,rivi$ print rivi$ Wend Close #1 OPEN "COMn:..." tietoliikenneportin avaus (Ei VB:ssa näin) Open ”Com2:9600,n,8,1,rs,cs,ds,cd” as #2 OUT portti, tavu tavun kirjoittaminen porttiin tai muistitavuun (Ei VB:ssa) Portti=888 ’LPT1:n tavallinen osoite Out Portti,255 ’Kaikki bitit päälle PRINT printtaa lomakkeelle tai näyttöön PRINT #h,muuttuja muuttujan arvon kirjoittaminen numerolle #h avattuun

tiedostoon tai porttiin (Porttiin ei VB:ssa mene näin) PUT #h, n random access tiedostoon #h kirjoitetaan n tavu

REDIM indeksoidun muuttujavektorin uudelleen määrittäminen RETURN aliohjelman viimeinen rivi, paluu GOSUB kutsua seuraavalle riville RIGHT$( merkkijono$, n ) n merkkiä merkkijonon oikeasta laidasta, virhetila, jos ei

riitä merkkejä RND Satunnaisluku 0 … vähän alle 1, joka kannattaa alustaa, jotta ei toista

itseään Esim KertolaskunKyselijä: Randomize Timer vastaus=0

while vastaus<>9999 print ”9999 lopettaa” arvokysymys:

Luku1=int(10*RND)+1 ’tulee 1…10 Luku2=int(10*RND)+1 ’tulee 1…10

kysy: print Luku1;” * ”;Luku2; ” =” input vastaus if vastaus=luku1*luku2 then print ”Hyvä” goto arvokysymys end if print ”Yritä uudelleen” goto kysy wend SIN( n ) kulman n (radiaaneja) sini

SQR(n) luvun n neliöjuuri. n ei saa olla negatiivinen STR$( n ) luku n merkkijonoksi, ascii-merkeiksi Text1.Text=Trim$(Str$(luku)) TAN( n ) kulman n (radiaaneja) tangentti TIME$( ) Nykyinen tietokoneen aika merkkijonona TRIM$( merkkijono$ ) putsaa merkkijonon välilyönneistä, tarpeen etenkin lukuja muutettaessa merkkijonoksi, muuten tyhjä etumerkin paikka kiusaa UCASE$(Merkkijono$) Merkin tai merkkijonon muutos isoille kirjaimille Line input #1,Merkkijono$ If Instr(Ucase$(Merkkijono$),”POLYLINE”)>0 then ’Tämä suoritetaan olipa Polyline-teksti kirjoitettu ’pienellä tai isolla ’Ucase$ tekee siitä ison end if VAL( merkkijono$ ) merkkijonon tulkinta luvuksi Jos alkaa muilla kuin numeromerkeillä, palautetaan 0 Merkkijono$=text1.text pulssejamillille=100 ajomillit=Val(Merkkijono$) pulssit=pulssejamillille*ajomillit ’laskentaa voidaan tehdä vain luvuilla WHILE...WEND luuppi