1.12.2006 NOKEVAL SCL. Käyttöohje



Samankaltaiset tiedostot
Nokeval Oy. Käyttöohje 7181

Nokeval No Käyttöohje. Tekstinäyttö 580-ALF

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

Nokeval. Pikaohje. Malli 2072 Sarjaviestille RS232 / RS485. No v1.0

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Kielioppia: toisin kuin Javassa

575F-2071, 1000F-2071, 1100F-2071

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Ohjelmointiharjoituksia Arduino-ympäristössä

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Luento 5. Timo Savola. 28. huhtikuuta 2006

Nokeval. No Malli Sarjaviestille RS-232/RS-485

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Ohjelmoinnin perusteet Y Python

Nokeval. No Kenttänäytöt 581D ja 582D sarjaviesteille RS-485/232

Harjoitustyö: virtuaalikone

Ohjelmoinnin peruskurssi Y1

PM10POW24SA-kortti. Ohje

Käyttöohje V1.0 DCS771. USB-RS-485-muunnin

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Käyttöohje Ohjelmistoversio V MTR kanavainen langaton lähetin mv- ja TC-tuloilla

Nokeval 2071 Käyttöohje

ELEC-A4010 Sähköpaja Arduinon ohjelmointi. Jukka Helle

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

14. Hyvä ohjelmointitapa 14.1

Kappale 20: Kantaluvut

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Muuttujien roolit Kiintoarvo cin >> r;

2 Konekieli, aliohjelmat, keskeytykset

PM10OUT2A-kortti. Ohje

ITKP102 Ohjelmointi 1 (6 op)

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmoinnin perusteet Y Python

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

11. Javan toistorakenteet 11.1

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Demot Timo Männikkö

TAITAJA 2007 ELEKTRONIIKKAFINAALI KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro:

Käyttöohje Laitteisto V1.1 DCS771B. USB-RS-485-muunnin

Tietueet. Tietueiden määrittely

Ohjelmassa on käytettävä funktiota laskeparkkimaksu laskemaan kunkin asiakkaan maksu. Funktio floor pyöristää luvun lähimmäksi kokonaisluvuksi.

Käyttöohje Firmware V PCB V Analogialähtöyksikkö

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

13. Hyvä ohjelmointitapa (osa 1) 13.1

Ohjelmoinnin perusteet Y Python

811120P Diskreetit rakenteet

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

1. Yleistä. 2. Ominaisuudet. 3. Liitännät

Ohjelmoinnin perusteet Y Python

Harjoitus 2 (viikko 45)

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Harjoitus 2. Harjoitus 3

Ohjelmoinnin perusteet Y Python

TiiMiMobile. KÄYTTÖOHJE v. 1.01

Käyttöohje Firmware V1.0-V1.2 HTB230. Anturirasialähetin

Algoritmit 2. Demot Timo Männikkö

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Harjoitus 4 (viikko 47)

Ohjelmointi 1 Taulukot ja merkkijonot

Verilogvs. VHDL. Janne Koljonen University of Vaasa

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Luennon sisältö Tyypit int, char, float, double signed, unsigned short, long Vakiot const Rakenteet if, for, while, switch, do-while Syöttö ja tulostu

Käyttöohje V 1.0 RTR970. Nokeval

Java-kielen perusteita

12. Javan toistorakenteet 12.1

Harjoitus 1 -- Ratkaisut

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Ohjelmoinnin perusteet Y Python

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

12. Näppäimistöltä lukeminen 12.1

12. Javan toistorakenteet 12.1

Olio-ohjelmointi Javalla

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:

Mathematica Sekalaista asiaa

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin perusteet Y Python

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Python-ohjelmointi Harjoitus 2

KÄYTTÖOHJE PEL 2500 / PEL 2500-M

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Kirjoita, tallenna, käännä ja suorita alla esitelty ohjelma, joka tervehtii käyttäjäänsä.

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Hammastankohissin modernisointi. Heikki Laitasalmi

Ohjelmoinnin perusteet Y Python

6. Valitse avautuneesta ikkunasta Add-painike!

Käyttöohje Mekuwin V1.9.0 MekuUI V MekuWin II. Konfigurointiohjelma

7.4 Sormenjälkitekniikka

Ohjelmoinnin perusteet Y Python

Transkriptio:

1.12.2006 NOKEVAL SCL Käyttöohje

PROTOKOLLA Sarjaliikenneasetelut Nokevalin laitteet käyttävät poikkeuksetta 8N1-bittiprotokollaa, eli 8 databittiä, ei pariteettibittiä ja yksi stopbitti. Baudinopeuksia on laitteesta riippuen valittavissa useita. Useimmat laitteet on tehdasaseteltu 9600 bittiin sekunnissa. Alla esiteltävät alku- ja loppumerkit ja tarkistustavut ovat yhden tavun mittaisia. Itse komennon kukin kirjain vie samaten yhden tavun. Komentopaketti Komento muodostuu kirjaimista ja numeroista. Kunkin laitteen tuntemat komennot on esitelty sen käyttöohjeessa, mutta yleisimpiä komentoja on esitelty myös tässä ohjeessa. Komento paketoidaan SCL-komentopaketiksi lisäämällä sen eteen alkumerkki ja perään loppumerkki sekä tarkistustavu. ID komento ETX BCC Alkumerkki ID Alkumerkki on SCL-protokollassa ainoa tavu, jonka ylin bitti on asettunut. Siitä laitteet tietävät, että uusi komentopaketti alkaa. Se muodostetaan kohdelaitteen osoitteesta (0 123) asettamalla ylin bitti päälle, minkä voi ajatella myös luvun 128 (heksadesimaalina 80) lisäämisenä osoitteeseen. Osoite 126 on varattu yleiskutsulle, jotta tuntemattomassa osoitteessa olevalle laitteelle saadaan yhteys. Väylällä ei tällöin saa luonnollisesti olla kuin yksi laite. Vain tietyt Nokeval-laitteet ymmärtävät yleiskutsun. Huom: Alkumerkki on siis yksi tavu, eikä sarja erillisiä numeroita (esim 1, 2 ja 8) ascii-koodattuna. Komento Itse komento, kuten mainittu, lähetetään sellaisenaan. Komento voi olla esimerkiksi MEA CH 1? (ilman lainausmerkkejä). Loppumerkki ETX Komennon loppumerkki ETX on tavu, jonka arvo on 3. Ei siis ascii-merkki 3. Tarkistustavu BCC Tarkistustavulla kohdelaite varmistaa, että komento on tullut muuttumattomana perille. Se on yksi tavu, joka saadaan laskemalla XOR-operaatio eli ehdoton tai itse komennon tavuista ja ETX:stä. Joissakin laitteissa (kenttänäytöissä) on mahdollista valita, vaatiiko laite ollenkaan tarkistustavua. Tarkistustavun laskenta saattaa joissakin sovelluksissa olla mahdotonta. Esimerkki paketista Lähetetään komento MEA CH 1? laitteelle, jonka osoite on 1. Alla komentopaketti, vastaavat tavujen arvot heksadesimaalilukuina:

<ID> M E A C H 1? <ETX> <BCC> 81 4D 45 41 20 43 48 20 31 20 3F 03 6F Tarkistustavu 6F on saatu laskemalla XOR kaikista tavuista paitsi ID:stä ( tarkoittaa XORoperaatiota): 4D 45 41 20 43 48 20 31 20 3F 03 = 6F Vastauspaketti Kun laite saa komennon, se vastaa vastauspaketilla. Niitä on kahta lajia, normaalia vastausta (ACK) ja virhevastausta (NAK). Normaali vastaus Vastaus alkaa vastauksen alkumerkillä ACK (tavun arvo 6), sitten tulee itse vastaus asciimerkkeinä, loppumerkki ETX (3) ja vastauksen tarkistustavu BCC. ACK vastaus ETX BCC BCC lasketaan samoin kuin komennossa XOR-operaatiolla. Vastauksessa myös alkumerkki otetaan mukaan laskentaan. Laite laskee tarkistustavun, ja käyttäjä voi joko tarkistaa sen tai jättää huomiotta. Mittaustuloksen ollessa esimerkiksi 21.3 saadaan paneelimittarilta/lähettimeltä vastaus seuraavassa muodossa (tavut esitetty heksadesimaalilukuina): <ACK> 2 1. 3 <ETX> <BCC> 06 32 31 2E 33 03 1B Eräät komennot palauttavat tyhjän vastauksen, eli pelkät ACK, ETX ja BCC. Näitä ovat mm DISP-, OUT- ja DO-komennot. Virhevastaus Jos tiedonsiirrossa tulee virhe, laite saattaa palauttaa siitä ilmoituksen virhevastauspakettina. Se alkaa ACK:n sijasta NAK-tavulla (arvo 21 eli heksadesimaalina 15), ja itse vastaus on kokonaisluku, virhenumero, joka koostuu ascii-merkeistä 0-9. NAK virhenumero ETX BCC Virhenumeron tarkka merkitys selviää varmimmin laitteen käyttöohjeesta, mutta yleisimpiä ovat: 0 Laite ei valmis vastaamaan yritä hetken päästä uudelleen 1 Sarjaliikennepuskurin ylivuoto liian pitkä komento 2 Timeout vastaanotossa komento jäänyt kesken 3 Tarkistussummavirhe komennossa häiriö tiedonsiirrossa 4 Komento tuntematon tai virheellinen 5 Ensimmäinen parametri virheellinen 6 Toinen parametri virheellinen 7 jne

YLEISIMPIÄ KOMENTOJA Laitekyselyt TYPE? Laite palauttaa tyyppinimensä ja ohjelmaversionsa, esimerkiksi 7100 V1.0 (ei lainausmerkkejä). SN? Laite palauttaa sarjanumeronsa, esimerkiksi A123456. DR? --ei käytetä-- Laite palauttaa tiedon kanaviensa määrästä. Vastaus koostuu useasta kokonaisluvusta, jotka on erotettu välilyönnein. Lukuja voi olla mikä määrä tahansa, mutta niiden merkitykset ovat: 1. Mittauskanavien lukumäärä (MEA-komento) 2. Analogisten lähtöjen määrä (OUT-komento) 3. Digitaalisten tulojen määrä (DI-komento) 4. Digitaalisten lähtöjen määrä (DO-komento) 5. Näppäinten määrä (KEYB-komento) 6. Näytön merkkimäärä (DISP-komento) 7. Tulevaisuuden lisäyksiä Mittaustuloksen haku MEA MEA CH 1? Laite palauttaa viimeisimmän mittaustuloksen kanavalta 1 ascii-merkkeinä. Käytössä ovat välilyönti, miinusmerkki, numerot 0-9 sekä piste. Mittaustuloksen edessä saattaa olla välilyöntejä. Kanavanumerointi alkaa yleensä ykkösestä. Esimerkki vastauksesta: 21.3 (ilman lainausmerkkejä). MEA SCAN 1 4 Palauttaa kanavien 1-4 mittaustulokset. Tulokset tulevat yhdessä vastauspaketissa ja ne on erotettu toisistaan yhdellä tai useammalla välilyönnillä. Esimerkki vastauksesta: 21.3 103.32 938.89 1.2 MEA LIST 3 1 2 7 Palauttaa kolmen kanavan - kanavien 1, 2 ja 7 - mittaustulokset samassa muodossa kuin MEA SCAN. Lähtöviestien ohjaus OUT OUT CH 1 100.0 Määrää laitetta asettamaa lähtöviestinsä kanavalla 1 arvoon 100.0. Laitteessa on yleensä skaalaus, jolla valitaan, mitä fyysistä lähtöviestin arvoa kukin ohjausarvo vastaa. Laite palauttaa tyhjän vastauksen.

OUT SCAN 1 4 10 20 30 40 Asettaa kerralla lähtöviestit kanaville 1-4. Digitaalilinjojen ohjaus DI ja DO DI CH 1? Palauttaa sisääntulon 1 tilan. Vastaus on ascii-merkki 0 tai 1. DI SCAN 1 4 Palauttaa sisääntulojen 1-4 arvot yhdessä vastauksessa välilyönnein erotettuna, esim 1 1 0 1. DO CH 1 0 Asettaa digitaalilähdön 1 tilaan 0. Laite palauttaa tyhjän vastauksen. DO SCAN 1 4 0 0 0 0 Nollaa neljä ensimmäistä digitaalilähtöä. Näytön ohjaus DISP DISP MORO Lähettää laitteen näytölle tekstin MORO. Laite palauttaa tyhjän vastauksen.

VIANETSINTÄÄ Usein käy niin, että on hankittu laitteet, kytketty ne ja kirjoitettu vielä itse ohjelma, eikä tietoa saadakaan kulkemaan. Ja vika voi olla missä vain. Jotta ohjelmaa ei tarvitse epäillä, kannattaa ensin käyttää tunnetuksi todettua ohjelmaa. Nokevalilta saa ilmaiseksi SCL-testiohjelman nimeltään Sicala. Siihen valitaan sarjaportti, baudinopeus ja laitteen osoite, sekä kirjoitetaan komento. Jos laite ei tähän vastaa, lähdetään vikaa etsimään kytkennöistä. Ensiksi tietysti varmistetaan laitteiden asettelut (baudinopeus, osoite). Ja varmistetaan että laitteet saavat sähköä. Lähettimien ollessa kyseessä käytä yleismittaria ja varmista myös napaisuus. RS-232-väylässä on huomioitava, että laitteiden TX ja RX pitää kytkeä ristiin. Mittaa kummankin linjan jännite yleismittarilla RS-232:n Commonia vastaan. Molemmissa linjoissa pitää olla vähintään 3 V negatiivista jännitettä, tyypillisesti 10 V. RS-485:ssä kytketään D1 D1:een ja D0 D0:aan. Aiemmin Nokeval nimesi linjat A:ksi ja B:ksi, mutta koska jotkut valmistajat käyttävät nimiä päinvastaisessa merkityksessä kuin toiset, siirryttiin Modbus-suosituksen mukaiseen nimeämiseen. D1 on tyhjäkäynnillä positiivisempi, entinen Nokevalin A. Tunnetaan myös nimellä +.. Tyhjäkäyvässä RS-485-väylässä mittaa jännite D1:n (A, +) ja D0:n (B, -) väliltä joka laitteella. Yli 0.1 V Normaali tyhjäkäynti. 0.0 V Fail-safet antavalla laitteella (yleensä RS-485-muunnin) ei ole sähköä. Yhdessäkään laitteessa ei ole fail-safet kytketty. Suositellaan kytkettäväksi RS-485- muuntimessa. Negatiivinen jännite D1- ja D0-linjat ristissä. Korjaa. Mittaa napaisuus joka laitteelta erikseen!

OHJEITA OHJELMOIJALLE Komennon muodostus Komentopaketti on helppo muodostaa, kunhan saa XOR-operaation onnistumaan. C-kielessä sen voisi laskea esim näin: int bcc( char *s ) { int b = 0; while( *s ) b = b ^ (*s++); return b; } Ennen lähetystä kannattaa tyhjentää vastaanottopuskuri. Vastaanotto Vastaanotto on hankalampi kuin komento: on osattava päätellä, milloin paketti on kokonaan tullut, ja on osattava luovuttaa jos vastausta ei kuulu. Vastaanotosta saa parhaan, kun tekee sen tilamuuttujan avulla. Tilamuuttuja pitää kirjaa, missä kohtaa vastaanottopakettia edetään. Alla esitetty vastaanottoalgoritmi sietää hyvin virheitä, esimerkiksi ennen vastausta tulevia häiriötavuja sekä oman komennon kuulemista kaikuna. Otetaan siis käyttöön tilamuuttuja T, joka saa arvoja: 0. Odotetaan alkumerkkiä 1. Luetaan itse vastausta, odotetaan loppumerkkiä 2. Odotetaan tarkistussummaa 3. Paketti valmis Lisäksi varataan muuttuja B tarkistustavun laskentaan ja E virheitä muistamaan. E:=0 //ei vielä virheitä T:=0 //odotetaan alkumerkkiä Toista Onko tullut tavu A sarjaportista, ON: Onko (T=0 tai T=1) ja (A=6 tai A=21), ON: //alkumerkki tuli T:=1 //siirrytään vastauksen vastaanottoon B:=A //tyhjennetään tarkistustavu Tyhjennä vastausmerkkijono Onko A=21, ON: //NAK-vastaus E:=1 //virhevastauksen merkiksi EI: E:=0 //unohdetaan menneet, uusi paketti alkaa Entä onko T=1, ON: //vastaanotetaan itse vastausta B:=B XOR A //lasketaan tarkistustavua Onko A=3, ON: //loppumerkki ETX tuli T:=2 //siirrytään tarkistussummaa odottamaan EI: Talleta tavu A vastausmerkkijonoon Entä onko T=2, ON: //vastaanotetaan tarkistussumma Onko B=A, EI:

E:=2 //tarkistussummavirheen merkiksi T:=3 //paketti tullut kokonaan Onko komennosta kulunut yli 2 sekuntia, ON: E:=3 //timeout Kunnes T=3 tai E=3 Jos E=0, on saatu kunnollinen vastaus. Algoritmi esitetty Visual Basicille (versio 6, mutta toimii myös vanhemmissa kun tarkistaa sarjaliikenneobjektin nimen) liitteessä A.

LIITE A: VB6-ESIMERKKI Tässä esitellään kolme kätevää funktiota, joita voi käyttää sellaisenaan Nokevalin laitteiden ohjaukseen SCL-protokollalla. Vedä ohjelmaasi sarjaliikenneobjekti MSComm1, esimerkissämme se on Form1-ikkunassa. Alusta sarjaportti kutsulla InitCom-funktioon, ja jos sarjaliikenneasettelut muuttuvat, kutsu uudelleen. Funktio palauttaa nollan jos operaatio onnistui. Ellei onnistunut, on sarjaportti luultavimmin jonkun muun ohjelman varaama. Kun haluat komentaa laitetta, kutsu yksinkertaisesti: Dim r As String r = SCL_command( MEA CH 1?, 0 ) ------------------------------------------------------------------ 'SCL-sarjaliikenteeseen tarvittavia funktioita. 'Käyttää liikenteeseen Form1!MSComm1-objektia. 'Nokeval Oy / Juha Hämäläinen Option Explicit 'Enum-tyyppi jossa vastaanoton tilat Enum tesclstate SCL_IDLE SCL_RECEIVE SCL_CHECKSUM SCL_COMPLETE End Enum Private Sub Command1_Click() 'Esimerkki yksinkertaisesta kyselystä. Dim r As String 'Alusta ensin portti esim: If InitCom(3, "9600") Then MsgBox "Sarjaportti ei käytettävissä" 'Lähetä sitten komento ja hae vastaus: r = SCL_command("MEA CH 1?", 0) 'Jos ei saatu vastausta, r on tyhjä. If r <> "" Then Me.Caption = "Vastasi: " & r Else Me.Caption = "Ei vastausta" End If 'Sulje sarjaportti: CloseCom End Sub Function InitCom(port As Integer, baud As String) As Integer 'Alustaa sarjaportin. 'Palauttaa 0 jos onnistui. 'Estetään ohjelman kaatuminen jos alustuksessa tulee virhe On Error GoTo ComError 'Suljetaan portti jotta asetteluja voi muuttaa If Form1!MSComm1.PortOpen Then Form1!MSComm1.PortOpen = False 'Tehdään asettelut ja avataan sitten portti Form1!MSComm1.CommPort = port Form1!MSComm1.Settings = baud & ",N,8,1" Form1!MSComm1.InputLen = 1 'Luetaan tavu kerrallaan Form1!MSComm1.PortOpen = True

InitCom = 0 'Onnistui Exit Function ComError: InitCom = 1 'Epäonnistui Exit Function End Function Sub CloseCom() 'Sulkee (vapauttaa) sarjaportin. Saa kutsua vaikkei portti olisi auki. If Form1!MSComm1.PortOpen Then Form1!MSComm1.PortOpen = False End Sub Function SCL_command(szCommand As String, iaddress As Integer) As String 'Lähettää SCL-komennon szcommand osoitteeseen iaddress ja odottelee 'vastausta. Jos tulee timeout tms virhe, palauttaa tyhjän. 'Esim s = SCL_command( "MEA CH 1?", 0 ) 'Timer-funktiota käytetään timeoutin toteuttamiseen, mutta 'koska Timer menee keskiyöllä ympäri nollaan, tarvitaan MOD 86400. Dim ibcc As Integer 'Tarkistussumman laskenta Dim dtsent As Date 'Ajanhetki jolloin komento lahetettiin Dim szresp As String 'Vastaus Dim ierror As Integer 'Virhe (0 = OK) Dim estate As tesclstate 'Vastaanoton tilamuuttuja Dim iindex As Integer 'Yleisindeksi Dim szreceive As String 'Yksi sarjaportista luettu pätkä Dim szchar As String 'Pätkän yksi merkki 'Tyhjennetään vastaanottopuskuri: Form1!MSComm1.InBufferCount = 0 'Lasketaan komennon tarkistussumma: ibcc = 3 'Sisältää valmiiksi ETX:n jota ei vielä merkkijonossa For iindex = 1 To Len(szCommand) ibcc = ibcc Xor Asc(Mid(szCommand, iindex, 1)) Next 'Lähetetään komento tykötarpeineen: Form1!MSComm1.Output = Chr$(iAddress Or 128) & szcommand & Chr$(3) & Chr$(iBcc) 'Aloitetaan vastauksen odottelu: estate = SCL_IDLE dtsent = Now 'Pannaan muistiin koska komento lähti 'Kierretään kunnes koko vastaus tullut Do If Form1!MSComm1.InBufferCount Then 'Tavuja saapunut szreceive = Form1.MSComm1.Input For iindex = 1 To Len(szReceive) 'Tavut yksitellen szchar = Mid(szReceive, iindex, 1) If estate <= SCL_RECEIVE And (Asc(szChar) = 6 Or Asc(szChar) = 21) Then 'ACK/NAK estate = 1 'Aletaan lukea vastausta ibcc = Asc(szChar) szresp = "" 'Tyhjennetään vastaus If Asc(szChar) = 6 Then ierror = 0 Else ierror = 1 'Norm vai virhevastauksen alku ElseIf estate = SCL_RECEIVE Then 'Luetaan vastausta ibcc = ibcc Xor Asc(szChar) If Asc(szChar) = 3 Then 'Loppumerkki ETX tuli estate = SCL_CHECKSUM 'Siirrytään odottelemaan tarkistussummaa Else szresp = szresp & szchar 'Talletetaan vastausta End If ElseIf estate = SCL_CHECKSUM Then 'Vastaanotetaan tarkistussumma If ibcc <> Asc(szChar) Then ierror = 2 'Se oli väärin! estate = SCL_COMPLETE 'Paketti saapunut kokonaan, poistutaan End If Next End If 'Timeout If Now - dtsent > 0.5 / 86400 Then ierror = 3 Loop Until estate = SCL_COMPLETE Or ierror = 3 Or DoEvents() = 0 'Asetetaan paluuarvo:

If ierror = 0 Then SCL_command = szresp Else SCL_command = "" 'Tuli virhe - palautetaan tyhjä End If End Function