/// <summary> /// 根据XML配置文件创建Modbus点表 /// 并将点表绑定到通用点表(PointMapping) /// </summary> /// <param name="workBook"></param> /// <param name="log"></param> /// <returns></returns> public static PointVirtualCollcet CreateMoudbus(XMLWorkbook workBook, ILog log) { PointMeDataList mappingIdexList = PointMeDataList.GetInstance(); var result = new PointVirtualCollcet(); List <string> colums = workBook.llStrings[0];//第一行列表为索引列数据; workBook.llStrings.RemoveAt(0); foreach (var ls in workBook.llStrings) { string addressName = ""; int address; string pointName = ""; int bindingIndex = 0; BindingWay bindingWay = BindingWay.OneWay; ByteOrder byteOrder = ByteOrder.None; if (ls.Count < colums.Count) { continue; } for (int i = 0; i < colums.Count; i++) { switch (colums[i].ToLower()) { case "addressname": addressName = ls[i]; break; case "pointname": var pointGroup = ls[i].Split(new char[] { '[' }); if (pointGroup != null && pointGroup.Length >= 2) { pointName = pointGroup[0]; pointGroup[1] = pointGroup[1].Replace("]", ""); //string类型处理,去掉‘]’ int.TryParse(pointGroup[1], out bindingIndex); } break; case "bindingway": int temp; if (int.TryParse(ls[i], out temp)) { bindingWay = (BindingWay)temp; } break; case "byteorder": int temp1; if (int.TryParse(ls[i], out temp1)) { byteOrder = (ByteOrder)temp1; } break; } } string type; /* * =============================== * 1.根据地址名生成相应的Modbus点 * 2.根据配置表绑定到对应的主地址表 * 3.如果绑定成功则添加到list中 * 4。根据不同的绑定类型分为:只读,只写,可读可写 * =============================== */ if (addressName != "" && int.TryParse(addressName, out address) && pointName != "") { if (addressName.Substring(0, 1) == "0" || addressName.Substring(0, 1) == "1") { if (mappingIdexList.Find(pointName, out type) && type == ds.ValueType.Bool) { VirtulPoint <bool> boolPoint = new VirtulPoint <bool>(addressName, type) { }; var sourcePoint = PointMapping <bool> .GetInstance(log).GetPoint(pointName); if (PointsBinding.BoolBinding(sourcePoint, bindingIndex, boolPoint, bindingWay)) { result.BoolPoints.Add(boolPoint); } } } if (addressName.Substring(0, 1) == "3" || addressName.Substring(0, 1) == "4") { if (mappingIdexList.Find(pointName, out type)) { VirtulPoint <ushort> ushortPoint1 = new VirtulPoint <ushort>(addressName, ds.ValueType.UInt16); VirtulPoint <ushort> ushortPoint2 = new VirtulPoint <ushort>((address + 1).ToString(), ds.ValueType.UInt16); if (type == ds.ValueType.Byte) { var sourcePoint = PointMapping <byte> .GetInstance(log).GetPoint(pointName); if (PointsBinding.UshortBinding(sourcePoint, bindingIndex, ushortPoint1, bindingWay)) { result.UshortPoints.Add(ushortPoint1); } } if (type == ds.ValueType.Int16) { var sourcePoint = PointMapping <short> .GetInstance(log).GetPoint(pointName); if (PointsBinding.UshortBinding(sourcePoint, bindingIndex, ushortPoint1, bindingWay)) { result.UshortPoints.Add(ushortPoint1); } } if (type == ds.ValueType.UInt16) { var sourcePoint = PointMapping <ushort> .GetInstance(log).GetPoint(pointName); if (PointsBinding.UshortBinding(sourcePoint, bindingIndex, ushortPoint1, bindingWay)) { result.UshortPoints.Add(ushortPoint1); } } if (type == ds.ValueType.Int32) { var sourcePoint = PointMapping <int> .GetInstance(log).GetPoint(pointName); if (PointsBinding.UshortBinding(sourcePoint, bindingIndex, new VirtulPoint <ushort>[] { ushortPoint1, ushortPoint2 }, byteOrder, bindingWay)) { result.UshortPoints.Add(ushortPoint1); result.UshortPoints.Add(ushortPoint2); } } if (type == ds.ValueType.UInt32) { var sourcePoint = PointMapping <uint> .GetInstance(log).GetPoint(pointName); if (PointsBinding.UshortBinding(sourcePoint, bindingIndex, new VirtulPoint <ushort>[] { ushortPoint1, ushortPoint2 }, byteOrder, bindingWay)) { result.UshortPoints.Add(ushortPoint1); result.UshortPoints.Add(ushortPoint2); } } if (type == ds.ValueType.Float) { var sourcePoint = PointMapping <float> .GetInstance(log).GetPoint(pointName); if (PointsBinding.UshortBinding(sourcePoint, bindingIndex, new VirtulPoint <ushort>[] { ushortPoint1, ushortPoint2 }, byteOrder, bindingWay)) { result.UshortPoints.Add(ushortPoint1); result.UshortPoints.Add(ushortPoint2); } } } } } else { log.ErrorLog(string.Format("adderss error or binding point is null!")); } } return(result); }
/// <summary> /// 16位无符号整形点绑定16位无符号整形数据 /// </summary> /// <param name="source">bool源数据</param> /// <param name="sourceindex">源数据点索引</param> /// <param name="target">目标数据,点长度为1的虚拟点</param> /// <param name="bindingWay">绑定方式,默认为单方向</param> public static bool BoolBinding(IPoint <bool> source, int sourceindex, IPoint <bool> target, BindingWay bindingWay = BindingWay.OneWay) { if (sourceindex >= source.Length) { return(false); } switch (bindingWay) { case BindingWay.OneWay: source.PropertyChanged += (s, p) => { if (int.Parse(p.PropertyName) == sourceindex) { target.ValueUpdate(source[(byte)sourceindex], 0); } }; return(true); case BindingWay.TwoWay: source.PropertyChanged += (s, p) => { if (int.Parse(p.PropertyName) == sourceindex) { target.ValueUpdate(source[(byte)sourceindex], 0); } }; target.PropertyChanged += (s, p) => { source.ValueUpdate(target[0], sourceindex); }; return(true); case BindingWay.ReverseWay: target.PropertyChanged += (s, p) => { source.ValueUpdate(target[0], sourceindex); }; return(true); default: return(false); } }
/// <summary> /// 16位无符号整形点绑定32整形数据 /// </summary> /// <param name="source">32位整形源数据</param> /// <param name="sourceindex">源数据点索引</param> /// <param name="targets">目标数据,数组长度为2,点长度为1的虚拟点</param> /// <param name="bindingWay">绑定方式,默认为单方向</param> public static bool UshortBinding(IPoint <int> source, int sourceindex, IPoint <ushort>[] targets, ByteOrder byterOrder = ByteOrder.None, BindingWay bindingWay = BindingWay.OneWay) { if (sourceindex >= source.Length) { return(false); } if (targets.Length != 2) { return(false); } switch (bindingWay) { case BindingWay.OneWay: source.PropertyChanged += (s, p) => { if (int.Parse(p.PropertyName) == sourceindex) { byte[] temp1 = UnsafeNetConvert.IntToBytes(source[(byte)sourceindex], byterOrder); ushort[] temp2 = (byterOrder == ByteOrder.BigEndian)? UnsafeNetConvert.BytesToUShorts(temp1, 0, 2, byterOrder):UnsafeNetConvert.BytesToUShorts(temp1, 0, 2, ByteOrder.None); for (int i = 0; i < targets.Length; i++) { targets[i].ValueUpdate(temp2[i], 0); } } }; return(true); case BindingWay.TwoWay: source.PropertyChanged += (s, p) => { if (int.Parse(p.PropertyName) == sourceindex) { byte[] temp1 = UnsafeNetConvert.IntToBytes(source[(byte)sourceindex], byterOrder); ushort[] temp2 = (byterOrder == ByteOrder.BigEndian) ? UnsafeNetConvert.BytesToUShorts(temp1, 0, 2, byterOrder) : UnsafeNetConvert.BytesToUShorts(temp1, 0, 2, ByteOrder.None); for (int i = 0; i < targets.Length; i++) { targets[i].ValueUpdate(temp2[i], 0); } } }; foreach (var target in targets) { target.PropertyChanged += (s, p) => { var temp1 = (byterOrder == ByteOrder.BigEndian) ? UnsafeNetConvert.UShortsToBytes(new ushort[] { targets[0][0], targets[1][0] }, byterOrder): UnsafeNetConvert.UShortsToBytes(new ushort[] { targets[0][0], targets[1][0] }, ByteOrder.None); var temp2 = UnsafeNetConvert.BytesToInt(temp1, 0, byterOrder); source.ValueUpdate(temp2, sourceindex); }; } return(true); case BindingWay.ReverseWay: foreach (var target in targets) { target.PropertyChanged += (s, p) => { var temp1 = (byterOrder == ByteOrder.BigEndian) ? UnsafeNetConvert.UShortsToBytes(new ushort[] { targets[0][0], targets[1][0] }, byterOrder) : UnsafeNetConvert.UShortsToBytes(new ushort[] { targets[0][0], targets[1][0] }, ByteOrder.None); var temp2 = UnsafeNetConvert.BytesToInt(temp1, 0, byterOrder); source.ValueUpdate(temp2, sourceindex); }; } return(true); default: return(false); } }
/// <summary> /// 16位无符号整形点绑定16位无符号整形数据 /// </summary> /// <param name="source">byte源数据,长度不小于2</param> /// <param name="sourceindex">源数据点索引</param> /// <param name="target">目标数据,点长度为1的虚拟点</param> /// <param name="bindingWay">绑定方式,默认为单方向</param> public static bool UshortBinding(IPoint <byte> source, int sourceindex, IPoint <ushort> target, BindingWay bindingWay = BindingWay.OneWay) { if (sourceindex + 1 >= source.Length) { return(false); } switch (bindingWay) { case BindingWay.OneWay: source.PropertyChanged += (s, p) => { if (int.Parse(p.PropertyName) == sourceindex) { var temp = UnsafeNetConvert.BytesToUShort(new byte[] { source[(byte)sourceindex], source[(byte)(sourceindex + 1)] }, 0, ByteOrder.None); target.ValueUpdate(temp, 0); } }; return(true); case BindingWay.TwoWay: source.PropertyChanged += (s, p) => { if (int.Parse(p.PropertyName) == sourceindex) { var temp = UnsafeNetConvert.BytesToUShort(new byte[] { source[(byte)sourceindex], source[(byte)(sourceindex + 1)] }, 0, ByteOrder.None); target.ValueUpdate(temp, 0); } }; target.PropertyChanged += (s, p) => { var temp = UnsafeNetConvert.UShortToBytes(target[0], ByteOrder.None); source.ValueUpdate(temp[0], sourceindex); source.ValueUpdate(temp[1], sourceindex + 1); }; return(true); case BindingWay.ReverseWay: target.PropertyChanged += (s, p) => { var temp = UnsafeNetConvert.UShortToBytes(target[0], ByteOrder.None); source.ValueUpdate(temp[0], sourceindex); source.ValueUpdate(temp[1], sourceindex + 1); }; return(true); default: return(false); } }