Example #1
0
        public static string DataRowValueToSource(S7DataRow datrw, string leerz)
        {
            var retval = new StringBuilder();

            foreach (S7DataRow s7DataRow in datrw.Children)
            {
                if (s7DataRow.DataType == S7DataRowType.STRUCT)
                {
                    retval.Append(DataRowValueToSource(s7DataRow, leerz + " "));
                }
                else
                {
                    retval.AppendLine(leerz + s7DataRow.Name + " := " + s7DataRow.ValueAsString + ";");
                }
            }
            return(retval.ToString());
        }
 private void AddDBValueSubNodes(TreeNode nd, S7DataRow row)
 {
     if (row.Children != null)
     {
         foreach (S7DataRow s7DataRow in row.Children)
         {
             if (s7DataRow._children != null && s7DataRow.Children.Count > 0)
             {
                 DBValueTreeNode newNd = new DBValueTreeNode();
                 newNd.Text      = s7DataRow.Name;
                 newNd.s7datarow = s7DataRow;
                 nd.Nodes.Add(newNd);
                 AddDBValueSubNodes(newNd, s7DataRow);
             }
         }
     }
 }
Example #3
0
        /// <summary>
        /// This is a Helper Function wich is used by GetSourceBlock
        /// </summary>
        /// <param name="datrw"></param>
        /// <param name="leerz"></param>
        /// <returns></returns>
        private string GetSubParas(S7DataRow datrw, string leerz)
        {
            string retval = "";

            foreach (S7DataRow s7DataRow in datrw.Children)
            {
                string arr = "";
                string val = "";
                string cmt = "";
                if (s7DataRow.IsArray)
                {
                    arr += "ARRAY  [";
                    for (int i = 0; i < s7DataRow.ArrayStart.Count; i++)
                    {
                        if (i > 1)
                        {
                            arr += ", ";
                        }
                        arr += s7DataRow.ArrayStart[i].ToString() + " .. " + s7DataRow.ArrayStop[i].ToString() + " ";
                    }
                    arr += "] OF ";
                }
                if (s7DataRow.StartValue != null)
                {
                    val += " := " + s7DataRow.StartValue.ToString();
                }
                if (!string.IsNullOrEmpty(s7DataRow.Comment))
                {
                    cmt += "    //" + s7DataRow.Comment;
                }
                if (s7DataRow.DataType == S7DataRowType.STRUCT)
                {
                    retval += leerz + s7DataRow.Name + " : " + arr + s7DataRow.DataType + cmt + Environment.NewLine;
                    retval += GetSubParas(s7DataRow, leerz + " ");
                    retval += leerz + "END_STRUCT ;" + Environment.NewLine;
                }
                else
                {
                    retval += leerz + s7DataRow.Name + " : " + arr + s7DataRow.DataType + (s7DataRow.DataTypeBlockNumber != 0 ? s7DataRow.DataTypeBlockNumber.ToString() : "") + " " + val + ";" + cmt + Environment.NewLine;
                }
            }
            return(retval);
        }
Example #4
0
 internal static void FillActualValuesInDataBlock(S7DataRow row, byte[] actualValues, ref int valuePos, ref int bitPos)
 {
     if (valuePos >= actualValues.Length)
     {
         return;
     }
     else
     {
         if (row.DataType != S7DataRowType.STRUCT && row.DataType != S7DataRowType.UDT)
         {
             if (row.DataType == S7DataRowType.BOOL)
             {
                 row.Value = libnodave.getBit(actualValues[valuePos], bitPos);
                 bitPos++;
                 if (bitPos > 7)
                 {
                     bitPos = 0;
                     valuePos++;
                 }
             }
             else
             {
                 bitPos    = 0;
                 row.Value = GetVarTypeVal((byte)row.DataType, actualValues, ref valuePos);
             }
         }
         else
         {
             bitPos = 0;
             foreach (var child in row.Children)
             {
                 FillActualValuesInDataBlock(((S7DataRow)child), actualValues, ref valuePos, ref bitPos);
             }
         }
     }
 }
        private void cmdSelectStep7UDT_Click(object sender, EventArgs e)
        {
            S7DataBlock myDB = DotNetSiemensPLCToolBoxLibrary.Projectfiles.SelectProjectPart.SelectUDT();

            if (myDB != null)
            {
                var myLst = S7DataRow.GetChildrowsAsList(((S7DataRow)myDB.GetArrayExpandedStructure(new S7DataBlockExpandOptions()
                {
                    ExpandCharArrays = false
                })));

                dtaSendTabelle.Rows.Clear();
                dtaEmpfangstelegrammAufgeschluesselt.Rows.Clear();

                foreach (var itm in myLst)
                {
                    if (itm.DataType != S7DataRowType.STRUCT && itm.DataType != S7DataRowType.UDT)
                    {
                        dtaSendTabelle.Rows.Add(new object[] { itm.StructuredName, itm.ByteLength });
                        dtaEmpfangstelegrammAufgeschluesselt.Rows.Add(new object[] { itm.StructuredName, itm.ByteLength });
                    }
                }
            }
        }
Example #6
0
        //PLCDataRow
        //Diconary ByteAddres, PLCDataRow

        //Create Extra Functions for GetValues and GetActualValues
        //This functions get the PLCDataRow Structure.


        internal static S7DataRow GetFunctionParameterFromNumber(S7DataRow parameters, int index)
        {
            if (parameters == null || parameters.Children == null)
            {
                return(null);
            }
            int n     = 0;
            int akIdx = index;

            while (n < parameters.Children.Count)
            {
                S7DataRow tmp = ((S7DataRow)parameters.Children[n]);
                if (akIdx >= tmp.Children.Count)
                {
                    akIdx -= tmp.Children.Count;
                    n++;
                }
                else
                {
                    return((S7DataRow)tmp.Children[akIdx]);
                }
            }
            return(null);
        }
        //In this Class a UC is converted to a Call and also backwards...
        public static void ConvertUCToCall(S7FunctionBlock myFct, S7ProgrammFolder myFld, BlocksOfflineFolder myblkFld, S7ConvertingOptions myOpt, byte[] addInfoFromBlock)
        {
            if (myOpt.GenerateCallsfromUCs)
            {
                int inBld = 0; //1=nach BLD 1
                S7FunctionBlockRow newRow = null;

                Dictionary <string, string> Parameters = new Dictionary <string, string>();
                List <FunctionBlockRow>     retVal     = new List <FunctionBlockRow>();
                List <FunctionBlockRow>     tempList   = new List <FunctionBlockRow>();


                string registerDi    = "DI";
                string registerDb    = "";
                string registerAkku1 = "";
                string registerAkku2 = "";
                string registerAR1   = "";
                string registerAR2   = "";



                string  diName              = "";
                string  akPar               = "";
                string  db                  = "";
                string  label               = "";
                string  akku                = "";
                bool    afterCall           = false;
                bool    multiInstance       = false;
                int     multiInstanceOffset = 0;
                Pointer ar2Addr             = new Pointer(0, 0);

                S7FunctionBlockRow callRow = null;

                for (int n = 0; n < myFct.AWLCode.Count; n++)
                {
                    S7FunctionBlockRow row = (S7FunctionBlockRow)myFct.AWLCode[n];
                    if (row.Command == Mnemonic.opBLD[(int)myOpt.Mnemonic] && (row.Parameter == "1" || row.Parameter == "7" || row.Parameter == "3" || row.Parameter == "16" || row.Parameter == "14") && inBld == 0)
                    {
                        retVal.AddRange(tempList);
                        tempList.Clear();

                        Parameters.Clear();
                        db = "";

                        label = row.Label;

                        inBld     = Convert.ToInt32(row.Parameter);
                        newRow    = null;
                        afterCall = false;
                        callRow   = null;
                        diName    = "";

                        multiInstance       = false;
                        multiInstanceOffset = 0;
                        ar2Addr             = new Pointer(0, 0);

                        tempList.Add(row);
                    }
                    else if (inBld == 1 || inBld == 7)
                    {
                        #region FC Aufruf
                        tempList.Add(row);
                        if (row.Command == "=" && n > 0 && myFct.AWLCode[n - 1].Command == Mnemonic.opBLD[(int)myOpt.Mnemonic])
                        {
                            //Do nothing, but this line needs to be there!
                        }
                        else if (row.Command == Mnemonic.opU[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opUN[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opO[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opON[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opO[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opON[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opX[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opXN[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opL[(int)myOpt.Mnemonic])
                        {
                            akPar = row.Parameter;
                        }
                        else if (row.Command == Mnemonic.opAUF[(int)myOpt.Mnemonic])
                        {
                            db = row.Parameter + ".";
                        }
                        else if (row.Command == Mnemonic.opCLR[(int)myOpt.Mnemonic])
                        {
                            akPar = "FALSE";
                        }
                        else if (row.Command == Mnemonic.opSET[(int)myOpt.Mnemonic])
                        {
                            akPar = "TRUE";
                        }
                        else if (row.Command == Mnemonic.opTAR2[(int)myOpt.Mnemonic])
                        {
                            //look what we need to do here!!!
                        }
                        else if (row.Command == Mnemonic.opPAR2[(int)myOpt.Mnemonic])
                        {
                            //look what we need to do here!!!
                        }
                        else if (row.Command == Mnemonic.opLAR2[(int)myOpt.Mnemonic])
                        {
                            //look what we need to do here!!!
                        }
                        else if (row.Command == Mnemonic.opLAR1[(int)myOpt.Mnemonic])
                        {
                            //look what we need to do here!!!
                        }
                        else if ((row.Command == "=") && akPar != "")
                        {
                            if (afterCall == false)
                            {
                                string key = row.Parameter.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", "");
                                if (!Parameters.ContainsKey(key))
                                {
                                    Parameters.Add("P#V " + key, db + akPar);
                                }
                            }
                            else
                            {
                                string key = akPar.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", "");
                                if (!Parameters.ContainsKey(key))
                                {
                                    Parameters.Add("P#V " + key, db + row.Parameter);
                                }
                            }
                            akPar = "";
                            db    = "";
                        }
                        else if (row.Command == Mnemonic.opT[(int)myOpt.Mnemonic] && akPar != "")
                        {
                            if (afterCall == false)
                            {
                                string key = row.Parameter.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", "");

                                //Fix for replace db accesses with symbols
                                if (myOpt.ReplaceDBAccessesWithSymbolNames && db != "")
                                {
                                    string dbnr     = db.Substring(0, db.Length - 1);
                                    string dbSymbol = Helper.TryGetSymbolFromOperand(myblkFld, dbnr);
                                    db    = (dbSymbol != null ? "\"" + dbSymbol + "\"" : dbnr) + ".";
                                    akPar = Helper.TryGetStructuredName(myblkFld, dbnr, akPar);
                                }
                                //end fix
                                if (!Parameters.ContainsKey(key))
                                {
                                    Parameters.Add("P#V " + key + ".0", db + akPar);
                                }
                            }
                            else
                            {
                                string key = akPar.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", "");
                                if (!Parameters.ContainsKey("P#V " + key))
                                {
                                    Parameters.Add("P#V " + key, db + row.Parameter);
                                }
                            }
                            akPar = "";
                            db    = "";
                        }
                        else if (row.Command == Mnemonic.opT[(int)myOpt.Mnemonic] && akPar == "")
                        {
                            //look what we need to do here!!!
                        }
                        else if (row.Command == Mnemonic.opUC[(int)myOpt.Mnemonic])
                        {
                            //Commands after a Call --> Out-Para
                            callRow   = row;
                            afterCall = true;
                        }
                        else if (row.Command == Mnemonic.opBLD[(int)myOpt.Mnemonic] && (row.Parameter == "2" || row.Parameter == "8"))
                        {
                            //Block Interface auslesen (von FC oder vom Programm)
                            S7DataRow para = myblkFld.GetInterface(callRow.Parameter);

                            newRow               = new S7FunctionBlockRow();
                            newRow.Command       = Mnemonic.opCALL[(int)myOpt.Mnemonic];
                            newRow.Parent        = callRow.Parent;
                            newRow.Parameter     = callRow.Parameter;
                            newRow.CallParameter = new List <S7FunctionBlockParameter>();

                            for (int i = 0; i < callRow.ExtParameter.Count; i++)
                            {
                                string s = callRow.ExtParameter[i];

                                string    parnm = "";
                                S7DataRow akRow = Parameter.GetFunctionParameterFromNumber(para, i);
                                if (akRow != null)
                                {
                                    parnm = akRow.Name + "";
                                }
                                else
                                {
                                    parnm = "$$undef";
                                }


                                S7FunctionBlockParameter newPar = new S7FunctionBlockParameter(newRow);
                                newPar.Name = parnm;
                                if (akRow != null)
                                {
                                    newPar.ParameterDataType = akRow.DataType;
                                    if (akRow.Parent.Name == "OUT")
                                    {
                                        newPar.ParameterType = S7FunctionBlockParameterDirection.OUT;
                                    }
                                    else if (akRow.Parent.Name == "IN_OUT")
                                    {
                                        newPar.ParameterType = S7FunctionBlockParameterDirection.IN_OUT;
                                    }
                                    else
                                    {
                                        newPar.ParameterType = S7FunctionBlockParameterDirection.IN;
                                    }
                                }

                                if (akRow != null)
                                {
                                    int posL       = s.IndexOf(' ');
                                    int ak_address = 0;
                                    if (posL >= 0)
                                    {
                                        ak_address = Convert.ToInt32(s.Substring(posL + 1).Split('.')[0]);
                                    }
                                    else
                                    {
                                        ak_address = Convert.ToInt32(s.Substring(2).Split('.')[0]) * 8 +
                                                     Convert.ToInt32(s.Substring(2).Split('.')[1]);
                                    }

                                    int lokaldata_address = -1;
                                    if (s.Substring(0, 3) == "P#V")
                                    {
                                        lokaldata_address = Convert.ToInt32(s.Substring(4).Split('.')[0]);
                                    }

                                    if (akRow.DataType == S7DataRowType.STRING || akRow.DataType == S7DataRowType.DATE_AND_TIME ||
                                        akRow.DataType == S7DataRowType.STRUCT || akRow.DataType == S7DataRowType.UDT ||
                                        akRow.DataType == S7DataRowType.POINTER || akRow.IsArray)
                                    {
                                        string p1 = "";
                                        string p2 = "";
                                        Parameters.TryGetValue("P#V " + (lokaldata_address + 0).ToString() + ".0", out p1);
                                        Parameters.TryGetValue("P#V " + (lokaldata_address + 2).ToString() + ".0", out p2);


                                        string tmp = "";
                                        if (p1 != "" && p1 != "0")
                                        {
                                            tmp += "P#DB" + p1 + "." + (p2 == null ? "0" : p2.Substring(2));
                                        }
                                        else
                                        {
                                            tmp += p2;
                                        }
                                        newPar.Value = tmp;
                                        newRow.CallParameter.Add(newPar);
                                    }
                                    else if (akRow.DataType == S7DataRowType.ANY)
                                    {
                                        string tmp = s;
                                        if (Parameters.ContainsKey("P#V " + (lokaldata_address + 0).ToString() + ".0") &&
                                            Parameters.ContainsKey("P#V " + (lokaldata_address + 2).ToString() + ".0") &&
                                            Parameters.ContainsKey("P#V " + (lokaldata_address + 4).ToString() + ".0") &&
                                            Parameters.ContainsKey("P#V " + (lokaldata_address + 6).ToString() + ".0"))
                                        {
                                            string p1 = Parameters["P#V " + (lokaldata_address + 0).ToString() + ".0"];
                                            string p2 = Parameters["P#V " + (lokaldata_address + 2).ToString() + ".0"];
                                            string p3 = Parameters["P#V " + (lokaldata_address + 4).ToString() + ".0"];
                                            string p4 = Parameters["P#V " + (lokaldata_address + 6).ToString() + ".0"];

                                            //Fix for wrong construction of any pointers
                                            var anyPtr = new S7AnyPointer(p1, p2, p3, p4);
                                            if (myOpt.ReplaceDBAccessesWithSymbolNames)
                                            {
                                                //TODO: make the any pointer symbolic.
                                                tmp = "" + anyPtr.ToString();
                                            }
                                            else
                                            {
                                                tmp = anyPtr.ToString();
                                            }

                                            //end fix
                                            //tmp = "P#";
                                            //if (p3 != "0")
                                            //    tmp += "DB" + p3 + ".";
                                            //tmp += p4.Substring(2);
                                            //tmp += " BYTE "; //Todo Parse Byte 1 if the Type is Byte!
                                            //tmp += p2;
                                        }
                                        newPar.Value = tmp;
                                        newRow.CallParameter.Add(newPar);
                                    }
                                    else
                                    {
                                        if (Parameters.ContainsKey(s))
                                        {
                                            string par = Parameters[s];
                                            if (akRow.DataType == S7DataRowType.S5TIME && par[0] >= '0' && par[0] <= '9')
                                            {
                                                newPar.Value = Helper.GetS5Time(
                                                    BitConverter.GetBytes(Convert.ToInt32(par))[1],
                                                    BitConverter.GetBytes(Convert.ToInt32(par))[0]);
                                            }
                                            else if (akRow.DataType == S7DataRowType.TIME && par[0] >= '0' && par[0] <= '9')
                                            {
                                                newPar.Value = Helper.GetDTime(BitConverter.GetBytes(Convert.ToInt32(par)), 0);
                                            }
                                            else if (akRow.DataType == S7DataRowType.CHAR && par[0] == 'B')
                                            {
                                                newPar.Value = (char)Int32.Parse(par.Substring(5), System.Globalization.NumberStyles.AllowHexSpecifier) + "'";
                                            }
                                            else if (akRow.DataType == S7DataRowType.REAL)
                                            {
                                                var bt = new byte[4];
                                                libnodave.putS32at(bt, 0, Int32.Parse(par.Substring(2)));
                                                var real = libnodave.getFloatfrom(bt, 0);
                                                newPar.Value = real.ToString("e6", CultureInfo.InvariantCulture);
                                            }
                                            else
                                            {
                                                newPar.Value = Parameters[s];
                                            }
                                        }
                                        else
                                        {
                                            if (akRow.DataType == S7DataRowType.BOOL)
                                            {
                                                newPar.Value = s.Substring(2).Replace('V', 'L');
                                            }
                                            else if (akRow.DataType == S7DataRowType.BLOCK_DB)
                                            {
                                                newPar.Value = "DB" + ak_address.ToString();
                                            }
                                            else if (akRow.DataType == S7DataRowType.BLOCK_FB)
                                            {
                                                newPar.Value = "FB" + ak_address.ToString();
                                            }
                                            else if (akRow.DataType == S7DataRowType.BLOCK_FC)
                                            {
                                                newPar.Value = "FC" + ak_address.ToString();
                                            }
                                            else if (akRow.DataType == S7DataRowType.BLOCK_SDB)
                                            {
                                                newPar.Value = "SDB" + ak_address.ToString();
                                            }
                                            else if (akRow.DataType == S7DataRowType.TIMER)
                                            {
                                                newPar.Value = Mnemonic.adT[(int)myOpt.Mnemonic] + ak_address.ToString();
                                            }
                                            else if (akRow.DataType == S7DataRowType.COUNTER)
                                            {
                                                newPar.Value = Mnemonic.adZ[(int)myOpt.Mnemonic] + ak_address.ToString();
                                            }
                                            else
                                            {
                                                string ber = "";
                                                if (s.Substring(0, 5) == "P#DBX")
                                                {
                                                    ber = "DB";
                                                }
                                                else if (s.Substring(0, 5) == "P#DIX")
                                                {
                                                    ber = "DI";
                                                }
                                                else
                                                {
                                                    ber = s.Substring(2, 1);
                                                }

                                                if (akRow.ByteLength == 1)
                                                {
                                                    ber += "B";
                                                }
                                                else if (akRow.ByteLength == 2)
                                                {
                                                    ber += "W";
                                                }
                                                else if (akRow.ByteLength == 4)
                                                {
                                                    ber += "D";
                                                }

                                                var access = ber.Replace('V', 'L') + ak_address;

                                                //fix for temporary area not replaced with symbolnames
                                                if (myOpt.ReplaceLokalDataAddressesWithSymbolNames)
                                                {
                                                    var tempSymbol = S7DataRow.GetDataRowWithAddress(myFct.Parameter, new ByteBitAddress(ak_address, 0));
                                                    if (tempSymbol != null)
                                                    {
                                                        access = "#" + tempSymbol.StructuredName.Replace("TEMP.", "");
                                                    }
                                                }
                                                newPar.Value = access;
                                            }
                                        }

                                        newRow.CallParameter.Add(newPar);
                                    }
                                }
                            }

                            newRow.CombinedCommands = tempList;
                            newRow.Label            = label;

                            int sz = 0;
                            foreach (var functionBlockRow in newRow.CombinedCommands)
                            {
                                sz += ((S7FunctionBlockRow)functionBlockRow).ByteSize;
                            }
                            byte[] mcges = new byte[sz];
                            sz = 0;
                            foreach (var functionBlockRow in newRow.CombinedCommands)
                            {
                                Array.Copy(((S7FunctionBlockRow)functionBlockRow).MC7, 0, mcges, sz, ((S7FunctionBlockRow)functionBlockRow).ByteSize);
                                sz += ((S7FunctionBlockRow)functionBlockRow).ByteSize;
                            }
                            newRow.MC7 = mcges;

                            retVal.Add(newRow);
                            Parameters.Clear();
                            tempList = new List <FunctionBlockRow>();
                            inBld    = 0;

                            newRow = null;
                        }
                        else
                        {
                            retVal.AddRange(tempList);
                            tempList.Clear();

                            inBld = 0;
                        }
                        #endregion
                    }
                    else if (inBld == 3 || inBld == 16 || inBld == 14)
                    {
                        #region FB Aufruf
                        tempList.Add(row);
                        if (row.Command == "=" && n > 0 && myFct.AWLCode[n - 1].Command == Mnemonic.opBLD[(int)myOpt.Mnemonic])
                        {
                            //Do nothing, but this line needs to be there!
                        }
                        else if (row.Command == Mnemonic.opTDB[(int)myOpt.Mnemonic])
                        {
                            //Do nothing, but this line needs to be there!
                        }
                        else if (row.Command == Mnemonic.opBLD[(int)myOpt.Mnemonic] && row.Parameter == "11")
                        {
                            //whatever this BLD 11 in the FB Calls means...
                        }
                        else if (row.Command == Mnemonic.opTAR2[(int)myOpt.Mnemonic])
                        {
                            if (ar2Addr.MemoryArea == MemoryArea.None)
                            {
                                akPar = "P#DIX " + ar2Addr.ToString();
                            }
                            else
                            {
                                akPar = ar2Addr.ToString(myOpt.Mnemonic);
                            }
                        }
                        else if (row.Command == Mnemonic.opLAR2[(int)myOpt.Mnemonic])
                        {
                            if (row.Parameter.StartsWith("P#"))
                            {
                                ar2Addr = new Pointer(row.Parameter.Substring(2));
                            }
                            else
                            {
                                ar2Addr.ByteAddress = 0;
                                ar2Addr.BitAddress  = 0;
                            }
                        }
                        else if (row.Command == Mnemonic.opPAR2[(int)myOpt.Mnemonic])
                        {
                            ar2Addr += new Pointer(row.Parameter);
                        }
                        else if (row.Command == Mnemonic.opAUF[(int)myOpt.Mnemonic] && (tempList.Count == 4))
                        {
                            diName = row.Parameter;
                        }
                        else if (row.Command == Mnemonic.opAUF[(int)myOpt.Mnemonic] && row.Parameter.Contains("[") && (tempList.Count == 6))
                        {
                            multiInstance = true;

                            diName = "";
                        }
                        else if (row.Command == Mnemonic.opU[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opUN[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opO[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opON[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opO[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opON[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opX[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opXN[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opL[(int)myOpt.Mnemonic])
                        {
                            akPar = db + row.Parameter;
                            db    = "";
                        }
                        else if (row.Command == Mnemonic.opAUF[(int)myOpt.Mnemonic])
                        {
                            db = row.Parameter + ".";
                        }
                        else if (row.Command == "CLR")
                        {
                            akPar = "FALSE";
                        }
                        else if (row.Command == "SET")
                        {
                            akPar = "TRUE";
                        }
                        else if ((row.Command == "=") && akPar != "")
                        {
                            if (afterCall == false)
                            {
                                if (!Parameters.ContainsKey(row.Parameter))
                                {
                                    Parameters.Add(row.Parameter, akPar);
                                }
                            }
                            else
                            {
                                if (!Parameters.ContainsKey(akPar))
                                {
                                    Parameters.Add(akPar, row.Parameter);
                                }
                            }
                            akPar = "";
                            db    = "";
                        }
                        else if (row.Command == Mnemonic.opT[(int)myOpt.Mnemonic] && akPar != "")
                        {
                            if (afterCall == false)
                            {
                                if (!Parameters.ContainsKey(row.Parameter))
                                {
                                    Parameters.Add(row.Parameter, akPar);
                                }
                            }
                            else
                            {
                                if (!Parameters.ContainsKey(akPar))
                                {
                                    Parameters.Add(akPar, row.Parameter);
                                }
                            }
                            akPar = "";
                            db    = "";
                        }
                        else if (row.Command == Mnemonic.opT[(int)myOpt.Mnemonic])
                        {
                            if (afterCall == false)
                            {
                                if (!Parameters.ContainsKey(row.Parameter))
                                {
                                    Parameters.Add(row.Parameter, "");
                                }
                            }
                            akPar = "";
                            db    = "";
                        }
                        else if (row.Command == Mnemonic.opUC[(int)myOpt.Mnemonic])
                        {
                            multiInstanceOffset = 0;
                            for (int j = tempList.Count - 2; j > -1; j--)
                            {
                                if (tempList[j].Command == Mnemonic.opPAR2[(int)myOpt.Mnemonic])
                                {
                                    multiInstanceOffset += (int)double.Parse((((S7FunctionBlockRow)tempList[j]).Parameter.Substring(2)), CultureInfo.InvariantCulture);
                                }
                                break;
                            }

                            //Commands after a Call --> Out-Para
                            callRow   = row;
                            afterCall = true;
                        }
                        else if (row.Command == Mnemonic.opBLD[(int)myOpt.Mnemonic] && (row.Parameter == "4" || row.Parameter == "17" || row.Parameter == "15"))
                        {
                            //Block Interface auslesen (von FC oder vom Programm)
                            S7DataRow para = myblkFld.GetInterface(callRow.Parameter);

                            newRow           = new S7FunctionBlockRow();
                            newRow.Parent    = callRow.Parent;
                            newRow.Command   = Mnemonic.opCALL[(int)myOpt.Mnemonic];
                            newRow.Parameter = callRow.Parameter;
                            if (diName.Length > 2 && !diName.StartsWith("#"))
                            {
                                newRow.DiName = "DI" + int.Parse(diName.Substring(2));
                            }
                            else if (diName.StartsWith("#"))
                            {
                                newRow.DiName = diName;
                            }
                            newRow.CallParameter = new List <S7FunctionBlockParameter>();


                            if (para != null)
                            {
                                var allPar = para.Children.Where(itm => itm.Name == "IN" || itm.Name == "IN_OUT" || itm.Name == "OUT");
                                foreach (var s7DataRowMain in allPar)
                                {
                                    foreach (var s7DataRow in s7DataRowMain.Children)
                                    {
                                        S7FunctionBlockParameter newPar = new S7FunctionBlockParameter(newRow);
                                        newPar.Name = s7DataRow.Name;

                                        string par = null;
                                        if (!multiInstance)
                                        {
                                            Parameters.TryGetValue(((S7DataRow)s7DataRow).BlockAddressInDbFormat.Replace("DB", "DI"), out par);
                                        }
                                        else if (((S7DataRow)s7DataRow).DataType == S7DataRowType.ANY)
                                        {
                                            var anySizeAddr = ((S7DataRow)s7DataRow).BlockAddress.ByteAddress + multiInstanceOffset + 2;
                                            var anyPosAddr  = ((S7DataRow)s7DataRow).BlockAddress.ByteAddress + multiInstanceOffset + 6;

                                            string anySize = "";
                                            string anyPos  = "";
                                            Parameters.TryGetValue("DIW[AR2,P#" + anySizeAddr + ".0]", out anySize);
                                            Parameters.TryGetValue("DID[AR2,P#" + anyPosAddr + ".0]", out anyPos);
                                            par = anyPos + " BYTE " + anySize;
                                        }
                                        else
                                        {
                                            var addr = ((S7DataRow)s7DataRow).BlockAddressInDbFormat;
                                            if (!string.IsNullOrEmpty(addr))
                                            {
                                                var    addrTp  = addr.Substring(0, 3).Replace("DB", "DI");
                                                double bytepos = double.Parse(addr.Substring(3), CultureInfo.InvariantCulture) + multiInstanceOffset;
                                                Parameters.TryGetValue(addrTp + "[AR2,P#" + bytepos.ToString("0.0", CultureInfo.InvariantCulture) + "]", out par);
                                            }
                                        }

                                        if (par != null && par.Contains("[AR2"))
                                        {
                                            newPar.Value = par;
                                            var addr = par.Substring(10);
                                            addr = addr.Substring(0, addr.Length - 1);
                                            var pRow = S7DataRow.GetDataRowWithAddress(myFct.Parameter.Children.Where(itm => itm.Name != "TEMP").Cast <S7DataRow>(), new ByteBitAddress(addr));
                                            if (pRow != null)
                                            {
                                                newPar.Value = ((S7DataRow)pRow).StructuredName.Substring(((S7DataRow)pRow).StructuredName.IndexOf('.') + 1);
                                            }
                                        }
                                        else
                                        {
                                            switch (((S7DataRow)s7DataRow).DataType)
                                            {
                                            case S7DataRowType.BLOCK_DB:
                                                newPar.Value = "DB" + par;
                                                break;

                                            case S7DataRowType.BLOCK_FC:
                                                newPar.Value = "FC" + par;
                                                break;

                                            case S7DataRowType.BLOCK_FB:
                                                newPar.Value = "FB" + par;
                                                break;

                                            case S7DataRowType.TIMER:
                                                newPar.Value = Mnemonic.adT[(int)myOpt.Mnemonic] + par.ToString();
                                                break;

                                            case S7DataRowType.COUNTER:
                                                newPar.Value = Mnemonic.adZ[(int)myOpt.Mnemonic] + par.ToString();
                                                break;

                                            case S7DataRowType.TIME:
                                                if (par != null && par.StartsWith("L#"))
                                                {
                                                    var arr = BitConverter.GetBytes(Convert.ToInt32(par.Substring(2)));
                                                    Array.Reverse(arr);
                                                    newPar.Value = Helper.GetDTime(arr, 0);
                                                }
                                                else
                                                {
                                                    newPar.Value = par;
                                                }
                                                break;

                                            default:
                                                newPar.Value = par;
                                                break;
                                            }
                                        }

                                        newRow.CallParameter.Add(newPar);
                                    }
                                }
                            }


                            newRow.CombinedCommands = tempList;
                            newRow.Label            = label;

                            int sz = 0;
                            foreach (var functionBlockRow in newRow.CombinedCommands)
                            {
                                sz += ((S7FunctionBlockRow)functionBlockRow).ByteSize;
                            }
                            byte[] mcges = new byte[sz];
                            sz = 0;
                            foreach (var functionBlockRow in newRow.CombinedCommands)
                            {
                                Array.Copy(((S7FunctionBlockRow)functionBlockRow).MC7, 0, mcges, sz, ((S7FunctionBlockRow)functionBlockRow).ByteSize);
                                sz += ((S7FunctionBlockRow)functionBlockRow).ByteSize;
                            }
                            newRow.MC7 = mcges;

                            retVal.Add(newRow);
                            Parameters.Clear();
                            tempList = new List <FunctionBlockRow>();
                            inBld    = 0;

                            newRow = null;
                        }
                        else
                        {
                            retVal.AddRange(tempList);
                            tempList.Clear();

                            inBld = 0;
                        }
                        #endregion
                    }
                    else
                    {
                        retVal.Add(row);
                    }
                }
                myFct.AWLCode = retVal;
            }
        }
        /// <summary>
        /// Parses the AWL Text and returns the S7Blocks
        /// </summary>
        /// <param name="AWL"></param>
        /// <param name="SymbolTable">Can be null</param>
        /// <returns></returns>
        public static List <S7Block> ParseAWL(string AWL, string SymbolTable)
        {
            var retVal = new List <S7Block>();


            string txt               = "";
            string blockType         = "";
            string blockNumberOrName = "";
            string blockRetValType   = "";
            bool   startOfQuote      = false;

            ParseStep step = ParseStep.ReadBlockType;

            S7DataRow akDataRow = null;

            S7Block akBlock = null;

            foreach (char c in AWL)
            {
                if (!startOfQuote && (c == ' ' || c == '\n' || c == '\r' || c == '=' || c == ':') || c == '"')
                {
                    if (c == '"' && !startOfQuote)
                    {
                        startOfQuote = true;
                    }
                    else if (startOfQuote)
                    {
                        startOfQuote = false;
                    }

                    if (step == ParseStep.ReadBlockRetVal && txt != "" && txt != ":") //Header ohne RetVal
                    {
                        blockRetValType = "";
                        akBlock         = CreateBlock(blockType, blockNumberOrName, blockRetValType);

                        step = ParseStep.ParseHeaderRow;
                    }

                    if (step == ParseStep.ParseTitle && (c == '\n' || c == '\r'))
                    {
                        step = ParseStep.ParseHeaderRow;
                    }

                    if (txt != "")
                    {
                        switch (step)
                        {
                        case ParseStep.ReadBlockType:
                        {
                            blockType = txt.ToUpper();
                            step      = ParseStep.ReadBlockNumberOrName;
                            break;
                        }

                        case ParseStep.ReadBlockNumberOrName:
                        {
                            blockNumberOrName = txt;
                            step = ParseStep.ReadBlockRetVal;
                            break;
                        }

                        case ParseStep.ReadBlockRetVal:
                        {
                            step = ParseStep.ReadBlockRetValType;
                            break;
                        }

                        case ParseStep.ReadBlockRetValType:
                        {
                            blockRetValType = txt;
                            akBlock         = CreateBlock(blockType, blockNumberOrName, blockRetValType);
                            step            = ParseStep.ParseHeaderRow;
                            break;
                        }

                        case ParseStep.ParseHeaderRow:
                        {
                            switch (txt.ToUpper())
                            {
                            case ("TITLE"):
                            {
                                step = ParseStep.ParseTitle;
                                break;
                            }

                            case ("VERSION"):
                            {
                                step = ParseStep.ParseVersion;
                                break;
                            }

                            case ("STRUCT"):
                            {
                                step = ParseStep.ParseStructure;
                                break;
                            }

                            case ("BEGIN"):
                            {
                                step = ParseStep.ParseAWLCode;
                                break;
                            }

                            case ("VAR_INPUT"):
                            case ("VAR_OUTPUT"):
                            case ("VAR_IN_OUT"):
                            case ("VAR_TEMP"):
                            {
                                step = ParseStep.ParsePara;

                                break;
                            }

                            default:
                            {
                                if (txt.StartsWith("{") && txt.EndsWith("}"))
                                {
                                    akBlock.Attributes = ParseStep7Attribute(txt);
                                }
                                break;
                            }
                            }
                            break;
                        }

                        case ParseStep.ParseTitle:
                        {
                            akBlock.Title = txt;
                            step          = ParseStep.ParseHeaderRow;
                            break;
                        }

                        case ParseStep.ParseVersion:
                        {
                            akBlock.Version = txt;
                            step            = ParseStep.ParseHeaderRow;
                            break;
                        }
                        }
                    }
                    txt = "";
                }
                else
                {
                    txt = txt + c;
                }
            }

            return(retVal);
        }
        /// <summary>
        /// Reads an Block from the Project and returns the block data that is stored in the S7 Project
        /// </summary>
        /// <param name="blkInfo">The Block info object that identifies the block to read from Disk</param>
        /// <param name="myConvOpt">Defines options that determine how the Block will be converted</param>
        /// <returns></returns>
        public Block GetBlock(ProjectBlockInfo blkInfo, S7ConvertingOptions myConvOpt)
        {
            if (blkInfo._Block != null && ((blkInfo._Block) as S7Block).usedS7ConvertingOptions.Equals(myConvOpt))
            {
                return(blkInfo._Block);
            }


            ProjectPlcBlockInfo plcblkifo = (ProjectPlcBlockInfo)blkInfo;
            tmpBlock            myTmpBlk  = GetBlockBytes(blkInfo);

            List <Step7Attribute> step7Attributes = null;

            if (myTmpBlk != null)
            {
                if (myTmpBlk.uda != null)
                {
                    int uPos = 2;
                    if (myTmpBlk.uda != null && myTmpBlk.uda.Length > 0 && myTmpBlk.uda[0] > 0)
                    {
                        step7Attributes = new List <Step7Attribute>();
                        for (int j = 0; j < myTmpBlk.uda[0]; j++)
                        {
                            string t1 = Project.ProjectEncoding.GetString(myTmpBlk.uda, uPos + 1, myTmpBlk.uda[uPos]);
                            uPos += myTmpBlk.uda[uPos] + 1;
                            string t2 = Project.ProjectEncoding.GetString(myTmpBlk.uda, uPos + 1, myTmpBlk.uda[uPos]);
                            uPos += myTmpBlk.uda[uPos] + 1;
                            step7Attributes.Add(new Step7Attribute(t1, t2));
                        }
                    }
                }

                //Begin with the Block Reading...
                if (blkInfo.BlockType == PLCBlockType.VAT)
                {
                    S7VATBlock retValBlock = new S7VATBlock(myTmpBlk.mc7code, myTmpBlk.comments, plcblkifo.BlockNumber, Project.ProjectEncoding);
                    retValBlock.Attributes = step7Attributes;

                    retValBlock.LastCodeChange      = myTmpBlk.LastCodeChange;
                    retValBlock.LastInterfaceChange = myTmpBlk.LastInterfaceChange;

                    retValBlock.ParentFolder            = this;
                    retValBlock.usedS7ConvertingOptions = myConvOpt;
                    blkInfo._Block = retValBlock;

                    return(retValBlock);
                }
                else if (blkInfo.BlockType == PLCBlockType.DB || blkInfo.BlockType == PLCBlockType.UDT)
                {
                    List <string> tmpList = new List <string>();
                    S7DataBlock   retVal  = new S7DataBlock();
                    retVal.IsInstanceDB = myTmpBlk.IsInstanceDB;
                    retVal.FBNumber     = myTmpBlk.FBNumber;

                    //if this is an interface DB, then rather take the Interface declaration from the instance FB,
                    //instead of the data sotred in the project.
                    //The reason is that if you change the comment in an FB, the DB data is not actualized and my contain outdated
                    //Declarations. When you change the interface, Step7 tells you to "regenerate" the instance DB which only then would
                    //Actualize the comments. Simple Commentary changes do not change the Datablocks row.
                    if (retVal.IsInstanceDB && myConvOpt.UseFBDeclarationForInstanceDB)
                    {
                        //load the FB data from the Project
                        tmpBlock InstFB = GetBlockBytes((myTmpBlk.IsSFB ? "SFB" : "FB") + myTmpBlk.FBNumber);

                        //Resolve both interfaces
                        List <string> tmpPar = new List <string>();
                        if (InstFB != null)
                        {
                            S7DataRow InterfaceFB =
                                Parameter.GetInterfaceOrDBFromStep7ProjectString(InstFB.blkinterface, ref tmpPar,
                                                                                 PLCBlockType.FB, false, this, null);
                            S7DataRow InterfaceDB =
                                Parameter.GetInterfaceOrDBFromStep7ProjectString(myTmpBlk.blkinterface, ref tmpPar,
                                                                                 PLCBlockType.DB, false, this, null);

                            //Only use the FB interface Declaration if they are compatible
                            if (Parameter.IsInterfaceCompatible(InterfaceFB, InterfaceDB))
                            {
                                myTmpBlk.blkinterface = InstFB.blkinterface;
                            }
                        }
                    }

                    if (myTmpBlk.mc7code != null)
                    {
                        retVal.CodeSize = myTmpBlk.mc7code.Length;
                    }

                    retVal.StructureFromString = Parameter.GetInterfaceOrDBFromStep7ProjectString(myTmpBlk.blkinterface, ref tmpList, blkInfo.BlockType, false, this, retVal, myTmpBlk.mc7code);
                    if (myTmpBlk.blkinterfaceInMC5 != null)
                    {
                        //List<string> tmp = new List<string>();
                        //retVal.StructureFromMC7 = Parameter.GetInterface(myTmpBlk.blkinterfaceInMC5, myTmpBlk.mc7code, ref tmp, blkInfo.BlockType, myTmpBlk.IsInstanceDB, retVal);
                    }
                    retVal.BlockNumber = plcblkifo.BlockNumber;
                    retVal.BlockType   = blkInfo.BlockType;
                    retVal.Attributes  = step7Attributes;

                    retVal.LastCodeChange      = myTmpBlk.LastCodeChange;
                    retVal.LastInterfaceChange = myTmpBlk.LastInterfaceChange;

                    retVal.ParentFolder            = this;
                    retVal.usedS7ConvertingOptions = myConvOpt;
                    retVal.CheckSum = myTmpBlk.CheckSum;
                    blkInfo._Block  = retVal;

                    return(retVal);
                }
                else if (blkInfo.BlockType == PLCBlockType.FC || blkInfo.BlockType == PLCBlockType.FB || blkInfo.BlockType == PLCBlockType.OB || blkInfo.BlockType == PLCBlockType.SFB || blkInfo.BlockType == PLCBlockType.SFC)
                {
                    List <string> ParaList = new List <string>();

                    S7FunctionBlock retVal = new S7FunctionBlock();

                    retVal.LastCodeChange      = myTmpBlk.LastCodeChange;
                    retVal.LastInterfaceChange = myTmpBlk.LastInterfaceChange;

                    retVal.BlockNumber       = plcblkifo.BlockNumber;
                    retVal.BlockType         = blkInfo.BlockType;
                    retVal.Attributes        = step7Attributes;
                    retVal.KnowHowProtection = myTmpBlk.knowHowProtection;
                    retVal.MnemonicLanguage  = Project.ProjectLanguage;

                    retVal.Author  = myTmpBlk.username;
                    retVal.Version = myTmpBlk.version;

                    retVal.Parameter = Parameter.GetInterfaceOrDBFromStep7ProjectString(myTmpBlk.blkinterface, ref ParaList, blkInfo.BlockType, false, this, retVal);

                    if (myTmpBlk.blockdescription != null)
                    {
                        retVal.Title       = Project.ProjectEncoding.GetString(myTmpBlk.blockdescription, 3, myTmpBlk.blockdescription[1] - 4);
                        retVal.Description = Project.ProjectEncoding.GetString(myTmpBlk.blockdescription, myTmpBlk.blockdescription[1], myTmpBlk.blockdescription.Length - myTmpBlk.blockdescription[1] - 1).Replace("\n", Environment.NewLine);
                    }

                    if (blkInfo.BlockType == PLCBlockType.FC || blkInfo.BlockType == PLCBlockType.FB || blkInfo.BlockType == PLCBlockType.OB)
                    {
                        retVal.CodeSize = myTmpBlk.mc7code.Length;

                        int[] Networks;
                        Networks = NetWork.GetNetworks(0, myTmpBlk.nwinfo);

                        S7ProgrammFolder prgFld = null;
                        if (this.Parent is S7ProgrammFolder)
                        {
                            prgFld = (S7ProgrammFolder)this.Parent;
                        }

                        retVal.AWLCode = MC7toAWL.GetAWL(0, myTmpBlk.mc7code.Length - 2, (int)myConvOpt.Mnemonic, myTmpBlk.mc7code, Networks, ParaList, prgFld, retVal, retVal.Parameter);

                        retVal.AWLCode = JumpMarks.AddJumpmarks(retVal.AWLCode, myTmpBlk.jumpmarks, myTmpBlk.nwinfo, myConvOpt);

                        LocalDataConverter.ConvertLocaldataToSymbols(retVal, myConvOpt);

                        CallConverter.ConvertUCToCall(retVal, prgFld, this, myConvOpt, null);

                        FBStaticAccessConverter.ReplaceStaticAccess(retVal, prgFld, myConvOpt);

                        #region UseComments from Block
                        if (myConvOpt.UseComments)
                        {
                            List <FunctionBlockRow> newAwlCode = new List <FunctionBlockRow>();

                            int n = 0;
                            int akRowInAwlCode   = 0;
                            int lineNumberInCall = 0; //Counter wich line in Command (for Calls and UCs)

                            if (myTmpBlk.comments != null)
                            {
                                byte[] cmt = myTmpBlk.comments;

                                //string aa = System.Text.Encoding.GetEncoding("Windows-1251").GetString(cmt);
                                //string testaa = "";

                                while (n < myTmpBlk.comments.Length)
                                {
                                    int kommLen            = cmt[n + 0];
                                    int startNWKomm        = cmt[n + 1];
                                    int anzUebsprungZeilen = cmt[n + 2] + cmt[n + 3] * 0x100;
                                    int lenNWKommZeile     = cmt[n + 3] + cmt[n + 4] * 0x100;
                                    //Console.WriteLine(cmt[n + 5].ToString("X"));
                                    if (cmt[n + 5] == 0x06)
                                    {
                                        //NWKomentar:
                                        string tx1 = Project.ProjectEncoding.GetString(cmt, n + 6, startNWKomm - 7);
                                        string tx2 = Project.ProjectEncoding.GetString(cmt, n + startNWKomm, lenNWKommZeile - startNWKomm - 1).Replace("\n", Environment.NewLine);
                                        n += lenNWKommZeile;

                                        if (retVal.AWLCode.Count > akRowInAwlCode)
                                        {
                                            while (retVal.AWLCode.Count - 1 > akRowInAwlCode && retVal.AWLCode[akRowInAwlCode].Command != "NETWORK")
                                            {
                                                if (!newAwlCode.Contains(retVal.AWLCode[akRowInAwlCode]))
                                                {
                                                    //newAwlCode.Add(retVal.AWLCode[akRowInAwlCode]);
                                                    S7FunctionBlockRow akRw = (S7FunctionBlockRow)retVal.AWLCode[akRowInAwlCode];

                                                    if (akRw.CombineDBAccess)
                                                    {
                                                        S7FunctionBlockRow nRw = (S7FunctionBlockRow)retVal.AWLCode[akRowInAwlCode + 1];
                                                        if (!nRw.Parameter.Contains("["))
                                                        {
                                                            nRw.Parameter = akRw.Parameter + "." + nRw.Parameter;
                                                            nRw.MC7       = Helper.CombineByteArray(akRw.MC7, nRw.MC7);
                                                            nRw.Label     = akRw.Label ?? nRw.Label;
                                                            akRw          = nRw;
                                                            retVal.AWLCode.RemoveAt(akRowInAwlCode + 1);
                                                        }
                                                    }

                                                    if (!newAwlCode.Contains(akRw))
                                                    {
                                                        newAwlCode.Add(akRw);
                                                    }
                                                }
                                                akRowInAwlCode++;
                                            }
                                            ((S7FunctionBlockRow)retVal.AWLCode[akRowInAwlCode]).NetworkName = tx1;
                                            ((S7FunctionBlockRow)retVal.AWLCode[akRowInAwlCode]).Comment     = tx2;
                                            newAwlCode.Add(retVal.AWLCode[akRowInAwlCode]);
                                        }
                                        akRowInAwlCode++;

                                        lineNumberInCall = 0;
                                    }
                                    else
                                    {
                                        S7FunctionBlockRow lastRow = null;

                                        //Anzahl der Anweisungen vor diesem Kommentar (inklusive aktueller Zeile!)
                                        for (int q = 0; q < (anzUebsprungZeilen); q++)
                                        {
                                            if (retVal.AWLCode.Count > akRowInAwlCode)
                                            {
                                                S7FunctionBlockRow akRw = (S7FunctionBlockRow)retVal.AWLCode[akRowInAwlCode];

                                                if (cmt[n + 4] == 0xc0 && q == anzUebsprungZeilen - 1)
                                                {
                                                    akRw.CombineDBAccess = false;
                                                }

                                                //Db Zugriff zusammenfügen...
                                                if (akRw.CombineDBAccess)
                                                {
                                                    S7FunctionBlockRow nRw = (S7FunctionBlockRow)retVal.AWLCode[akRowInAwlCode + 1];
                                                    nRw.Parameter = akRw.Parameter + "." + nRw.Parameter;
                                                    nRw.MC7       = Helper.CombineByteArray(akRw.MC7, nRw.MC7);
                                                    nRw.Label     = akRw.Label ?? nRw.Label;
                                                    akRw          = nRw;
                                                    retVal.AWLCode.RemoveAt(akRowInAwlCode + 1);
                                                }

                                                if (!newAwlCode.Contains(akRw))
                                                {
                                                    newAwlCode.Add(akRw);
                                                }


                                                if (akRw.GetNumberOfLines() == 1)
                                                {
                                                    lineNumberInCall = 0;

                                                    lastRow = akRw;

                                                    //if (!newAwlCode.Contains(akRw))
                                                    //    newAwlCode.Add(akRw);

                                                    akRowInAwlCode++;
                                                }
                                                else
                                                {
                                                    lastRow = akRw;
                                                    if (lineNumberInCall == 0 && !(cmt[n + 4] != 0x80 && cmt[n + 4] != 0xc0))
                                                    {
                                                        //if (!newAwlCode.Contains(akRw))
                                                        //    newAwlCode.Add(akRw);
                                                    }

                                                    if (akRw.GetNumberOfLines() - 1 == lineNumberInCall)
                                                    {
                                                        akRowInAwlCode++;
                                                        lineNumberInCall = 0;
                                                        //subCnt++;    //The set to zero was wrong here, but maybe now comments on calls do not work, need to check!
                                                    }
                                                    else
                                                    {
                                                        lineNumberInCall++;
                                                    }
                                                }
                                            }
                                        }


                                        //if (lastRow == null || cmt[n + 4] != 0x80)
                                        if (lastRow == null || (cmt[n + 4] != 0x80 && cmt[n + 4] != 0xc0))
                                        {
                                            lastRow = new S7FunctionBlockRow()
                                            {
                                                Parent = retVal
                                            };
                                            newAwlCode.Add(lastRow);
                                            lineNumberInCall = 0;
                                        }

                                        string tx1 = Project.ProjectEncoding.GetString(cmt, n + 6, kommLen);
                                        if (lineNumberInCall == 0)
                                        {
                                            lastRow.Comment = tx1;
                                        }
                                        else
                                        if (lastRow.Command == "CALL")
                                        {
                                            if (lineNumberInCall == 1)
                                            {
                                                lastRow.Comment = tx1;
                                            }
                                            else
                                            {
                                                if (lastRow.CallParameter.Count >= lineNumberInCall - 2)
                                                {
                                                    lastRow.CallParameter[lineNumberInCall - 2].Comment = tx1;
                                                }
                                            }
                                        }
                                        n += kommLen + 6;

                                        //subCnt = 0;
                                    }
                                }
                            }
                            while (akRowInAwlCode < retVal.AWLCode.Count)
                            {
                                newAwlCode.Add(retVal.AWLCode[akRowInAwlCode]);
                                akRowInAwlCode++;
                            }
                            retVal.AWLCode = newAwlCode;
                        }
                        #endregion
                    }

                    retVal.Networks = NetWork.GetNetworksList(retVal);

                    retVal.ParentFolder            = this;
                    retVal.usedS7ConvertingOptions = myConvOpt;
                    retVal.CheckSum = myTmpBlk.CheckSum;
                    blkInfo._Block  = retVal;

                    return(retVal);
                }
            }
            return(null);
        }
Example #10
0
        /*internal static S7DataRow GetInterface(int Start, int Count, byte[] BD, DataTypes.PLCBlockType blkTP, bool isInstanceDB, S7Block myBlk)
         * {
         *  S7DataRow parameterRoot = new S7DataRow("ROOTNODE", S7DataRowType.STRUCT, myBlk);
         *  S7DataRow parameterIN = new S7DataRow("IN", S7DataRowType.STRUCT, myBlk);
         *  S7DataRow parameterOUT = new S7DataRow("OUT", S7DataRowType.STRUCT, myBlk);
         *  S7DataRow parameterINOUT = new S7DataRow("IN_OUT", S7DataRowType.STRUCT, myBlk);
         *  S7DataRow parameterSTAT = new S7DataRow("STATIC", S7DataRowType.STRUCT, myBlk);
         *  S7DataRow parameterTEMP = new S7DataRow("TEMP", S7DataRowType.STRUCT, myBlk);
         *  S7DataRow parameterRETVAL = new S7DataRow("RET_VAL", S7DataRowType.STRUCT, myBlk);
         *
         *
         *  parameterRoot.Add(parameterIN);
         *  parameterRoot.Add(parameterOUT);
         *  parameterRoot.Add(parameterINOUT);
         *  if (blkTP == DataTypes.PLCBlockType.FB || (blkTP == DataTypes.PLCBlockType.DB && isInstanceDB))
         *      parameterRoot.Add(parameterSTAT);
         *  if (blkTP != DataTypes.PLCBlockType.DB)
         *      parameterRoot.Add(parameterTEMP);
         *  parameterRoot.Add(parameterRETVAL);
         *  parameterRoot.ReadOnly = true;
         *
         *  if (blkTP == DataTypes.PLCBlockType.DB && !isInstanceDB)
         *      parameterRoot = parameterSTAT;
         *
         *  //PLCDataRowsInterface retVal = new PLCDataRowsInterface();
         *  int INcnt = 0;
         *  int OUTcnt = 0;
         *  int IN_OUTcnt = 0;
         *  int STATcnt = 0;
         *  int TEMPcnt = 0;
         *  int StackNr = 1;
         *
         *
         *  int pos = Start + 4;
         *  string parNm = "";
         *
         *  S7DataRow akParameter = parameterRoot;
         *
         *
         *  while (pos <= (Start + Count))
         *  {
         *      switch (BD[pos + 1])
         *      {
         *          case 0x01:
         *          case 0x09: //with start val
         *              akParameter = parameterIN;
         *              parNm = "IN";
         *              break;
         *          case 0x02:
         *          case 0x0A: //with start val
         *              akParameter = parameterOUT;
         *              parNm = "OUT";
         *              break;
         *          case 0x03:
         *          case 0x0b: //with start val
         *              akParameter = parameterINOUT;
         *              parNm = "IN_OUT";
         *              break;
         *          case 0x04:
         *          case 0x0C: //with start val
         *              akParameter = parameterSTAT;
         *              parNm = "STAT";
         *              break;
         *          case 0x05:
         *              akParameter = parameterTEMP;
         *              parNm = "TEMP";
         *              break;
         *          case 0x06:
         *              akParameter = parameterRETVAL;
         *              parNm = "RET_VAL";
         *              break;
         *      }
         *
         *
         *      pos += 2;
         *  }
         *  return parameterRoot;
         * }*/

        //internal PLCDataRow GetInterfaceSubrows(PLCDataRow currRow)


        internal static void GetVarTypeEN(S7DataRow currPar, object startVal, byte b, bool Struct, bool Arry, string VarName, byte[] interfaceBytes, byte[] actualvalueBytes, ref int pos, ref List <string> ParaList, ref int StackNr, string VarNamePrefix, ref int VarCounter, ref int Valpos, S7Block myBlk)
        {
            int i, max, dim;

            S7DataRowType Result = S7DataRowType.BOOL;

            switch (b)
            {
            case 0x01:
                Result = S7DataRowType.BOOL;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x02:
                Result = S7DataRowType.BYTE;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x03:
                Result = S7DataRowType.CHAR;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x04:
                Result = S7DataRowType.WORD;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x05:
                Result = S7DataRowType.INT;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x06:
                Result = S7DataRowType.DWORD;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x07:
                Result = S7DataRowType.DINT;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x08:
                Result = S7DataRowType.REAL;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x09:
                Result = S7DataRowType.DATE;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x0A:
                Result = S7DataRowType.TIME_OF_DAY;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x0b:
                Result = S7DataRowType.TIME;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x0C:
                Result = S7DataRowType.S5TIME;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x0E:
                Result = S7DataRowType.DATE_AND_TIME;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x10:     //Array...
            {
                dim = interfaceBytes[pos + 2];
                List <int> arrStart = new List <int>();
                List <int> arrStop  = new List <int>();

                for (i = 0; i <= dim - 1; i++)
                {
                    arrStart.Add(BitConverter.ToInt16(interfaceBytes, pos + 3 + (i * 4)));
                    arrStop.Add(BitConverter.ToInt16(interfaceBytes, pos + 5 + (i * 4)));
                }
                GetVarTypeEN(currPar, "", interfaceBytes[pos + 3 + (dim * 4)], true, true, VarName, interfaceBytes, actualvalueBytes, ref pos, ref ParaList, ref StackNr, VarNamePrefix, ref VarCounter, ref Valpos, myBlk);
                ((S7DataRow)currPar.Children[currPar.Children.Count - 1]).ArrayStart = arrStart;
                ((S7DataRow)currPar.Children[currPar.Children.Count - 1]).ArrayStop  = arrStop;
                ((S7DataRow)currPar.Children[currPar.Children.Count - 1]).IsArray    = true;
                pos += 3 + (dim * 4);
            } break;

            case 0x11:     //Struct
            {
                if (Arry)
                {
                    pos += 7;
                }
                Result = S7DataRowType.STRUCT;
                var akPar = new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    StartValue = startVal
                };
                currPar.Add(akPar);
                VarCounter++;
                max = interfaceBytes[pos + 2] - 1;
                for (i = 0; i <= max; i++)
                {
                    if ((interfaceBytes[pos + 3] == 0x11) || (interfaceBytes[pos + 3] == 0x10))
                    {
                        pos += 3;


                        if (Helper.IsWithStartVal(interfaceBytes[pos + 1]))
                        {
                            if (interfaceBytes[pos] != 0x10)         //Datentyp == Array...
                            {
                                startVal = GetVarTypeVal(interfaceBytes[pos], actualvalueBytes, ref Valpos);
                            }
                            else
                            {
                                Valpos   = Valpos + 6;
                                startVal = GetVarTypeVal(interfaceBytes[pos + 3 + (interfaceBytes[pos + 2] * 4)], actualvalueBytes, ref Valpos);
                            }
                        }
                        else
                        {
                            startVal = null;
                        }


                        GetVarTypeEN(akPar, startVal, interfaceBytes[pos], true, false, VarName + "." + VarNamePrefix + VarCounter.ToString(), interfaceBytes, actualvalueBytes, ref pos, ref ParaList, ref StackNr, VarNamePrefix, ref VarCounter, ref Valpos, myBlk);
                        pos -= 3;
                    }
                    else
                    {
                        if (Helper.IsWithStartVal(interfaceBytes[pos + 4]))
                        {
                            if (interfaceBytes[pos] != 0x10)         //Datentyp == Array...
                            {
                                startVal = GetVarTypeVal(interfaceBytes[pos + 3], actualvalueBytes, ref Valpos);
                            }
                            else
                            {
                                Valpos   = Valpos + 6;
                                startVal = GetVarTypeVal(interfaceBytes[pos + 6 + (interfaceBytes[pos + 2] * 4)], actualvalueBytes, ref Valpos);
                            }
                        }
                        else
                        {
                            startVal = null;
                        }

                        GetVarTypeEN(akPar, startVal, interfaceBytes[pos + 3], true, false, VarName + "." + VarNamePrefix + VarCounter.ToString(), interfaceBytes, actualvalueBytes, ref pos, ref ParaList, ref StackNr, VarNamePrefix, ref VarCounter, ref Valpos, myBlk);
                    }
                    pos += 2;
                }
                if (Arry)
                {
                    pos -= 7;
                }
                pos += 1;
            } break;

            case 0x13:
            {
                Result = S7DataRowType.STRING;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                    {
                        Value = startVal
                    });
                if (Arry)
                {
                    currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                        {
                            Value = startVal, StringSize = interfaceBytes[pos + 9]
                        });
                }
                else
                {
                    currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                        {
                            Value = startVal, StringSize = interfaceBytes[pos + 2]
                        });
                }
                pos += 1;
                VarCounter++;
            }
            break;

            case 0x14:
                Result = S7DataRowType.POINTER;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x16:
                Result = S7DataRowType.ANY;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x17:
                Result = S7DataRowType.BLOCK_FB;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x18:
                Result = S7DataRowType.BLOCK_FC;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x19:
                Result = S7DataRowType.BLOCK_DB;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x1A:
                Result = S7DataRowType.BLOCK_SDB;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x1C:
                Result = S7DataRowType.COUNTER;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;

            case 0x1D:
                Result = S7DataRowType.TIMER;
                currPar.Add(new S7DataRow(VarNamePrefix + VarCounter.ToString(), Result, myBlk)
                {
                    Value = startVal
                });
                VarCounter++;
                break;
                //default: Result = "UNKNOWN (" + Convert.ToString(b) + ")"; break;
            }
            //if (!Struct || Arry)
            {
                ParaList.Add(VarName);
                //Result = Result + "(" + Convert.ToString(StackNr * 2) + ")";
                StackNr = StackNr + 1;
            }

            //return Result;
        }
        private static S7Block CreateBlock(string blockType, string blockNumber, string type)
        {
            S7Block akBlock = null;

            switch (blockType.ToUpper())
            {
            case ("TYPE"):
            {
                akBlock = new S7DataBlock()
                {
                    BlockType = DataTypes.PLCBlockType.UDT, BlockLanguage = PLCLanguage.DB
                };
            }
            break;

            case ("DATA_BLOCK"):
            {
                akBlock = new S7DataBlock()
                {
                    BlockType = DataTypes.PLCBlockType.DB, BlockLanguage = PLCLanguage.DB
                };
            }
            break;

            case ("FUNCTION"):
            {
                akBlock = new S7FunctionBlock()
                {
                    BlockType = DataTypes.PLCBlockType.FC, BlockLanguage = PLCLanguage.AWL
                };

                S7DataRow parameterRoot  = new S7DataRow("ROOTNODE", S7DataRowType.STRUCT, akBlock);
                S7DataRow parameterIN    = new S7DataRow("IN", S7DataRowType.STRUCT, akBlock);
                S7DataRow parameterOUT   = new S7DataRow("OUT", S7DataRowType.STRUCT, akBlock);
                S7DataRow parameterINOUT = new S7DataRow("IN_OUT", S7DataRowType.STRUCT, akBlock);
                S7DataRow parameterSTAT  = new S7DataRow("STATIC", S7DataRowType.STRUCT, akBlock);
                S7DataRow parameterTEMP  = new S7DataRow("TEMP", S7DataRowType.STRUCT, akBlock);

                parameterOUT.Add(new S7DataRow("RET_VAL", (S7DataRowType)Enum.Parse(typeof(S7DataRowType), type), akBlock));

                parameterRoot.Children.Add(parameterIN);
                parameterRoot.Children.Add(parameterOUT);
                parameterRoot.Children.Add(parameterINOUT);
                parameterRoot.Children.Add(parameterSTAT);
                parameterRoot.Children.Add(parameterTEMP);
            }
            break;

            case ("FUNCTION_BLOCK"):
            {
                akBlock = new S7FunctionBlock()
                {
                    BlockType = DataTypes.PLCBlockType.FB, BlockLanguage = PLCLanguage.AWL
                };

                S7DataRow parameterRoot  = new S7DataRow("ROOTNODE", S7DataRowType.STRUCT, akBlock);
                S7DataRow parameterIN    = new S7DataRow("IN", S7DataRowType.STRUCT, akBlock);
                S7DataRow parameterOUT   = new S7DataRow("OUT", S7DataRowType.STRUCT, akBlock);
                S7DataRow parameterINOUT = new S7DataRow("IN_OUT", S7DataRowType.STRUCT, akBlock);
                S7DataRow parameterTEMP  = new S7DataRow("TEMP", S7DataRowType.STRUCT, akBlock);

                parameterRoot.Children.Add(parameterIN);
                parameterRoot.Children.Add(parameterOUT);
                parameterRoot.Children.Add(parameterINOUT);
                parameterRoot.Children.Add(parameterTEMP);
            }
            break;
            }

            return(akBlock);
        }
Example #12
0
        //
        internal static S7DataRow GetInterface(byte[] interfaceBytes, byte[] actualvalueBytes, ref List <String> ParaList, DataTypes.PLCBlockType blkTP, bool isInstanceDB, S7Block myBlk)
        {
            S7DataRow parameterRoot   = new S7DataRow("ROOTNODE", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterIN     = new S7DataRow("IN", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterOUT    = new S7DataRow("OUT", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterINOUT  = new S7DataRow("IN_OUT", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterSTAT   = new S7DataRow("STATIC", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterTEMP   = new S7DataRow("TEMP", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterRETVAL = new S7DataRow("RET_VAL", S7DataRowType.STRUCT, myBlk);


            parameterRoot.Add(parameterIN);
            parameterRoot.Add(parameterOUT);
            parameterRoot.Add(parameterINOUT);
            if (blkTP == DataTypes.PLCBlockType.FB || (blkTP == DataTypes.PLCBlockType.DB && isInstanceDB))
            {
                parameterRoot.Add(parameterSTAT);
            }
            if (blkTP != DataTypes.PLCBlockType.DB)
            {
                parameterRoot.Add(parameterTEMP);
            }
            parameterRoot.Add(parameterRETVAL);
            parameterRoot.ReadOnly = true;

            if (blkTP == DataTypes.PLCBlockType.DB && !isInstanceDB)
            {
                parameterRoot = parameterSTAT;
            }

            int INp     = 0;
            int OUTp    = 0;
            int IN_OUTp = 0;
            int STATp   = 0;
            int TEMPp   = 0;
            int StackNr = 1;


            int pos    = 7;
            int Valpos = 0;

            S7DataRow akParameter = parameterRoot;

            ParaList.Clear();

            while (pos <= (interfaceBytes.Length - 2)) // && pos < BD.Length - 2)  //pos<BD.Length-2 was added so SDBs can be converted!! but is this needed?
            {
                object startVal;
                if (Helper.IsWithStartVal(interfaceBytes[pos + 1]))
                {
                    if (interfaceBytes[pos] != 0x10) //Datentyp == Array...
                    {
                        startVal = GetVarTypeVal(interfaceBytes[pos], actualvalueBytes, ref Valpos);
                    }
                    else
                    {
                        Valpos   = Valpos + 6;
                        startVal = GetVarTypeVal(interfaceBytes[pos + 3 + (interfaceBytes[pos + 2] * 4)], actualvalueBytes, ref Valpos);
                    }
                }
                else
                {
                    startVal = null;
                }
                switch (interfaceBytes[pos + 1])
                {
                case 0x01:
                case 0x09:
                {
                    GetVarTypeEN(parameterIN, startVal, interfaceBytes[pos], false, false, "IN" + Convert.ToString(INp), interfaceBytes, actualvalueBytes, ref pos, ref ParaList, ref StackNr, "IN", ref INp, ref Valpos, myBlk);
                }
                break;

                case 0x02:
                case 0x0A:
                {
                    GetVarTypeEN(parameterOUT, startVal, interfaceBytes[pos], false, false, "OUT" + Convert.ToString(OUTp), interfaceBytes, actualvalueBytes, ref pos, ref ParaList, ref StackNr, "OUT", ref OUTp, ref Valpos, myBlk);
                }
                break;

                case 0x03:
                case 0x0b:
                {
                    GetVarTypeEN(parameterINOUT, startVal, interfaceBytes[pos], false, false, "IN_OUT" + Convert.ToString(IN_OUTp), interfaceBytes, actualvalueBytes, ref pos, ref ParaList, ref StackNr, "IN_OUT", ref IN_OUTp, ref Valpos, myBlk);
                }
                break;

                case 0x04:
                case 0x0C:
                {
                    GetVarTypeEN(parameterSTAT, startVal, interfaceBytes[pos], false, false, "STAT" + Convert.ToString(STATp), interfaceBytes, actualvalueBytes, ref pos, ref ParaList, ref StackNr, "STAT", ref STATp, ref Valpos, myBlk);
                }
                break;

                case 0x05:
                {
                    GetVarTypeEN(parameterTEMP, startVal, interfaceBytes[pos], false, false, "TEMP" + Convert.ToString(TEMPp), interfaceBytes, actualvalueBytes, ref pos, ref ParaList, ref StackNr, "TEMP", ref TEMPp, ref Valpos, myBlk);
                }
                break;

                case 0x06:
                {
                    int tmp = 0;
                    GetVarTypeEN(parameterRETVAL, startVal, interfaceBytes[pos], false, false, "RET_VAL", interfaceBytes, actualvalueBytes, ref pos, ref ParaList, ref StackNr, "RET_VAL", ref tmp, ref Valpos, myBlk);
                }
                break;

                    /*default:
                     * RETURNIntf = RETURNIntf + Convert.ToString(pos) + " UNKNOWN: " +
                     *       Convert.ToString(BD[pos + 1]) + " " + Convert.ToString(BD[pos]) + startVal +
                     *       "\r\n";
                     * break;*/
                }
                pos += 2;
            }
            return(parameterRoot);
        }
Example #13
0
        internal static S7DataRow GetInterfaceOrDBFromStep7ProjectString(string txt, ref List <String> ParaList, PLCBlockType blkTP, bool isInstanceDB, BlocksOfflineFolder myFld, S7Block myBlk, byte[] actualValues = null)
        {
            S7DataRow parameterRoot            = new S7DataRow("ROOTNODE", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterRootWithoutTemp = new S7DataRow("ROOTNODE", S7DataRowType.STRUCT, myBlk);

            if (myBlk is S7FunctionBlock)
            {
                (myBlk as S7FunctionBlock).ParameterWithoutTemp = parameterRootWithoutTemp;
            }

            S7DataRow parameterIN    = new S7DataRow("IN", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterOUT   = new S7DataRow("OUT", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterINOUT = new S7DataRow("IN_OUT", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterSTAT  = new S7DataRow("STATIC", S7DataRowType.STRUCT, myBlk);
            S7DataRow parameterTEMP  = new S7DataRow("TEMP", S7DataRowType.STRUCT, myBlk);
            //S7DataRow parameterRETVAL = new S7DataRow("RET_VAL", S7DataRowType.STRUCT, myBlk);

            S7DataRow akDataRow = parameterRoot;

            parameterIN.isRootBlock    = true;
            parameterOUT.isRootBlock   = true;
            parameterINOUT.isRootBlock = true;
            parameterINOUT.isInOut     = true;
            parameterSTAT.isRootBlock  = true;
            parameterTEMP.isRootBlock  = true;

            bool tempAdded = false;

            int Valpos = 0;

            if (txt == null)
            {
                if (blkTP != PLCBlockType.DB)
                {
                    parameterRoot.Add(parameterTEMP);
                }
                return(parameterRoot);
            }

            //Todo: read the complete DB from mc5 code first, Read the containing UDTs, compare the UDTs with the Structs, if the UDTs and Structs are not Equal, marke the PLCDataRow as TimeStampConflict

            string[] rows = txt.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);

            S7DataRow lastrow = null;


            Dictionary <string, S7Block> blkHelpers = new Dictionary <string, S7Block>();

            for (int n = 0; n < rows.Length; n++) // (string row in rows)
            {
                string rowTr = rows[n].Replace("\0", "").Trim();
                int    poscm = rowTr.IndexOf("\t//");
                if (poscm <= 0)
                {
                    poscm = rowTr.Length;
                }

                string switchrow = rowTr.Substring(0, poscm);
                string commnew   = "";
                if (poscm != rowTr.Length)
                {
                    commnew = rowTr.Substring(poscm + 1);
                }

                if (rowTr.StartsWith("//"))
                {
                    if (lastrow != null)
                    {
                        lastrow.Comment += rowTr;
                    }
                    else
                    {
                        if (commnew != null)
                        {
                            if (string.IsNullOrEmpty(akDataRow.Comment))
                            {
                                akDataRow.Comment += rowTr;
                            }
                            else
                            {
                                akDataRow.Comment += "\r\n" + rowTr;
                            }
                        }
                    }
                }
                else
                {
                    switch (switchrow.Trim())
                    {
                    case "VAR_INPUT":
                        akDataRow         = parameterIN;
                        akDataRow.Comment = commnew;
                        parameterRoot.Add(parameterIN);
                        parameterRootWithoutTemp.Add(parameterIN);
                        break;

                    case "VAR_OUTPUT":
                        akDataRow         = parameterOUT;
                        akDataRow.Comment = commnew;
                        parameterRoot.Add(parameterOUT);
                        parameterRootWithoutTemp.Add(parameterOUT);
                        break;

                    case "VAR_IN_OUT":
                        akDataRow         = parameterINOUT;
                        akDataRow.Comment = commnew;

                        parameterRoot.Add(parameterINOUT);
                        parameterRootWithoutTemp.Add(parameterINOUT);
                        break;

                    case "VAR_TEMP":
                        akDataRow = parameterTEMP;
                        if (blkTP != PLCBlockType.DB)
                        {
                            tempAdded = true;
                            parameterRoot.Add(parameterTEMP);
                        }
                        break;

                    case "VAR":     //Static Data on a FB
                        akDataRow = parameterSTAT;
                        parameterRoot.Add(parameterSTAT);
                        parameterRootWithoutTemp.Add(parameterSTAT);
                        break;

                    case "END_STRUCT;":
                    case "END_STRUCT ;":
                        akDataRow = ((S7DataRow)akDataRow.Parent);
                        break;

                    case "STRUCT":
                    case "END_VAR":
                    case "":
                        if (commnew != null)
                        {
                            if (string.IsNullOrEmpty(akDataRow.Comment))
                            {
                                akDataRow.Comment += commnew;
                            }
                            else
                            {
                                akDataRow.Comment += "\r\n" + commnew;
                            }
                        }
                        break;

                    default:

                        char oldChar = ' ';

                        List <Step7Attribute> Step7Attributes = new List <Step7Attribute>();

                        string tmpName           = "";
                        string tmpAttributeName  = "";
                        string tmpAttributeValue = "";
                        string tmpType           = "";
                        string tmpComment        = "";
                        string tmpValue          = "";

                        int parseZustand = 0;     //0=ParName, 1=AttributeName, 6=AfterAttributeName, 2=AttributeValue, 3=Type, 4=Value, 7=InnerValue (without '), 5=Comment

                        var p1 = rows[n].IndexOf(" OF ");
                        int p2 = 0, p3 = 0;
                        if (p1 > 0)
                        {
                            p2 = rows[n].IndexOf(";", p1);
                            p3 = rows[n].IndexOf("//", p1);
                        }

                        //if (rows[n].Contains("ARRAY") && rows[n].Contains(" OF ") && !rows[n].Contains("\t\r")) //    !rows[n].Contains("\t")
                        if (rows[n].Contains("ARRAY") && rows[n].Contains(" OF ") && (!(p2 > p1 && (p2 < p3 || p3 < 0)) && !rows[n].Contains("\t\r")))
                        {
                            if (rows.Length > n + 1)
                            {
                                if (rowTr.Contains("//"))
                                {
                                    int pos = rowTr.IndexOf("//");
                                    rowTr = rowTr.Substring(0, pos) + " " + rows[n + 1].Trim() + rowTr.Substring(pos);
                                }
                                else if (rowTr.Contains("OF STRUCT"))
                                {
                                }
                                else if (rowTr[rowTr.Length - 1] != ';')
                                {
                                    rowTr += " " + rows[n + 1].Trim();
                                }
                                n++;
                            }
                        }

                        for (int j = 0; j < rowTr.Length; j++)
                        {
                            char tmpChar = rowTr[j];

                            if (parseZustand == 0 && tmpChar == '{')
                            {
                                parseZustand = 1;
                            }
                            else if (parseZustand == 0 && tmpChar != ' ' && tmpChar != ':')
                            {
                                tmpName += tmpChar;
                            }
                            else if (parseZustand == 6 && tmpChar == '\'')
                            {
                                parseZustand = 2;
                            }
                            else if (parseZustand == 1 && tmpChar == ':' && rowTr[j + 1] == '=')
                            {
                                parseZustand = 6;
                                j++;
                            }
                            else if (parseZustand == 1 && tmpChar != ' ' && tmpChar != ':' && tmpChar != '=' && tmpChar != '}' && tmpChar != '\'' && tmpChar != ';')
                            {
                                tmpAttributeName += tmpChar;
                            }
                            else if (parseZustand == 1 && tmpChar == '}')
                            {
                                parseZustand = 0;
                            }
                            else if (parseZustand == 0 && tmpChar == ':')
                            {
                                parseZustand = 3;
                            }
                            else if (parseZustand == 2 && tmpChar == '$')
                            {
                                tmpAttributeValue += rowTr[j + 1];
                                j++;
                            }
                            else if (parseZustand == 2 && tmpChar == '\'')
                            {
                                parseZustand = 1;
                                Step7Attributes.Add(new Step7Attribute(tmpAttributeName, tmpAttributeValue));
                                tmpAttributeName  = "";
                                tmpAttributeValue = "";
                            }
                            else if (parseZustand == 2)
                            {
                                tmpAttributeValue += tmpChar;
                            }
                            //else if (parseZustand == 3 && tmpChar == ':')
                            //    parseZustand = 2;
                            else if (parseZustand == 3 && tmpChar == ':' && rowTr[j + 1] == '=')
                            {
                                parseZustand = 4;
                                j++;
                            }
                            else if ((parseZustand == 3 || parseZustand == 4) && tmpChar == '/' && rowTr[j + 1] == '/')
                            {
                                parseZustand = 5;
                                j++;
                            }
                            else if (parseZustand == 4 && tmpChar == '\'')
                            {
                                tmpValue    += tmpChar;
                                parseZustand = 7;
                            }
                            else if (parseZustand == 7 && tmpChar == '$')
                            {
                                tmpValue += rowTr[j + 1];
                                j++;
                            }
                            else if (parseZustand == 7 && tmpChar == '\'')
                            {
                                tmpValue    += tmpChar;
                                parseZustand = 4;
                            }
                            else if (parseZustand == 3 && tmpChar != ';')
                            {
                                tmpType += tmpChar;
                            }
                            else if (parseZustand == 4 && tmpChar != ';' && tmpChar != ' ')
                            {
                                tmpValue += tmpChar;
                            }
                            else if (parseZustand == 7)
                            {
                                tmpValue += tmpChar;
                            }
                            else if (parseZustand == 5)
                            {
                                tmpComment += tmpChar;
                            }
                        }

                        tmpType = tmpType.Trim().ToUpper();

                        S7DataRow addRW = new S7DataRow(tmpName, S7DataRowType.UNKNOWN, myBlk);
                        lastrow = addRW;

                        if (tmpType.Replace(" ", "").Contains("ARRAY["))
                        {
                            List <int> arrayStart = new List <int>();
                            List <int> arrayStop  = new List <int>();

                            int      pos1   = tmpType.IndexOf("[");
                            int      pos2   = tmpType.IndexOf("]", pos1);
                            string[] arrays = tmpType.Substring(pos1 + 1, pos2 - pos1 - 2).Split(',');

                            foreach (string array in arrays)
                            {
                                string[] akar = array.Split(new string[] { ".." }, StringSplitOptions.RemoveEmptyEntries);
                                arrayStart.Add(Convert.ToInt32(akar[0].Trim()));
                                arrayStop.Add(Convert.ToInt32(akar[1].Trim()));
                            }

                            addRW.ArrayStart = arrayStart;
                            addRW.ArrayStop  = arrayStop;
                            addRW.IsArray    = true;
                            tmpType          = tmpType.Substring(pos2 + 5);
                        }

                        addRW.Comment = tmpComment.Replace("$'", "'").Replace("$$", "$");

                        if (Step7Attributes.Count > 0)
                        {
                            addRW.Attributes = Step7Attributes;
                        }

                        int akRowTypeNumber = 0;
                        if (tmpType.Contains("SFB"))
                        {
                            addRW.DataType  = S7DataRowType.SFB;
                            akRowTypeNumber = Convert.ToInt32(tmpType.Substring(4));

                            string          blkDesc = "SFB" + akRowTypeNumber.ToString();
                            S7FunctionBlock tmpBlk;
                            if (blkHelpers.ContainsKey(blkDesc))
                            {
                                tmpBlk = (S7FunctionBlock)blkHelpers[blkDesc];
                            }
                            else
                            {
                                tmpBlk = ((S7FunctionBlock)myFld.GetBlock(blkDesc));
                                blkHelpers.Add(blkDesc, tmpBlk);
                            }

                            if (tmpBlk != null && tmpBlk.Parameter != null && tmpBlk.Parameter.Children != null)
                            {
                                addRW.AddRange(tmpBlk.ParameterWithoutTemp.DeepCopy().Children.Cast <S7DataRow>());
                            }
                        }
                        else if (tmpType.Contains("UDT"))
                        {
                            addRW.DataType  = S7DataRowType.UDT;
                            akRowTypeNumber = Convert.ToInt32(tmpType.Substring(4));

                            string      blkDesc = "UDT" + akRowTypeNumber.ToString();
                            S7DataBlock tmpBlk;
                            if (blkHelpers.ContainsKey(blkDesc))
                            {
                                tmpBlk = (S7DataBlock)blkHelpers[blkDesc];
                            }
                            else
                            {
                                tmpBlk = ((S7DataBlock)myFld.GetBlock(blkDesc));
                                blkHelpers.Add(blkDesc, tmpBlk);
                            }

                            if (tmpBlk != null && tmpBlk.Structure != null && tmpBlk.Structure.Children != null)
                            {
                                addRW.AddRange(((S7DataRow)tmpBlk.Structure).DeepCopy().Children.Cast <S7DataRow>());
                            }
                        }
                        else if (tmpType.Contains("BLOCK_FB"))
                        {
                            addRW.DataType = S7DataRowType.BLOCK_FB;
                            //akRowTypeNumber = Convert.ToInt32(tmpType.Substring(3));

                            //PLCFunctionBlock tmpBlk = ((PLCFunctionBlock)myFld.GetBlock("FB" + akRowTypeNumber.ToString()));
                            //if (tmpBlk != null && tmpBlk.Parameter != null && tmpBlk.Parameter.Children != null)
                            //    addRW.AddRange(tmpBlk.Parameter.Children);
                        }
                        else if (tmpType.Contains("FB"))
                        {
                            addRW.DataType  = S7DataRowType.FB;
                            akRowTypeNumber = Convert.ToInt32(tmpType.Substring(3));

                            string          blkDesc = "FB" + akRowTypeNumber.ToString();
                            S7FunctionBlock tmpBlk;
                            if (blkHelpers.ContainsKey(blkDesc))
                            {
                                tmpBlk = (S7FunctionBlock)blkHelpers[blkDesc];
                            }
                            else
                            {
                                tmpBlk = ((S7FunctionBlock)myFld.GetBlock(blkDesc));
                                blkHelpers.Add(blkDesc, tmpBlk);
                            }

                            if (tmpBlk != null && tmpBlk.Parameter != null && tmpBlk.Parameter.Children != null)
                            {
                                addRW.AddRange(tmpBlk.ParameterWithoutTemp.DeepCopy().Children.Cast <S7DataRow>());
                            }
                        }
                        else if (tmpType.Contains("STRING"))
                        {
                            addRW.DataType = S7DataRowType.STRING;
                            int pos1 = tmpType.IndexOf("[");
                            int pos2 = tmpType.IndexOf("]", pos1);
                            addRW.StringSize = Convert.ToInt32(tmpType.Substring(pos1 + 1, pos2 - pos1 - 2));
                        }
                        else
                        {
                            addRW.DataType = (S7DataRowType)Enum.Parse(typeof(S7DataRowType), tmpType.ToUpper());
                        }

                        addRW.DataTypeBlockNumber = akRowTypeNumber;

                        if (tmpValue != "")
                        {
                            //Todo: Startvalues bei arrays...
                            //Mehrere Values...
                            //TRUE,6(FALSE),TRUE,TRUE,7(FALSE)
                            if (addRW.IsArray)
                            {
                                addRW.StartValue = tmpValue;
                            }
                            else
                            {
                                addRW.StartValue = Helper.StringValueToObject(tmpValue, addRW.DataType);
                            }
                        }
                        else
                        {
                            if (!addRW.IsArray)
                            {
                                addRW.StartValue = Helper.DefaultValueForType(addRW.DataType);
                            }
                        }

                        //if (actualValues != null)
                        //{
                        //    addRW.Value = GetVarTypeVal((byte)addRW.DataType, actualValues, ref Valpos);
                        //}

                        akDataRow.Add(addRW);
                        ParaList.Add(tmpName);

                        if (addRW.DataType == S7DataRowType.STRUCT)
                        {
                            akDataRow = addRW;
                        }

                        break;

                        /*
                         * Attributname kann nicht ' und } enthalten!
                         * In Attribt Values
                         * $$ zum ausmaskieren von $
                         * $' zum ausmaskieren von '
                         *
                         * Beispielzeilen....
                         * // "ID { S7_co := 'agag'; S7_server1 := 'connection' }: INT ;\t// Connection ID 1..16"
                         * // "LADDR { S7_co := 'agag'; S7_server1 := 'connection' }: WORD ;\t// Module address in hardware configuration"
                         * // "RECV : ANY ;\t// Buffer for received data"
                         * // "NDR : BOOL ;\t// Indicates whether new data were received"
                         * // "aa { ff := '//ghghf}' }: BOOL ;"
                         * // "bb : INT  := 8888;"
                         * // "P_1001 : ARRAY  [0 .. 3 ] OF CHAR  := '1', '0', '0', '1';"
                         * // "aa : STRING  [20 ] := 'deewedw';"
                         * // "aa { dsfs := '' }: BOOL ;"
                         *
                         * //"res : ARRAY  [1 .. 121 ] OF STRUCT"
                         * //      "P_AKL1 : ARRAY  [0 .. 3 ] OF CHAR  := 'A', 'K', 'L', '1';"
                         */
                    }
                }
            }
            if (blkTP != PLCBlockType.DB && blkTP != PLCBlockType.UDT && tempAdded == false)
            {
                parameterRoot.Add(parameterTEMP);
            }

            if (actualValues != null)
            {
                int vPos = 0, bPos = 0;
                //FillActualValuesInDataBlock(parameterRoot, actualValues, ref vPos, ref bPos);
            }

            return(parameterRoot);
        }
        public static void ReplaceStaticAccess(S7FunctionBlock myFct, S7ProgrammFolder myFld, S7ConvertingOptions myOpt)
        {
            if (myOpt.ReplaceDIAccessesWithSymbolNames && myFct.BlockType == PLCBlockType.FB)
            {
                List <FunctionBlockRow> retVal   = new List <FunctionBlockRow>();
                List <FunctionBlockRow> tempList = new List <FunctionBlockRow>();

                bool LargeAccess = false;
                int  add_adresse = 0;

                foreach (var functionBlockRow in myFct.AWLCode)
                {
                    if (functionBlockRow.Command == "TAR2")
                    {
                        tempList.Add(functionBlockRow);
                        LargeAccess = true;
                    }
                    else if (functionBlockRow.Command == "+AR2" && LargeAccess)
                    {
                        tempList.Add(functionBlockRow);
                        add_adresse += Convert.ToInt32(Convert.ToDouble(((S7FunctionBlockRow)functionBlockRow).Parameter.Substring(2), new NumberFormatInfo()
                        {
                            NumberDecimalSeparator = "."
                        }));
                    }
                    else if (((S7FunctionBlockRow)functionBlockRow).Parameter.Contains("[AR2,P#") && ((S7FunctionBlockRow)functionBlockRow).Parameter.Substring(0, 2) == "DI" && !LargeAccess)
                    {
                        string         para   = ((S7FunctionBlockRow)functionBlockRow).Parameter;
                        ByteBitAddress adr    = new ByteBitAddress(para.Substring(10, para.Length - 11));
                        var            parRow = S7DataRow.GetDataRowWithAddress(myFct.Parameter, adr, true);
                        if (parRow != null)
                        {
                            byte[] tmp = ((S7FunctionBlockRow)functionBlockRow).MC7;
                            ((S7FunctionBlockRow)functionBlockRow).Parameter = "#" + parRow.StructuredName.Substring(parRow.StructuredName.IndexOf('.') + 1);
                            ((S7FunctionBlockRow)functionBlockRow).MC7       = tmp;
                        }
                        retVal.Add(functionBlockRow);
                    }
                    else if (((S7FunctionBlockRow)functionBlockRow).Parameter.Contains("[AR2,P#") && ((S7FunctionBlockRow)functionBlockRow).Parameter.Substring(0, 2) == "DI" && LargeAccess)
                    {
                        /*
                         * string para = ((S7FunctionBlockRow)functionBlockRow).Parameter;
                         * ByteBitAddress adr = new ByteBitAddress(para.Substring(10, para.Length - 11));
                         * adr.ByteAddress += add_adresse;
                         * var parRow = S7DataRow.GetDataRowWithAddress(myFct.Parameter, adr);
                         * if (parRow != null)
                         * {
                         *  byte[] tmp = ((S7FunctionBlockRow)functionBlockRow).MC7;
                         *  ((S7FunctionBlockRow)functionBlockRow).Parameter = "#" + parRow.StructuredName;
                         *  ((S7FunctionBlockRow)functionBlockRow).MC7 = tmp;
                         * }
                         * retVal.Add(functionBlockRow);
                         */
                        LargeAccess = false;
                    }
                    else if (functionBlockRow.Command == "LAR2")
                    {
                    }
                    else
                    {
                        LargeAccess = false;
                        retVal.AddRange(tempList);
                        tempList.Clear();
                        retVal.Add(functionBlockRow);
                    }
                }

                myFct.AWLCode = retVal;
            }
        }
        public static S7DataRow ParseChildrenRowsFromText(List <String> inputText, String structName, String structComment, DotNetSiemensPLCToolBoxLibrary.DataTypes.Blocks.Block blockName)
        {
            S7DataRow newRow = new S7DataRow(structName, S7DataRowType.STRUCT, blockName);

            newRow.Comment = structComment;
            bool finished = false;

            while (inputText.Count > 0 && !finished)
            {
                String line = inputText[0];
                inputText.RemoveAt(0);
                String    trimmedLine = line.Trim();
                String    comment     = "";
                String    type        = "";
                String    name        = "";
                String    arrayType   = "";
                String[]  splitString;
                S7DataRow childRow   = new S7DataRow("", S7DataRowType.ANY, blockName);
                int       length     = 0;
                int       arrayStart = 0;
                bool      typeFailed = false;

                if (trimmedLine.Contains("//"))
                {
                    splitString = trimmedLine.Split(new string[] { "//" }, StringSplitOptions.RemoveEmptyEntries);
                    comment     = splitString[1].Trim();
                    trimmedLine = splitString[0];
                }
                if (trimmedLine.Contains(":"))
                {
                    splitString = trimmedLine.Split(':');
                    type        = splitString[1].Trim().Trim(';').Trim('\"').Trim();
                    name        = splitString[0].Trim();

                    if (type.ToUpper().Contains("ARRAY"))
                    {
                        name        = name.Trim('\"');
                        splitString = type.Split(new string[] { "[", "..", "]" }, StringSplitOptions.RemoveEmptyEntries);
                        if (splitString.Length == 4)
                        {
                            bool parsed  = Int32.TryParse(splitString[2], out length);
                            bool parsed2 = Int32.TryParse(splitString[1], out arrayStart);
                        }
                        splitString = type.Split(new string[] { "of" }, StringSplitOptions.RemoveEmptyEntries);
                        if (splitString.Length > 1)
                        {
                            arrayType = splitString[1].Trim().Trim('\"');
                        }

                        type = "ARRAY";
                    }
                    else if (type.ToUpper().Contains("STRING"))
                    {
                        splitString = type.Split(new string[] { "[", "]" }, StringSplitOptions.RemoveEmptyEntries);
                        if (splitString.Length > 1)
                        {
                            bool parsed = Int32.TryParse(splitString[1], out length);
                        }
                        else
                        {
                            length = 254;
                        }

                        type = "STRING";
                    }
                }

                comment = String.IsNullOrEmpty(comment) ? name : comment;

                if (trimmedLine.ToUpper().Contains("END_STRUCT"))
                {
                    finished = true;
                    break;
                }

                switch (type.ToUpper())
                {
                case "":
                    typeFailed = true;
                    break;

                case "ARRAY":
                    S7DataRowType dataType;
                    bool          parsed = Enum.TryParse <S7DataRowType>(arrayType.ToUpper(), out dataType);
                    if (!parsed)
                    {
                        typeFailed        = GetUdtStructureFromSource(arrayType, out childRow);
                        childRow.Name     = name;
                        childRow.DataType = S7DataRowType.UDT;
                    }
                    else
                    {
                        childRow = new S7DataRow(name, dataType, blockName);
                    }

                    childRow.IsArray    = true;
                    childRow.ArrayStart = new List <int>(new int[] { arrayStart });
                    childRow.ArrayStop  = new List <int>(new int[] { length });
                    break;

                case "STRING":
                    childRow            = new S7DataRow(name, S7DataRowType.STRING, blockName);
                    childRow.StringSize = length;
                    break;

                case "BOOL":
                    childRow = new S7DataRow(name, S7DataRowType.BOOL, blockName);
                    break;

                case "INT":
                    childRow = new S7DataRow(name, S7DataRowType.INT, blockName);
                    break;

                case "REAL":
                    childRow = new S7DataRow(name, S7DataRowType.REAL, blockName);
                    break;

                case "DATE":
                    childRow = new S7DataRow(name, S7DataRowType.DATE, blockName);
                    break;

                case "DATE_AND_TIME":
                    childRow = new S7DataRow(name, S7DataRowType.DATE_AND_TIME, blockName);
                    break;

                case "TIME":
                    childRow = new S7DataRow(name, S7DataRowType.TIME, blockName);
                    break;

                case "TIME_OF_DAY":
                    childRow = new S7DataRow(name, S7DataRowType.TIME_OF_DAY, blockName);
                    break;

                case "S5TIME":
                    childRow = new S7DataRow(name, S7DataRowType.S5TIME, blockName);
                    break;

                case "WORD":
                    childRow = new S7DataRow(name, S7DataRowType.WORD, blockName);
                    break;

                case "BYTE":
                    childRow = new S7DataRow(name, S7DataRowType.BYTE, blockName);
                    break;

                case "CHAR":
                    childRow = new S7DataRow(name, S7DataRowType.CHAR, blockName);
                    break;

                case "DINT":
                    childRow = new S7DataRow(name, S7DataRowType.DINT, blockName);
                    break;

                case "DWORD":
                    childRow = new S7DataRow(name, S7DataRowType.DWORD, blockName);
                    break;

                case "STRUCT":
                    childRow = ParseChildrenRowsFromText(inputText, name, comment, blockName);
                    break;

                default:
                    typeFailed    = GetUdtStructureFromSource(type, out childRow);
                    childRow.Name = name;
                    break;
                }
                if (typeFailed)
                {
                    break;
                }

                childRow.Comment = comment;
                newRow.Add(childRow);
            }

            if (!finished)
            {
                // for some reason we didn't get to an "END_STRUCT" and there is a struct mismatch
                throw new NotImplementedException();
            }

            return(newRow);
        }
Example #16
0
        public static S5DataBlock GetDB(ProjectPlcBlockInfo blkInfo, byte[] block, byte[] preHeader, byte[] commentBlock)
        {
            S5DataBlock retVal = new S5DataBlock();

            retVal.BlockType   = blkInfo.BlockType;
            retVal.BlockNumber = blkInfo.BlockNumber;

            S7DataRow main = new S7DataRow("STATIC", S7DataRowType.STRUCT, retVal);

            retVal.Structure = main;

            var zeilenListe = new List <S7DataRow>();

            if (preHeader != null)
            {
                int akcnt = 0;
                //S7DataRowType akRwTp = (S7DataRowType) (preHeader[9] | 0xf00);
                int anzTypes = (((preHeader[6] * 256 + preHeader[7]) - 2) / 2); //How many different Types are in the Header
                for (int n = 1; n <= anzTypes; n++)
                {
                    int rowStart = preHeader[(n - 1) * 4 + 10] * 256 + preHeader[(n - 1) * 4 + 11];
                    int rowStop  = preHeader[n * 4 + 10] * 256 + preHeader[n * 4 + 11];
                    var akRwTp   = (S7DataRowType)(preHeader[9 + (n - 1) * 4] | 0xf00);


                    if (akRwTp == S7DataRowType.S5_C || akRwTp == S7DataRowType.S5_KC)
                    {
                        for (int j = rowStart; j < rowStop; j += 24)
                        {
                            var row = new S7DataRow(string.Empty, akRwTp, retVal);
                            row.StringSize = rowStop - j > 12 ? 24 : (rowStop - j) * 2;
                            main.Add(row);
                            for (int q = 0; q < (row.StringSize / 2); q++)
                            {
                                zeilenListe.Add(row);
                            }
                        }
                    }
                    else if (akRwTp == S7DataRowType.S5_KG)
                    {
                        for (int j = rowStart; j < rowStop; j += 2)
                        {
                            var row = new S7DataRow(string.Empty, akRwTp, retVal);
                            main.Add(row);
                            zeilenListe.Add(row);
                            zeilenListe.Add(row);
                        }
                    }
                    else
                    {
                        for (int j = rowStart; j < rowStop; j += 1)
                        {
                            var row = new S7DataRow(string.Empty, akRwTp, retVal);
                            main.Add(row);
                            zeilenListe.Add(row);
                        }
                    }
                }
            }


            try
            {
                int st = 10;

                int maxZ = (block[8] * 256 + block[9]);
                int n    = 0;

                while (n < maxZ - 5)
                //foreach (var s7DataRow in main.Children)
                {
                    S7DataRow s7DataRow;
                    if (zeilenListe.Count > n)
                    {
                        s7DataRow = zeilenListe[n];
                    }
                    else
                    {
                        s7DataRow = new S7DataRow(string.Empty, S7DataRowType.S5_KH, retVal);
                        main.Add(s7DataRow);
                    }

                    switch (s7DataRow.DataType)
                    {
                    case S7DataRowType.S5_KF:
                        s7DataRow.Value = libnodave.getS16from(block, st);
                        break;

                    case S7DataRowType.S5_KZ:
                        s7DataRow.Value = libnodave.getBCD16from(block, st);
                        break;

                    case S7DataRowType.S5_KM:
                        s7DataRow.Value = libnodave.getU16from(block, st);
                        break;

                    case S7DataRowType.S5_KH:
                        s7DataRow.Value = libnodave.getU16from(block, st);
                        break;

                    case S7DataRowType.S5_KY:
                        s7DataRow.Value = libnodave.getU16from(block, st);
                        break;

                    case S7DataRowType.S5_KG:
                        s7DataRow.Value = libnodave.getS5Floatfrom(block, st);
                        break;

                    case S7DataRowType.S5_KC:
                    case S7DataRowType.S5_C:
                        s7DataRow.Value = System.Text.ASCIIEncoding.ASCII.GetString(block, st, s7DataRow.StringSize);
                        break;

                    case S7DataRowType.S5_KT:
                        s7DataRow.Value = libnodave.getS5Timefrom(block, st);
                        break;

                    default:
                        s7DataRow.Value = libnodave.getU16from(block, st);
                        break;
                    }

                    st += s7DataRow.ByteLength;
                    n  += s7DataRow.ByteLength / 2;
                }
            }
            catch (Exception ex)
            { }


            try
            {
                if (commentBlock != null && main._children != null && main._children.Count > 0)
                {
                    int nr    = 28;
                    int hdlen = 0x7f & commentBlock[nr];

                    retVal.Name = System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(commentBlock, nr + 1, hdlen);

                    nr += hdlen + 1;
                    while (nr + 3 < commentBlock.Length)
                    {
                        int    zeile = ((commentBlock[nr + 1] - 128) * 256) + commentBlock[nr];
                        int    len   = 0x7f & commentBlock[nr + 2];
                        string cmt   = System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(commentBlock, nr + 3, len);
                        //main._children[zeile].Comment = cmt;
                        zeilenListe[zeile].Comment = cmt;

                        nr += len + 3;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("There was an error parsing the Block Comments! Maybe the Step5 project is broken? \n" + ex.Message);
            }

            return(retVal);
        }
Example #17
0
        private void cmdCreateWinCCFlexibleTags_Click(object sender, EventArgs e)
        {
            S7DataBlock myDB = (S7DataBlock)((BlocksOfflineFolder)blkFld).GetBlock((S7ProjectBlockInfo)lstListBox.SelectedItem);

            List <S7DataRow> myLst = null;

            if (chkExpandArrays.Checked)
            {
                myLst = S7DataRow.GetChildrowsAsList(myDB.GetArrayExpandedStructure(new S7DataBlockExpandOptions())); // ) myDB.GetRowsAsArrayExpandedList(ne);
            }
            else
            {
                myLst = S7DataRow.GetChildrowsAsList(myDB.Structure); // myDB.GetRowsAsList();
            }
            string tags = "";


            foreach (S7DataRow plcDataRow in myLst) // myDB.GetRowsAsList())
            {
                string tagName = txtTagsPrefix.Text + plcDataRow.StructuredName.Replace(".", "_").Replace("[", "_").Replace("]", "").Replace(" ", "").Replace(",", "_");

                switch (plcDataRow.DataType)
                {
                case S7DataRowType.BOOL:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBX " + plcDataRow.BlockAddress.ByteAddress.ToString() + "." + plcDataRow.BlockAddress.BitAddress.ToString() + ";Bool;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.INT:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBW " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Int;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.DINT:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBD " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";DInt;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.WORD:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBW " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Word;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.DWORD:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBD " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";DWord;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.BYTE:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBB " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Byte;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.REAL:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBD " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Real;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.CHAR:
                    if (plcDataRow.IsArray)
                    {
                        tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBB " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";StringChar;" + plcDataRow.GetArrayLines().ToString() + ";" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    }
                    else
                    {
                        tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBB " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Char;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    }
                    break;

                case S7DataRowType.COUNTER:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBW " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Counter;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.DATE:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBD " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Date;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.DATE_AND_TIME:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBB " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Date and Time;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.S5TIME:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBW " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Timer;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.STRING:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBB " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";String;" + plcDataRow.StringSize.ToString() + ";" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.TIME:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBD " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Time;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.TIME_OF_DAY:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBD " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Time of Day;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;

                case S7DataRowType.TIMER:
                    tags += tagName + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBW " + plcDataRow.BlockAddress.ByteAddress.ToString() + ";Timer;;" + "1" + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";
                    break;
                }
            }

            FolderBrowserDialog fldDlg = null;

            fldDlg             = new FolderBrowserDialog();
            fldDlg.Description = "Destination Directory for Tags.csv!";
            if (fldDlg.ShowDialog() == DialogResult.OK)
            {
                System.IO.StreamWriter swr;

                swr = new System.IO.StreamWriter(fldDlg.SelectedPath + "\\Tags.csv");
                swr.Write(tags.Replace(";", "\t"));
                swr.Close();
            }
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string errors = "";
            string tags   = "";

            foreach (var projectBlockInfo in ConvertBlocks)
            {
                S7DataBlock myDB = (S7DataBlock)projectBlockInfo.GetBlock();

                int cnt = 0;

                if (myDB.Structure != null && myDB.Structure.Children != null)
                {
                    cnt = myDB.Structure.Children[myDB.Structure.Children.Count - 1].NextBlockAddress.ByteAddress;
                }

                string varname = "STOERUNGEN_DB" + myDB.BlockNumber;

                tags += varname + ";" + txtConnectionName.Text + ";DB " + myDB.BlockNumber + " DBW 0;Int;;" +
                        ((cnt - 2) / 2).ToString() + ";2;1 s;;;;;0;10;0;100;0;;0;\r\n";

                int errNr = Convert.ToInt32(txtStartErrorNumber.Text);

                foreach (S7DataRow plcDataRow in S7DataRow.GetChildrowsAsList(myDB.Structure))
                // myDB.GetRowsAsList())
                {
                    if (plcDataRow.DataType == S7DataRowType.BOOL)
                    {
                        ByteBitAddress akAddr = plcDataRow.BlockAddress;

                        int bitnr = (akAddr.ByteAddress / 2) * 16 + akAddr.BitAddress; //akAddr.BitAddress;
                        if (akAddr.ByteAddress % 2 == 0)
                        {
                            bitnr += 8;
                        }

                        string stoeTxt   = "";
                        string stoeTxtEn = "";

                        stoeTxt = plcDataRow.Comment;
                        if (stoeTxt.Contains(";"))
                        {
                            stoeTxt = "Störort: " + stoeTxt.Split(';')[0] + ", " + stoeTxt.Split(';')[1];
                        }

                        if (chkFixedErrorNumber.IsChecked.Value)
                        {
                            errNr = Convert.ToInt32(txtStartErrorNumber.Text) + akAddr.ByteAddress * 8 + akAddr.BitAddress;
                        }
                        errors += "\"D\"\t\"" + errNr.ToString() + "\"\t\"Alarms\"\t\"" + varname + "\"\t\"" +
                                  bitnr.ToString() + "\"\t\t\t\t\t\t\"0\"\t\"de-DE=" + stoeTxt + "\"\t\"en-US=" +
                                  stoeTxtEn + "\"\t\"de-DE=\"" + "\r\n";
                        if (!chkFixedErrorNumber.IsChecked.Value)
                        {
                            errNr++;
                        }
                    }
                }
            }

            FolderBrowserDialog fldDlg = null;

            fldDlg             = new FolderBrowserDialog();
            fldDlg.Description = "Destination Diretory for Alarms.csv and Tags.csv!";
            if (fldDlg.ShowDialog() == DialogResult.OK)
            {
                System.IO.StreamWriter swr;

                swr = new System.IO.StreamWriter(fldDlg.SelectedPath + "\\Alarms.csv");
                swr.Write(errors);
                swr.Close();

                swr = new System.IO.StreamWriter(fldDlg.SelectedPath + "\\Tags.csv");
                swr.Write(tags.Replace(";", "\t"));
                swr.Close();
            }
        }
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            HMIGENOBJECTSLib.HMIGO HMIGOObject = null;
            try
            {
                HMIGOObject = new HMIGENOBJECTSLib.HMIGO();
            }
            catch (Exception ex)
            {
                MessageBox.Show("The WinCC Object could not be created!\n\n Error:" + ex.Message);
            }

            foreach (var projectBlockInfo in ConvertBlocks)
            {
                S7DataBlock myDB = (S7DataBlock)projectBlockInfo.GetBlock();

                List <S7DataRow> myLst = null;
                if (chkExpandArrays.IsChecked.Value)
                {
                    myLst =
                        S7DataRow.GetChildrowsAsList(myDB.GetArrayExpandedStructure(new S7DataBlockExpandOptions()));
                }
                // ) myDB.GetRowsAsArrayExpandedList(ne);
                else
                {
                    myLst = S7DataRow.GetChildrowsAsList(myDB.Structure); // myDB.GetRowsAsList();
                }
                int cnt = 0;

                try
                {
                    foreach (S7DataRow plcDataRow in myLst)
                    {
                        string tagName = txtTagsPrefix.Text +
                                         plcDataRow.StructuredName.Replace(".", "_").Replace("[", "_").Replace("]", "").
                                         Replace(" ", "").Replace(",", "_");
                        try
                        {
                            switch (plcDataRow.DataType)
                            {
                            case S7DataRowType.BOOL:
                                HMIGOObject.CreateTag(tagName, HMIGENOBJECTSLib.HMIGO_TAG_TYPE.TAG_BINARY_TAG,
                                                      txtConnectionName.Text,
                                                      "DB" + myDB.BlockNumber + ",D" +
                                                      plcDataRow.BlockAddress.ToString(),
                                                      "TAGS_DB" + myDB.BlockNumber);
                                break;

                            case S7DataRowType.INT:
                                HMIGOObject.CreateTag(tagName,
                                                      HMIGENOBJECTSLib.HMIGO_TAG_TYPE.TAG_SIGNED_16BIT_VALUE,
                                                      txtConnectionName.Text,
                                                      "DB" + myDB.BlockNumber + ",DW" +
                                                      plcDataRow.BlockAddress.ByteAddress.ToString(),
                                                      "TAGS_DB" + myDB.BlockNumber);
                                break;

                            case S7DataRowType.DINT:
                                HMIGOObject.CreateTag(tagName,
                                                      HMIGENOBJECTSLib.HMIGO_TAG_TYPE.TAG_SIGNED_32BIT_VALUE,
                                                      txtConnectionName.Text,
                                                      "DB" + myDB.BlockNumber + ",DD" +
                                                      plcDataRow.BlockAddress.ByteAddress.ToString(),
                                                      "TAGS_DB" + myDB.BlockNumber);
                                break;

                            case S7DataRowType.WORD:
                                HMIGOObject.CreateTag(tagName,
                                                      HMIGENOBJECTSLib.HMIGO_TAG_TYPE.TAG_UNSIGNED_16BIT_VALUE,
                                                      txtConnectionName.Text,
                                                      "DB" + myDB.BlockNumber + ",DW" +
                                                      plcDataRow.BlockAddress.ByteAddress.ToString(),
                                                      "TAGS_DB" + myDB.BlockNumber);
                                break;

                            case S7DataRowType.DWORD:
                                HMIGOObject.CreateTag(tagName,
                                                      HMIGENOBJECTSLib.HMIGO_TAG_TYPE.TAG_UNSIGNED_32BIT_VALUE,
                                                      txtConnectionName.Text,
                                                      "DB" + myDB.BlockNumber + ",DD" +
                                                      plcDataRow.BlockAddress.ByteAddress.ToString(),
                                                      "TAGS_DB" + myDB.BlockNumber);
                                break;

                            case S7DataRowType.BYTE:
                                HMIGOObject.CreateTag(tagName,
                                                      HMIGENOBJECTSLib.HMIGO_TAG_TYPE.TAG_UNSIGNED_8BIT_VALUE,
                                                      txtConnectionName.Text,
                                                      "DB" + myDB.BlockNumber + ",DBB" +
                                                      plcDataRow.BlockAddress.ByteAddress.ToString(),
                                                      "TAGS_DB" + myDB.BlockNumber);
                                break;

                            case S7DataRowType.REAL:
                                HMIGOObject.CreateTag(tagName,
                                                      HMIGENOBJECTSLib.HMIGO_TAG_TYPE.
                                                      TAG_FLOATINGPOINT_NUMBER_32BIT_IEEE_754,
                                                      txtConnectionName.Text,
                                                      "DB" + myDB.BlockNumber + ",DD" +
                                                      plcDataRow.BlockAddress.ByteAddress.ToString(),
                                                      "TAGS_DB" + myDB.BlockNumber);
                                break;
                            }
                        }
                        catch (System.Runtime.InteropServices.COMException ex)
                        {
                            if (ex.ErrorCode != -2147196408)
                            {
                                throw ex;
                            }
                            //Tag existiert schoin
                        }
                    }
                }
                catch (System.Runtime.InteropServices.COMException ex)
                {
                    if (ex.ErrorCode == -2147195889)
                    {
                        MessageBox.Show("Error: The Connection Name you specified does not exist!");
                    }
                    else
                    {
                        MessageBox.Show("Error: " + ex.Message);
                    }
                    return;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: " + ex.Message);
                    return;
                }
            }
        }
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            HMIGENOBJECTSLib.HMIGO HMIGOObject = null;
            try
            {
                HMIGOObject = new HMIGENOBJECTSLib.HMIGO();
            }
            catch (Exception ex)
            {
                MessageBox.Show("The WinCC Object could not be created!\n\n Error:" + ex.Message);
            }

            try
            {
                foreach (var projectBlockInfo in ConvertBlocks)
                {
                    S7DataBlock myDB = (S7DataBlock)projectBlockInfo.GetBlock();


                    int cnt = 0;

                    if (myDB.Structure != null && myDB.Structure.Children != null)
                    {
                        cnt = myDB.Structure.Children[myDB.Structure.Children.Count - 1].NextBlockAddress.ByteAddress;
                    }

                    string varname = "STOERUNGEN_DB" + myDB.BlockNumber;

                    for (int n = 0; n < cnt / 2; n++)
                    {
                        try
                        {
                            HMIGOObject.CreateTag(varname + "_" + (n + 1).ToString(),
                                                  HMIGENOBJECTSLib.HMIGO_TAG_TYPE.TAG_UNSIGNED_16BIT_VALUE,
                                                  txtConnectionName.Text,
                                                  "DB" + myDB.BlockNumber + ",DD" + (n * 2).ToString(), "Stoerungen");
                        }
                        catch (COMException ex)
                        {
                            if (ex.ErrorCode != -2147196408)
                            {
                                throw ex;
                            }
                        }
                    }

                    string errors = "";

                    int errNr = Convert.ToInt32(txtStartErrorNumber.Text);

                    foreach (S7DataRow plcDataRow in S7DataRow.GetChildrowsAsList(myDB.Structure))
                    // myDB.GetRowsAsList())
                    {
                        if (plcDataRow.DataType == S7DataRowType.BOOL)
                        {
                            ByteBitAddress akAddr = plcDataRow.BlockAddress;
                            int            varnr  = (akAddr.ByteAddress / 2) + 1;

                            int bitnr = akAddr.BitAddress;
                            if (akAddr.ByteAddress % 2 == 0)
                            {
                                bitnr += 8;
                            }

                            string stoeTxt   = "";
                            string stoeOrt   = "";
                            string stoeTxtEn = "";

                            stoeTxt = plcDataRow.Comment;
                            if (stoeTxt.Contains(";"))
                            {
                                stoeTxt = stoeTxt.Split(';')[1];
                                stoeOrt = stoeTxt.Split(';')[0];
                            }

                            if (chkFixedErrorNumber.IsChecked.Value)
                            {
                                errNr = Convert.ToInt32(txtStartErrorNumber.Text) + akAddr.ByteAddress * 8 +
                                        akAddr.BitAddress;
                            }

                            try
                            {
                                HMIGOObject.CreateSingleAlarm(errNr,
                                                              HMIGENOBJECTSLib.HMIGO_SINGLE_ALARM_CLASS_ID.
                                                              SINGLE_ALARM_ERROR, 1, stoeTxt,
                                                              varname + "_" + varnr.ToString(), bitnr);
                                HMIGOObject.SingleAlarmInfoText = stoeTxt;
                                HMIGOObject.SingleAlarmText2ID  = stoeOrt;
                                HMIGOObject.CommitSingleAlarm();
                            }
                            catch (System.Runtime.InteropServices.COMException ex)
                            {
                                if (ex.ErrorCode != -2147467259)
                                {
                                    throw ex;
                                }
                            }

                            //errors += "\"D\"\t\"" + errNr.ToString() + "\"\t\"Alarms\"\t\"" + varname + "\"\t\"" + bitnr.ToString() + "\"\t\t\t\t\t\t\"0\"\t\"de-DE=" + stoeTxt + "\"\t\"en-US=" + stoeTxtEn + "\"\t\"de-DE=\"" + "\r\n";
                            if (!chkFixedErrorNumber.IsChecked.Value)
                            {
                                errNr++;
                            }
                        }
                    }
                }
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                if (ex.ErrorCode == -2147195889)
                {
                    MessageBox.Show("Error: The Connection Name you specified does not exist!");
                }
                else
                {
                    MessageBox.Show("Error: " + ex.Message);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }
Example #21
0
        private void fetchPLCData_Tick(object sender, EventArgs e)
        {
            if (lblConnected.BackColor == Color.LightGreen)
            {
                lblConnected.BackColor = Color.DarkGray;
            }
            else
            {
                lblConnected.BackColor = Color.LightGreen;
            }

            try
            {
                if (myConn.Connected)
                {
                    /* Get the ScrollViewer des XAML Trees (um scrollposition zu lesen!)... */
                    if (myScrollViewer == null)
                    {
                        DependencyObject tst = VisualTreeHelper.GetChild(dataBlockViewControl.MyTree, 0);
                        while (tst != null && tst.GetType() != typeof(ScrollViewer))
                        {
                            tst = VisualTreeHelper.GetChild(tst, 0);
                        }
                        if (tst != null)
                        {
                            myScrollViewer = (ScrollViewer)tst;
                        }
                    }

                    //nur die angezeigten Values von der SPS lesen...
                    int start = (int)myScrollViewer.VerticalOffset / 20;
                    if (valueList == null || start != oldPos)
                    {
                        List <S7DataRow> tmpLst = S7DataRow.GetChildrowsAsList(expRow);
                        List <S7DataRow> askLst = new List <S7DataRow>();
                        for (int n = 0; n < tmpLst.Count; n++)
                        {
                            if (n >= start && n < start + 24)
                            {
                                askLst.Add(tmpLst[n]);
                            }
                        }
                        valueList = S7DataRow.GetLibnoDaveValues(askLst);
                        oldPos    = start;
                    }
                    myConn.ReadValues(valueList);
                }
                else
                {
                    oldPos                 = 0;
                    myScrollViewer         = null;
                    fetchPLCData.Enabled   = false;
                    valueList              = null;
                    lblConnected.BackColor = Color.DarkGray;
                }
            }
            catch (Exception ex)
            {
                lblStatus.Text = ex.Message;
            }
        }
Example #22
0
        /// <summary>
        /// This is a Helper Function wich is used by GetSourceBlock
        /// </summary>
        /// <param name="datrw"></param>
        /// <param name="leerz"></param>
        /// <returns></returns>
        public static string DataRowToSource(S7DataRow datrw, string leerz, bool withoutStartValue = false)
        {
            string retval = "";

            foreach (S7DataRow s7DataRow in datrw.Children)
            {
                string arr = "";
                string val = "";
                string cmt = "";
                if (s7DataRow.IsArray)
                {
                    arr += "ARRAY  [";
                    for (int i = 0; i < s7DataRow.ArrayStart.Count; i++)
                    {
                        if (i > 1)
                        {
                            arr += ", ";
                        }
                        arr += s7DataRow.ArrayStart[i].ToString() + " .. " + s7DataRow.ArrayStop[i].ToString() + " ";
                    }
                    arr += "] OF ";
                }
                if (s7DataRow.DataType == S7DataRowType.STRING)
                {
                    if (s7DataRow.StartValue != null && s7DataRow.StartValue.ToString() != "" && !withoutStartValue)
                    {
                        val += " := " + s7DataRow.StartValue.ToString() + "";
                    }
                }
                else if (s7DataRow.StartValue != null && !withoutStartValue)
                {
                    string valuePrefix = "";
                    switch (s7DataRow.DataType)
                    {
                    case S7DataRowType.DWORD:
                    case S7DataRowType.WORD:
                    case S7DataRowType.BYTE:
                        valuePrefix = "16#";
                        break;
                    }
                    val += " := " + valuePrefix;

                    if ((s7DataRow.DataType == S7DataRowType.REAL))
                    {
                        val += s7DataRow.StartValueAsString;
                    }
                    else
                    {
                        val += s7DataRow.StartValue.ToString();
                    }
                }

                if (!string.IsNullOrEmpty(s7DataRow.Comment))
                {
                    cmt += "    //" + s7DataRow.Comment;
                }
                if (s7DataRow.DataType == S7DataRowType.STRUCT)
                {
                    retval += leerz + s7DataRow.Name + " : " + arr + s7DataRow.DataType + cmt + Environment.NewLine;
                    retval += DataRowToSource(s7DataRow, leerz + " ");
                    retval += leerz + "END_STRUCT ;" + Environment.NewLine;
                }
                else
                {
                    retval += leerz + s7DataRow.Name + " : " + arr;
                    retval += s7DataRow.DataType;
                    if (s7DataRow.DataType == S7DataRowType.STRING)
                    {
                        retval += " [" + s7DataRow.StringSize + "]";
                    }
                    retval += (s7DataRow.DataTypeBlockNumber != 0 ? s7DataRow.DataTypeBlockNumber.ToString() : "") + " " + val + ";" + cmt + Environment.NewLine;
                }
            }
            return(retval);
        }
        public static void ConvertLocaldataToSymbols(S7FunctionBlock myFct, S7ConvertingOptions myOpt)
        {
            if (myOpt.ReplaceLokalDataAddressesWithSymbolNames)
            {
                List <S7DataRow>            rows   = null;
                Dictionary <String, String> parLst = new Dictionary <string, string>();

                if (myFct.Parameter != null && myFct.Parameter.Children != null)
                {
                    foreach (var plcDataRow in myFct.Parameter.Children)
                    {
                        if (plcDataRow.Name == "TEMP")
                        {
                            S7DataRow tmpRw = ((S7DataRow)plcDataRow)._GetExpandedChlidren(new S7DataBlockExpandOptions()
                            {
                                ExpandCharArrays = true, ExpandSubChildInINOUT = false
                            })[0];
                            rows = S7DataRow.GetChildrowsAsList(tmpRw);
                            break;
                        }
                    }
                }

                if (rows != null)
                {
                    foreach (var plcDataRow in rows)
                    {
                        if (plcDataRow.DataType != S7DataRowType.STRUCT && plcDataRow.DataType != S7DataRowType.UDT && plcDataRow.DataType != S7DataRowType.FB)
                        {
                            parLst.Add("P#L" + plcDataRow.BlockAddress.ToString(), "P##" + plcDataRow.StructuredName);
                        }
                        string tmp = plcDataRow.GetSymbolicAddress();
                        if (tmp != null)
                        {
                            parLst.Add("L" + tmp.Replace("X", ""), "#" + plcDataRow.StructuredName);
                        }
                    }
                }
                foreach (S7FunctionBlockRow plcFunctionBlockRow in myFct.AWLCode)
                {
                    if (!plcFunctionBlockRow.Parameter.Contains("'") && !plcFunctionBlockRow.Parameter.Contains("[AR") && plcFunctionBlockRow.Parameter.Contains("["))
                    {
                        int    pos1 = plcFunctionBlockRow.Parameter.IndexOf("[") + 1;
                        int    pos2 = plcFunctionBlockRow.Parameter.IndexOf("]");
                        string par  = plcFunctionBlockRow.Parameter.Substring(pos1, pos2 - pos1);
                        if (parLst.ContainsKey(par))
                        {
                            byte[] tmp = plcFunctionBlockRow.MC7;
                            plcFunctionBlockRow.Parameter = plcFunctionBlockRow.Parameter.Substring(0, pos1) + parLst[par] + "]";
                            plcFunctionBlockRow.MC7       = tmp;
                        }
                    }
                    else
                    {
                        string par = plcFunctionBlockRow.Parameter.Replace(" ", "");
                        if (parLst.ContainsKey(par))
                        {
                            byte[] tmp = plcFunctionBlockRow.MC7;
                            plcFunctionBlockRow.Parameter = "";

                            plcFunctionBlockRow.Parameter = parLst[par];

                            plcFunctionBlockRow.MC7 = tmp;
                        }
                    }
                }
            }
        }
Example #24
0
        //In this Class a UC is converted to a Call and also backwards...
        public static void ConvertUCToCall(S7FunctionBlock myFct, S7ProgrammFolder myFld, BlocksOfflineFolder myblkFld, S7ConvertingOptions myOpt, byte[] addInfoFromBlock)
        {
            if (myOpt.GenerateCallsfromUCs)
            {
                int inBld = 0; //1=nach BLD 1
                S7FunctionBlockRow newRow = null;

                Dictionary <string, string> Parameters = new Dictionary <string, string>();
                List <FunctionBlockRow>     retVal     = new List <FunctionBlockRow>();
                List <FunctionBlockRow>     tempList   = new List <FunctionBlockRow>();

                string             akPar     = "";
                string             db        = "";
                string             label     = "";
                bool               afterCall = false;
                S7FunctionBlockRow callRow   = null;

                for (int n = 0; n < myFct.AWLCode.Count; n++)
                {
                    S7FunctionBlockRow row = (S7FunctionBlockRow)myFct.AWLCode[n];
                    if (row.Command == Mnemonic.opBLD[(int)myOpt.Mnemonic] && (row.Parameter == "1" || row.Parameter == "7") && inBld == 0)
                    {
                        retVal.AddRange(tempList);
                        tempList.Clear();

                        Parameters.Clear();
                        db = "";

                        label = row.Label;

                        inBld     = Convert.ToInt32(row.Parameter);
                        newRow    = null;
                        afterCall = false;
                        callRow   = null;
                        tempList.Add(row);
                    }
                    else if (inBld > 0)
                    {
                        tempList.Add(row);
                        if (row.Command == "=" && n > 0 && myFct.AWLCode[n - 1].Command == Mnemonic.opBLD[(int)myOpt.Mnemonic])
                        {
                            //Do nothing, but this line needs to be there!
                        }
                        else if (row.Command == Mnemonic.opU[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opUN[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opO[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opON[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opO[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opON[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opX[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opXN[(int)myOpt.Mnemonic] ||
                                 row.Command == Mnemonic.opL[(int)myOpt.Mnemonic])
                        {
                            akPar = row.Parameter;
                        }
                        else if (row.Command == "AUF")
                        {
                            db = row.Parameter + ".";
                        }
                        else if (row.Command == "CLR")
                        {
                            akPar = "FALSE";
                        }
                        else if (row.Command == "SET")
                        {
                            akPar = "TRUE";
                        }
                        else if ((row.Command == "=") && akPar != "")
                        {
                            if (afterCall == false)
                            {
                                string key = row.Parameter.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", "");
                                if (!Parameters.ContainsKey(key))
                                {
                                    Parameters.Add("P#V " + key, db + akPar);
                                }
                            }
                            else
                            {
                                string key = akPar.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", "");
                                if (!Parameters.ContainsKey(key))
                                {
                                    Parameters.Add("P#V " + key, db + row.Parameter);
                                }
                            }
                            akPar = "";
                            db    = "";
                        }
                        else if (row.Command == Mnemonic.opT[(int)myOpt.Mnemonic] && akPar != "")
                        {
                            if (afterCall == false)
                            {
                                string key = row.Parameter.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", "");
                                if (!Parameters.ContainsKey(key))
                                {
                                    Parameters.Add("P#V " + key + ".0", db + akPar);
                                }
                            }
                            else
                            {
                                string key = akPar.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", "");
                                if (!Parameters.ContainsKey(key))
                                {
                                    Parameters.Add("P#V " + key, db + row.Parameter);
                                }
                            }
                            akPar = "";
                            db    = "";
                        }
                        else if (row.Command == Mnemonic.opUC[(int)myOpt.Mnemonic])
                        {
                            //Commands after a Call --> Out-Para
                            callRow   = row;
                            afterCall = true;
                        }
                        else if (row.Command == Mnemonic.opBLD[(int)myOpt.Mnemonic] && (row.Parameter == "2" || row.Parameter == "8"))
                        {
                            //Block Interface auslesen (von FC oder vom Programm)
                            //myFld.BlocksOfflineFolder.GetBlock()
                            S7DataRow para = myblkFld.GetInterface(callRow.Parameter);

                            newRow           = new S7FunctionBlockRow();
                            newRow.Command   = Mnemonic.opCALL[(int)myOpt.Mnemonic];
                            newRow.Parameter = callRow.Parameter;
                            //newRow.ExtParameter = new List<string>();
                            newRow.CallParameter = new List <S7FunctionBlockParameter>();

                            for (int i = 0; i < callRow.ExtParameter.Count; i++)
                            {
                                string s = callRow.ExtParameter[i];

                                string    parnm = "";
                                S7DataRow akRow = Parameter.GetFunctionParameterFromNumber(para, i);
                                if (akRow != null)
                                {
                                    parnm = akRow.Name + "";
                                }
                                else
                                {
                                    parnm = "$$undef";
                                }


                                S7FunctionBlockParameter newPar = new S7FunctionBlockParameter();
                                newPar.Name = parnm;
                                if (akRow != null)
                                {
                                    newPar.ParameterDataType = akRow.DataType;
                                    if (akRow.Parent.Name == "OUT")
                                    {
                                        newPar.ParameterType = S7FunctionBlockParameterDirection.OUT;
                                    }
                                    else if (akRow.Parent.Name == "IN_OUT")
                                    {
                                        newPar.ParameterType = S7FunctionBlockParameterDirection.IN_OUT;
                                    }
                                    else
                                    {
                                        newPar.ParameterType = S7FunctionBlockParameterDirection.IN;
                                    }
                                    //newPar.ParameterType
                                }

                                if (akRow != null)
                                {
                                    int posL       = s.IndexOf(' ');
                                    int ak_address = 0;
                                    if (posL >= 0)
                                    {
                                        ak_address = Convert.ToInt32(s.Substring(posL + 1).Split('.')[0]);
                                    }
                                    else
                                    {
                                        ak_address = Convert.ToInt32(s.Substring(2).Split('.')[0]) * 8 +
                                                     Convert.ToInt32(s.Substring(2).Split('.')[1]);
                                    }

                                    int lokaldata_address = -1;
                                    if (s.Substring(0, 3) == "P#V")
                                    {
                                        lokaldata_address = Convert.ToInt32(s.Substring(4).Split('.')[0]);
                                    }

                                    if (akRow.DataType == S7DataRowType.STRING || akRow.DataType == S7DataRowType.DATE_AND_TIME ||
                                        akRow.DataType == S7DataRowType.STRUCT || akRow.DataType == S7DataRowType.UDT ||
                                        akRow.DataType == S7DataRowType.POINTER || akRow.IsArray)
                                    {
                                        string p1 = Parameters["P#V " + (lokaldata_address + 0).ToString() + ".0"];
                                        string p2 = Parameters["P#V " + (lokaldata_address + 2).ToString() + ".0"];


                                        string tmp = "";
                                        if (p1 != "" && p1 != "0")
                                        {
                                            tmp += "P#DB" + p1 + "." + p2.Substring(2);
                                        }
                                        else
                                        {
                                            tmp += p2;
                                        }
                                        newPar.Value = tmp;
                                        newRow.CallParameter.Add(newPar);
                                        //newRow.ExtParameter.Add(parnm + tmp);
                                    }
                                    else if (akRow.DataType == S7DataRowType.ANY)
                                    {
                                        string tmp = s;
                                        if (Parameters.ContainsKey("P#V " + (lokaldata_address + 0).ToString() + ".0") &&
                                            Parameters.ContainsKey("P#V " + (lokaldata_address + 2).ToString() + ".0") &&
                                            Parameters.ContainsKey("P#V " + (lokaldata_address + 4).ToString() + ".0") &&
                                            Parameters.ContainsKey("P#V " + (lokaldata_address + 6).ToString() + ".0"))
                                        {
                                            string p1 = Parameters["P#V " + (lokaldata_address + 0).ToString() + ".0"];
                                            string p2 = Parameters["P#V " + (lokaldata_address + 2).ToString() + ".0"];
                                            string p3 = Parameters["P#V " + (lokaldata_address + 4).ToString() + ".0"];
                                            string p4 = Parameters["P#V " + (lokaldata_address + 6).ToString() + ".0"];

                                            tmp = "P#";
                                            if (p3 != "0")
                                            {
                                                tmp += "DB" + p3 + ".";
                                            }
                                            tmp += p4.Substring(2);
                                            tmp += " BYTE "; //Todo Parse Byte 1 if the Type is Byte!
                                            tmp += p2;
                                        }
                                        newPar.Value = tmp;
                                        newRow.CallParameter.Add(newPar);
                                        //newRow.ExtParameter.Add(parnm + tmp);
                                    }
                                    else
                                    {
                                        if (Parameters.ContainsKey(s))
                                        {
                                            string par = Parameters[s];
                                            if (akRow.DataType == S7DataRowType.S5TIME && par[0] >= '0' && par[0] <= '9')
                                            {
                                                newPar.Value = Helper.GetS5Time(
                                                    BitConverter.GetBytes(Convert.ToInt32(par))[1],
                                                    BitConverter.GetBytes(Convert.ToInt32(par))[0]);
                                                newRow.CallParameter.Add(newPar);
                                                //newRow.ExtParameter.Add(parnm +
                                                //                        Helper.GetS5Time(
                                                //                            BitConverter.GetBytes(Convert.ToInt32(par))[1],
                                                //                            BitConverter.GetBytes(Convert.ToInt32(par))[0]));
                                            }
                                            else if (akRow.DataType == S7DataRowType.TIME && par[0] >= '0' && par[0] <= '9')
                                            {
                                                newPar.Value = Helper.GetDTime(BitConverter.GetBytes(Convert.ToInt32(par)), 0);
                                                newRow.CallParameter.Add(newPar);
                                                //newRow.ExtParameter.Add(parnm +
                                                //                        Helper.GetDTime(BitConverter.GetBytes(Convert.ToInt32(par)),0));
                                            }
                                            else if (akRow.DataType == S7DataRowType.CHAR && par[0] == 'B')
                                            {
                                                newPar.Value =
                                                    (char)
                                                    Int32.Parse(par.Substring(5),
                                                                System.Globalization.NumberStyles.AllowHexSpecifier) +
                                                    "'";
                                                newRow.CallParameter.Add(newPar);
                                                //newRow.ExtParameter.Add(parnm + "'" +
                                                //                        (char)Int32.Parse(par.Substring(5), System.Globalization.NumberStyles.AllowHexSpecifier) + "'");
                                            }
                                            else
                                            {
                                                newPar.Value = Parameters[s];
                                                newRow.CallParameter.Add(newPar);
                                                //newRow.ExtParameter.Add(parnm + Parameters[s]);
                                            }
                                        }
                                        else
                                        {
                                            if (akRow.DataType == S7DataRowType.BOOL)
                                            {
                                                newPar.Value = s.Substring(2).Replace('V', 'L');
                                                newRow.CallParameter.Add(newPar);
                                                //newRow.ExtParameter.Add(parnm + s.Substring(2).Replace('V', 'L'));
                                            }
                                            else if (akRow.DataType == S7DataRowType.BLOCK_DB)
                                            {
                                                newPar.Value = "DB" + ak_address.ToString();
                                                newRow.CallParameter.Add(newPar);
                                                //newRow.ExtParameter.Add(parnm + "DB" + ak_address.ToString());
                                            }
                                            else if (akRow.DataType == S7DataRowType.BLOCK_FB)
                                            {
                                                newPar.Value = "FB" + ak_address.ToString();
                                                newRow.CallParameter.Add(newPar);
                                                //newRow.ExtParameter.Add(parnm + "FB" + ak_address.ToString());
                                            }
                                            else if (akRow.DataType == S7DataRowType.BLOCK_FC)
                                            {
                                                newPar.Value = "FC" + ak_address.ToString();
                                                newRow.CallParameter.Add(newPar);
                                            }
                                            else if (akRow.DataType == S7DataRowType.BLOCK_SDB)
                                            {
                                                newPar.Value = "SDB" + ak_address.ToString();
                                                newRow.CallParameter.Add(newPar);
                                            }
                                            else if (akRow.DataType == S7DataRowType.TIMER)
                                            {
                                                newPar.Value = Mnemonic.adT[(int)myOpt.Mnemonic] + ak_address.ToString();
                                                newRow.CallParameter.Add(newPar);
                                            }
                                            else if (akRow.DataType == S7DataRowType.COUNTER)
                                            {
                                                newPar.Value = Mnemonic.adZ[(int)myOpt.Mnemonic] + ak_address.ToString();
                                                newRow.CallParameter.Add(newPar);
                                            }
                                            else
                                            {
                                                string ber = "";
                                                if (s.Substring(0, 5) == "P#DBX")
                                                {
                                                    ber = "DB";
                                                }
                                                else if (s.Substring(0, 5) == "P#DIX")
                                                {
                                                    ber = "DI";
                                                }
                                                else
                                                {
                                                    ber = s.Substring(2, 1);
                                                }

                                                if (akRow.ByteLength == 1)
                                                {
                                                    ber += "B";
                                                }
                                                else if (akRow.ByteLength == 2)
                                                {
                                                    ber += "W";
                                                }
                                                else if (akRow.ByteLength == 4)
                                                {
                                                    ber += "D";
                                                }

                                                newPar.Value = ber.Replace('V', 'L') + ak_address.ToString();
                                                newRow.CallParameter.Add(newPar);
                                                //newRow.ExtParameter.Add(parnm +
                                                //                        ber.Replace('V', 'L') +
                                                //                        ak_address.ToString());
                                            }
                                        }
                                    }
                                }
                            }

                            newRow.CombinedCommands = tempList;
                            newRow.Label            = label;

                            int sz = 0;
                            foreach (var functionBlockRow in newRow.CombinedCommands)
                            {
                                sz += ((S7FunctionBlockRow)functionBlockRow).ByteSize;
                            }
                            byte[] mcges = new byte[sz];
                            sz = 0;
                            foreach (var functionBlockRow in newRow.CombinedCommands)
                            {
                                Array.Copy(((S7FunctionBlockRow)functionBlockRow).MC7, 0, mcges, sz, ((S7FunctionBlockRow)functionBlockRow).ByteSize);
                                sz += ((S7FunctionBlockRow)functionBlockRow).ByteSize;
                            }
                            newRow.MC7 = mcges;

                            retVal.Add(newRow);
                            Parameters.Clear();
                            tempList = new List <FunctionBlockRow>();
                            inBld    = 0;
                        }
                        else
                        {
                            retVal.AddRange(tempList);
                            tempList.Clear();

                            inBld = 0;
                        }
                    }
                    else
                    {
                        retVal.Add(row);
                    }
                }
                myFct.AWLCode = retVal;
            }
        }