//C++ syntax : HRESULT STDMETHODCALLTYPE OptimizeAccess(DATAFRAME* lpFrame, DEVREG* lpDevReg, VARIANT_BOOL * pRetVal); public bool OptimizeAccess(IntPtr pDataFrame, IntPtr pDevReg) { strLastError = ""; if (pDataFrame == IntPtr.Zero || pDevReg == IntPtr.Zero) { strLastError = "调用参数错误。"; return(false); } UCView.DATAFRAME DataFrame = (UCView.DATAFRAME)Marshal.PtrToStructure(pDataFrame, typeof(UCView.DATAFRAME)); UCView.DEVREG DevReg = (UCView.DEVREG)Marshal.PtrToStructure(pDevReg, typeof(UCView.DEVREG)); //一定要首先判断地址 try { if (DataFrame.DevAddr.nAddr != DevReg.devAddr.nAddr) { return(false); } if (DataFrame.WRType == UCView.FT_WRITE) { return(DevReg.regAddr.nAddr == DataFrame.StartRegAddr.nAddr); } //Check if we can read this register together with this frame if (DevReg.regType == 0) { return(DataFrame.RegType == 0); } if (DevReg.regType >= 1 && DevReg.regType <= 4) { return(DataFrame.RegType >= 1 && DataFrame.RegType <= 4); } if (DevReg.regType >= 5 && DevReg.regType <= 16) { return(DataFrame.RegType >= 5 && DataFrame.RegType <= 16); } if (DevReg.regType == 17) { return(DataFrame.RegType == 17); } return(true); } catch { Utility.Trace2Logger(atomMsgSrcName, "OptimizeAccess 遇到异常"); return(false); } }
//C++ syntax : HRESULT STDMETHODCALLTYPE CompileItem(const DEVREGINFO * lpRegInfo, DEVREG* lpDevReg, VARIANT_BOOL * pRetVal); public bool CompileItem(IntPtr pRegInfo, IntPtr pDevReg) { strLastError = ""; if (pRegInfo == IntPtr.Zero || pDevReg == IntPtr.Zero) { return(false); } UCView.DEVREGINFO RegInfo = pRegInfo.GetStructure <UCView.DEVREGINFO>(); UCView.DEVREG DevReg = pDevReg.GetStructure <UCView.DEVREG>(); string ItemName = Marshal.PtrToStringAnsi(RegInfo.pszItemName); string LibName = Marshal.PtrToStringAnsi(RegInfo.pszLibName); if (ItemName.Length == 0) { strLastError = "寄存器名错。名称长度不能为0"; return(false); } int i = 0, ITEM_NUM = 0; UCView.DEVITEM[] ucSurpportRegisters = GetRegister(LibName, ref ITEM_NUM); if (ITEM_NUM == 0 || ucSurpportRegisters == null) { strLastError = String.Format("这个驱动不支持名为'{0}'的设备。请与开发者联系。", LibName); return(false); } for (i = 0; i < ITEM_NUM; i++) { int registerLen = ucSurpportRegisters[i].ItemName.Length; if (ItemName.Length < registerLen) { continue; } //比较前几个字符是否一致? if (ItemName.Substring(0, registerLen) != ucSurpportRegisters[i].ItemName) { continue; } //需要寄存器序号吗? UInt32 lowNo = ucSurpportRegisters[i].MinIndex; UInt32 highNo = ucSurpportRegisters[i].MaxIndex; if (highNo > lowNo) {//需要寄存器号 if (ItemName.Length == registerLen) { strLastError = "缺少寄存器地址。"; return(false); } int digPos; for (digPos = registerLen; digPos < ItemName.Length; digPos++) { if (g_szRegIndexChars.IndexOf(ItemName[digPos]) < 0) { break; } } if (digPos < ItemName.Length) { continue; } UInt32 No = uint.Parse(ItemName.Substring(registerLen)); if (No < lowNo) { strLastError = "寄存器范围越下界。"; return(false); } else if (No > highNo) { strLastError = "寄存器范围越上界。"; return(false); } DevReg.regType = (UInt32)i; DevReg.regAddr.nAddr = No; } else //不需要寄存器号 { if (ItemName.Length != registerLen) { continue; } //用户定义寄存器便是该寄存器 DevReg.regType = (UInt32)i; DevReg.regAddr.nAddr = 0; } if ((RegInfo.DataType & ucSurpportRegisters[i].DataType) == 0) { strLastError = "寄存器数据类型错。"; return(false); } Marshal.StructureToPtr(DevReg, pDevReg, true); return(true); } //查找完所有寄存器名都不匹配。 strLastError = "寄存器名错。没有找到这个名称。"; return(false); }