📄 emcmodule.cc
字号:
}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 + -