Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
            }
        }
Пример #3
0
        /// <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);
            }
        }
Пример #4
0
        /// <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);
            }
        }