camfer-pr

veterplua/chamfer/camfer-pr

No description
camfer-pr
@/camfer-pr
SXport
Порт STEP X
DXport
Порт DIR X
SYport
Порт STEP Y
DYport
Порт DIR Y
LENnumber
DEPnumber
TIEnumber
IMPnumber
YMULnumber
UPDpulse
camfer-pr
SX
DX
SY
DY
LEN
DEP
TIE
IMP
YMUL
UPD
OUTX
OUTY
OUTR
OUTRnumber
OUTYnumber
OUTXnumber
To use the node in your project you should have the veterplua/chamfer library installed. Use the “File → Add Library” menu item in XOD IDE if you don’t have it yet. See Using libraries for more info.

C++ implementation

#include <math.h>
node {

            int NOD(int a, int b)
{
    while(a > 0 && b > 0)

        if(a > b)
            a %= b;

        else
            b %= a;

    return a + b;
}
    void evaluate(Context ctx) {


        auto enc = getValue<input_ENCD>(ctx);
        auto sx = getValue<input_SX>(ctx);
        auto sy = getValue<input_SY>(ctx);
        auto dx = getValue<input_DX>(ctx);
        auto dy = getValue<input_DY>(ctx);
        auto ex = getValue<input_EX>(ctx);
        auto ey = getValue<input_EY>(ctx);
        bool dirX = false;
        bool dirY = false;
        float len = getValue<input_LEN>(ctx);
        float dep = getValue<input_DEP>(ctx);
        int ymul = getValue<input_YMUL>(ctx);
        float tie = getValue<input_TIE>(ctx); //Глубина врезки за проход в мм
        unsigned int imp = getValue<input_IMP>(ctx); //Импульсов на 1 мм движения по оси Х
        int kx; //коэф. по оси X
        int ky; //коэф. по оси Y
        int res; // НОД двух чисел (результирующая)
        int lx = len * 10000;
        int ly = dep * 10000 * ymul;
        res = NOD(lx, ly);
        kx = lx / res;
        ky = ly / res;
        int kimp = 0;
        unsigned long countimp = 0;
        unsigned long countmin = 0;
        float gsin = dep / sqrt (len * len + dep * dep); // sin угла при прямой len
        unsigned long VALsfeeds =  round(gsin * len / tie) ; // кол-во подач поперпендикуляру гипотенузы
        unsigned long slen = round(imp * len);  // Кол-во шагов по оси X
        unsigned long sdep = ymul * round(imp * dep); // Общее кол-во шагов по оси Y
        unsigned long sfeedsY = round(sdep / VALsfeeds); // Кол-во шагов на подачу по оси Y
        unsigned long sfeedsX = round(slen / VALsfeeds); // Кол-во шагов на подачу по оси X
        unsigned long num = 0;
        unsigned long moove = 0;
        unsigned long numpass = 0;
        unsigned long numx = 0;
        unsigned long numy = 0;

        if (!isInputDirty<input_UPD>(ctx))
                return;

        if (ly >= lx) kimp = trunc(ly / lx);
        else kimp = trunc(lx / ly);




        pinMode(enc, INPUT);
        pinMode(sx, OUTPUT);
        pinMode(sy, OUTPUT);
        pinMode(dx, OUTPUT);
        pinMode(dy, OUTPUT);
        pinMode(ex, OUTPUT);
        pinMode(ey, OUTPUT);

        digitalWrite(ex, false);
        digitalWrite(ey, false);


// Если Ly>Lx
// Углубление резца на 1 подачу по оси Y
        //dirX = false;
        dirY = false;
        //digitalWrite(dx, dirX); // Движение X <
        digitalWrite(dy, dirY);
        num = 0;
        moove = sfeedsY;
     do {
            if (!digitalRead(enc)) {
            digitalWrite(sy, false);
            while (!digitalRead(enc)) {}
                                    }
            if (digitalRead(enc)) {
            digitalWrite(sy, true);
            while (digitalRead(enc)) {}
            num = num + 1;
                                    }
        } while (num <= moove);
// ТЕЛО движения по гипотенузе ---------------

// Проход по гипотинузе сзада вперед и справа налево
        dirX = true;
        dirY = true;
        digitalWrite(dx, dirX); 
        digitalWrite(dy, dirY);
        num = 0;
        moove = sfeedsX;
        countimp = 0;
        countmin = 0;
     do {
            if (!digitalRead(enc)) {
            digitalWrite(sx, false);
            digitalWrite(sy, false);
            while (!digitalRead(enc)) {}
                                }
            if (digitalRead(enc)) {
            //digitalWrite(sx, true);
            digitalWrite(sy, true);
            countimp ++
            if(countimp % kimp = 0 && countmin <= kx) {
                digitalWrite(sx, true); countmin ++;
            }

            if (countmin = kx) countmin = 0;
            if (countimp = ky) countimp = 0;
            num ++;
            while (digitalRead(enc)) {}                   }
        } while (num < moove);






// Конец ТЕЛА движения по гипотенузе ---------------

// Смещение резца на 1 подачу по оси X
        //dirX = false;
        dirX = true;
        digitalWrite(dx, dirX); // Движение X <
        //digitalWrite(dy, dirY);
        num = 0;
        moove = sfeedsX;
     do {
            if (!digitalRead(enc)) {
            digitalWrite(sx, false);
            //digitalWrite(sy, false);
            while (!digitalRead(enc)) {}
                                }
            if (digitalRead(enc)) {
            digitalWrite(sx, true);
            //digitalWrite(sy, true);
            while (digitalRead(enc)) {}
            num = num + 1;
                               }
        } while (num <= moove);


        emitValue<output_OUTX>(ctx, sfeedsX);
        emitValue<output_OUTY>(ctx, sfeedsY);
        emitValue<output_OUTR>(ctx, VALsfeeds);
    }
}