Exemplo n.º 1
0
        /// <summary>
        /// Check if the current line is a UDT
        /// </summary>
        /// <param name="splittedLines"></param>
        /// <returns></returns>
        private List <SignalModelContext> CheckForUDT(DbFileLineItem lineItem)
        {
            List <string> splittedUdtName = lineItem.DataTypeStr.Split('"').ToList();

            if (splittedUdtName.Count > 1)
            {
                char[] charsToTrim = new char[] { '\\', '/', '\"', ' ' };
                string udtFileName = lineItem.DataTypeStr.Trim(charsToTrim);

                string filePath = AppDomain.CurrentDomain.BaseDirectory + Constants.BaseDirectorySubDirs +
                                  udtFileName + Constants.S7UdtExtension;


                FileInfo fileInfo = new FileInfo(filePath);
                if (fileInfo.Exists)
                {
                    _fileLines = ReadS7DbFile(filePath);
                    if (_fileLines?.Count == 0)
                    {
                        return(new List <SignalModelContext>());
                    }

                    _structNames.Add(lineItem.Name);
                    var signals = ParseDb();
                    if (_structNames.Count > 0)
                    {
                        _structNames.RemoveAt(_structNames.Count - 1);
                    }

                    return(signals);
                }
            }
            return(new List <SignalModelContext>());
        }
Exemplo n.º 2
0
        private SignalModelContext CreateSignalContextItem(DbFileLineItem lineItem)
        {
            if (!lineItem.IsDataType)
            {
                return(null);
            }

            string name = String.Empty;

            foreach (var structName in _structNames)
            {
                name += structName + '.';
            }
            name += lineItem.Name;

            SignalModelContext ctx = new SignalModelContext
            {
                Name        = name,
                Description = lineItem.Description,
                DataTypeStr = lineItem.DataTypeStr,
                ByteIndex   = _bitByteIndexControl.ByteCounter,
                BitNumber   = _bitByteIndexControl.BitCounter
            };

            return(ctx);
        }
Exemplo n.º 3
0
 public void Reset()
 {
     BitCounter  = 0;
     ByteCounter = 0;
     _previousDataTypeLineItem = new DbFileLineItem();
     _previousLineItem         = null;
 }
Exemplo n.º 4
0
        public void Update(DbFileLineItem lineItem)
        {
            if (_previousLineItem == null)
            {
                BitCounter  = 0;
                ByteCounter = 0;
            }
            else
            {
                if (lineItem.IsDataType)
                {
                    if (lineItem.IsBoolType)
                    {
                        HandleBooleanType();
                    }
                    else
                    {
                        HandleNumericType();
                    }
                }
            }

            _previousLineItem = lineItem;

            if (lineItem.IsDataType)
            {
                _previousDataTypeLineItem = lineItem;
            }
        }
Exemplo n.º 5
0
        private List <SignalModelContext> ParseDb()
        {
            bool result = RemoveHeaderData(_fileLines, _contentStartKeywords);

            // TODO: HANDLE
            if (!result)
            {
                throw new Exception("Exception: Invalid file. No STRUCT or VAR keyword found.");
            }

            List <SignalModelContext> signalContextList = new List <SignalModelContext>();

            foreach (var line in _fileLines)
            {
                var lineItem = new DbFileLineItem(line, _discardKeywords);

                if (lineItem.IsValid)
                {
                    if (lineItem.IsStruct)
                    {
                        _structNames.Add(lineItem.Name);
                    }

                    int currentByteCount = _bitByteIndexControl.ByteCounter;
                    IList <SignalModelContext> signalsFromUdt = CheckForUDT(lineItem);
                    signalContextList.AddRange(signalsFromUdt);

                    IList <SignalModelContext> signalsFromArray = CheckForArrayType(lineItem);
                    signalContextList.AddRange(signalsFromArray);


                    if (currentByteCount == _bitByteIndexControl.ByteCounter)
                    {
                        _bitByteIndexControl.Update(lineItem);

                        if (!lineItem.IsDiscarded)
                        {
                            signalContextList.Add(CreateSignalContextItem(lineItem));
                        }
                    }
                }
            }
            log.Info($"DatablockParser.ParseDb - parse completed - signal count {signalContextList.Count}");
            return(signalContextList);
        }
Exemplo n.º 6
0
        private List <SignalModelContext> CheckForArrayType(DbFileLineItem lineItem)
        {
            var output = new List <SignalModelContext>();


            // Excepected value of dataTypeStr if array datatype is Int  and size is 3: Array[0..2] of Int

            // Array[0..2] of Int
            // 1. split .. and remove 0, 6 => splitted[0] = lower value
            // splitt on ']' + ' '  =>  splitted.First = upper value,  splitted.First

            // Example input string: "Array[0..2] of Int" At least 18 chars and always begins with: Array[


            if (String.IsNullOrEmpty(lineItem.DataTypeStr) || lineItem.DataTypeStr.Count() < 18 || !lineItem.DataTypeStr.Contains("Array["))
            {
                return(output);
            }


            string arrayBeginStr, arrayEndStr, arrayDataTypeStr;

            // 1. split on .. and remove 0, 6 => splitted[0] == lower value
            List <string> dataTypeStrSplitted = lineItem.DataTypeStr.Split(new string[] { ".." }, StringSplitOptions.None).ToList();

            arrayBeginStr = dataTypeStrSplitted[0].Remove(0, 6);

            List <string> splitGetUpperValueAndType = dataTypeStrSplitted[1].Split(new string[] { "]", " " }, StringSplitOptions.None).ToList();

            arrayEndStr      = splitGetUpperValueAndType.First();
            arrayDataTypeStr = splitGetUpperValueAndType.Last();

            bool parseOk = false;
            int  arrayBegin, arrayEnd;

            parseOk = Int32.TryParse(arrayBeginStr, out arrayBegin);
            parseOk = Int32.TryParse(arrayEndStr, out arrayEnd);

            // 2. Get the datatype and its bytesize
            int byteMultiplier = Constants.S7DataTypesByteSize[arrayDataTypeStr];

            if (parseOk && byteMultiplier > 0)
            {
                int    arraySize = arrayEnd - arrayBegin + 1;
                string name      = lineItem.Name;
                lineItem.DataTypeStr = arrayDataTypeStr;
                for (int i = 0; i < arraySize; i++)
                {
                    _bitByteIndexControl.Update(lineItem);
                    if (!lineItem.IsDiscarded)
                    {
                        lineItem.Name = name + $"[{i}]";
                        output.Add(CreateSignalContextItem(lineItem));
                    }
                }
            }
            else
            {
                throw new Exception("Invalid file. Array parse error");
            }

            return(output);
        }