Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Ansteuerung mehrerer Servomotoren

heldus
2017-10-29
2017-11-01
  • heldus - 2017-10-29

    Hallo,

    wir versuchen momentan über Codesys und Raspberry Pi mit Hilfe des PWM-Drivers PCA 9685 16-Channel mehrere Servomotoren (2 oder noch mehr) anzusteuern.

    Folgendes Problem hat sich bei uns ergeben und zwar lässt sich ein Servomotor mit unserem Code ansteuern, also seine Position ändern. Sobald wir aber einen zweiten Servomotor und optional noch mehrere Servomotoren ansteuern möchten bekommen wir das im Programm, als strukturierten Text, nicht mehr umgesetzt.
    Hardwaretechnisch ist mit den Servomotoren soweit alles in Ordnung, lassen sich also einzeln über den PWM-Controller ansteuern.

    Jetzt wäre die Frage, ob sich schon mal jemand damit auseinandergesetzt hat und uns evtl. einen Tipp geben kann wie der Programmverlauf bei zwei oder mehreren Servomotoren aussehen muss.

    Danke für Eure Hilfe

    Programmcode stellt den Versuch da, einen zweiten Servomotor mit einzubinden.

    PROGRAM SoftMotion
    VAR
    uiError: UINT;
    mcp_01 : MC_Power;
    mcp_02 : MC_Power;
    mcma_01 : MC_MoveAbsolute;
    mcma_02 : MC_MoveAbsolute;
    MotionStep: UINT := 0;
    lrSpeed_01: LREAL;
    lrSpeed_02 : LREAL;
    rlAngle_01: LREAL;
    rlAngle_02 : LREAL;

    END_VAR

    CASE MotionStep OF
    0:
    mcp_01(Enable := TRUE,bRegulatorOn := TRUE,bDriveStart:= TRUE, Axis := SM_Drive_Servo_01);
    mcma_01.Acceleration := 1000;
    mcma_01.Deceleration := 1000;
    mcp_02(Enable := TRUE,bRegulatorOn := TRUE,bDriveStart:= TRUE, Axis := SM_Drive_Servo_02);
    mcma_02.Acceleration := 1000;
    mcma_02.Deceleration := 1000;

    lrSpeed_01 := 200;
    lrSpeed_02 := 200;
    
    mcma_01.Velocity := lrSpeed_01; 
    mcma_02.Velocity := lrSpeed_02;
    
    IF mcp_01.Status = TRUE AND mcp_02.Status = TRUE THEN
        MotionStep := 5;
    ELSE
        uiError := 1;
    END_IF
    

    5:

        //mcma_01.Execute := TRUE;
        mcma_01.Position := (rlAngle_01);
        mcma_02.Position := (rlAngle_02);
        mcma_01(Axis := (SM_Drive_Servo_01));
        mcma_02(Axis := (SM_Drive_Servo_02));
    

    END_CASE

     
  • eschwellinger

    eschwellinger - 2017-10-30

    Hi,

    ruf die Motion fb's nach der Statemachine auf:

    .
    .
    .
    END_CASE
    mcp_01(Enable := TRUE,bRegulatorOn := TRUE,bDriveStart:= TRUE, Axis := SM_Drive_Servo_01);
    mcp_02(Enable := TRUE,bRegulatorOn := TRUE,bDriveStart:= TRUE, Axis := SM_Drive_Servo_02);
    mcma_01(Axis := (SM_Drive_Servo_01));
    mcma_02(Axis := (SM_Drive_Servo_02));

    dann sollte es gehen...denke ich.

    Grüße
    Edwin

     
  • heldus - 2017-11-01

    Hi Edwin,

    danke für die schnelle Hilfe es funktioniert jetzt so wie gewollt.

    Ich hätte noch eine Frage bezüglich der Motion FBs die ich jetzt verschoben habe, funktioniert dies im Case nicht weil wir in einen neuen Schritt springen und dann die Eingänge für die Bausteine quasi nicht mehr gesetzt sind oder was ist der Grund dafür dass diese im Case nicht so funktionieren wie gewollt?

    Gruß

     
  • eschwellinger

    eschwellinger - 2017-11-01

    Hi,
    die Bedingungen für die Verwendung der Motion FB's sind:
    Sie müssen einmal pro Zyklus aufgerufen werden sonst kommt ne Fehlermeldung. (->die Trajektorie wird ja in den Motion
    FB's gerechnet, daher ist das eine Ãœberwachung)
    Wenn du die FB's (Instanzaufruf) in dem Case oben aufrufst ist das ja nicht gewährleistet das Sie einmal pro Zyklus dran kommen,
    sondern eben nur wenn man sich in dem jeweiligen CASE befindet.

    Grüße
    Edwin

     

Log in to post a comment.