⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emcmodule.cc

📁 CNC 的开放码,EMC2 V2.2.8版
💻 CC
📖 第 1 页 / 共 4 页
字号:
}static PyObject *Stat_joint_position(pyStatChannel *s) {    PyObject *res = PyTuple_New(EMC_AXIS_MAX);    for(int i=0; i<EMC_AXIS_MAX; i++) {        PyTuple_SetItem(res, i,                PyFloat_FromDouble(s->status.motion.axis[i].output));    }    return res;}static PyObject *Stat_joint_actual(pyStatChannel *s) {    PyObject *res = PyTuple_New(EMC_AXIS_MAX);    for(int i=0; i<EMC_AXIS_MAX; i++) {        PyTuple_SetItem(res, i,                PyFloat_FromDouble(s->status.motion.axis[i].input));    }    return res;}static PyObject *Stat_probed(pyStatChannel *s) {    return pose(s->status.motion.traj.probedPosition);}static PyObject *Stat_activegcodes(pyStatChannel *s) {    return int_array(s->status.task.activeGCodes, ACTIVE_G_CODES);}static PyObject *Stat_activemcodes(pyStatChannel *s) {    return int_array(s->status.task.activeMCodes, ACTIVE_M_CODES);}static PyObject *Stat_activesettings(pyStatChannel *s) {   return double_array(s->status.task.activeSettings, ACTIVE_SETTINGS);}static PyObject *Stat_din(pyStatChannel *s) {    return uchar_array(s->status.io.aux.din, EMC_AUX_MAX_DIN);}static PyObject *Stat_dout(pyStatChannel *s) {    return uchar_array(s->status.io.aux.dout, EMC_AUX_MAX_DOUT);}static PyObject *Stat_limit(pyStatChannel *s) {    int sz = NUM_AXES;    PyObject *res = PyTuple_New(sz);    for(int i = 0; i < sz; i++) {        int v = 0;        if(s->status.motion.axis[i].minHardLimit) v |= 1;        if(s->status.motion.axis[i].maxHardLimit) v |= 2;        if(s->status.motion.axis[i].minSoftLimit) v |= 4;        if(s->status.motion.axis[i].maxSoftLimit) v |= 8;        PyTuple_SET_ITEM(res, i, PyInt_FromLong(v));    }    return res;}static PyObject *Stat_homed(pyStatChannel *s) {    int sz = NUM_AXES;    PyObject *res = PyTuple_New(sz);    for(int i = 0; i < sz; i++) {        PyTuple_SET_ITEM(res, i, PyInt_FromLong(s->status.motion.axis[i].homed));    }    return res;}static PyObject *Stat_ain(pyStatChannel *s) {    return double_array(s->status.io.aux.ain, EMC_AUX_MAX_AIN);}static PyObject *Stat_aout(pyStatChannel *s) {    return double_array(s->status.io.aux.aout, EMC_AUX_MAX_AOUT);}static void dict_add(PyObject *d, char *name, unsigned char v) {    PyObject *o;    PyDict_SetItemString(d, name, o = PyInt_FromLong(v));    Py_XDECREF(o);}static void dict_add(PyObject *d, char *name, double v) {    PyObject *o;    PyDict_SetItemString(d, name, o = PyFloat_FromDouble(v));    Py_XDECREF(o);}#define F(x) F2(#x, x)#define F2(y,x) dict_add(res, y, s->status.motion.axis[axisno].x)static PyObject *Stat_axis_one(pyStatChannel *s, int axisno) {    PyObject *res = PyDict_New();    F(axisType);    F(units);    F(p);    F(i);    F(d);    F(ff0);    F(ff1);    F(ff2);    F(backlash);    F(bias);    F2("max_error", maxError);    F(deadband);    F2("cycle_type", cycleTime);    F2("input_scale", inputScale);    F2("input_offset", inputOffset);    F2("output_scale", outputScale);    F2("output_offset", outputOffset);    F2("min_position_limit", minPositionLimit);    F2("max_position_limit", maxPositionLimit);    F2("min_output_limit", minOutputLimit);    F2("max_output_limit", maxOutputLimit);    F2("max_ferror", maxFerror);    F2("min_ferror", minFerror);    F2("homing_vel", homingVel);    F(setup_time);    F(hold_time);    F2("home_offset", homeOffset);    F(setpoint);    F2("ferror_current", ferrorCurrent);    F2("ferror_highmark", ferrorHighMark);    F(output);    F(input);    F(inpos);    F(homing);    F(homed);    F(fault);    F(enabled);    F2("min_soft_limit", minSoftLimit);    F2("max_soft_limit", maxSoftLimit);    F2("min_hard_limit", minHardLimit);    F2("max_hard_limit", maxHardLimit);    F2("override_limits", overrideLimits);    F(scale);    return res;}#undef F#undef F2static PyObject *Stat_axis(pyStatChannel *s) {    PyObject *res = PyTuple_New(EMC_AXIS_MAX);    for(int i=0; i<EMC_AXIS_MAX; i++) {        PyTuple_SetItem(res, i, Stat_axis_one(s, i));    }    return res;}static PyStructSequence_Field tool_fields[] = {    {"id", },    {"zoffset", },    {"xoffset", },    {"diameter", },    {"frontangle", },    {"backangle", },    {"orientation", },    {0,},};static PyStructSequence_Desc tool_result_desc = {    "tool_result", /* name */    "", /* doc */    tool_fields,    7};static PyTypeObject ToolResultType;static PyObject *Stat_tool_table(pyStatChannel *s) {    PyObject *res = PyTuple_New(CANON_TOOL_MAX);    int j=0;    for(int i=1; i<=CANON_TOOL_MAX; i++) {        struct CANON_TOOL_TABLE &t = s->status.io.tool.toolTable[i];        if(t.id == 0) continue;        PyObject *tool = PyStructSequence_New(&ToolResultType);        PyStructSequence_SET_ITEM(tool, 0, PyInt_FromLong(t.id));        PyStructSequence_SET_ITEM(tool, 1, PyFloat_FromDouble(t.zoffset));        PyStructSequence_SET_ITEM(tool, 2, PyFloat_FromDouble(t.xoffset));        PyStructSequence_SET_ITEM(tool, 3, PyFloat_FromDouble(t.diameter));        PyStructSequence_SET_ITEM(tool, 4, PyFloat_FromDouble(t.frontangle));        PyStructSequence_SET_ITEM(tool, 5, PyFloat_FromDouble(t.backangle));        PyStructSequence_SET_ITEM(tool, 6, PyInt_FromLong(t.orientation));        PyTuple_SetItem(res, j, tool);        j++;    }    _PyTuple_Resize(&res, j);    return res;}// XXX io.tool.toolTable// XXX EMC_AXIS_STAT motion.axis[]static PyGetSetDef Stat_getsetlist[] = {    {"actual_position", (getter)Stat_actual},    {"ain", (getter)Stat_ain},    {"aout", (getter)Stat_aout},    {"axis", (getter)Stat_axis},    {"din", (getter)Stat_din},    {"dout", (getter)Stat_dout},    {"gcodes", (getter)Stat_activegcodes},    {"homed", (getter)Stat_homed},    {"limit", (getter)Stat_limit},    {"mcodes", (getter)Stat_activemcodes},    {"origin", (getter)Stat_origin},    {"position", (getter)Stat_position},    {"joint_position", (getter)Stat_joint_position},    {"joint_actual_position", (getter)Stat_joint_actual},    {"probed_position", (getter)Stat_probed},    {"settings", (getter)Stat_activesettings},    {"tool_offset", (getter)Stat_tool_offset},    {"tool_table", (getter)Stat_tool_table},    {NULL}};PyTypeObject Stat_Type = {    PyObject_HEAD_INIT(NULL)    0,                      /*ob_size*/    "emc.stat",             /*tp_name*/    sizeof(pyStatChannel),  /*tp_basicsize*/    0,                      /*tp_itemsize*/    /* methods */    (destructor)Stat_dealloc, /*tp_dealloc*/    0,                      /*tp_print*/    0,                      /*tp_getattr*/    0,                      /*tp_setattr*/    0,                      /*tp_compare*/    0,                      /*tp_repr*/    0,                      /*tp_as_number*/    0,                      /*tp_as_sequence*/    0,                      /*tp_as_mapping*/    0,                      /*tp_hash*/    0,                      /*tp_call*/    0,                      /*tp_str*/    0,                      /*tp_getattro*/    0,                      /*tp_setattro*/    0,                      /*tp_as_buffer*/    Py_TPFLAGS_DEFAULT,     /*tp_flags*/    0,                      /*tp_doc*/    0,                      /*tp_traverse*/    0,                      /*tp_clear*/    0,                      /*tp_richcompare*/    0,                      /*tp_weaklistoffset*/    0,                      /*tp_iter*/    0,                      /*tp_iternext*/    Stat_methods,           /*tp_methods*/    Stat_members,           /*tp_members*/    Stat_getsetlist,        /*tp_getset*/    0,                      /*tp_base*/    0,                      /*tp_dict*/    0,                      /*tp_descr_get*/    0,                      /*tp_descr_set*/    0,                      /*tp_dictoffset*/    (initproc)Stat_init,    /*tp_init*/    0,                      /*tp_alloc*/    PyType_GenericNew,      /*tp_new*/    0,                      /*tp_free*/    0,                      /*tp_is_gc*/};static int Command_init(pyCommandChannel *self, PyObject *a, PyObject *k) {    char *file = get_nmlfile();    if(file == NULL) return -1;    RCS_CMD_CHANNEL *c =        new RCS_CMD_CHANNEL(emcFormat, "emcCommand", "xemc", file);    if(!c) {        PyErr_Format( error, "new RCS_CMD_CHANNEL failed");        return -1;    }    RCS_STAT_CHANNEL *s =        new RCS_STAT_CHANNEL(emcFormat, "emcStatus", "xemc", file);    if(!c) {        PyErr_Format( error, "new RCS_STAT_CHANNEL failed");        return -1;    }    self->s = s;    self->c = c;    return 0;}static void Command_dealloc(PyObject *self) {    delete ((pyCommandChannel*)self)->c;    PyObject_Del(self);}static PyObject *block_delete(pyCommandChannel *s, PyObject *o) {    EMC_TASK_PLAN_SET_BLOCK_DELETE m;    if(!PyArg_ParseTuple(o, "i", &m.state)) return NULL;                m.serial_number = next_serial(s);    s->c->write(m);    emcWaitCommandReceived(s->serial, s->s);    Py_INCREF(Py_None);    return Py_None;}static PyObject *optional_stop(pyCommandChannel *s, PyObject *o) {    EMC_TASK_PLAN_SET_OPTIONAL_STOP m;    if(!PyArg_ParseTuple(o, "i", &m.state)) return NULL;                m.serial_number = next_serial(s);    s->c->write(m);    emcWaitCommandReceived(s->serial, s->s);    Py_INCREF(Py_None);    return Py_None;}static PyObject *mode(pyCommandChannel *s, PyObject *o) {    EMC_TASK_SET_MODE m;    if(!PyArg_ParseTuple(o, "i", &m.mode)) return NULL;    switch(m.mode) {        case EMC_TASK_MODE_MDI:        case EMC_TASK_MODE_MANUAL:        case EMC_TASK_MODE_AUTO:            break;        default:            PyErr_Format(PyExc_ValueError,"Mode should be MODE_MDI, MODE_MANUAL, or MODE_AUTO");            return NULL;    }    m.serial_number = next_serial(s);    s->c->write(m);    emcWaitCommandReceived(s->serial, s->s);    Py_INCREF(Py_None);    return Py_None;}static PyObject *feedrate(pyCommandChannel *s, PyObject *o) {    EMC_TRAJ_SET_SCALE m;    if(!PyArg_ParseTuple(o, "d", &m.scale)) return NULL;    m.serial_number = next_serial(s);    s->c->write(m);    emcWaitCommandReceived(s->serial, s->s);    Py_INCREF(Py_None);    return Py_None;}static PyObject *spindleoverride(pyCommandChannel *s, PyObject *o) {    EMC_TRAJ_SET_SPINDLE_SCALE m;    if(!PyArg_ParseTuple(o, "d", &m.scale)) return NULL;    m.serial_number = next_serial(s);    s->c->write(m);    emcWaitCommandReceived(s->serial, s->s);    Py_INCREF(Py_None);    return Py_None;}static PyObject *spindle(pyCommandChannel *s, PyObject *o) {    int dir;    if(!PyArg_ParseTuple(o, "i", &dir)) return NULL;    switch(dir) {        case LOCAL_SPINDLE_FORWARD:        case LOCAL_SPINDLE_REVERSE:        {            EMC_SPINDLE_ON m;            m.speed = dir;            m.serial_number = next_serial(s);            s->c->write(m);            emcWaitCommandReceived(s->serial, s->s);        }            break;        case LOCAL_SPINDLE_INCREASE:        {            EMC_SPINDLE_INCREASE m;            m.serial_number = next_serial(s);            s->c->write(m);            emcWaitCommandReceived(s->serial, s->s);        }            break;        case LOCAL_SPINDLE_DECREASE:        {            EMC_SPINDLE_DECREASE m;            m.serial_number = next_serial(s);            s->c->write(m);            emcWaitCommandReceived(s->serial, s->s);        }            break;        case LOCAL_SPINDLE_CONSTANT:        {            EMC_SPINDLE_CONSTANT m;            m.serial_number = next_serial(s);            s->c->write(m);            emcWaitCommandReceived(s->serial, s->s);        }            break;        case LOCAL_SPINDLE_OFF:        {            EMC_SPINDLE_OFF m;            m.serial_number = next_serial(s);            s->c->write(m);            emcWaitCommandReceived(s->serial, s->s);        }            break;        default:            PyErr_Format(PyExc_ValueError,"Spindle direction should be SPINDLE_FORWARD, SPINDLE_REVERSE, SPINDLE_OFF, SPINDLE_INCREASE, SPINDLE_DECREASE, or SPINDLE_CONSTANT");            return NULL;    }    Py_INCREF(Py_None);    return Py_None;}static PyObject *mdi(pyCommandChannel *s, PyObject *o) {    char *cmd;    int len;    if(!PyArg_ParseTuple(o, "s#", &cmd, &len)) return NULL;    if(len >= 255) {        PyErr_Format(PyExc_ValueError,"MDI commands limited to 255 characters");        return NULL;    }    EMC_TASK_PLAN_EXECUTE m;    m.serial_number = next_serial(s);    strcpy(m.command, cmd);    s->c->write(m);    emcWaitCommandReceived(s->serial, s->s);    Py_INCREF(Py_None);    return Py_None;}static PyObject *state(pyCommandChannel *s, PyObject *o) {    EMC_TASK_SET_STATE m;    if(!PyArg_ParseTuple(o, "i", &m.state)) return NULL;    switch(m.state){        case EMC_TASK_STATE_ESTOP:        case EMC_TASK_STATE_ESTOP_RESET:        case EMC_TASK_STATE_ON:        case EMC_TASK_STATE_OFF:            break;        default:            PyErr_Format(PyExc_ValueError,"Spindle direction should be STATE_ESTOP, STATE_ESTOP_RESET, STATE_ON, or STATE_OFF");            return NULL;    }    m.serial_number = next_serial(s);    s->c->write(m);    emcWaitCommandReceived(s->serial, s->s);    Py_INCREF(Py_None);    return Py_None;}static PyObject *tool_offset(pyCommandChannel *s, PyObject *o) {    EMC_TOOL_SET_OFFSET m;    if(!PyArg_ParseTuple(o, "idd", &m.tool, &m.length, &m.diameter)) return NULL;    m.serial_number = next_serial(s);    s->c->write(m);    emcWaitCommandReceived(s->serial, s->s);    Py_INCREF(Py_None);    return Py_None;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -