using System; using System.Text; using System.Collections.Generic; using System.Runtime.InteropServices; namespace ocean { public class cshrap_dll { static private string _pszcmddesc = "业务模块自定义消息格式.\n" + "\n发送消息格式:\n\n\n" + "M1 通知取料仓拍照,并返回拍照结果\n\n" + "M2 通知搬运模组拍照,并返回拍照结果\n\n" + "M3 通知OK仓拍照,并返回拍照结果\n\n" + "M4 通知NG仓拍照,并返回拍照结果\n\n" + "M5 通知NG取一拍一模式拍照,并返回拍照结果\n\n" + "M6 通知NG放一拍一模式拍照,并返回拍照结果\n\n" + "M7 通知治具取料模式拍照,并返回拍照结果\n\n" + "M8 通知治具放料模式拍照,并返回拍照结果\n\n" + "MT tindex [sn] 模拟治具发送侧相机处理请求\n\n" + "vacmreset 通知释放吸嘴产品数据\n\n" + "makeinput 模拟生成进料盘数据\n\n" + "posreset sindex 通知释放拍照数据 sindex料仓编号[1-5]\n\n" + "posget sindex 获取拍照取料位置数据写入变量 res=0标识获取成功,否则标识要拍照获取数据.取料信息写入(sn,x,y)\n\n" + "posset sindex index sn x y 将拍照数据暂存起来,sindex料仓编号[1-5] index数据编号[1-4] sn二维码 x,y基于相机的坐标值\n\n" + "posmap sindex 拍照3次(左上、右上、左下)后,此指令可计算矩阵,生成料盘位置数据.\n\n" + "clear tindex 清空治具统计参数 tindex治具编号[1-6]\n\n" + "home tindex 通知治具回原 tindex治具编号[1-6]\n\n" + "pause tindex flag 通知治具暂停 tindex治具编号[1-6] flag 1暂停 0暂停取消\n\n" + "grip tindex 1/0 通知治具控制夹爪 tindex治具编号[1-6] 1夹紧 0松开\n\n" + "status tindex a 设置治具状态更新到某个变量 tindex治具编号[1-6] a变量名\n\n" + "sim tindex bsim 打开/关闭模拟治具 tindex治具编号[1-6] bsim 1打开模拟 0关闭模拟\n\n" + "stockreset sindex 通知释放料盘产品数据 sindex料仓编号[1-5]\n\n" + "where 通知设置当前是给治具换料还是放料到料仓,设置到变量't'中,0标识放料到料仓,[1-6]标识给治具换料\n\n" + "vacmtake 通知设置需要取料的吸嘴编号为0时无效,设置到变量'v'中\n\n" + "testput 通知设置需要进入治具的吸嘴编号->'v',治具编号->'t',为0时无效\n\n" + "testake 通知设置需要从治具取料的吸嘴编号->'v',治具编号->'t',为0时无效\n\n" + "stockput 通知设置需要放回料仓的吸嘴编号->'v',料仓编号[2-5]->'t',为0时无效\n\n" + "create sn vindex 从进料仓到吸嘴,并创建产品资料 vindex吸嘴编号\n\n" + "vacm_to_test vindex tindex 变更产品位置,从吸嘴到测试治具并开始测试 vindex吸嘴编号 tindex治具编号\n\n" + "test_to_vacm tindex vindex 变更产品位置,从测试治具到吸嘴 tindex治具编号 vindex吸嘴编号\n\n" + "vacm_to_stock vindex sindex 变更产品位置,从吸嘴到料仓 vindex吸嘴编号 sindex料仓编号[2-5]\n\n" + "\n接收消息(\"msg\"格式):\n\n\n" + "waitOk tindex 等待测试治具就绪,当状态就绪时,返回0,否则返回超时\n\n" + "WaitM1 接收进料仓拍照处理结果,消息返回格式:res,sn,x,y res=0标识成功\n\n" + "WaitM2 sindex sindex料仓编号[1-5] 等待搬运模组拍照处理结果,自动刷新产品标识到数组中,消息返回格式:res 0标识成功\n\n" + "WaitM3 接收OK仓拍照结果,消息返回格式:res,x,y res=0标识成功\n\n" + "WaitM4 接收NG仓拍照结果,消息返回格式:res,x,y res=0标识成功\n\n" + "WaitM5 接收NG取一拍一拍照结果,消息返回格式:res,x,y res=0标识成功\n\n" + "WaitM6 接收NG放一拍一拍照结果,消息返回格式:res,x,y res=0标识成功\n\n" + "WaitM7 接收治具取料拍照结果,消息返回格式:res,x,y res=0标识成功\n\n" + "WaitM8 接收治具放料拍照结果,消息返回格式:res,x,y res=0标识成功\n\n" ; static private Byte[] _cmdinfo = System.Text.Encoding.Default.GetBytes(_pszcmddesc); static private MotorFun m_fun = new MotorFun(); static private coreworks m_pk = new coreworks(); /*********************************************** *Function: 创建/初始化一个对象 -- 参数使用字符串 *Intput: index 对象索引,动态累加,从0开始 ctx 初始化参数 多个参数以;分割<256字节,最多支持PARAM_CNT个参数 *Output: NULL *Return: 成功返回0,失败返回错误码<0 *********************************************/ static public int Init(ushort index, string ctx) { if (0 != index) return -1000; return m_pk.Init(ctx); } /*********************************************** *Function: 反初始化/释放一个对象 *Intput: index 对象索引 *Output: NULL *Return: 成功返回0,失败返回错误码<0 *********************************************/ static public int Deinit(ushort index) { if (0 != index) return -1000; return m_pk.Deinit(); } /*********************************************** *Function: 获取指定对象当前状态 *Intput: index 对象索引 *Output: NULL *Return: EDevStatus or EMoveStatus *********************************************/ static public int GetStatus(ushort index) { if (0 != index) return (int)EDevStatus.EDev_NOINIT; return m_pk.GetStatus(); } static public int GetCmdInfo(IntPtr p) {//获取指令描述 if (p == IntPtr.Zero) return _cmdinfo.Length; Marshal.Copy(_cmdinfo, 0, p, _cmdinfo.Length); return 0; } /********************************************* *Function: 向指定对象发送消息(万能接口) *Intput: index 对象索引 msg 要发送的消息 res 返回消息,可以不传 *Output: res 返回消息,可以不传 *Return: 成功返回0,失败返回错误码<0 *********************************************/ static public int SendMessage(ushort index, string msg, IntPtr res) { int ret = 0; string str = ""; if (0 != index) return -1000; ret = m_pk.SendMessage(msg, ref str); if (res != IntPtr.Zero && str != "") {//传入指针且有结果传出 Byte[] bt = System.Text.Encoding.Default.GetBytes(str); Marshal.Copy(bt, 0, res, bt.Length); } return ret; } /********************************************* *Function: 接收指定对象消息(万能接口) *Intput: index 对象索引 msg 过滤字段及参数,可以为空字符串 res 返回消息 timeout 超时机制 单位ms *Output: res 返回消息 *Return: 成功返回0,失败返回错误码<0 *PS: 超时返回ERR_TIMEOUT *PS: 若有过滤机制,未接收到的消息由底层插件自行处理,或缓存下来 *********************************************/ static public int RecvMessage(ushort index, string msg, IntPtr res, int timeout) { int ret = 0; string str = ""; if (0 != index) return -1000; ret = m_pk.RecvMessage(msg, ref str, timeout); if (res != IntPtr.Zero && str != "") {//传入指针且有结果传出 Byte[] bt = System.Text.Encoding.Default.GetBytes(str); Marshal.Copy(bt, 0, res, bt.Length); } return ret; } static public void Regist() {//注册插件 //string home = "捕获回原;Index回原;普通回原;"; string ctx = "服务端IP:|127.0.0.1;服务端端口:|6060"; m_fun.funinit = new fun_init(Init); m_fun.fundeinit = new fun_deinit(Deinit); m_fun.funstatus = new fun_get_status(GetStatus); m_fun.funcmdinfo = new fun_get_cmd_info(GetCmdInfo); m_fun.funsend = new fun_send_msg(SendMessage); m_fun.funrecv = new fun_recv_msg(RecvMessage); control.regist("CSharpCore", "C#业务库", "", ctx, 0, 0, 0, ref m_fun); } } public class coreworks {//核心业务类 public int Init(string ctx) {//初始化 return 0; } public int Deinit() {//反初始化 return 0; } public int GetStatus() {//获取模块状态 return (int)EDevStatus.EDev_IDLE; } public int SendMessage(string msg, ref string res) { if (msg == "hello") { res = "world."; return 0; } return -1; } public int RecvMessage(string msg, ref string res, int timeout) { return -1; } } }