I modbus vet man alltid hur många bytes som skall sändas och tas emot, mastern vet i alla lägen hur många bytes slaven sänder.DanielM skrev: ↑7 februari 2025, 12:41:52TomasL skrev: ↑2 januari 2025, 20:21:32 Vi implementerade det bibliotek jag länkade till ihop med OpenRTOS på en PIC32MX795, det funkar perfekt utan några som helst modifikationer, från dag 1.
Dock fick vi lite problem med ABB omformare, som i vissa lägen skickar fel checksumma, så vi fick modda lite grand innan ABB fixade det hela.
I Mastern körde vi både MASTER RTU och SERVER TCP, i TCP-koden så använde vi DMA vid mottagning, eftersom det inte finns någon timing på TCP-versionen.
I RTU-koden så körde vi tighta interrupt för både mottagning och sändning, i hastigheter upp till runt 230kb/s(230400 b/s) över det fick vi problem. Eftersom vi defaultade till 19,2 så var det inga problem.
Om du ska ta emot X bytes, som du har ingen kännedom om. Hur skulle du göra då?
Du kan använda en interrupt som aktiveras vid 1 byte. Men om du skickar 10 byte, då kommer interrupten att köras 10 gånger, eller hinner du läsa 10 byte, innan du återkallar på interruptens inställning igen?
Slaven vet naturligtvis inte hur många bytes som mastern sänder, men normalt sett, så, beroende på implementation handlar det om 8, 16 , 32 eller 64 bytes, och det är inga problem med interrupt och eventuell dma.
Processorn är alltid såpass mycket snabbare än överföringshastigheten, så interrupten kommer inte sådär jätteofta.
Det normala för en modbus-lina är 9k6 eller 19k2.
Ja, man startar om timern varje gång, men som sagt, snurrar processorn med flera 10-tals MHz eller flera 100-tal MHz, så hinns rätt mycket med, 2000 int/sec är ju inte så mycket i ett sånt läge, och är bufferten länge än 1 Byte, så blir det ju motsvarande färre antal int.