Example #1
0
        /// <summary>
        /// Create Raw Read operations for Array Elements
        /// </summary>
        private void HandleArray(int offset, PlcArray array, KeyValuePair <string, Tuple <int, PlcObject> > item, PlcRawData pred, string dimension = "")
        {
            var arrayOffset = offset;

            for (var i = array.From; i <= array.To; i++)
            {
                var index   = $"[{i}]";
                var element = array.ArrayType is PlcStruct
                    ? new PlcObjectRef(index, array.ArrayType)
                    : PlcObjectFactory.CreatePlcObjectForArrayIndex(array.ArrayType, i, array.From);

                var name     = $"{item.Key}{index}";
                var elemName = string.IsNullOrWhiteSpace(dimension) ? name :  $"{dimension}{index}";
                if (element is PlcArray)
                {
                    pred.AddReference(elemName, arrayOffset, element);
                    HandleArray(arrayOffset, element as PlcArray, item, pred, name);
                    arrayOffset += array.ArrayType.Size.Bytes;
                }
                else
                {
                    pred.AddReference(elemName, arrayOffset, element);
                    arrayOffset += array.ArrayType.Size.Bytes;
                }
            }
        }
Example #2
0
        /// <summary>
        /// Create Raw Read operations for Array Elements
        /// </summary>
        private void HandleArray(int offset, PlcArray array, KeyValuePair <string, Tuple <int, PlcObject> > item, PlcRawData pred, string dimension = "")
        {
            var arrayOffset = offset;

            for (var i = array.From; i <= array.To; i++)
            {
                var element = array.ArrayType is PlcStruct
                    ? new PlcObjectRef(string.Format("[{0}]", i), array.ArrayType)
                    : PlcObjectFactory.CreatePlcObjectForArrayIndex(array.ArrayType, i, array.From);

                if (element is PlcArray)
                {
                    var elemName = string.IsNullOrWhiteSpace(dimension) ? string.Format("{0}[{1}]", item.Key, i) : dimension + string.Format("[{0}]", i);
                    pred.AddReference(elemName, arrayOffset, element);
                    HandleArray(arrayOffset, element as PlcArray, item, pred, string.Format("{0}[{1}]", item.Key, i));
                    arrayOffset += array.ArrayType.Size.Bytes;
                }
                else
                {
                    var elemName = string.IsNullOrWhiteSpace(dimension) ? string.Format("{0}[{1}]", item.Key, i) : dimension + string.Format("[{0}]", i);
                    pred.AddReference(elemName, arrayOffset, element);
                    arrayOffset += array.ArrayType.Size.Bytes;
                }
            }
        }
Example #3
0
        /// <summary>
        /// Syntax:
        /// Selector= Area[DbNumber]
        ///
        /// IB: Input Area
        /// FB: Flag Area
        /// QB: Output Area
        /// TM: Timer Area
        /// CT: Counter Area
        /// DB: DataBlock Area
        ///
        /// W = Word; X = Bool;  B = Byte; I = Int; S = String;
        ///
        /// [TYPE][OFFSET][_CountOfData]
        ///
        /// Bool
        /// [TYPE][OFFSET_Bit][_CountOfData]
        ///
        /// String
        /// [TYPE][OFFSET_Stringlength][_CountOfData]
        /// </summary>
        /// <param name="plcObj"></param>
        /// <param name="plcObjects"></param>
        /// <param name="values"></param>
        internal static bool AddRawPlcObjects(ITreeNode plcObj, Dictionary <string, Tuple <int, PlcObject> > plcObjects, IEnumerable <string> values)
        {
            var adds    = new Dictionary <string, Tuple <int, PlcObject> >();
            var updated = false;

            foreach (var value in values)
            {
                var dataType = new StringBuilder();
                foreach (var c in value.TakeWhile(char.IsLetter))
                {
                    dataType.Append(c);
                }

                var plcObject = DataTypeToPlcObject(value, dataType);

                if (plcObject != null)
                {
                    var parts = value.Substring(dataType.Length).Split(new[] { "_", "," }, StringSplitOptions.RemoveEmptyEntries);
                    plcObject.Selector = plcObj.Name;
                    if (parts.Length >= 2)
                    {
                        if (plcObject is PlcBool)
                        {
                            plcObject.Offset.Bits = int.Parse(parts[1]);
                        }

                        if (plcObject is ISupportStringLengthAttribute plcs)
                        {
                            plcs.StringLength = int.Parse(parts[1]);
                        }

                        if (!(plcObject is PlcBool || plcObject is ISupportStringLengthAttribute) || parts.Length >= 3)
                        {
                            var length = int.Parse(parts.Last());
                            if (length > 0)
                            {
                                length--;
                            }
                            plcObject = new PlcArray(value, plcObject, 0, length);
                        }
                    }
                    plcObject.Offset.Bytes = int.Parse(parts[0]);
                    if (!plcObjects.ContainsKey(value))
                    {
                        adds.Add(value, new Tuple <int, PlcObject>(0, plcObject));
                    }
                }
                else
                {
                    ExceptionThrowHelper.ThrowInvalidVariableException($"{plcObj.Name}.{value}");
                }
            }

            if (adds.Any())
            {
                foreach (var item in adds)
                {
                    if (!plcObjects.ContainsKey(item.Key))
                    {
                        updated = true;
                        plcObjects.Add(item.Key, item.Value);
                    }
                }
            }
            return(updated);
        }