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