/// <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; } } }
/// <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; } } }
/// <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); }