Tolka oregelbunden data - Klient och Server

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

Re: Tolka oregelbunden data - Klient och Server

Inlägg av Icecap »

Nu är jag tydligen nybörjare - men jag har fått det att fungera genom alla år, något som den "erfarna" Al tydligen inte klarar.

En länk till Al: Läs detta, Al, fastän jag vet att du inte förstår det.

Jag har genom "alla" år kört med STX (0x02)<Data><Checksum>ETX (0x03).
Data i ASCII (värdet 123 blir alltså '1', '2', '3' osv.) Checksum blir då en hexadecimal utskrift.

Datacheck: Om alla värden är inom 'A'-'F' eller '0'-'9' är saken biff. Då ska checksum kollas och om allt är bra plockar jag ut data.
Ibland behövs det fler värden, då separerar jag med t.ex.'|' eller ',' - lite beroende på vad som behövs.

Och tänk sig - det har fungerat riktigt bra under alla åren...
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Tolka oregelbunden data - Klient och Server

Inlägg av sodjan »

Vi har traditionellt (då all kommunikation hade en RS232 del någonstans, oftast i den
sista länken mot produktionsutrustningen) använt STX/ETX för att avgränsa meddelanden.

Sedan ett år tillbaka (idag kör vi inte RS232 mot nya utrustningar längre, alla PLCer och
liknande har LAN port inbyggt) gått över till att inte ha något speciellt starttecken och
bara avsluta alla meddelanden med en enkel CR.

Så idag är allt ASCII, utom terminatorn (CR) som terminal drivern använder för att
avsluta läsningen så att vi alltid får ett komplett meddelande oavsett om TCPIP har
valt att dela det på flera packet på nätet.

Vi har nog 50-60 PLCer i olika utrustningar med var sin kommunikations process.
Fungerar väldigt stabilt och bra...
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Tolka oregelbunden data - Klient och Server

Inlägg av Al_Bundy »

lillahuset skrev:Al: Tja, jag har programmerat för försörjning i snart fyrtio år och har lärt mig att strängar brukar vara väldigt användbara.
Hur brukar du lösa "big endian" och "little endian" i binära dataströmmar? Med strängar blir det trivialt.
Hur debuggar du binärdata på väg mellan två system? Jo du använder något verktyg som kan tolka protokollet. Inget konstigt.
Debugga ASCII-data? Det lämnar jag till dig att lista ut. :)
Så du menar att om jag har A, B, C, D att skicka så skickar jag:

A-B-C-D

Och sedan så delar jag på strängen grundat på "-" ? Det är normal teknik? Min programmeringslärare sade att man ska helst undvika strängar så gått som det går. Det har med att det finns alltid effektivare sätt.

Men stämmer det?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Tolka oregelbunden data - Klient och Server

Inlägg av Al_Bundy »

mrfrenzy skrev:Varför uppfinna hjulet på nytt?
Använd ett befintligt protokoll tex mqtt, modbus, canbus.
Trots att jag ska bara kommunicera via localhost? Det är alltså två program som ska tala med varandra.
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Tolka oregelbunden data - Klient och Server

Inlägg av Lennart Aspenryd »

Nu måste jag lägga mig i detta!
Så länge man har kontroll över både sändandet och mottageriet så kan man språka hur som helst.
Bara man själv kommer ihåg regelverket.
Det verkar som om du Al_Bundy vill trolla upp olika åsikter istället för att lösa och klargöra en funktion.
Hur svårt kan det va?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Tolka oregelbunden data - Klient och Server

Inlägg av Al_Bundy »

Det är väldigt enkelt att skicka en sträng och sedan dela upp den. Men jag hörde från min erfarna lärare, som tycks nu inte vara så erfaren, att strängar ska man försöka undvika så mycket som det går då det finns bättre och effektivare sätt att skicka data.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45168
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Tolka oregelbunden data - Klient och Server

Inlägg av TomasL »

Och varför skall man undvika textsträngar?
jag tror du har missuppfattat det hela rätt ordentligt.

Ja, naturligtvis finns det bättre och effektivare sätt att skicka data, du kan alltid skicka som int8, sint8, int16, sint16, int32 sint32, real, osv (i all oändlighet).Men det förutsätter ju alltid att moottagaren vet vad som skickas.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Tolka oregelbunden data - Klient och Server

Inlägg av Al_Bundy »

sodjan skrev:Vi har traditionellt (då all kommunikation hade en RS232 del någonstans, oftast i den
sista länken mot produktionsutrustningen) använt STX/ETX för att avgränsa meddelanden.

Sedan ett år tillbaka (idag kör vi inte RS232 mot nya utrustningar längre, alla PLCer och
liknande har LAN port inbyggt) gått över till att inte ha något speciellt starttecken och
bara avsluta alla meddelanden med en enkel CR.

Så idag är allt ASCII, utom terminatorn (CR) som terminal drivern använder för att
avsluta läsningen så att vi alltid får ett komplett meddelande oavsett om TCPIP har
valt att dela det på flera packet på nätet.

Vi har nog 50-60 PLCer i olika utrustningar med var sin kommunikations process.
Fungerar väldigt stabilt och bra...
PLC är riktigt fint. Kör TTC control med Codesys 2.3 för att programmera mikroprocessorer och det är kul faktiskt. Men i detta fall så använder jag Python och Java för att tala med varandra.

Så ska jag satsa och köra på strängar?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Tolka oregelbunden data - Klient och Server

Inlägg av Al_Bundy »

TomasL skrev:Och varför skall man undvika textsträngar?
jag tror du har missuppfattat det hela rätt ordentligt.

Ja, naturligtvis finns det bättre och effektivare sätt att skicka data, du kan alltid skicka som int8, sint8, int16, sint16, int32 sint32, real, osv (i all oändlighet).Men det förutsätter ju alltid att moottagaren vet vad som skickas.
I detta fall vet mottagaren vilken ordning data skickas, men problemet är att datan läses in oregelbundet. Det förhindrar ibland vilken ordning datan har skickats, men inte alltid. Så det blir osäkert för mig att läsa utav datan.
sc3
Inlägg: 173
Blev medlem: 10 januari 2011, 11:05:40
Ort: Umeå

Re: Tolka oregelbunden data - Klient och Server

Inlägg av sc3 »

När du läser socket'en i python så kan du inte vara säker på att du får hela meddelandet, särskilt om du inte skickar hela på en gång, så antingen måste du läsa av socketen och räkna antalet bytes, och avsluta när du tagit emot så många bytes du vill ha, eller skicka med en "avslutnings-byte", en markör som indikerar att meddelandet är slut.

observera som jag skrev sist, varje Java int (som är 4 byte) kommer att i mottagande python ända bli 4 byte, dvs du kommer att ha tre "nollor" innan. Hur stora tal ska du skicka? Du kan ju tex ändra i java så du skickar Java byte istället, då slipper du "nollorna"

edit:
nåt liknande detta borde lösa det, (hittat på nätet, är dålig på python):

Kod: Markera allt

def read_socket():
      return socket.recv(1)

 data = b''.join(iter(read_socket, b''))
edit2:
koden ovan läser tills socket.recv(1) returnerar 0, skickar du med ojämna mellanrum kommer du inte få hela meddelande utan då behöver du en markör som meddelar avslut
grottan
Inlägg: 428
Blev medlem: 16 maj 2010, 12:16:42

Re: Tolka oregelbunden data - Klient och Server

Inlägg av grottan »

Al_Bundy skrev:Det är väldigt enkelt att skicka en sträng och sedan dela upp den. Men jag hörde från min erfarna lärare, som tycks nu inte vara så erfaren, att strängar ska man försöka undvika så mycket som det går då det finns bättre och effektivare sätt att skicka data.
Får man fråga vad det var för programmeringsutbildning du gick och var? Endera har du missuppfattat läraren grovt eller så lever personen i fråga i någon sluten bubbla. Går väl inte att kategoriskt säga att strängar är dåligt.... beror ju helt på hur man tillämpar det hela
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Tolka oregelbunden data - Klient och Server

Inlägg av Al_Bundy »

Gick ingen programmeringsutbildning. Jag är en industrimekaniker som har tagit masterexamen då jag insåg att jag ville inte vara en industriarbetare, utan, utvecklare utav mina egna idéer.

Jag är renodlad praktiker och jag läst mycket reglerteknik och systemidentifiering. Jag är mycket intresserad utav kalmanfilter. Jag har nog tagit för mycket på allvar vad läraren har sagt. Normalt brukar jag med en nypa salt vad läraren säger.
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Tolka oregelbunden data - Klient och Server

Inlägg av mankan »

Visserligen är OSI-modellen av nätverkstackar lite väl akademisk/överdriven/föråldrad/osv men om du läser på lite med en nypa salt så kommer du nog få ett antal insikter. Lästips: Computer Networks av Andrew S Tanenbaum.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Tolka oregelbunden data - Klient och Server

Inlägg av Al_Bundy »

Förklara så en Bundy förstår :lol:
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Tolka oregelbunden data - Klient och Server

Inlägg av sodjan »

> ...Men i detta fall så använder jag Python och Java...

Det som diskuteras här är komplett oberoende av vilka verktyg/språk
man använder så länge som man ligger och kör på socket-nivån. Då
har man alltid samma problem att tackla. D.v.s. att trafiken över själva
nätverkat inte alltid motsvarar det som man sänder, det kan delas upp
i olika paket så som TCPIP finner lämpligt.

Antingen har man ett lager mellan nätverket och applikationen som
hanterar det, eller så får man hantera det själv i applikationen.

Sen, när det gäller "strängar" (definitionen av en "sträng" är lite otydlig)
så handlar det mest om att hitta ett format som har lägst sannolikhet för
att misstolkas mellan sändare och mottagare. Binära numeriska format
(speciellt om man börjar blanda in float i det hela) kräver att man har mer
koll än om man skickar numeriska värden som teckensträngar, "123" o.s.v.
Skriv svar