Läsa Modbus med arduino

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

DanielM skrev: 6 oktober 2021, 14:43:51
TomasL skrev: 6 oktober 2021, 14:09:13
DanielM skrev: 6 oktober 2021, 11:29:49
Så i Modbus kan man inte skicka paket?
Frågan är vad du menar med "paket"
Benämningen "Paket" kommer från IP-protokollet

Där ett meddelande inte kan vara större än en Ethernet-frame, dvs totalt runt 1522 byte
Vilket då kallas för ett ethernet-paket.
Är meddelandet längre styckas det upp och det skickas flera numrerade paket, vilka då, av mottagaren sätts samman till ett komplett meddelande.

Modbus på en seriell lina är historiskt begränsat till en meddelandelängd om 256 bytes.
Det handlar då om hur stora buffertar och vilken kapacitet en PLC har.
Så, för Modbus är meddelandelängd och paketlängd samma sak
När man skickar data så brukar man oftast skriva hur mycket bytes man skickar och i hur många paket. Sådant gör man i J1939 och jag förmodar att man gör så i alla protokoll. Annars vore det konstigt. Hur annars ska man beskriva hur mycket data man skickar?
Nej det brukar man inte.
Väldigt många protokoll har en fast alternativt maximal längd på ett meddelande.
Ethernet är till exempel alltid 1522 byte i en frame, är meddelandet mindre så paddas framen.
Vissa protokoll tillåter längre meddelanden än vad en frame tillåter, så är det till exempel med de olika IP-protokollen, då styckas meddelandet upp i flera paket, och varje paket är alltid 1 frame lång.
Dessa paket numreras, dock talar sändaren inte om hur många paket som skickas.

I modbuss har man variabel datalängd på en "frame", dvs den kan vara minimalt 4 bytes och maximalt 256 bytes, vilket är den maximala längden på ett meddelande.
Eftersom ett meddelande får plats i en frame, behöver man inte skicka paket.

Sedan undrar jag varför du blandar in TCP/IP när du skall använda USB?
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Icecap skrev: 6 oktober 2021, 14:58:49 Måste ett protokoll innbära att man skickar med hur många bytes det är?

Och tillåt mig att svara för dig så det blir rätt: Nej.

Ett protokoll kan vara av en fast storlek - eller variabel storlek.
Det kan skicka med antal data - och det kan låta bli.
Det kan finnas checksum för att kunde sortera störda data - och det går fint utan.

Ett protokoll är helt enkelt en beskrivelse av hur data ska formatteras för att två eller fler enheter kan förstå varandra.

Att det finns många olika standardprotokoller är för att varje applikation kan ha specifika krav med hastighet, datamängd, feltolerans osv.

Många har frågat dig om EXAKT VAD uu vill uppnå - men i vanlig ordning möljar du på med protokoller och vilka som är bäst till de <OSPECIFIKA> ändamål du har.

Jag har lyckats mycket väl med ren textbaserat protokoller i många enheter - men fan om jag ville överföra en del MB på kort tid på det vis.

Så exakt VAD vill du uppnå?
Självklart går det också. I J1939 så skickar man först ett meddelande:

Första meddelandet handlar om hur många bytes man skickar. Hur många paket det kommer skickas och vilket PGN nummer.
Då skickar man det, sedan skickar man paket efter paket.

När mottagaren har fått ihop alla paket så tittar den på PGN numret och tänker "Jaha? Så ska jag tolka detta meddelande" och då konstruerar mottagaren upp meddelandet. Superenkelt.

Vad JAG vill uppnå har jag redan förklarat tre gånger i denna tråd. Men jag kan ta det igen.
Jag vill ha kommunikation mellan STM32 och PC via USB och då är det mer värt att använda ett riktigt protokoll som jag kan använda flera gånger. Normalt har jag alltid skapat ett protokoll som fungerar just för en specifik applikation. Det slutar alltid med att jag får göra om jobbet flera gånger. Så då tänkte jag investera lite i tid och lära mig att bra protokoll.

Det stod mellan Modbus och CANopen och Modbus vann, trots att CANopen anses vara något bättre än Modbus med tanke på att det är nyare.
CANopen är inte direkt "open" för att många av deras dokument på CAN-CiA håller många dokument låsta och endast tillgängliga för dess medlemmar. Dom som utvecklar CANopen. Så det var en nackdel som vägde tungt.
Andra nackdelen har med att industriella produkter för CANopen talar inte TCP/IP, trots att CANopen standarden har stöd för det. Troligtvis har detta med att CANopen TCP/IP är för nytt och det tar alltid några år innan produkterna kommer ut på marknaden.

Så två nackdelar med CANopen(Inte helt 100% öppet protokoll, marknaden saknar stöd för TCP/IP) och en fördel med Modbus (TCP/IP) gjorde så att Modbus vann. Nackdelen med Modbus är att mastern måste skicka förfrågan till slavarna och slavarna kan ej bestämma själv när dom ska skicka meddelanden. Men det ska nog gå bra med tanke på att internet är snabbt nu för tiden samt RS485 är riktigt snabbt.
TomasL skrev: 6 oktober 2021, 15:13:09
DanielM skrev: 6 oktober 2021, 14:43:51
TomasL skrev: 6 oktober 2021, 14:09:13 Frågan är vad du menar med "paket"
Benämningen "Paket" kommer från IP-protokollet

Där ett meddelande inte kan vara större än en Ethernet-frame, dvs totalt runt 1522 byte
Vilket då kallas för ett ethernet-paket.
Är meddelandet längre styckas det upp och det skickas flera numrerade paket, vilka då, av mottagaren sätts samman till ett komplett meddelande.

Modbus på en seriell lina är historiskt begränsat till en meddelandelängd om 256 bytes.
Det handlar då om hur stora buffertar och vilken kapacitet en PLC har.
Så, för Modbus är meddelandelängd och paketlängd samma sak
När man skickar data så brukar man oftast skriva hur mycket bytes man skickar och i hur många paket. Sådant gör man i J1939 och jag förmodar att man gör så i alla protokoll. Annars vore det konstigt. Hur annars ska man beskriva hur mycket data man skickar?
Nej det brukar man inte.
Väldigt många protokoll har en fast alternativt maximal längd på ett meddelande.
Ethernet är till exempel alltid 1522 byte i en frame, är meddelandet mindre så paddas framen.
Vissa protokoll tillåter längre meddelanden än vad en frame tillåter, så är det till exempel med de olika IP-protokollen, då styckas meddelandet upp i flera paket, och varje paket är alltid 1 frame lång.
Dessa paket numreras, dock talar sändaren inte om hur många paket som skickas.

I modbuss har man variabel datalängd på en "frame", dvs den kan vara minimalt 4 bytes och maximalt 256 bytes, vilket är den maximala längden på ett meddelande.
Eftersom ett meddelande får plats i en frame, behöver man inte skicka paket.

Sedan undrar jag varför du blandar in TCP/IP när du skall använda USB?
Inte TCP/IP över USB. Jag talar om Modbus RTU över USB. Varför skulle det inte fungera?
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Läsa Modbus med arduino

Inlägg av Klas-Kenny »

DanielM skrev: 6 oktober 2021, 14:42:35 Har du jobbat med CANopen? Nu när jag ser att denna frekvensriktare har CANopen så verkar protokollet inte alls så farligt.
Nej, har inte jobbat "konkret" med det.
Men vad jag vet (ifrån diskussioner med kollegor som jobbar med det) är att i sin helhet är det ett stort och ganska avancerat protokoll.
MEN, i princip inga enheter stödjer *hela* protokollet (varken masters eller slavar), utan de flesta enheter lär vara ganska så enkla att prata med även via CANopen.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Mitt J1939 protokoll stödjer grundläggande standarden och den ger även möjlighet att kunna implementera eget själv efter behov. Det den inte stödjer är DM13 meddelanden, vilket betyder att man kan stoppa J1922 meddelanden.

Hittade en manual som förklarar det där med CANopen riktigt bra.
https://www.sick.com/media/docs/3/53/85 ... 064853.PDF

Figur 11 visar hur LSS, NMT, PDO, SDO och EMGY ska skickas. LSS, NMT ska ALLTID skickas från mastern till slav enkelriktat, medan PDO, SDO, EMGY kan skickas mellan slav och master.

Paragraf 9.2 förklarar hur COB ID:erna ska se ut enligt standard. Varje COB id förklarar vilket typ av meddelande och vart meddelandet ska någonstans.

Paragraf 9.3 förklarar det där med LSS att den används för att skicka vilken address enheterna ska ha och vilken baudrate dom ska ha. Låter vettigt.

Paragraf 9.4 förklarar hur man startar upp en enhet så den blir medlem i nätverket. Även hur man förklarar för enheten om den ska sluta skicka data eller vara avaktiverad.

Paragraf 9.5 till 9.6 förklarar det där med SDO och PDO. Här finns det intressanta standarregister, men många av registerna är också produktspecifika.

Paragraf 9.7 förklarar det där med Object Dictionary, det vill säga data som användare kan komma åt. Här förklaras det även vilka register, enligt standard, som bara kan vara produktspecifika. Det tycker jag är hyggligt gjort.

Paragraf 9.8, sista paragrafen. Denna förklarar felmeddelanden

Det jag tycker är fint med CANopen är att den verkligen beskriver vilka register som tillhör standarden och vilka register som användarna själva kan implementera.

Nästan som att man vill skippa det där med Modbus RTU och bara satsa på Modbus TCP/IP och CANopen :) Ja, man vill ju vara modern?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

Jag talar om Modbus RTU över USB. Varför skulle det inte fungera?
Jo naturligtvis funkar det, men jag förstår fortfarande inte varför du blandar in TCP/IP i diskussionen.
Användarvisningsbild
ajje
Inlägg: 2351
Blev medlem: 12 mars 2010, 16:35:31
Ort: Smedjebacken

Re: Läsa Modbus med arduino

Inlägg av ajje »

TomasL skrev: 6 oktober 2021, 15:13:09
Ethernet är till exempel alltid 1522 byte i en frame, är meddelandet mindre så paddas framen.
Jag beundrar dig för ditt Sisyfosarbete i den här tråden, men rätt ska vara rätt.

Ethernet (den ursprungliga IEEE 802.3) har en variabel ramstorlek på 64 till 1518 bytes.

Padding med nollor sker bara om header + payload skulle understiga 64 bytes.

Det har att göra med att vid en kortare frame än 64 bytes så funkar inte CSMA/CD tillförlitligt pga propagation delay.
Början på ramen ska nå alla mottagare inom kollisionsdomänen innan sändaren skickar sista byten.

Nu får du återgå till att stånga pannan blodig :D
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

Ok, rättningen är mottagen :)
Fortsätter att stånga pannan blodig, tills dess att TS förstår :D
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

TomasL skrev: 6 oktober 2021, 20:32:28
Jag talar om Modbus RTU över USB. Varför skulle det inte fungera?
Jo naturligtvis funkar det, men jag förstår fortfarande inte varför du blandar in TCP/IP i diskussionen.
För det är något som jag ska använda senare. :)
Är Modbus TCP/IP samma grundprotokoll som RTU? Eller är det allt mer komplext?
TomasL skrev: 6 oktober 2021, 21:49:03 Ok, rättningen är mottagen :)
Fortsätter att stånga pannan blodig, tills dess att TS förstår :D
Eller du lär dig läsa det jag skriver? :mrgreen:
Senast redigerad av DanielM 6 oktober 2021, 22:22:45, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

Modbus TCP/IP är samma sak som MODBUS RTU docks saknas checksumman eftersom den inte behövs, sedan finns det några fler data-fält, som man kan använda för olika saker, MEN du hittar inga MODBUS-enheter oavsett om de kör över RS485 eller TCP som stöder nånting annat än de grundläggande funktionerna.
Exempelvis så nämnde du funktionskod 20 mfl, jag tror ärligt talat inte du hittar en enda enhet som stöder denna funktion.

Den enda anledningen till att använda ett standardiserat protokoll är om man vill prata med andra fabrikat och enheter.

Skall man använda det enbart för sig själv, finns det ingen anledning att köra standardprotokoll, eftersom de alltid är mer komplexa och långsammare,
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Jag har behov utav att använda ett standardiserat protokoll för jag ska tala med andra fabrikat, och använda för eget personligt bruk.
Om Modbus är så förbaskat enkelt(det du använder) så tror jag använder både Modbus och CANopen.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

Ja, Modbus är förhållandevis enkelt, dock glöm idéerna om funktion 20, 21 osv, det finns inga kommersiella enheter som stöder dessa obskyra koder.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45173
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

DanielM skrev: 6 oktober 2021, 22:08:19 Eller du lär dig läsa det jag skriver? :mrgreen:
Jag läser allt du skriver, dock verkar du ha dålig kunskap, och inte förstår det vi andra skriver. Alternativt, så läser du det inte.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

TomasL skrev: 6 oktober 2021, 22:40:51 Ja, Modbus är förhållandevis enkelt, dock glöm idéerna om funktion 20, 21 osv, det finns inga kommersiella enheter som stöder dessa obskyra koder.
Som jag sa innan och flera gånger, det är för privat bruk. Det är alltid bra att kunna skicka data mellan två olika enheter, som man själv har skapat.
TomasL skrev: 6 oktober 2021, 22:43:21 Jag läser allt du skriver, dock verkar du ha dålig kunskap, och inte förstår det vi andra skriver. Alternativt, så läser du det inte.
Ja just de. :wink:

Har redan börjat strukturera upp för CANopen och Modbus. Jag kör samma mappstruktur som på J1939 projektet som jag skapade. Nämligen ett mapp som innehåller strukturer och en mapp som innehåller protokollet.

- Strukturer/lyssnare
- Protokollet
- Hårdvara
Skärmklipp1.PNG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
pfyra
Inlägg: 345
Blev medlem: 8 mars 2015, 14:14:44
Ort: utanför Karlstad

Re: Läsa Modbus med arduino

Inlägg av pfyra »

DanielM skrev: 6 oktober 2021, 22:24:51 Jag har behov utav att använda ett standardiserat protokoll för jag ska tala med andra fabrikat, och använda för eget personligt bruk.
Vill minnas att jag läst att du ska ha ditt stm32 kort kopplat till en pc med usbkabel, och i så fall spelar fabrikatet på usbkabeln och pcn ingen roll. Jag har svårt att se poängen med standardiserat protokoll tunnlat över USB för att kunna prata med olika prylar när ditt kort ändå bara är en usb device och kommer prata med en pc.
I ditt läge hade jag använt usb (eller seriell kommunikation över usb) till datorn istället för att tunnla modbus, erhercat eller can över usb.
Den dagen du har något annat "medium" än usb att prata över så är det läge att spana in de andra protokollen, och då implementerar du de(t) som de prylar du vill prata med stöder.
Att spekulativt implementera stöd för protokollen låter som ett tidsfördriv som kan bli helt bortkastat i slutändan (såvisa du inte redan har prylar du vill prata med, men om du hade det så hade nog valet varit lätt då de knappast stöder alla protokoll som nämnts i tråden).
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

pfyra skrev: 6 oktober 2021, 23:19:14 Vill minnas att jag läst att du ska ha ditt stm32 kort kopplat till en pc med usbkabel, och i så fall spelar fabrikatet på usbkabeln och pcn ingen roll. Jag har svårt att se poängen med standardiserat protokoll tunnlat över USB för att kunna prata med olika prylar när ditt kort ändå bara är en usb device och kommer prata med en pc.
I ditt läge hade jag använt usb (eller seriell kommunikation över usb) till datorn istället för att tunnla modbus, erhercat eller can över usb.
Den dagen du har något annat "medium" än usb att prata över så är det läge att spana in de andra protokollen, och då implementerar du de(t) som de prylar du vill prata med stöder.
Att spekulativt implementera stöd för protokollen låter som ett tidsfördriv som kan bli helt bortkastat i slutändan (såvisa du inte redan har prylar du vill prata med, men om du hade det så hade nog valet varit lätt då de knappast stöder alla protokoll som nämnts i tråden).
När jag skriver kod så är jag en perfektionist. Jag lägger stor vikt på att få koden snygg, strukturerad och lättläst för andra. För att uppnå detta så gäller det att tänka enkelt och smart. För att tänka enkelt så använder man rätt verktyg vid rätt tillfälle. För att tänka smart så gäller det att minimera sin kod så mycket som det går.

Jag ser många C programmerare som skriver kod som de har rullat en apelsin på tangentbordet. Det är mystiskt #pragma och massor av #if och #else här och där samt filer som har flera tusen rader kod. Eller folk som skriver kod utan att ta användning av C standardbibliotek. Dem må ha programmerat i säkert 10 år i sträck, men dom är fortfarande nybörjare i mina ögon.

Att använda ett standardprotokoll för enkelt kommunikation över USB porten känns något överdrivet. Men jag sitter inte och skriver kod för att två enheter ska tala med varandra och sedan slänger jag bort dom efter dom har tjänat sitt syfte. Nej nej. När jag skriver kod så skriver jag kod så att det går att bygga på koden vid behov. Då är det värt att investera tid till ett protokoll.

Det jag gör är att jag ska först och främst ha kommunikation mellan en STM32 och PC för att bara skicka rå data(ADC, PWM, inställningar med mera). Ingen speciell data. Men jag kommer använda exakt samma protokoll för att skicka J1939, CANopen över USB för att tala med externa industriella saker ut på CAN-bus porten. Samt jag kommer använda Modbus för mitt STM32 kort som har ethernet. Jag kan säga att CANopen verkar finnas tillgängligt på allt modernt.

Jag har bara sett Modbus TCP/IP på moderna saker. Modbus RTU hittar jag inte på moderna saker som produceras och uppfinns idag. Då är det snarare IO-Link, CANopen, EtherCAT med mera som härskar där. Exempelvis Dewesoft saknar stöd för Modbus RTU, men stödjer Modbus TCP/IP. https://download.dewesoft.com/list/plug ... ster-tcpip Notera att Dewesoft har också stöd för SAE J1939. Det är nytt plugin som har kommit ut nyligt som jag såg på något nyhetsbrev.

Sammanfattning:
- Perfektionist när det kommer till kod
- Återanvänder projekt i andra projekt
- Gott humör :)
Skriv svar