Пример #1
0
 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>();
 }
Пример #2
0
 public PlcObjectBinding(PlcRawData rawData, PlcObject metaData, int offset, int validationTimeMs, bool fullType = false)
 {
     RawData            = rawData;
     MetaData           = metaData;
     Offset             = offset;
     ValidationTimeInMs = validationTimeMs;
     FullType           = fullType;
 }
Пример #3
0
        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;
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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;
                }
Пример #6
0
        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);
        }
Пример #7
0
 public static PlcMetaDataTreePath CreateNodePath(ITreePath path, PlcObject plcObject) => path.Extend(plcObject.Name) as PlcMetaDataTreePath;