/********************************************************************* *文件说明: 数据类型声明 *作者: logos *日期: 2017/02/07 *修改日志: 2017/02/07 CW4945 创建 ***********************************************************************/ #pragma once #ifndef _INCLUDE_DTYPE_H_ #define _INCLUDE_DTYPE_H_ #ifndef EXPORT_C #define EXPORT_C extern "C" #endif #ifndef WINAPI #define WINAPI __stdcall #endif #ifndef ushort #define ushort unsigned short #endif #ifndef MAX_ID_LEN #define MAX_ID_LEN 16 #endif #ifndef MAX_NAME_LEN #define MAX_NAME_LEN 32 #endif #ifndef MAX_BUF_LEN #define MAX_BUF_LEN 256 #endif #ifndef PARAM_CNT #define PARAM_CNT 8 #endif #ifndef RES_CNT #define RES_CNT 16 #endif struct TParam {//参数结构体 -- 用于插件初始化 char data[PARAM_CNT][MAX_NAME_LEN]; //参数 }; enum EDevStatus {//对象状态 EDev_NOINIT = 0, //未初始化 EDev_ERROR, //异常 EDev_IDLE, //就绪 }; enum EMoveStatus {//运动状态 EMove_NOHOME = 3, //未回原 EMove_STOP, //停止状态 -- 异常停止,限位停止 EMove_ISMOVING, //运动中 EMove_ISHOME, //回原中 EMove_PAUSE, //暂停 EMove_PAUSING, //正在暂停 EMove_STOPING, //正在停止 }; enum EIOType {//IO类型 IOT_COMIN = 0, //通用输入 IOT_COMOUT, //通用输出 IOT_LIMITP, //正限位 IOT_LIMITN, //负限位 IOT_ALARM, //报警 IOT_HOME, //原点 IOT_SEVON, //使能 IOT_CLEARALARM, //清除报警 }; enum EMPosType {//轴位置类型 EMPos_Default = -1, //默认位置 伺服-编码器 步进-规划器 EMPos_Encoder, //编码器位置 EMPos_Profile, //规划器位置 }; struct TDevInfo {//硬件信息 char id[MAX_ID_LEN]; //硬件id,不得超过16位 char desc[MAX_NAME_LEN]; //硬件描述 TParam homep; //回原方法描述 TParam param; //初始化参数描述 ushort paramCnt; //初始化参数个数 ushort homeCnt; //回原方式数量,homep 数组大小 ushort axisCnt; //轴数量 motor-轴/专用IO数量 ushort ioCnt; //io-通用IO位数 ushort adCnt; //ad-通道数量 ushort reserved[3]; //保证8位对齐 }; struct TSpeed {//速度结构 double vel; double acc; double dec; }; struct TVisionDevInfo {//视觉插件信息 char id[MAX_ID_LEN]; //插件类型id -- 作为对象类型标识符,不能重复 char desc[MAX_NAME_LEN]; //硬件描述 TParam param; //初始化参数描述 ushort paramCnt; //参数个数 ushort reserved[3]; //保证8位对齐 }; struct TVisionResult {//视觉结果结构体 int res; //结果 0 - ok int resCnt; //结果个数 double val[RES_CNT]; //结果 }; struct TVisionImage {//视觉图像 ushort width; //图像宽 ushort heigh; //图像高 ushort channel; //图像通道 1通道 3通道(彩色) ushort rowbytes; //每行占多少字节 char* pdata; //数据缓冲区 }; #define DEFAULTPOS 10000 //默认位置 -- 正限位、负限位、原点搜索距离+方向 #define MAX_AXIS_CNT 6 //工站最大轴数量 #define MAX_TOOL_CNT 10 //Tool数量 #define MAX_PALLET_CNT 50 //料盘数量 #define MAX_POINT_CNT 200 //工站点位个数 #define PAGE_AD_CNT 8 //每页AD通道数 #define PAGE_IO_CNT 16 //每页IO点数 #define PAGE_AXIS_CNT 8 //每页Axis点数 #define NEWDEVCNT 10 //每个插件最多实例化多少个对象 enum EMIOVAL {//IO操作 IOFF = 0, //关闭 ION, //打开 }; enum EMDir {//运动方向 DirN = 0, //负方向 DirP, //正方向 }; enum EMIOSYSType {//系统IO类型 IOS_Normal = 0, //普通IO IOS_START, //启动 IOS_RESET, //复位 IOS_ESTOP, //急停 IOS_PAUSE, //暂停 IOS_STOP, //停止 IOS_BRAKE, //刹车 }; enum EMAxisType {//轴类型 EAXIS_SERVO = 0, //伺服 EAXIS_STEPPER, //步进电机 EAXIS_FLOW, //旋转电机,每次运动清零位置 - 不需要回原 EAXIS_ABSSERVO, //绝对值编码器 - 可以不回原 }; enum EMAxisDir {//轴方向 EAXIS_X = 0, //横向 EAXIS_Y, //纵向 EAXIS_Z, //上下 EAXIS_U, //平面旋转 EAXIS_V, //横向旋转 EAXIS_W, //纵向旋转 }; enum EMHomeType {//回原方式 EHOME_LIMITN = 0, //先回负限位 EHOME_LIMITP, //先回正限位 EHOME_HOMEP, //找原点再精确回原 EHOME_IOHOME, //IO控制回原 EHOME_GOHOME, //直接精确回原 EHOME_NOHOME, //不回原,直接以当前位置为原点 }; struct TCard {//控制卡 char name[MAX_NAME_LEN]; //名称 char dev[MAX_ID_LEN]; //硬件ID TParam param; //初始化参数 int cid; //卡ID ushort axisCnt; //轴数量 motor-轴/专用IO数量 ushort ioCnt; //io-通用IO位数 ushort adCnt; //ad-通道数量 ushort reserved[3]; //保留字符,8位对齐 }; struct TVision {//视觉 char name[MAX_NAME_LEN]; //名称 char dev[MAX_ID_LEN]; //插件ID TParam param; //初始化参数 int vid; //视觉ID int reserved; //保留字符,8位对齐 }; struct TStation {//工站 char name[MAX_NAME_LEN]; //名称 int axis[MAX_AXIS_CNT]; //轴ID int tid; //工站ID ushort axisCnt; //轴数量 ushort reserved; }; struct TAxisParam {//轴参数 char name[MAX_NAME_LEN]; //名称 char outIO[MAX_NAME_LEN]; //回原IO or 刹车IO int axis; //轴ID int cid; //卡ID int index; //在当前卡的索引 int homeIndex; //回原方法序号 参考 插件返回的回原方式序列 -- 超过最大序号表示自定义回原 int bDirNeg; //方向取反 1取反 0不取反 EMAxisDir dir; //0==x 1==y 2==z 3==u 4==v 5==w EMAxisType motorType; //参考 0伺服, 1步进 2流水线 3绝对值编码器 EMHomeType homeType; //回原方式 0负限位 1回正限位 2找原点 3IO控制回原 4直接回零 5直接回零 6不回零 int homePos; //原点位置+方向 单位:mm int limitN; //负限位位置+方向 可设软限位 单位:mm int limitP; //正限位位置+方向 可设软限位 单位:mm int highHomePos; //高速回原位置 单位:mm 为0则禁用高速回原 int iAfterhomeOffset; //回原后偏移量 单位:mm int arriveOffset; //到位误差 单位:um 0表示无效 步进无效,检查编码器与规划器误差,到位后才结束运动 double limitvel; //搜索限位速度 mm/s double homeVel; //搜索原点速度 mm/s double maxVel; //最大工作速度 mm/s double maxAcc; //最大工作加速度 mm/s^2 double maxDec; //最大工作减速度 mm/s^2 double stepvalue; //1mm对应多少脉冲 }; struct TAdParam {//ad参数 最终ad = readAD * ratio + offset char name[MAX_NAME_LEN]; //名称 double ratio; //比例、系数 double offset; //补偿值 int aid; //ID int cid; //卡ID int index; //索引 int reserved; //保留字符,8位对齐 }; typedef struct IOConfig {//io参数 char name[MAX_NAME_LEN]; //名称 int iid; //ID int cid; //卡ID int index; //索引 int sense; //是否取反 0取反 1不取反 EIOType type; //参考 EIOType 通用输入/输出 限位/原点等 EMIOSYSType ios; //参考 EMIOSYSType 系统类型,开始?停止?等等 } TIoParam; struct TPallet {//料盘 char name[MAX_NAME_LEN]; //名称 ushort index; //索引 ushort start; //起始点索引 ushort ptCol; //最大列点位索引 ushort ptRow; //最大行点位索引 ushort col; //最大列 ushort row; //最大行 }; struct TPoint {//点位 int index; //点索引 int itool; //保存点位时使用的tool[0,10] char name[MAX_NAME_LEN]; //点名称 double val[MAX_AXIS_CNT]; //分别为x,y,z,u,v,w的坐标值 }; struct TControlCfg {//设置项 int bPrintLog; //是否打印日志 int bSendSysMsg; //是否向插件发送系统消息 如:reset / pause int bHomeClearPos; //回原清零位置 int bChkPtChange; //监视点位数据变动 -- 总开关 int chkOffsetShow; //点位修改偏差大于多少弹框提示 0表示不弹框 单位mm [0,50] int movePrecision; //运动精度,当前位置与目标位置低于这个值,将不会运动 单位um [1,1000] int bRecordPos; //是否记录上次退出时的位置 1记录,0不记录 记录时,可以不用回原 int bSafeChk; //安全空间检测 -- 总开关 改变这个值时,会启动或停止安全监控 int safeSpdOffset; //间距检测时降速偏移[10,1000],比如最少100必须停,那么可以设置一个缓冲区用于降速,如50,则间距150时,开始降速 int bSaveTxt; //配置是否保存位文本格式 -- 重启生效 int bArcPause; //圆弧插补是否必须暂停 1必须暂停 0不暂停 int interval; //监听任务扫描间隔 单位:ms 可设置区间[0,100] }; enum Control_ErrCode {//错误代码 ERR_NO_SUPPORT = -900, //该功能不支持 ERR_NO_SERVICE, //服务未启动 ERR_NO_DEV, //未找到插件 ERR_NDEV_COUNT, //插件实例化数量超限 ERR_HOME_BREAK, //回原被中断 ERR_MOVE_BREAK, //运动被中断 ERR_NO_HOME, //未回原 ERR_LOAD_CFG, //加载配置文件失败 ERR_OCCUPY_AXIS, //轴被占用 ERR_IO_TYPE, //IO类型错误 ERR_AXIS_HOME, //轴回原失败 ERR_IS_MOVING, //正在运动中 ERR_NO_SERVO, //未使能 ERR_SET_CRD, //建立坐标系失败 ERR_SAFE_CHK, //安全空间限制 ERR_NO_HOMEP, //无原点信号 ERR_NO_LIMITN, //无负限位信号 ERR_NO_LIMITP, //无正限位信号 ERR_IN_LIMITN, //在负限位 ERR_IN_LIMITP, //在正限位 ERR_VISION_IMG, //拍照失败 ERR_VISION_GR, //视觉处理失败 }; /*模块提供简单的安全机制 1. 间距检测模式: 主要用于检测两个轴之间的间距,常见场景为直线电机上两个动子之间 由于两轴方向可能不一样,可能a+boffset(mm)时触发 暂时处理方式为:如果是>offset 则offset-50时开始减速到50%,>offset时触发暂停 2. 位置检测模式:此模式主要用于检测类似Z轴的这种模组结构,Z轴必须在安全高度,其它轴才能移动 当然也可以检测某个气缸的限位 a. 将pid2设置为某个气缸限位IO b. 将judge设置为 ESafeJ_Equal c. 将safeval设置为 1.0 -- 即=1 d. 将pid1设置为某个轴 e. 将type设置为ESafe_VALUE f. 将dir1设置为2 -- 即为正负方向都限制 当value(pid2)==1时 轴(pid1)将无法运动. 3. 若要实现复杂的安全防呆机制,请注册回调函数 FunSafeCallBack */ enum ESafeChk {//安全检测模式 ESafe_DISTANCE = 0, //间距检测 -- 两轴之间距离检测,通常为pos(1)+pos(2) < or > val(mm)触发减速or暂停 ESafe_VALUE, //位置检测 -- 用于轴或者IO, 目标值<= or >= val时触发 }; enum ESafeJudge {//安全判断模式 ESafeJ_Equal = 0, //等于某个值 ESafeJ_Less, //小于某个值 ESafeJ_Greater, //大于某个值 }; struct TSafeCfg {//运动安全限制 int sid; //规则ID int pid; //轴ID或IO ESafe_VALUE时,此为被限制对象 int dir; //pid 被限制方向 DirN-0 负方向 DirP-1 正方向 2-两者都限制 int pid2; //轴ID或IO ESafe_VALUE时,此为触发对象;ESafe_DISTANCE时,pid和pid2都为触发和被限制对象 ESafeChk type; //检测模式 间距检测\位置检测 ESafeJudge judge; //判断模式 int safeval; //安全值 -- 整数 int bhomechk; //回原时是否检测 1检测 0不检测 char desc[MAX_NAME_LEN]; //描述、说明 }; struct TLicenseInfo {//许可信息 int dyn; //8位动态机器码 int perdate; //有效期 20181212 0标识无效 char hd[MAX_NAME_LEN]; char cpu[MAX_NAME_LEN]; char mac[MAX_NAME_LEN]; char sn[MAX_BUF_LEN]; //机器码 }; struct TDevMap {//映射数据 int pid; //pid 轴/IO/AD/卡对象/视觉对象 char var[MAX_NAME_LEN]; //变量 存储轴状态/IO值/AD值、卡状态、视觉状态 }; #pragma region callback //安全类接口回调 //pid 轴ID或IO //curval 当前位置 可标识axis/io位置 //val 目标位置 表示运动目标位置(mm) IO表示气缸控制目标信号 //bhome 轴ID时1表示回原,0表示不是回原,IO控制时此参数无意义 //返回值 返回1表示检测通过,可以运动 返回0表示检测不通过,则control会终止该轴/IO所有运动接口 typedef int (WINAPI *FunSafeCallBack)(int pid, int curval, int val, int bhome); //插件(控制卡)类接口回调 -- 命令行模式 用于C#注册底层插件用 //fun 接口名称 //cid 卡序号 不需要此从参数时为0 /*---接口名称说明--- int get_command_desc(char* pszcmddesc) -- 获取插件支持的自定义指令描述 int init_devs(ushort index, const char* ctx) -- 初始化一张卡 int uninit_dev(ushort index) -- 反初始化一张卡 int get_status(ushort index) -- 获取卡状态 int send_custom_msg(ushort index, const char* msg, char* res) -- 发送自定义消息 int recv_custom_msg(ushort index, const char* msg, char* res, int timeout) -- 接收自定义消息 int axis_reset(ushort cindex, ushort axisIndex) -- 重置一个轴 int axis_zero_pos(ushort cindex, ushort axisIndex) -- 清零轴位置 ... 参考motor.h axis_home axis_is_moving axis_set_speed axis_set_pos axis_stop axis_move_jog axis_move_pos axis_move_offset axis_read axis_write axis_get_pos create_crd add_line_pos add_arc_pos add_line add_arc crd_move crd_is_moving close_crd read_in read_out write_out read_ad write_ad -----接口名称说明---*/ //pszparam 根据函数定义调用时的附加参数,多参数","隔开 //pszres 若有传出参数,在这里填充(无输出参数时,可能传空指针到应用层),多参数用","隔开 //返回值 成功返回0,失败返回错误代码 参考 dev.h motor.h typedef int (WINAPI *DevCallBack)(const char* fun, ushort cid, const char* pszparam/* = 0*/, char* pszres/* = 0*/); //插件底层类接口声明 typedef int (WINAPI *fun_init)(ushort index, const char* ctx); typedef int (WINAPI *fun_deinit)(ushort index); typedef int (WINAPI *fun_get_status)(ushort index); typedef int (WINAPI *fun_get_cmd_info)(char* pszcmddesc); typedef int (WINAPI *fun_send_msg)(ushort index, const char* msg, char* res); typedef int (WINAPI *fun_recv_msg)(ushort index, const char* msg, char* res, int timeout); //控制卡底层继承类接口声明 -- 轴接口 typedef int (WINAPI *fun_axis_reset)(ushort index, ushort axisIndex); typedef int (WINAPI *fun_axis_home)(ushort index, ushort axisIndex, ushort homeType, double pos, double offset, double vel); typedef int (WINAPI *fun_axis_zero_pos)(ushort index, ushort axisIndex); typedef int (WINAPI *fun_axis_is_moving)(ushort index, ushort axisIndex); typedef int (WINAPI *fun_axis_set_speed)(ushort index, ushort axisIndex, double vel, double acc, double dec); typedef int (WINAPI *fun_axis_set_pos)(ushort index, ushort axisIndex, double pos); typedef int (WINAPI *fun_axis_stop)(ushort index, ushort axisIndex, int type); typedef int (WINAPI *fun_axis_move_pos)(ushort index, ushort axisIndex, double pos, double vel, double acc, double dec); typedef int (WINAPI *fun_axis_move_offset)(ushort index, ushort axisIndex, double offset, double vel, double acc, double dec); typedef int (WINAPI *fun_axis_move_jog)(ushort index, ushort axisIndex, int dir, double vel, double acc, double dec); typedef int (WINAPI *fun_axis_read)(ushort index, ushort axisIndex, int dio_type); typedef int (WINAPI *fun_axis_write)(ushort index, ushort axisIndex, ushort val, int do_type); typedef int (WINAPI *fun_axis_get_pos)(ushort index, ushort axisIndex, int postype, double *pval); typedef int (WINAPI *fun_create_crd)(ushort index, ushort *pAxisIndex, ushort nsize); typedef int (WINAPI *fun_add_line_pos)(int crd, double *ppos, ushort nsize, double vel, double acc, double endvel); typedef int (WINAPI *fun_add_arc_pos)(int crd, double *ppos1, double *ppos2, double *ppos3, ushort nsize, double vel, double acc, double endvel); typedef int (WINAPI *fun_crd_move)(int crd); typedef int (WINAPI *fun_crd_is_moving)(int crd, int *progress); typedef int (WINAPI *fun_close_crd)(int crd); //控制卡底层继承类接口声明 -- IO接口 typedef int (WINAPI *fun_read_in)(ushort index, ushort in_index); typedef int (WINAPI *fun_read_out)(ushort index, ushort out_index); typedef int (WINAPI *fun_write_out)(ushort index, ushort out_index, ushort val); //控制卡底层继承类接口声明 -- AD接口 typedef int (WINAPI *fun_read_ad)(ushort index, ushort ad_index, double* pVal); typedef int (WINAPI *fun_write_ad)(ushort index, ushort ad_index, double val); struct MotorFun {//回调函数列表 fun_init funinit; fun_deinit fundeinit; fun_get_status funstatus; fun_send_msg funsend; fun_recv_msg funrecv; fun_get_cmd_info funcmd; fun_axis_reset funreset; fun_axis_home funhome; fun_axis_zero_pos funzero; fun_axis_is_moving funismoving; fun_axis_set_speed funsetspeed; fun_axis_set_pos funsetpos; fun_axis_stop funstop; fun_axis_move_pos funmovepos; fun_axis_move_offset funmoveoffset; fun_axis_move_jog funmovejog; fun_axis_read funaxisread; fun_axis_write funaxiswrite; fun_axis_get_pos fungetpos; fun_create_crd funcrd; fun_add_line_pos funaddline; fun_add_arc_pos funaddarc; fun_crd_move funcrdmove; fun_crd_is_moving funcrdmoving; fun_close_crd funclosecrd; fun_read_in funreadin; fun_read_out funreadout; fun_write_out funwriteout; fun_read_ad funreadad; fun_write_ad funwritead; }; #pragma endregion #endif //防止重复包含头文件