public MappingEntry(PlcObject plcObject) { PlcObject = plcObject ?? ExceptionThrowHelper.ThrowArgumentNullException <PlcObject>(nameof(plcObject)); BaseBinding = new PlcObjectBinding(new PlcRawData(plcObject.ByteSize), plcObject, 0, 0, true); Variables = new Dictionary <string, Tuple <int, PlcObject> >(); Bindings = new Dictionary <string, PlcObjectBinding>(); }
public PlcObjectBinding(PlcRawData rawData, PlcObject metaData, int offset, int validationTimeMs, bool fullType = false) { RawData = rawData; MetaData = metaData; Offset = offset; ValidationTimeInMs = validationTimeMs; FullType = fullType; }
public Entry(PlcDataMapper mapper, PlcObject plcObject, int readDataBlockSize, int validationTimeInMs) { _mapper = mapper ?? ExceptionThrowHelper.ThrowArgumentNullException <PlcDataMapper>(nameof(mapper)); PlcObject = plcObject ?? ExceptionThrowHelper.ThrowArgumentNullException <PlcObject>(nameof(plcObject)); ReadDataBlockSize = readDataBlockSize; ValidationTimeMs = validationTimeInMs; Variables = new Dictionary <string, Tuple <int, PlcObject> >(); Name = plcObject.Name; }
/// <summary> /// Try to get the mapping from MetaTree. If the data are not in the tree, try to create and add it. /// </summary> internal static PlcObject GetMapping(string name, ITree tree, Type t, bool allowAddingWithoutMappingAttribute = false) { if (string.IsNullOrWhiteSpace(name)) { return(null); } var nodePathStack = new Stack <string>(); nodePathStack.Push(RootNodeName); nodePathStack.Push(InstancesNodeName); foreach (var part in name.Split('.')) { nodePathStack.Push(part); } var path = PlcMetaDataTreePath.CreateAbsolutePath(nodePathStack.Reverse().ToArray()); var offset = 0; if (!tree.TryGet(path, ref offset, out var obj, true)) { if (t == null) { ExceptionThrowHelper.ThrowArgumentNullException(nameof(t)); } var mapping = t.GetTypeInfo().GetCustomAttributes <MappingAttribute>().FirstOrDefault(m => m.Name == name); if (mapping != null) { nodePathStack.Pop(); var plcObj = new PlcObjectRef(name, GetMetaData(tree, t)) { Offset = { Bytes = mapping.Offset }, Selector = mapping.Selector }; PlcObject.AddPlcObjectToTree(plcObj, tree, PlcMetaDataTreePath.CreateAbsolutePath(nodePathStack.Reverse().ToArray())); obj = plcObj; } else if (allowAddingWithoutMappingAttribute) { nodePathStack.Pop(); var plcObj = new PlcObjectRef(name, GetMetaData(tree, t)); PlcObject.AddPlcObjectToTree(plcObj, tree, PlcMetaDataTreePath.CreateAbsolutePath(nodePathStack.Reverse().ToArray())); obj = plcObj; } else { ExceptionThrowHelper.ThrowInvalidMappingNameException(name); } } return(obj as PlcObject); }
/// <summary> /// Try to get Meta data from MetaTree. If the data are not in the tree, try to create and add it. /// All the calculation of the offsets will be made in this method. the tree has two parts, one for MetaData and one for The Mappings. /// The mappings have only a Reference of the Meta data, so you shouldn't change the Offsets while using. /// </summary> private static PlcObject GetMetaData(ITree tree, Type t) { var nodePathStack = new Stack <string>(); var name = NormalizeTypeName(t.FullName); nodePathStack.Push(RootNodeName); nodePathStack.Push(MetaDataNodeName); nodePathStack.Push(name); var path = PlcMetaDataTreePath.CreateAbsolutePath(nodePathStack.Reverse().ToArray()); var offset = 0; if (!tree.TryGet(path, ref offset, out var obj)) { var byteOffset = 0; var bitOffset = 0; nodePathStack.Pop(); var parent = new PlcStruct(name, t); PlcObject.AddPlcObjectToTree(parent, tree, PlcMetaDataTreePath.CreateAbsolutePath(nodePathStack.Reverse().ToArray())); nodePathStack.Push(parent.Name); PlcObject pred = null; DebugOutPut("{0}{{", name); foreach (var pi in t.GetTypeInfo().DeclaredProperties) { var plcObject = PlcObjectFactory.CreatePlcObject(pi); if (plcObject is PlcArray plcObjectArray && (plcObjectArray.LeafElementType ?? plcObjectArray.ArrayType) is PlcStruct) { plcObjectArray.ArrayType = GetMetaData(tree, plcObjectArray.ElemenType); } else if (plcObject is PlcStruct) { plcObject = new PlcObjectRef(plcObject.Name, GetMetaData(tree, pi.PropertyType)); } var hasCustomOffset = PlcObjectFactory.GetOffsetFromAttribute(pi, ref byteOffset, ref bitOffset); AddPlcObject(tree, pred, plcObject, nodePathStack, ref byteOffset, ref bitOffset, hasCustomOffset); pred = plcObject; }
private static PlcObject DataTypeToPlcObject(string value, StringBuilder dataType) { PlcObject plcObject = null; switch (dataType.ToString()) { case "X": case "BIT": plcObject = new PlcBool(value); break; case "B": case "BYTE": plcObject = new PlcByte(value); break; case "C": case "CHAR": plcObject = new PlcChar(value); break; case "DATE": plcObject = new PlcDate(value); break; case "DT": case "DATETIME": plcObject = new PlcDateTime(value); break; case "DI": case "DINT": plcObject = new PlcDInt(value); break; case "DW": case "DWORD": plcObject = new PlcDWord(value); break; case "I": case "INT": plcObject = new PlcInt(value); break; case "LDT": case "LDATETIME": plcObject = new PlcLDateTime(value); break; case "LI": case "LINT": plcObject = new PlcLInt(value); break; case "LT": case "LTIME": plcObject = new PlcTime(value); break; case "LW": case "LWORD": plcObject = new PlcWord(value); break; case "R": case "REAL": plcObject = new PlcReal(value); break; case "TIMEBCD": plcObject = new PlcS5Time(value); break; case "CT": case "COUNT": plcObject = new PlcS7Counter(value); break; case "SI": case "SINT": plcObject = new PlcSInt(value); break; case "S": case "STRING": plcObject = new PlcString(value); break; case "T": case "TIME": plcObject = new PlcTime(value); break; case "TOD": plcObject = new PlcTimeOfDay(value); break; case "UDI": case "UDINT": plcObject = new PlcUDInt(value); break; case "UI": case "UINT": plcObject = new PlcUInt(value); break; case "ULI": case "ULINT": plcObject = new PlcULInt(value); break; case "USI": case "USINT": plcObject = new PlcUSInt(value); break; case "WC": case "WCHAR": plcObject = new PlcWChar(value); break; case "W": case "WORD": plcObject = new PlcWord(value); break; case "WS": case "WSTRING": plcObject = new PlcWString(value); break; } return(plcObject); }
public static PlcMetaDataTreePath CreateNodePath(ITreePath path, PlcObject plcObject) => path.Extend(plcObject.Name) as PlcMetaDataTreePath;