PLS - MQTT kommunikasjon ble implementert med hjelp av nødvendige bibliotek: WagoAppCloud, WagoSysPlainMem, FloatingPointUtils. Desse blei lagt til via library manager i application.

Subscriber

PLS programmet trenger ein subscriber for å få informasjonen frå kontrolleren. Dette blir gjort med WagoAppCloud biblioteket sin funksjonsblokk for subscriber.

Det viktige her er subData. Subscriber-blokka kopierer mottatt data inn i subData variablen, dette er i form ARRAY OF BYTE. Deretter blir det brukt memcopy frå FloatingPointUtils, for å kopiere den mottatte dataen til variablen angleData, som er ein string. Det er angleData som blir outputen for subscriberen. Videre blir stringen konvertert til riktig form for gjeldande kommunikasjonsprotokoll


 For info om funksjonen til resten av variablane se bilde eller dokumentasjon til WagoAppCloud.

Variablane er beskreven med kommentar


Meldinger

Frå arduinoen blir det send ein array of byte. Strukturen på dinna arrayen er følgende

Kvar enkoder i kontrolleren sender ut ein 10 bit verdi, altså den kan vise ein tallverdi frå 0-1024. Fordi MQTT Biblioteket for CodeSys tar inn array of byte, må vi konvertere dei 10bit tallverdiane fra enkoderane til byte. Måten vi gjør dette er slik. Følgende tallverdiar er vilkårlege

enkoder 1 = 1015 = 1111110111

Vi konverterer dette til å representere kvar tall i byte. Dette blir 

enkoder 1 = 1015 = 00000001 , 00000000, 00000001, 00000101

enkoder 2 = 0658 = 00000000, 00000110, 00000101, 00001000

og vidare for resten av enkoderane. Resultatet av dette blir at vi sender ein array of byte av med 20 byte. 20 byte fordi vi har 5 enkodera, og vi trenger 4 byte for å representere kvar av dei. 


Prossesering av melding


Når PLS har subscriberen implementert, må ein prosessere dataen den får in. Dette blei gjort vi ein funksjonsblokk "Split_string_to_int". 



Denne funksjonsblokka tar inn dataen fra subscriberen, og prosseserar den.


Vi tar inndataen på 20 byte og splitter den opp i 4 byte, ein for kvar enkoder verdi. Fordi datatypen string og array of byte er prinsippielt det same, og det var lettare å konvertere blei det gjort på denne måten.

Utgangsdataen frå funksjonsblokka er ein array of int, der rekkefølga på enkoder går frå er slik:

aiJointBinaryState = [base, shoulder, elbow, wrist1, wrist2, wrist3], der kvar verdi er fra 0-1023.









  • No labels