public void WriteItems(Tag tag, object value) { lock (this) { try { CNCAddress addr = CNCAddress.ConvertAddress(tag.Address); //if (addr.ValType == "Bool" || tag.TagType =="bool") if (addr.ValType == "Bool") { if (addr.AddrType == "Y") { WritePmcYAddrBool(addr.BlockID, addr.BitOffset, Convert.ToBoolean(value)); } else { throw new Exception("暂时不支持该地址的bool类型的写入"); } } else { if (addr.AddrType == "R") { WritePmcRAddr(addr.BlockID, Convert.ToInt16(value)); } else if (addr.AddrType == "K") { WritePmcKAddr(addr.BlockID, Convert.ToInt16(value)); } else if (addr.AddrType == "M") { WritePmcMacroAddr(Convert.ToInt16(addr.BlockID), Convert.ToInt32(value)); } else { throw new Exception("暂时不支持该类型地址的写入"); } } } catch (Exception ex) { LOG.Error(string.Format("CNC Driver 写数据出错:{0}", ex.Message)); } } }
public static CNCAddress ConvertAddress(string Address) { CNCAddress cncaddr = new CNCAddress(); if (Address.Contains(".")) { cncaddr.ValType = "Bool"; cncaddr.AddrType = Address.Substring(0, 1).ToUpper(); string add = Address.Substring(1, Address.Length - 1); string[] x = add.Split('.'); cncaddr.BlockID = Convert.ToUInt16(x[0]); cncaddr.BitOffset = Convert.ToByte(x[1]); if (cncaddr.BitOffset > 7) { throw new Exception("bool类型的地址位不能大于7"); } } else if (Address.ToLower().Contains("r")) { cncaddr.AddrType = "R"; string offset = Address.Substring(1, Address.Length - 1); cncaddr.BlockID = Convert.ToUInt16(offset); } else if (Address.ToLower().Contains("f")) { cncaddr.AddrType = "F"; string offset = Address.Substring(1, Address.Length - 1); cncaddr.BlockID = Convert.ToUInt16(offset); } else if (Address.ToLower().Contains("x")) { cncaddr.AddrType = "X"; string offset = Address.Substring(1, Address.Length - 1); cncaddr.BlockID = Convert.ToUInt16(offset); } else if (Address.ToLower().Contains("k")) { cncaddr.AddrType = "K"; string offset = Address.Substring(1, Address.Length - 1); cncaddr.BlockID = Convert.ToUInt16(offset); } else if (Address.ToLower().Contains("a")) { cncaddr.AddrType = "A"; string offset = Address.Substring(1, Address.Length - 1); cncaddr.BlockID = Convert.ToUInt16(offset); } else if (Address.ToLower().Contains("m")) { cncaddr.AddrType = "M"; string offset = Address.Substring(1, Address.Length - 1); cncaddr.BlockID = Convert.ToUInt16(offset); } else if (Address.ToLower().Contains("y")) { string offset = Address.Substring(1, Address.Length - 1); cncaddr.BlockID = Convert.ToUInt16(offset); cncaddr.AddrType = "Y"; } else if (Address.ToLower().Contains("p")) { cncaddr.AddrType = "P"; string offset = Address.Substring(1, Address.Length - 1); cncaddr.ParaOffset = Convert.ToUInt16(offset); } else if (Address.ToLower().Contains("v")) { cncaddr.AddrType = "V"; } else { LOG.Error(string.Format("CNCAddress 地址不识别出错: {0}", Address)); } return(cncaddr); }
public object ReadItem(string address) { lock (this) { try { CNCAddress addr = CNCAddress.ConvertAddress(address); if (addr.AddrType == "Y") { short ret = GetYValue(addr.BlockID); if (addr.ValType == "Bool") { return(Convert.ToBoolean(ret & Convert.ToByte(Math.Pow(2, addr.BitOffset)))); } else { return(ret); } } else if (addr.AddrType == "R") { short val = 0; short ret = ReadPmcRAddr(Convert.ToUInt16(addr.BlockID), out val); if (ret == -16) { throw new Exception("CNC读取R出错" + ret); } else { if (addr.ValType == "Bool") { return(Convert.ToBoolean(val & Convert.ToByte(Math.Pow(2, addr.BitOffset)))); } else { return(val); } } } else if (addr.AddrType == "F") { short val = 0; short ret = ReadPmcFAddr(Convert.ToUInt16(addr.BlockID), out val); if (ret == -16) { throw new Exception("CNC读取F出错" + ret); } else { if (addr.ValType == "Bool") { return(Convert.ToBoolean(val & Convert.ToByte(Math.Pow(2, addr.BitOffset)))); } else { return(val); } } } else if (addr.AddrType == "X") { short val = 0; short ret = ReadPmcXAddr(Convert.ToUInt16(addr.BlockID), out val); if (ret == -16) { throw new Exception("CNC读取X出错" + ret); } else { if (addr.ValType == "Bool") { return(Convert.ToBoolean(val & Convert.ToByte(Math.Pow(2, addr.BitOffset)))); } else { return(val); } } } else if (addr.AddrType == "K") { short val = 0; short ret = ReadPmcKAddr(Convert.ToUInt16(addr.BlockID), out val); if (ret == -16) { throw new Exception("CNC读取K出错" + ret); } else { if (addr.ValType == "Bool") { return(Convert.ToBoolean(val & Convert.ToByte(Math.Pow(2, addr.BitOffset)))); } else { return(val); } } } else if (addr.AddrType == "M") { short val = 0; short ret = ReadPmcMacroAddr(Convert.ToInt16(addr.BlockID), out val); if (ret == -16) { throw new Exception("CNC读取K出错" + ret); } else { if (addr.ValType == "Bool") { return(Convert.ToBoolean(val & Convert.ToByte(Math.Pow(2, addr.BitOffset)))); } else { return(val); } } } else if (addr.AddrType == "A") { short val = 0; short ret = ReadPmcAAddr(Convert.ToUInt16(addr.BlockID), out val); if (ret == -16) { throw new Exception("CNC读取A出错" + ret); } else { if (addr.ValType == "Bool") { return(Convert.ToBoolean(val & Convert.ToByte(Math.Pow(2, addr.BitOffset)))); } else { return(val); } } } else if (addr.AddrType == "P") { return(ReadParameterValue(Convert.ToInt16(addr.ParaOffset))); } else if (addr.AddrType == "V") { return(ReadPmcAlarm()); } else { throw new Exception("地址错误"); } } catch (Exception ex) { LOG.Error(string.Format("CNC Driver 读数据出错:{0}", ex.Message)); return(null); } } }