Läsa Modbus med arduino

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

Re: Läsa Modbus med arduino

Inlägg av TomasL »

Finns det något kommando inom Modbus för att skicka byte-data? Alltså ren data. Typ i form av paket.
Alla Läs/skrivkommandon skickar/tar emot multiplar av 16 byte, så vad undrar du över?

MBus är rätt vanligt mot enklare utrustning, oftast pratar man med Elmätare/energimätare och dyligt med M-Bus.
M-Bus betyder faktiskt Meter-Bus, och togs fram som ett enkelt protokoll för just energimätare.

Modbus används på alla möjliga ställen, men eftersom jag främst håller på inom begreppet fastighetsautomation, så ärt det väl det jag kan bäst.

EtherCat är något helt annat, och har inget med Modbus mm att göra, det är ett rent överföringsprotokoll, oftast mig veterligen implementerat direkt i hårdvara, för att kunna prata med diverse digitala och analoga I/On utan att behöva ödsla men massa I/On på PLCn.
Ethercat kan varken mer eller mindre än MODBus, då det främst är ett transportprotokoll, dvs det beskriver hur data skall kappslas in i ett ethernet-paket

Det du hänvisar till är nog ett försök att slå ihop Modbus/TCP med ethercat, vilket inte verkar funka så bra, troligen då behovet inte finns, eftersom de har två helt skilda uppgifter.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Så här ligger det till. Jag måste skicka data via USB och istället för att skriva ett halvtaskigt protokoll som bara fungerar för mitt program, då tänkte jag göra det riktigt istället och lägga tid och fokus på att använda ett riktigt protokoll. Dels för att kunskapen ska kunna vara värd att kunna, och inte bara användas för tillfället.

Så jag har två protokoll att välja mellan.

- CANopen
- Modbus

Övriga protokoll så som EtherNet/IP, EtherCAT, IO-Link med mera intresserar inte mig för dom verkar allt för avancerade och ställer höga krav på hårdvara eller är rent av så enkelt att CANopen eller Modbus kan ersätta dom.

CANopen används mycket inom industrin och det verkar vara populärt för det anses vara ett säkert protokoll. Nackdelen är att protokollet är något avancerat. En fördel med CANopen är att det är väldigt administrativt och har en struktur som passar många problem t.ex. felkoder för batterier.

Modbus används mycket inom industrin och verkar också vara väldigt populärt. Men Modbus har sina brister när det kommer till säkerhet, både i överföring och skydd mot hackare samt att i Modbus finns det inte färdiga register att använda. Sådant lämnas till utvecklarna själva.
En väldigt bra fördel med Modbus som väger tungt här enligt mitt tycke är att Modbus brukar ofta användas med TCP/IP. Vilket är något som jag vill använda.

Så jag kommer använda ett protokoll för:

- USB
- Datakommunikation över nätet
- Läsa utav I/O-moduler
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

Men Modbus har sina brister när det kommer till säkerhet, både i överföring och skydd mot hackare samt att i Modbus finns det inte färdiga register att använda
På vilket sätt skulle Modbus vara osäkert?
Eftersom man primärt använder RS485, så går det inte att hacka, utan att systemet går ned direkt.

Varför skulle det finnas färdiga register? Det är ju bara klumpigt och onödigt. Detta eftersom Modbus skall kunna användas inom vilken typ av applikation som helst.
En frekvensomformare har väldigt lite med en PLC att göra, till exempel.
Det är väldigt osmart att låsa upp register för något som aldrig används.

Sedan när man skapar sin registerkarta, kan det vara vettigt att tänka till lite grand, dvs gruppera register efter funktion, typ:
Register 1 - 999 för driftstatus
1001 - 1999 för digital IO status
2001 - 2999 för driftdata

osv.
Inställningar som man vill ha skrivbara grupperar man på samma sätt efter sina olika funktioner.
typ
3001 - 3999 för referenser
4001 -4999 för gränser

osv

I din kod, kan du göra detta med en enkel strukt, vilken antingen faktiskt innehåller dina data eller med pekare till data/funktioner.
Så när du fått en läsförfrågan så letar du bara reda på registret i din strukt och skickar de data den innehåller/pekar på.
Behöver du använda 32/64-bitars data är det enklast att dela upp dem i flera 16-bitars register, men du kan också skicka till exempel 32 bitar direkt, under förutsättning att din master kan hantera 32 bitar, vilket inte alls är säkert.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Ja. Låter som ett enkelt protokoll. Men detta bygger på att användaren själv formar sin struktur i C.

Om jag vill t.ex. byta namn på en ECU i J1939 så använder jag kommandot Commanded Address. Detta kommando följer en ISO standard för att ändra en adress hos en ECU.
Sådant måste väll finnas möjlighet inom Modbus? Alltså att det finns färdiga grundverktyg för att t.ex. skicka paket, ta emot X antal paket och forma dessa till ett komplett meddelande?

Att hitta på exakt alla register efter tycka och smak har sina fördelar, men har också nackdelar.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

Ja du kan ju om du vill byta adress på din enhet, det är ju bara att lagra adressen som ett register.

Vad menar du med grundverktyg?

Modbus har ett antal kommandon som stöds, inget annat.

Du får väl ladda ned standarden (vilken iofs är helt fri) och läsa på.

Eftersom du tydligen skall skapa en slav-enhet, så är det helt nödvändigt att läsa på standarden, eftersom det finns ett antal krav på timing, som slaven måste kunna uppfylla.
Lättast är ju att man då använder sig av ett bra bibliotek, till exempel det jag länkade till tidigare.
Det biblioteket funkar för en väldans massa utvecklingsmiljöer/processorer Olika RTOS inklusive Windows/Linux
H.O
Inlägg: 5683
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Re: Läsa Modbus med arduino

Inlägg av H.O »

Har du varit i kontakt med CANopen? Jag är mycket nyfiken på detta. Orsaken har med att med CANopen så kan man faktiskt köra över nätet. :)
Nej, det har jag inte. Och jag har inte mycket erfarenhet av CAN heller för den delen men den erfarenhet jag faktiskt HAR är från en applikation som inte involverar bilar :-)

Men vid en snabb koll på vad CANOpen är så verkar det ju, som namnet antyder, vara ett kommunikationsprotokoll som primärt använder CAN som överföringsprotokoll. CANOpen över Ethernet verkar vara det som vanligen kallas Powerlink.

Som sagts tidigare, MODBUS och CAN är två (olika) protokoll för att över data, MODBUS och CAN specificerar, i sig, inte vad för data som överförs och/eller hur den representeras. Du SKULLE kunna överföra video med MODBUS - även om det verkar lite dumt.

Du vill "läsa utav I/O-noder" men det säger inte så mycket. Är en I/O-nod ett A/D-kort med 8st 24-bitars converters vars data du behöver läsa av med 200us intervall eller är det 8 digitala ingångar som du behöver läsa av med 200ms intervall, eller en trycktransmitter vars 16bitars värde du behöver läsa av 1 gång i sekunden? Eller försöker du täcka in "allt" och därmed göra det hela överdrivet komplicerat för 95% av de FAKTISKA användningsområdena bara för att täcka in de där sista 5%?

Jag kan inte svara på vilket protokoll du SKA eller BORDE välja men tänk igenom vad det är för data du ska överföra, hur mycket och hur ofta. MODBUS är som sagt ett klient-server / master-slav protokoll. Om det inte är vad du söker så kan du stryka DET från listan direkt.
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: 4 oktober 2021, 21:56:04
H.O skrev: 4 oktober 2021, 21:46:43
För i J1939 så behöver man inte avkoda något.
Är inte det en definitionsfråga?
J1939 är är väl just precis en beskrivning/specifikation på hur data överförd i form av CAN-meddelande skall tolkas/översättas/avkodas?
Dvs J1939 specificerar vilka värden som överförs i ett paketet med ett visst ID och hur dessa värden skall representeras (skalfaktor och offset).

CAN är ett sätt överföra data.
VAD som överförs "bestäms" inte på något sätt av CAN-standarden.
J1939 bestämmer/beskriver/specificerar exakt VAD och HUR specifik data överförs i form av CAN-meddelande.
OBD-2 är ett exempel på ett ANNAT protokoll som också överförs i form av CAN-meddelande.

MODBUS är ett sätt att överföra data.
VAD som överförs "bestäms" inte på något sätt av MODBUS-standarden.
Nej. Det fungerar så att när man skickar en förfrågan så skickar man ett PGN nummer. Detta nummer representerar en funktion. Vi säger att jag skickar ID = 200, vilket betyder förfrågan. Sedan skickar jag mitt PGN nummer. Vi säger att PGN numret är 300 och betyder att jag vill ha felkoderna för DM1 av dig. Då skickar du DM1 felkoder. DM1 felkoder i sin tur innehåller FMI och SPN nummer där FMI beskriver vad det är för fel och SPI beskriver lokaliseringen av felet. SPI numrera är enorma medan FMI numren går upp till 30 stycken. Det kan vara till exempelvis FMI = låg strömstyrka och SPI = Tändstift.

J1939 är som du säger, ett sätt att forma CAN meddelanden och tolka dessa på ett likasinnat sätt för alla enheter. Det unika med J1939 är att du behöver aldrig definiera registerna själv. Allt finns dokumenterat att ett visst ID nummer och visst data är en speciell funktion och ingenting annat. :)

Jag kan J1939.
ODB2 fixar Biltema. :mrgreen:
Jag tror du missade poängen som H.O försökte få fram. J1939 ligger inte på samma lager som CAN/MODBUS/Ethernet/.... och löser helt olika problem. OBD-2 och J1939 ligger på samma lager och är två helt olika lösningar på hur man kan prata med olika prylar. Båda använder, om jag hängt med, CAN men de kan inte prata med alla prylar som pratar CAN och man kan så klart inte prata J1939 med en pryl som pratar OBD-2. Alla apparater som pratar ethernet kan kommunicera med varandra, men inte förstå varandra utan de högre lager som kan tolka informationen som skickas.

Du kan inte ersätta J1939 med CAN eller tvärsom eller EtherCAT hit och dit då de är på olika lager och löser olika problem. Definiera ditt problem ordentligt först och leta teknisk lösning senare.
Användarvisningsbild
ojz0r
Inlägg: 244
Blev medlem: 14 september 2007, 19:38:04
Ort: Växjö

Re: Läsa Modbus med arduino

Inlägg av ojz0r »

DanielM skrev: 4 oktober 2021, 23:16:03samt att i Modbus finns det inte färdiga register att använda. Sådant lämnas till utvecklarna själva.
Här är en bild som är ihopsaxad från en manual jag nyligen stötte på för en I/O-slav från Phoenix Contact (Modbus TCP) som belyser deras register. Den kanske kan ge dig en idé om varför du inte behöver implementera HELA modbus utan bara de delar du behöver.
modbus.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

H.O skrev: 5 oktober 2021, 07:37:57
Har du varit i kontakt med CANopen? Jag är mycket nyfiken på detta. Orsaken har med att med CANopen så kan man faktiskt köra över nätet. :)
Nej, det har jag inte. Och jag har inte mycket erfarenhet av CAN heller för den delen men den erfarenhet jag faktiskt HAR är från en applikation som inte involverar bilar :-)

Men vid en snabb koll på vad CANOpen är så verkar det ju, som namnet antyder, vara ett kommunikationsprotokoll som primärt använder CAN som överföringsprotokoll. CANOpen över Ethernet verkar vara det som vanligen kallas Powerlink.

Som sagts tidigare, MODBUS och CAN är två (olika) protokoll för att över data, MODBUS och CAN specificerar, i sig, inte vad för data som överförs och/eller hur den representeras. Du SKULLE kunna överföra video med MODBUS - även om det verkar lite dumt.

Du vill "läsa utav I/O-noder" men det säger inte så mycket. Är en I/O-nod ett A/D-kort med 8st 24-bitars converters vars data du behöver läsa av med 200us intervall eller är det 8 digitala ingångar som du behöver läsa av med 200ms intervall, eller en trycktransmitter vars 16bitars värde du behöver läsa av 1 gång i sekunden? Eller försöker du täcka in "allt" och därmed göra det hela överdrivet komplicerat för 95% av de FAKTISKA användningsområdena bara för att täcka in de där sista 5%?

Jag kan inte svara på vilket protokoll du SKA eller BORDE välja men tänk igenom vad det är för data du ska överföra, hur mycket och hur ofta. MODBUS är som sagt ett klient-server / master-slav protokoll. Om det inte är vad du söker så kan du stryka DET från listan direkt.
Det jag finner intressant med CANopen är att mycket är standaliserat t.ex. felmeddelanden och hur man sätter adresser. Detta är inte standaliserat i Modbus där man själv bestämmer registrerna. CANopen verkar vara en mer utbredd standard medan Modbus verkar vara en väldigt enkel standard.

Målet är ett litet generellt protokoll för att överföra data och styra. Så om Modbus inte har denna funktionalitet att överföra data, så bör jag nog inte fokusera på det.

Du kan använda CANopen över TCP/IP. Jag har dock aldrig sett produkter för sådant ute på marknaden. Troligvis har det säkert med att EtherCAT och liknande är bättre lämpat.

Det jag vill göra är att ha kommunikation över:

- USB
- Socket
- Överföra data
- Sätta register
- CAN (så klart)

Lite så där generellt.
Jag har hittat två länkar jag finner är intressant med CANopen
https://www.csselectronics.com/pages/ca ... mple-intro
https://cache.industry.siemens.com/dl/f ... V20_en.pdf

Här verkar protokollet se rätt enkelt ut. Men när jag läser dokumenten om CANopen från CAN-CiA så ser det hemskt ut. Känns överdrivet komplicerat.
ojz0r skrev: 5 oktober 2021, 08:35:28
DanielM skrev: 4 oktober 2021, 23:16:03samt att i Modbus finns det inte färdiga register att använda. Sådant lämnas till utvecklarna själva.
Här är en bild som är ihopsaxad från en manual jag nyligen stötte på för en I/O-slav från Phoenix Contact (Modbus TCP) som belyser deras register. Den kanske kan ge dig en idé om varför du inte behöver implementera HELA modbus utan bara de delar du behöver.

modbus.jpg
Ja, verkligen enkelt. Här anropar man register efter behov.
pfyra skrev: 5 oktober 2021, 08:22:49
DanielM skrev: 4 oktober 2021, 21:56:04
H.O skrev: 4 oktober 2021, 21:46:43
Är inte det en definitionsfråga?
J1939 är är väl just precis en beskrivning/specifikation på hur data överförd i form av CAN-meddelande skall tolkas/översättas/avkodas?
Dvs J1939 specificerar vilka värden som överförs i ett paketet med ett visst ID och hur dessa värden skall representeras (skalfaktor och offset).

CAN är ett sätt överföra data.
VAD som överförs "bestäms" inte på något sätt av CAN-standarden.
J1939 bestämmer/beskriver/specificerar exakt VAD och HUR specifik data överförs i form av CAN-meddelande.
OBD-2 är ett exempel på ett ANNAT protokoll som också överförs i form av CAN-meddelande.

MODBUS är ett sätt att överföra data.
VAD som överförs "bestäms" inte på något sätt av MODBUS-standarden.
Nej. Det fungerar så att när man skickar en förfrågan så skickar man ett PGN nummer. Detta nummer representerar en funktion. Vi säger att jag skickar ID = 200, vilket betyder förfrågan. Sedan skickar jag mitt PGN nummer. Vi säger att PGN numret är 300 och betyder att jag vill ha felkoderna för DM1 av dig. Då skickar du DM1 felkoder. DM1 felkoder i sin tur innehåller FMI och SPN nummer där FMI beskriver vad det är för fel och SPI beskriver lokaliseringen av felet. SPI numrera är enorma medan FMI numren går upp till 30 stycken. Det kan vara till exempelvis FMI = låg strömstyrka och SPI = Tändstift.

J1939 är som du säger, ett sätt att forma CAN meddelanden och tolka dessa på ett likasinnat sätt för alla enheter. Det unika med J1939 är att du behöver aldrig definiera registerna själv. Allt finns dokumenterat att ett visst ID nummer och visst data är en speciell funktion och ingenting annat. :)

Jag kan J1939.
ODB2 fixar Biltema. :mrgreen:
Jag tror du missade poängen som H.O försökte få fram. J1939 ligger inte på samma lager som CAN/MODBUS/Ethernet/.... och löser helt olika problem. OBD-2 och J1939 ligger på samma lager och är två helt olika lösningar på hur man kan prata med olika prylar. Båda använder, om jag hängt med, CAN men de kan inte prata med alla prylar som pratar CAN och man kan så klart inte prata J1939 med en pryl som pratar OBD-2. Alla apparater som pratar ethernet kan kommunicera med varandra, men inte förstå varandra utan de högre lager som kan tolka informationen som skickas.

Du kan inte ersätta J1939 med CAN eller tvärsom eller EtherCAT hit och dit då de är på olika lager och löser olika problem. Definiera ditt problem ordentligt först och leta teknisk lösning senare.
Detta vet jag. J1939 är skapat för vissa syftet, i detta fall är det tunga fordon/traktorer och mobila maskiner.

ODB2 är skapat för civilfordonsindustrin, och Biltema.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Nu har jag bestämt mig. Det blir Modbus. Orsak:

- Modbus TCP/IP vägde tungt.
- CANopen är inte riktigt "open". Många av deras dokument är bara tillgängliga för medlemmar av CAN-CiA. Dem som utvecklar CANopen.
- Produkter ute på marknaden som har CANopen har inte TCP/IP, än fast det finns CANopen standarder för TCP/IP (vilket jag inte kommer åt)
- Modbus standard har inte förändrats på 10 år. Detta ser jag som en styrka då förändringar är tecken på krav på förbättringar
- Både Modbus och CANopen har diagnostikkontroll. Jag trodde Modbus hade var bara ett dumt protokoll med en struct som man skickar uint16_t register ifrån

Så för att börja med Modbus för USB kommunikation. Vilka dokument rekommenderar ni mig att läsa då från denna sida? https://modbus.org/specs.php
Kan det vara "Modbus Serial Line Protocol and Implementation Guide V1.02" för implementering när man skriver koden samt "MODBUS Protocol Specification" som referensmanual för alla register och funktionaliteter?

Jag tar TCP/IP sist när jag får igång mitt STM32-kretskort som har ethernet.

En viktig fråga! Jag sökte lite snabbt i "MODBUS Protocol Specification" men hittade något som heter 20 (0x14) Read File Record. Är detta ett sätt att överföra rå data typ en textsträng eller liknande?
Skärmklipp.PNG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

Eftersom USB för din del med största sannolikhet kommer att bete sig som en serieport, så är det naturligtvis dokumentet du skall läsa.

Deträffande kommando 20, så har jag nog aldrig någonsin sett det implementerat, och ej hellr sett det i de biblioteken som vanligtvis används.
Enkelt uttryckt, skit i det, håll dig till register och coils, så blir livet mycket enklare.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Vadå skit i det?
Det är väll väldigt användbart det där? Enkelt och smidigt. Lite som DM16 i J1939 som handlar om överföring av rå data.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

Tja, därför att jag aldrig någonsin sett den funktionskoden implementerad i någon master.

Visst implementera den, men du hittar nog ingen som faktiskt kan använda den.

Alla data i Modbus är "Rådata".
Du kan istället använda funktionskod 3, dvs läs multipla register, detta stöds däremot av alla mastrar.
Den gör i princip samma sak, dvs om du vill läsa 10 register, så får du 10 register tillbaka.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Jag tänkte använda det för eget bruk. Om jag tänker skicka X bytes data så slipper jag skapa X antal register. Jag tänker bara skicka data på ett snyggt sätt.

Modbus har inte ändrats sedan 2006. Nog för jag sa att förändringar är av allt ondo, men 2006 var väldigt länge sedan och mycket har hänt. Jag tänkte om de planerar att lägga till något med modbus?

Jag har planer på att göra Modbus portabelt för alla fysiska lager. Allt från TCP/IP till CAN samt vanlig enkel USB. Allt handlar om att byta ut fysiska lagret.
Jag kör till och med J1939 över USB 8)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Läsa Modbus med arduino

Inlägg av TomasL »

Modbusstandarden kommer knappast att ändras någonsin
Om du bara skall skicka data, så skicka data utan något speciellt protokoll.
Du behöver ju då inte ha med kompabilitet med andra enheter.

Det är ju bara att packa ihop data , köra crc, och skicka allt.
Skriv svar