Läsa Modbus med arduino

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Läsa Modbus med arduino

Inlägg av Icecap »

Dina funktionskrav är INTE någon regel!

Ja, det fungerar bra med lite förklaring om vad som ska ske vid starten av en funktionsblock, om DU har problem med det är det rent faktisk DITT problem - men tro mig: jag kan förstå att det är ett problem då jag lever med en person med Afantasia och NLD. Men det betyder inte att koden är dålig, det betyder bara att du inte fungerar bra med den.

Men Modbus är verkligen enkel!
Skicka en fråga i ett givet format, visst är det lite CRC osv. men inget allvarligt.

Man får sedan ett svar (som har en extra byte har jag lärt efter att ha skällt fel personer ut) och data i dom är binära i (minns-inte-vilken)-endian. Har för mig att det var little-endian men lovar inget.

Använd data till vad de ska användas till och fråga igen vid rätt tillfälle.

En källfil med många rader kod är INTE likvärdig med stor programkod eller stort minnesforbrukning!
Det KAN hänga ihop men även vara utan signifikans.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Läsa Modbus med arduino

Inlägg av Micke_s »

Surfade runt på github lite. Helt läsbart kod på telefonen..
https://github.com/angeloc/simplemodbusng
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Icecap skrev: 25 september 2021, 14:49:53 Dina funktionskrav är INTE någon regel!

Ja, det fungerar bra med lite förklaring om vad som ska ske vid starten av en funktionsblock, om DU har problem med det är det rent faktisk DITT problem - men tro mig: jag kan förstå att det är ett problem då jag lever med en person med Afantasia och NLD. Men det betyder inte att koden är dålig, det betyder bara att du inte fungerar bra med den.

Men Modbus är verkligen enkel!
Skicka en fråga i ett givet format, visst är det lite CRC osv. men inget allvarligt.

Man får sedan ett svar (som har en extra byte har jag lärt efter att ha skällt fel personer ut) och data i dom är binära i (minns-inte-vilken)-endian. Har för mig att det var little-endian men lovar inget.

Använd data till vad de ska användas till och fråga igen vid rätt tillfälle.

En källfil med många rader kod är INTE likvärdig med stor programkod eller stort minnesforbrukning!
Det KAN hänga ihop men även vara utan signifikans.
Det handlar inte om att göra koden lättläst för vissa personer. Det handlar om att få till en bra struktur och tydliga namn, vilket många har problem med än idag. Börjar man på en bra struktur så kommer man se att koden som man skriver består sällan av iterationer och if-satser Om sin kod innehåller mycket iterationer och if-satser vid applikationskoden så tyder det på ett dålig struktur där man blandar olika lager.

Snygg kod ser ut så här:

Kod: Markera allt

void anropa_server_via_tcp_ip(){
	anslut();
	skicka_kommando();
	invänta_svar();
	avsluta();
}	
Dålig kod, så innehåller övrig kod ovan massvis med if-satser och iterationer. Sådant ska endast finnas i "botten"-lagret hos koden.

Jag är mycket intresserad utav modbus. Jag har ett mål att kunna använda det för att skicka över data via TCP/IP hos min STM32:a när jag får igång den också :)
Micke_s skrev: 25 september 2021, 15:51:40 Surfade runt på github lite. Helt läsbart kod på telefonen..
https://github.com/angeloc/simplemodbusng
Japp. Där är bra skriven kod.
Exemplet är snyggt skrivet och innehåller otydligheter. Mest bara enkel C++ kod. Jag ska ta och studera denna kod. Tänkte porta om det till C kod då jag föredrar C kod före C++ när det kommer till hårdvara och optimerade lösningar. Jag är normalt en C++ programmerare, men det använder jag till Microsoft-produkter.

Kod: Markera allt

void setup()
{
    // read 3 registers starting at address 0
    packet1->id = 2;
    packet1->function = READ_HOLDING_REGISTERS;
    packet1->address = 0;
    packet1->no_of_registers = 9;
    packet1->register_array = regs;

    // write the 9 registers to the PLC starting at address 3
    packet2->id = 2;
    packet2->function = PRESET_MULTIPLE_REGISTERS;
    packet2->address = 6;
    packet2->no_of_registers = 1;
    packet2->register_array = write_regs;
    
    // Initialize communication settings etc...
    modbus_configure(baud, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS);

    pinMode(connection_error_led, OUTPUT);
}

void loop()
{
    unsigned int connection_status = modbus_update(packets);

    if (millis() - last_toggle > 1000) {
        last_toggle = millis();
        write_regs[0] = led_on;
    }

    if (connection_status != TOTAL_NO_OF_PACKETS) {
        digitalWrite(connection_error_led, HIGH);
        // You could re-enable the connection by:
        //packets[connection_status].connection = true;
    } else {
        digitalWrite(connection_error_led, LOW);
    }
}
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 »

C-kod som ser ut som ditt exempel saknar felhantering och det är därför just C-kod inte ser ut som ditt exempel utan det är if-satser mm här och där. C++ och C# har exceptions som kan fungera för viss felhantering och möjliggöra ditt exempel, men brukar ge väldigt svår felhantering och dessutom degraderad prestanda. Använd inte exceptions för embeddedkod helt enkelt.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Jag kan programmera exceptions med C igenom att använda mig av enkal if-satser.
Med tanke på att systemet skall göra samma sak hela tiden så ser jag det svårt att den skulle göra något annat som den inte är programmerad till.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Någon som vet hur mycket Profinet skiljer sig från Modbus?
Tänkte om Profinet kanske använder något annat protokollager än TCP/IP?

Som jag vet så brukar EtherCAT, EtherNET/IP, Profinet vara minst lika populär som Modbus.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Läsa Modbus med arduino

Inlägg av Micke_s »

Profinet använder ethernet+TCP/IP, den har en egen ”frame type” precis som UDP, TCP, ICMP osv.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Läsa Modbus med arduino

Inlägg av Micke_s »

Profinet är rätt så mycket krångligare att implementera än modbus
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Jag skulle behöva ett protokoll som inte är beroende utav trådar. SAE J1939 kan man köra helt "trådlöst" :mrgreen: Här skickar man bara ut ett meddelande dirket på CAN-nätverket och förhoppningsvis så är det någon som svarar. Superenkelt. Jag har läst på lite om CANopen och det verkar vara betydligt svårare än SAE J1939. Jag förstår dock inte varför folk skapar svåra protokull som kräver mer processorkraft. :tumner:

Jag tänkte att desto enklare protokoll, desto större chans är det att man slipper det där med trådar.
Men visst är det så att om man kör TCP/IP så måste man ha trådar?

På min dator så kan jag köra något som heter Sockets. Det uppfattar jag som är TCP/IP i renaste form. Om jag vill ha kommunikation mellan två datorer så måste jag starta upp en Socket-server och den ska lyssna efter en Socket-klient. När jag menar lyssna så är det blocking-call som det heter. Vilket betyder att "koden stannar på samma ställe" och inväntar efter en anslutning.

När det blir anslutning, så måste man starta upp en ny Socket-server för att en annan klient skall kunna ansluta. Men då är frågan. Kan man göra detta utan trådar?

Orsaken varför jag vill köra utan trådar har med att portabilitet att göra.
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 visst är det så att om man kör TCP/IP så måste man ha trådar?
Naturligtvis inte, men om din TCP/IP-server skall kunna klara flera anslutningar samtidigt, så behövs det nog.
Som jag vet så brukar EtherCAT, EtherNET/IP, Profinet vara minst lika populär som Modbus.
EtherCAT är något helt annat, det är skapat för att man skall kunna ansluta till exempel en givare direkt på en Ethernet-lina, på klientsidan realiseras det då ofta direkt i hårdvara.

IP, tja det är ju ett överföringsprotkoll där man kan kapsla in andra protokoll såsom TCP, UDP osv
Ethernet är ju faktiskt benämningen på det fysiska mediat, så det är per se inget protokoll, lika lite som RS485, RS232 etc är prokoll.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

TomasL skrev: 29 september 2021, 14:51:50 Naturligtvis inte, men om din TCP/IP-server skall kunna klara flera anslutningar samtidigt, så behövs det nog.
Jag byggde ett kort för STM32 som har ethernet på. Då får jag fundera på hur jag ska få det portabelt. Målet är att jag ska använda samma C mjukvara på PC som på STM32.
EtherCAT är något helt annat, det är skapat för att man skall kunna ansluta till exempel en givare direkt på en Ethernet-lina, på klientsidan realiseras det då ofta direkt i hårdvara.

IP, tja det är ju ett överföringsprotkoll där man kan kapsla in andra protokoll såsom TCP, UDP osv
Ethernet är ju faktiskt benämningen på det fysiska mediat, så det är per se inget protokoll, lika lite som RS485, RS232 etc är prokoll.
Okej. Är det samma sak som Profinet och Profibus? Profibus är har väll något annat uttag jämfört med Profinet och Profinet körs väll med TCP/IP?
Eller är det bara Modbus som har det klassiska "nätverks RJ45"-anslutningen?
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 »

Profinet är profinet, ethercat är ethercat och modbus tcp/udp är modbus tcp/udp. De är olika protokoll som använder TCP/UDP för transport. Oftast med RJ45 kontakt.
Profibus använder RS-485, ofta med den karakteristiska 9-pol DSUB kontakten.
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 »

Eller är det bara Modbus som har det klassiska "nätverks RJ45"-anslutningen?
Modbus kan använda alla typer av anslutningar, eftersom det normalt sett körs över RS485, kan var 2 eller flera skruvplintar, DB9, DB25, RJ45 osv.
Dock Modbus TCP/IP körs ju oftast på en Ethernetlina, och Ethernet använder ju normalt sett RJ45, dock kan ju man alltid köra det över en optisk fiber, och då blir ju anslutningarna annorlunda.
Du måste lära dig att skilja mellan dataprotokoll, såsom Modbus/IP/TCP osv, eftersom de är fullständigt oberoende av det fysiska gränssnittet, dvs Ethernet, RS232. RS485 osv
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Läsa Modbus med arduino

Inlägg av DanielM »

Jag bara gör en liten enkel förstudie på vilket protokoll som passar mig och det som är enklast att ha som C kod. Profibus och Profinet verkade krångligt. Så det får nog bli Modbus eller CANopen. Sett att nästan alla industriella produkter idag har antingen Profibus, Profinet, EtherCAT och CANopen.

Jag har dessutom sett mindre Modbus. Kan detta ha med att övriga protokoll är nyare än Modbus? Företag som jag har pratat med vägrar släppa in folk som vill koppla upp sig på deras nätverk. Det måste vara RJ485, CANBUS eller något annat lokalt enkelt nätverk. Undantag är de stora drakarna typ Beckhoff eller Siemens. Dom får koppla upp sig. Men det är begränsningar där också.

Tänk om man skulle ha haft UDP/IP som fysiska lagret för CANOpen då UDP så kan man köra Peer to Peer och broadcast, alltså man skickar till alla.
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 »

Jag har inte sett någon minskning av stödet för modbus tcp, snarare tvärt om.
Nästan alla stöder modbus eftersom det är så inarbetat och en öppen standard.

Edit:
Kan tillägga att det där med att bli insläppt i nätverket inte direkt har någon koppling till protokollet, det brukar vara IT-folket som är nitiska och har en allmän skeptisk inställning till automationssidan.
Skriv svar