You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

502 lines
18 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*********************************************************************
*文件说明: 数据类型声明
*作者: 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+b<offset时触发也可能a+b>offset(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 //防止重复包含头文件