En liten Modbushistoria
Postat: 26 juni 2012, 18:07:27
Det där med datakommunikation är inte helt lätt.
I vårt projekt har vi ett antal regulatorer och frekvensomformare kopplade till en modbusmaster.
Regulatorerna och modbussmastern är helt vår egen design och konstruktion.
Omformarna kommer från ett stort känt fabrikat.
Nåväl, tanken är att vår master skall skicka referenser till omformarna och slavregulatorerna , lätt som en plätt kan man tycka.
Men ack vad man bedrar sig.
Ingenting funkade med omformarna.
VIsst vi kunde skicka referenser till dem, men retursvaret var alltid, enligt vå modbussmaster felaktig.
Så, vi konstaterar att vår master anser att checksumman på svaret är felaktig.
Jah, bara, bara att dyka ned i koden och felsöka, efter någon veckas provkörning, analys av kod linjelyssning osv, konstaterar vi att vår kod är fullständigt ok, vi följer Modbusstandarden till 100%.
Dock kan vi konstatera att den stora omformartillverkaren måste ha buggar i sin kod.
Skickar ett par mail till deras support, med loggar från linjelyssning osv.
Efter någon frustrerande vecka och en del telefonsamtal så får vi svar från dem, ja de har fel i koden, sorry, uppdateras nästa år, typ, eventuellt.
Men sa de, om man frångår modbuss-standarden och kör 8N1 i stället för kravet i standarden (8N2 eller 8E1), så funkar det.
Ja ja, ok, vi ändrar i koden till 8N1, och visst det funkade, HURRA, ett tag.
Efter en tids drift slutade omformarna att ta emot data, såvida man inte startade om dem, ibland fick vi konstiga fel som processor överbelastad osv.
Hmpf, åter tillbaka till supporten, hmm, till svar får vi, Det inbyggda modbusgränssnittet är rätt nytt, ni är faktiskt de första som använder det, och (mellan raderna), ja vi har märkt att det beter sig lite konstigt i bland.
Dock, löser det sig om ni använder vår externa adapter, den vet vi funkar, eftersom tyusentals anläggningar använder den.
Ok, javisst, kör på skicka dem, Hmm 6 veckors leveranstid, inte acceptabelt, vi har en stor anläggning som står stilla.
Fick adaptrarna installerade dem, frid och fröjd, he he, trodde ni va.
Jo, det visar sig att skriva till omformarna gick alldeles utmärkt, med rätt svar och rätt checksumma osv.
Men läsa från dem, nja, dt funkade för det mesta inte, nog fick vi svar alltid, men i de flesta fallen så var svaret en undantagskod "oåterkalleligt fel, kontakta supporten" enligt bruksen.
Sagt och gjort det gjorde vi.
Nu är det så att modbus är ett rent 16-bitarsprotokoll, så man läser och skriver 16-bitars register.
På senare tid har man diverse modifikationer lyckats få till både 32 och 64-bitars register, och hur i helsike addresserar man 32 bitar med 16, well, normalt sett så när man läser så får man enligt boken LSW vid 16-bitars läsning, vilket är helt ok för oss eftersom det vi är intresserade av ändå ligger i LSW.
Supporten återkommer, och meddelar följande, med den inbyggda modbusporten(som inte funkar) kan man problemfritt (i teorin) läsa LSW av ett 32-bitars ord, men det går inte med den externa adaptern, där måste man läsa hela 32-bitarsregistret, suck,
Hur gör man det då, bra fråga svarar de.
Då inställer sig problemet, det finns ett par sätt att göra detta,
Det är något luddigt och ickespecificerat vad som menas i standarden när man skickar en läs/skrivförfrågan, avser den ett 16-bitars register, ett värde eller.....
Till råga på allt så finns det ett antal sätt att koda informationen, generellt är modbus Big Endian, men vid multibyte register, dvs 32 bitar till exempel så kan man ha BE på allt BE på 2*16 bitar och LE inom resp 16 bitar osv.
Totalt finns det runt 8 sätt att läsa ett 32 bitars register, och man har naturligtvis inte specat hur man skall göra.
Lusläser den där 400-sidiga manualen, och hittar en formel för att omvandla adresserna till 32 bitar.
Ok, då vet man, normalt är registeradresserna vid 16 bitar 0-9999 och vid 32 bitar 20000-39999, typ.
Ja ha, implementerar detta i koden, funkar inte, det visar sig att, man måste läsa 2 register med 32-bitars addressering, för att på ett 32-bitars register.
Suck, nu kan vi i alla fall läsa, återstår att se hur det är med endinessen.
Nä nu skall jag ned i hotellets bastu, med några öl.
I vårt projekt har vi ett antal regulatorer och frekvensomformare kopplade till en modbusmaster.
Regulatorerna och modbussmastern är helt vår egen design och konstruktion.
Omformarna kommer från ett stort känt fabrikat.
Nåväl, tanken är att vår master skall skicka referenser till omformarna och slavregulatorerna , lätt som en plätt kan man tycka.
Men ack vad man bedrar sig.
Ingenting funkade med omformarna.
VIsst vi kunde skicka referenser till dem, men retursvaret var alltid, enligt vå modbussmaster felaktig.
Så, vi konstaterar att vår master anser att checksumman på svaret är felaktig.
Jah, bara, bara att dyka ned i koden och felsöka, efter någon veckas provkörning, analys av kod linjelyssning osv, konstaterar vi att vår kod är fullständigt ok, vi följer Modbusstandarden till 100%.
Dock kan vi konstatera att den stora omformartillverkaren måste ha buggar i sin kod.
Skickar ett par mail till deras support, med loggar från linjelyssning osv.
Efter någon frustrerande vecka och en del telefonsamtal så får vi svar från dem, ja de har fel i koden, sorry, uppdateras nästa år, typ, eventuellt.
Men sa de, om man frångår modbuss-standarden och kör 8N1 i stället för kravet i standarden (8N2 eller 8E1), så funkar det.
Ja ja, ok, vi ändrar i koden till 8N1, och visst det funkade, HURRA, ett tag.
Efter en tids drift slutade omformarna att ta emot data, såvida man inte startade om dem, ibland fick vi konstiga fel som processor överbelastad osv.
Hmpf, åter tillbaka till supporten, hmm, till svar får vi, Det inbyggda modbusgränssnittet är rätt nytt, ni är faktiskt de första som använder det, och (mellan raderna), ja vi har märkt att det beter sig lite konstigt i bland.
Dock, löser det sig om ni använder vår externa adapter, den vet vi funkar, eftersom tyusentals anläggningar använder den.
Ok, javisst, kör på skicka dem, Hmm 6 veckors leveranstid, inte acceptabelt, vi har en stor anläggning som står stilla.
Fick adaptrarna installerade dem, frid och fröjd, he he, trodde ni va.
Jo, det visar sig att skriva till omformarna gick alldeles utmärkt, med rätt svar och rätt checksumma osv.
Men läsa från dem, nja, dt funkade för det mesta inte, nog fick vi svar alltid, men i de flesta fallen så var svaret en undantagskod "oåterkalleligt fel, kontakta supporten" enligt bruksen.
Sagt och gjort det gjorde vi.
Nu är det så att modbus är ett rent 16-bitarsprotokoll, så man läser och skriver 16-bitars register.
På senare tid har man diverse modifikationer lyckats få till både 32 och 64-bitars register, och hur i helsike addresserar man 32 bitar med 16, well, normalt sett så när man läser så får man enligt boken LSW vid 16-bitars läsning, vilket är helt ok för oss eftersom det vi är intresserade av ändå ligger i LSW.
Supporten återkommer, och meddelar följande, med den inbyggda modbusporten(som inte funkar) kan man problemfritt (i teorin) läsa LSW av ett 32-bitars ord, men det går inte med den externa adaptern, där måste man läsa hela 32-bitarsregistret, suck,
Hur gör man det då, bra fråga svarar de.
Då inställer sig problemet, det finns ett par sätt att göra detta,
Det är något luddigt och ickespecificerat vad som menas i standarden när man skickar en läs/skrivförfrågan, avser den ett 16-bitars register, ett värde eller.....
Till råga på allt så finns det ett antal sätt att koda informationen, generellt är modbus Big Endian, men vid multibyte register, dvs 32 bitar till exempel så kan man ha BE på allt BE på 2*16 bitar och LE inom resp 16 bitar osv.
Totalt finns det runt 8 sätt att läsa ett 32 bitars register, och man har naturligtvis inte specat hur man skall göra.
Lusläser den där 400-sidiga manualen, och hittar en formel för att omvandla adresserna till 32 bitar.
Ok, då vet man, normalt är registeradresserna vid 16 bitar 0-9999 och vid 32 bitar 20000-39999, typ.
Ja ha, implementerar detta i koden, funkar inte, det visar sig att, man måste läsa 2 register med 32-bitars addressering, för att på ett 32-bitars register.
Suck, nu kan vi i alla fall läsa, återstår att se hur det är med endinessen.
Nä nu skall jag ned i hotellets bastu, med några öl.