public ReadResultStyle(All.Class.TypeUse.TypeList type, int random, bool result, object value) { this.Type = type; this.Random = random; this.Result = result; this.Value = value; }
public WriteDataStyle(All.Class.TypeUse.TypeList type, int start, object value) { this.Random = (int)All.Class.Num.GetRandom(0, 99999); this.Type = type; this.Start = start; this.Value = value; }
public override bool Read <T>(out List <T> value, Dictionary <string, string> parm) { value = new List <T>(); if (!Init()) { return(false); } ScanHP(); lock (lockObject) { try { string readValue = ""; if (this.WriteAndRead <string, string>("FETC?\r\n", 16 * len - 1, out readValue)) { readValue = readValue.Trim(); string[] buff = readValue.Split(','); string[] tmp; All.Class.TypeUse.TypeList type = All.Class.TypeUse.GetType <T>(); for (int i = 0; i < buff.Length; i++) { tmp = buff[i].Split('E'); if (tmp.Length != 2) { All.Class.Error.Add("当前34970返回的数据,不包含E分隔的数据,请更新驱动"); return(false); } switch (type) { case Class.TypeUse.TypeList.Double: value.Add((T)(object)(tmp[0].ToDouble() * Math.Pow(10, tmp[1].ToInt()))); break; case Class.TypeUse.TypeList.Float: value.Add((T)(object)(float)(tmp[0].ToFloat() * Math.Pow(10, tmp[1].ToInt()))); break; default: All.Class.Error.Add("当前34970无法返回指定的数据结构,请检查程序读取数据结构,或更新此驱动"); return(false); } } } } catch (Exception e) { All.Class.Error.Add(e); return(false); } } return(true); }
/// <summary> /// 从初始化值中解析须要的数据类型,以及读取值 /// </summary> public void Analysis() { if (Parent == null || Values == null || !Values.ContainsKey("Data")) { return; } if (!Values.ContainsKey("Text") || !Values.ContainsKey("Index")) { All.Class.Error.Add(string.Format("{0}.{1},没有数据类型或数据序号", Parent.Value.Parent.Text, Parent.Value.Text)); } readType = All.Class.TypeUse.GetType(Values["Data"]); this.Datas = GetIndexFromSet(Values["Index"], Values["Text"]); }
/// <summary> /// 读取的数据组,添加批量读取项目 /// </summary> /// <param name="t"></param> /// <param name="buff"></param> public void AddRange(All.Class.TypeUse.TypeList t, Dictionary <int, string> buff) { switch (t) { case Class.TypeUse.TypeList.Boolean: this.BoolValue.AddRange(buff); break; case Class.TypeUse.TypeList.Byte: this.ByteValue.AddRange(buff); break; case Class.TypeUse.TypeList.Bytes: this.BytesValue.AddRange(buff); break; case Class.TypeUse.TypeList.DateTime: this.DateTimeValue.AddRange(buff); break; case Class.TypeUse.TypeList.Double: this.DoubleValue.AddRange(buff); break; case Class.TypeUse.TypeList.Float: this.FloatValue.AddRange(buff); break; case Class.TypeUse.TypeList.Int: this.IntValue.AddRange(buff); break; case Class.TypeUse.TypeList.Long: this.LongValue.AddRange(buff); break; case Class.TypeUse.TypeList.String: this.StringValue.AddRange(buff); break; case Class.TypeUse.TypeList.UnKnow: break; case Class.TypeUse.TypeList.UShort: this.UshortValue.AddRange(buff); break; } }
/// <summary> /// 批量写入的时候, /// Y点地址0 -> Y0~Y7 , 1 -> Y10~Y17 , 2->Y20~Y27 /// M点地址0 -> M0~M7 , 1 -> M08~M15 , 2->M16~M23 /// X点地址0 -> X0~X7 , 1 -> X10~X17 , 2->X20~X27 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="value"></param> /// <param name="parm"></param> /// <returns></returns> public override bool WriteInternal <T>(List <T> value, Dictionary <string, string> parm) { lock (lockObject) { bool result = true; //写入数据 if (value == null || value.Count <= 0) { All.Class.Error.Add("写入数据为空,不能写入空数据", Environment.StackTrace); return(false); } //单个boolean值写入 All.Class.TypeUse.TypeList t = All.Class.TypeUse.GetType <T>(); if (t == All.Class.TypeUse.TypeList.Boolean && ((value.Count % 8) != 0)) { return(Write((bool)(object)value[0], parm)); } //写入地址 if (!parm.ContainsKey("Start") && !parm.ContainsKey("Address")) { All.Class.Error.Add("数据写入参数中不包含寄存器地址", Environment.StackTrace); return(false); } ushort tmpAddress = 0; if (parm.ContainsKey("Start")) { tmpAddress = parm["Start"].ToUshort(); } if (parm.ContainsKey("Address")) { tmpAddress = parm["Address"].ToUshort(); } //写入区域 List <byte> sendBuff = new List <byte>(); //发送的总字符 List <byte> sendValue = new List <byte>(); //发送的数据区域 if (!parm.ContainsKey("Code")) { switch (t) { case Class.TypeUse.TypeList.Boolean: parm.Add("Code", "M"); break; case Class.TypeUse.TypeList.UShort: case Class.TypeUse.TypeList.Byte: case Class.TypeUse.TypeList.Int: case Class.TypeUse.TypeList.String: case Class.TypeUse.TypeList.Long: parm.Add("Code", "D"); break; default: All.Class.Error.Add("数据写入类型不正确,须要先添加并测试", Environment.StackTrace); break; } } sendBuff.Add(0x02); sendBuff.Add(0x31); string tmpCode = parm["Code"]; switch (tmpCode) { case "D": tmpAddress = (ushort)(0x1000 + 2 * tmpAddress); break; case "M": tmpAddress = (ushort)(0x0100 + tmpAddress); break; case "X": tmpAddress = (ushort)(0x0080 + Convert.ToUInt16(tmpAddress.ToString(), 8)); break; case "Y": tmpAddress = (ushort)(0x00A0 + Convert.ToUInt16(tmpAddress.ToString(), 8)); break; case "S": case "T": case "C": All.Class.Error.Add("数据写入指令正确,但当前驱动没有添加实现此区域操作,请添加并测试", Environment.StackTrace); break; default: All.Class.Error.Add("数据写入指令不正确,当前驱动没有指定的指令", Environment.StackTrace); return(false); } sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X4}", (ushort)(tmpAddress & 0xFFFF)))); switch (tmpCode) { case "D": switch (t) { case Class.TypeUse.TypeList.String: //下面的字符串字节与高低交换,如果不须要,则改 sendValue.AddRange(All.Class.Num.SwitchHighAndLow(Encoding.ASCII.GetBytes((string)(object)value[0]))); break; case Class.TypeUse.TypeList.Byte: for (int i = 0; i < value.Count; i++) { sendValue.Add((byte)(object)value[i]); } break; case Class.TypeUse.TypeList.Int: ushort tmpInt = 0; for (int i = 0; i < value.Count; i++) { tmpInt = (ushort)(((int)(object)value[i]) & 0xFFFF); sendValue.AddRange(new byte[] { (byte)(tmpInt & 0xFF), (byte)(tmpInt >> 8) }); } break; case Class.TypeUse.TypeList.UShort: ushort tmpUshort = 0; for (int i = 0; i < value.Count; i++) { tmpUshort = (ushort)(((ushort)(object)value[i]) & 0xFFFF); sendValue.AddRange(new byte[] { (byte)(tmpUshort & 0xFF), (byte)(tmpUshort >> 8) }); } break; case Class.TypeUse.TypeList.Long: ushort tmpLong = 0; for (int i = 0; i < value.Count; i++) { tmpInt = (ushort)(((long)(object)value[i]) & 0xFFFF); sendValue.AddRange(new byte[] { (byte)(tmpLong & 0xFF), (byte)(tmpLong >> 8) }); } break; } break; case "M": case "X": case "Y": bool[] tmpBool = new bool[8 * (int)(Math.Floor(value.Count / 8.0f))]; for (int i = 0; i < tmpBool.Length; i++) { tmpBool[i] = (bool)(object)value[i]; } sendValue.AddRange(All.Class.Num.Bool2Byte(tmpBool)); break; } sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", sendValue.Count))); for (int i = 0; i < sendValue.Count; i++) { sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", sendValue[i]))); } sendBuff.Add(0x03); byte sumLow, sumHigh; byte[] readBuff; All.Class.Check.SumCheck(sendBuff.ToArray(), 1, sendBuff.Count - 1, out sumLow, out sumHigh); sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", sumLow))); if (WriteAndRead <byte[], byte[]>(sendBuff.ToArray(), 1, out readBuff)) { if (readBuff == null || readBuff.Length < 1 || readBuff[0] != 0x06) { result = false; } } else { result = false; } return(result); } }
/// <summary> /// 设置读取后的数据 /// </summary> /// <param name="t"></param> /// <param name="buff"></param> public void SetValue(All.Class.TypeUse.TypeList t, Dictionary <int, object> buff) { if (buff == null || buff.Count <= 0) { return; } switch (t) { case Class.TypeUse.TypeList.Boolean: foreach (int i in buff.Keys) { this.BoolValue.SetValue(i, (bool)buff[i]); } break; case Class.TypeUse.TypeList.Byte: foreach (int i in buff.Keys) { this.ByteValue.SetValue(i, (byte)buff[i]); } break; case Class.TypeUse.TypeList.Bytes: case Class.TypeUse.TypeList.UnKnow: break; case Class.TypeUse.TypeList.DateTime: foreach (int i in buff.Keys) { this.DateTimeValue.SetValue(i, (DateTime)buff[i]); } break; case Class.TypeUse.TypeList.Double: foreach (int i in buff.Keys) { this.DoubleValue.SetValue(i, (double)buff[i]); } break; case Class.TypeUse.TypeList.Float: foreach (int i in buff.Keys) { this.FloatValue.SetValue(i, (float)buff[i]); } break; case Class.TypeUse.TypeList.Int: foreach (int i in buff.Keys) { this.IntValue.SetValue(i, (int)buff[i]); } break; case Class.TypeUse.TypeList.Long: foreach (int i in buff.Keys) { this.LongValue.SetValue(i, (long)buff[i]); } break; case Class.TypeUse.TypeList.String: foreach (int i in buff.Keys) { this.StringValue.SetValue(i, (string)buff[i]); } break; case Class.TypeUse.TypeList.UShort: foreach (int i in buff.Keys) { this.UshortValue.SetValue(i, (ushort)buff[i]); } break; } }
public override bool WriteInternal <T>(List <T> value, Dictionary <string, string> parm) { lock (lockObject) { bool result = true; //写入数据 if (value == null || value.Count <= 0) { All.Class.Error.Add("写入数据为空,不能写入空数据", Environment.StackTrace); return(false); } //单个boolean值写入 All.Class.TypeUse.TypeList t = All.Class.TypeUse.GetType <T>(); //写入地址 if (!parm.ContainsKey("Start") && !parm.ContainsKey("Address")) { All.Class.Error.Add("数据写入参数中不包含寄存器地址", Environment.StackTrace); return(false); } ushort tmpAddress = 0; if (parm.ContainsKey("Start")) { tmpAddress = parm["Start"].ToUshort(); } if (parm.ContainsKey("Address")) { tmpAddress = parm["Address"].ToUshort(); } //写入区域 string code = "BW"; if (!parm.ContainsKey("Code")) { switch (t) { case Class.TypeUse.TypeList.Boolean: parm.Add("Code", "M"); break; case Class.TypeUse.TypeList.UShort: case Class.TypeUse.TypeList.Byte: case Class.TypeUse.TypeList.Int: case Class.TypeUse.TypeList.String: case Class.TypeUse.TypeList.Long: parm.Add("Code", "D"); code = "WW"; break; default: All.Class.Error.Add("数据写入类型不正确,须要先添加并测试", Environment.StackTrace); break; } } List <byte> sendBuff = new List <byte>(); sendBuff.Add(0x05); sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", address))); sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", 0xFF))); sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0}", code))); sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X1}", delay))); sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0}", parm["Code"].ToUpper()))); sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X4}", tmpAddress))); switch (t) { case Class.TypeUse.TypeList.Boolean: sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", value.Count))); for (int i = 0; i < value.Count; i++) { sendBuff.Add((byte)((bool)(object)value[i] ? 0x31 : 0x30)); } break; case Class.TypeUse.TypeList.Double: sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", 4 * value.Count))); for (int i = 0; i < value.Count; i++) { sendBuff.AddRange(Encoding.ASCII.GetBytes(All.Class.Num.Hex2Str(BitConverter.GetBytes((double)(object)value[i])))); } break; case Class.TypeUse.TypeList.Float: sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", 2 * value.Count))); for (int i = 0; i < value.Count; i++) { sendBuff.AddRange(Encoding.ASCII.GetBytes(All.Class.Num.Hex2Str(BitConverter.GetBytes((float)(object)value[i])))); } break; case Class.TypeUse.TypeList.Int: sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", value.Count))); int tmpInt = 0; for (int i = 0; i < value.Count; i++) { tmpInt = (int)(object)value[i]; if (tmpInt < 0) { tmpInt = -((tmpInt ^ 0xFFFF) + 1); } sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X4}", tmpInt))); } break; case Class.TypeUse.TypeList.Long: sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", value.Count))); for (int i = 0; i < value.Count; i++) { sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X4}", (long)(object)value[i]))); } break; case Class.TypeUse.TypeList.UShort: sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", value.Count))); for (int i = 0; i < value.Count; i++) { sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X4}", (ushort)(object)value[i]))); } break; } if (check) { sendBuff.AddRange(Encoding.ASCII.GetBytes(string.Format("{0:X2}", All.Class.Check.SumCheck(sendBuff.ToArray(), 1, sendBuff.Count - 1)))); } if (crlf) { sendBuff.Add(0x0D); sendBuff.Add(0x0A); } byte[] readBuff; if (WriteAndRead <byte[], byte[]>(sendBuff.ToArray(), 5, out readBuff)) { if (readBuff[0] != sendBuff[0] || readBuff[1] != sendBuff[1] || readBuff[2] != sendBuff[2] || readBuff[3] != sendBuff[3] || readBuff[4] != sendBuff[4]) { All.Class.Error.Add("读取参数帧头或帧尾校验失败", Environment.StackTrace); All.Class.Error.Add(string.Format("读取帧为:{0}", All.Class.Num.Hex2Str(readBuff))); return(false); } result = true; } else { result = false; } return(result); } }
public ReadDataStyle(All.Class.TypeUse.TypeList type, Dictionary <string, string> symbol) { this.Type = type; this.Random = (int)All.Class.Num.GetRandom(0, 99999); this.Symbol = symbol; }