Byte-Swap für GO[] mit 16 Bit mit Makro

  • Hallo,
    mir wurde aufgetragen eine ProfiBus-Verbindung zwischen einem FANUC Arcmate 100iC und einem Pulverförderer des Herstellers GTV einzurichten. Der Pulverförderer fungiert dabei als Slave, und der Roboter als Master. Die grundlegende Kommunikation und das Setzen einzelner Bytes funktioniert inzwischen auch so weit.
    Jetzt habe ich jedoch ein Problem bei der Reihenfolge der übertragenen Bits wenn man diese im Fanuc als gruppiert.
    Ich möchte bspw. einen Integer-Wert von 431 übertragen. Also: GO[1] = 431
    Die Steuerung rechnet das auch richtig in die entsprechende Bitbelegung um. Da 16 Bit vom Pulverförderer erwartet werden sehen die DO[] dann so aus:

    431 = 0000 0001 1010 1111 --> DO[15] = 0; DO[14] = 0; .........; DO[1] = 1; DO[0] = 1
    Die Steuerung sendet diese Bits dann auch in dieser Reihenfolge. Also:
    15/14/13/12/11/10/9/8 | 7/6/5/4/3/2/1/0
    So weit so gut. Das Problem ist jedoch das der Förderer die beiden Bytes beim Einlesen vertauscht. Der Förderer deutet die gesendeten Daten in dieser Reihenfolge:
    7/6/5/4/3/2/1/0 | 15/14/13/12/11/10/9/8
    Normalerweise kann man das einfach umstellen. Der Support von GTV hat mir mitgeteilt dass dafür jedoch das SPS-Programm geändert werden muss und das Geld kostet. Das findet mein Chef natürlich nicht so toll.
    FANUC hat mir wiederrum mitgeteilt, dass ich das über ein Makro lösen soll.


    Prinzipiell ist das ja auch nicht schwer. Ich dachte ich dividiere einfach klassisch den Integerwert immer mit 2 und bei Rest = 1 ist das Bit eben 1 und bei Rest = 0 ist eben 0. Dabei arbeite ich mit einem R[]-Parameter und weise innerhalb des Makros einzeln die entsprechend vertauschten DO[] zu....so weit zur Theorie


    Das Problem ist, dass ich noch nie ein Fanuc-Programm erstellt habe und deswegen recht "erstaunt" auf das Pendant drücke und gucke was passiert. Ich finde online auch keinerlei Dokumentation wo alle Programmierbefehle aufgeführt sind. Die Schulungsunterlagen die mir zur Verfügung gestellt wurden beinhalten nur das Teachen eines Pfades etc. aber keine Berechnungen o.Ä..
    Gibt es also eine entsprechende Rechenfunktion für das "Behalten" des Restes? Oder sogar eine alternative Lösung des Problems?


    Danke im Vorraus,
    Rico

  • ANZEIGE
  • Hallo RicoH,
    ja eine Modulo-Operation (Restdivision) gibt es . Diese ist bei den Register Statements zu finden.

    Code
    1: R[1]=R[2] MOD R[3] 
    2: !Bsp: Bei R[2]=4 und R[3]=2 wird R[1] der Wert 0 zugewiesen


    LG, dax

    Always look on the bright side of life!<br /><br />Verlass dich nicht auf andere. Mach deine eigenen Fehler! - Manfred Hinrich

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden