private SymbolTable _GetSymTabForProject(S7ProgrammFolder myBlockFolder, bool showDeleted) { string tmpId1 = ""; var retVal = new SymbolTable() { Project = this }; int tmpId2 = 0; //Look in Sym-LinkList for ID { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "YDBs" + _DirSeperator + "YLNKLIST.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool) row["DELETED_FLAG"]) { if ((int) row["TOI"] == myBlockFolder.ID) { tmpId2 = (int) row["SOI"]; break; } } } if (tmpId2 == 0 && showDeleted) foreach (DataRow row in dbfTbl.Rows) { if ((int) row["TOI"] == myBlockFolder.ID) { tmpId2 = (int) row["SOI"]; retVal.Folder = ProjectFolder + "YDBs" + _DirSeperator + tmpId2.ToString() + _DirSeperator; break; } } } //Look fro Symlist Name { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "YDBs" + _DirSeperator + "SYMLISTS.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || showDeleted) { if ((int)row["_ID"] == tmpId2) { retVal.Name = (string)row["_UName"]; if ((bool)row["DELETED_FLAG"]) retVal.Name = "$$_" + retVal.Name; break; } } } } if (string.IsNullOrEmpty(retVal.Name) && !File.Exists(ProjectFolder + "YDBs" + _DirSeperator + tmpId2.ToString() + _DirSeperator + "SYMLIST.DBF")) return null; retVal.showDeleted = showDeleted; if (tmpId2 != 0) retVal.Folder = ProjectFolder + "YDBs" + _DirSeperator + tmpId2.ToString() + _DirSeperator; 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); }
private void Button_Click_2(object sender, RoutedEventArgs e) { myblkFld = SelectProjectPart.SelectS7ProgrammFolder(); }
internal override void LoadProject() { _projectLoaded = true; ProjectStructure = new Step7ProjectFolder() {Project = this}; CPUFolders = new List<CPUFolder>(); CPFolders=new List<CPFolder>(); S7ProgrammFolders = new List<S7ProgrammFolder>(); BlocksOfflineFolders = new List<BlocksOfflineFolder>(); ProjectStructure.Name = this.ToString(); //Get The Project Stations... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hstatx" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hstatx" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["OBJTYP"] == 1314969 || (int)row["OBJTYP"] == 1314970 || (int)row["OBJTYP"] == 1315650) { var x = new StationConfigurationFolder() { Project = this, Parent = ProjectStructure}; x.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool) row["DELETED_FLAG"]) x.Name = "$$_" + x.Name; x.ID = (int) row["ID"]; x.UnitID = (int)row["UNITID"]; switch ((int)row["OBJTYP"]) { case 1314969: x.StationType = PLCType.Simatic300; break; case 1314970: x.StationType = PLCType.Simatic400; break; case 1315650: x.StationType = PLCType.Simatic400H; break; } x.Parent = ProjectStructure; ProjectStructure.SubItems.Add(x); } } } } //Get The CP Folders if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7wb53ax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7wb53ax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (var y in ProjectStructure.SubItems) { if (y.GetType() == typeof(StationConfigurationFolder)) { var z = (StationConfigurationFolder)y; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["TUNITID"] == z.ID && ((int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314970 || (int)row["TUNITTYP"] == 1315650))//as in "Get The Project Stations" { var x = new CPFolder() {Project = this}; x.UnitID = Convert.ToInt32(row["TUNITID"]); x.TobjTyp = Convert.ToInt32(row["TOBJTYP"]); x.ID = Convert.ToInt32(row["SOBJID"]); x.Parent = z; z.SubItems.Add(x); CPFolders.Add(x); } } } } } } //Get The CPU 300 Folders if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (var y in ProjectStructure.SubItems) { if (y.GetType() == typeof(StationConfigurationFolder)) { var z = (StationConfigurationFolder)y; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["TUNITID"] == z.ID && (int)row["TOBJTYP"] == 1314972) //((int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969)) { var x = new CPUFolder() {Project = this}; x.UnitID = Convert.ToInt32(row["TUNITID"]); x.TobjTyp = Convert.ToInt32(row["TOBJTYP"]); x.CpuType = z.StationType; x.ID = Convert.ToInt32(row["SOBJID"]); x.Parent = z; z.SubItems.Add(x); CPUFolders.Add(x); } } } } } } //Get The CPU 300 ET200s Folders if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (var y in ProjectStructure.SubItems) { if (y.GetType() == typeof(StationConfigurationFolder)) { var z = (StationConfigurationFolder)y; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["TUNITID"] == z.ID && (int)row["TOBJTYP"] == 1314972) //((int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969)) { var x = new CPUFolder() { Project = this }; x.UnitID = Convert.ToInt32(row["TUNITID"]); x.TobjTyp = Convert.ToInt32(row["TOBJTYP"]); x.CpuType = z.StationType; x.ID = Convert.ToInt32(row["SOBJID"]); x.CpuType = PLCType.SimaticET200; x.Parent = z; z.SubItems.Add(x); CPUFolders.Add(x); } } } } } } //Get The CPU 400 Folders if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (var y in ProjectStructure.SubItems) { if (y.GetType() == typeof(StationConfigurationFolder)) { var z = (StationConfigurationFolder)y; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["TUNITID"] == z.ID && ((int)row["TOBJTYP"] == 1314972 || (int)row["TOBJTYP"] == 1315656 /* BackupCPU bei H Sys */)) //((int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969)) { var x = new CPUFolder() { Project = this }; x.UnitID = Convert.ToInt32(row["TUNITID"]); x.TobjTyp = Convert.ToInt32(row["TOBJTYP"]); x.CpuType = z.StationType; x.ID = Convert.ToInt32(row["SOBJID"]); x.Parent = z; z.SubItems.Add(x); CPUFolders.Add(x); } } } } } } /* //Get The HW Folder for the Station... if (ZipHelper.FileExists(_zipfile,ProjectFolder + "hOmSave7" + _DirSeperator + "s7hstatx" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hstatx" + _DirSeperator + "HRELATI1.DBF", _zipfile, _DirSeperator); foreach (var y in Step7ProjectStructure.SubItems) { if (y.GetType() == typeof (StationConfigurationFolder)) { var z = (StationConfigurationFolder) y; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["SOBJID"] == z.ID && (int)row["RELID"] == 1315838) { var x = new CPUFolder() {Project = this}; x.UnitID = Convert.ToInt32(row["TUNITID"]); x.TobjTyp = Convert.ToInt32(row["TOBJTYP"]); x.CpuType = z.StationType; bool add = true; foreach (Step7ProjectFolder tmp in z.SubItems) { if (tmp.GetType() == typeof (CPUFolder) && ((CPUFolder) tmp).UnitID == x.UnitID) add = false; } if (add) { x.Parent = z; z.SubItems.Add(x); CPUFolders.Add(x); } } } } } } } */ //Get The CPU(ET200S)... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (var y in CPUFolders) { foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["ID"] == y.ID && y.CpuType == PLCType.SimaticET200) //if ((int)row["UNITID"] == y.UnitID && y.CpuType == PLCType.SimaticET200) { y.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) y.Name = "$$_" + y.Name; y.ID = (int)row["ID"]; } } } } } //Get The CPU(300)... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (var y in CPUFolders) { foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["ID"] == y.ID && y.CpuType == PLCType.Simatic300) //if ((int)row["UNITID"] == y.UnitID && y.CpuType == PLCType.Simatic300) { y.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) y.Name = "$$_" + y.Name; y.ID = (int)row["ID"]; } } } } } //Get The CPU(300) password if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HATTRME1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HATTRME1.DBF", _ziphelper, _DirSeperator); byte[] memoarray = null; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"]) { if ((int)row["ATTRIIDM"] == 111142) { if (row["MEMOARRAYM"] != DBNull.Value) memoarray = (byte[])row["MEMOARRAYM"]; if (memoarray.Length >= 12) { // memoarray[3] : level password (1-3) byte[] mempass = new byte[8]; for (int i = 0; i < 8; i++) { if (i < 2) mempass[i] = (byte) (memoarray[i + 4] ^ 0xAA); else mempass[i] = (byte) (memoarray[i + 2] ^ memoarray[i + 4] ^ 0xAA); } string res = ProjectEncoding.GetString(mempass); foreach (var y in CPUFolders) { if ((int) row["IDM"] == y.ID) { y.PasswdHard = res.Trim(); } } } } } } } //Get The CPU(400)... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (var y in CPUFolders) { foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["ID"] == y.ID && (y.CpuType == PLCType.Simatic400 || y.CpuType == PLCType.Simatic400H)) //if ((int)row["UNITID"] == y.UnitID && (y.CpuType == PLCType.Simatic400 || y.CpuType == PLCType.Simatic400H) ) { y.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) y.Name = "$$_" + y.Name; y.ID = (int)row["ID"]; } } } } } //Get The CPU(400) password if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HATTRME1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HATTRME1.DBF", _ziphelper, _DirSeperator); byte[] memoarray = null; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"]) { if ((int)row["ATTRIIDM"] == 111142) { if (row["MEMOARRAYM"] != DBNull.Value) memoarray = (byte[])row["MEMOARRAYM"]; if (memoarray.Length >= 12) { // memoarray[3] : level password (1-3) byte[] mempass = new byte[8]; for (int i = 0; i < 8; i++) { if (i < 2) mempass[i] = (byte)(memoarray[i + 4] ^ 0xAA); else mempass[i] = (byte)(memoarray[i + 2] ^ memoarray[i + 4] ^ 0xAA); } string res = ProjectEncoding.GetString(mempass); foreach (var y in CPUFolders) { if ((int)row["IDM"] == y.ID) { y.PasswdHard = res.Trim(); } } } } } } } //Get The CPs... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7wb53ax" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7wb53ax" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (var y in CPFolders) { foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["ID"] == y.ID) { y.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) y.Name = "$$_" + y.Name; } } } } } var tmpS7ProgrammFolders = new List<S7ProgrammFolder>(); //Get all Program Folders if (_ziphelper.FileExists(ProjectFolder + "hrs" + _DirSeperator + "S7RESOFF.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hrs" + _DirSeperator + "S7RESOFF.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { var x = new S7ProgrammFolder() { Project = this }; x.Name = ((string)row["Name"]).Replace("\0",""); if ((bool) row["DELETED_FLAG"]) x.Name = "$$_" + x.Name; x.ID = (int) row["ID"]; x._linkfileoffset = (int) row["RSRVD4_L"]; S7ProgrammFolders.Add(x); tmpS7ProgrammFolders.Add(x); } } } //Combine Folder and CPU (300) if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["RELID"] == 16) { int cpuid = (int)row["SOBJID"]; int fldid = (int)row["TOBJID"]; foreach (var y in CPUFolders) { if (y.ID == cpuid && y.CpuType == PLCType.Simatic300) { foreach (var z in S7ProgrammFolders) { if (z.ID == fldid) { z.Parent = y; y.SubItems.Add(z); tmpS7ProgrammFolders.Remove(z); } } } } } } } } //Combine Folder and CPU (300 ET200s) if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["RELID"] == 16) { int cpuid = (int)row["SOBJID"]; int fldid = (int)row["TOBJID"]; foreach (var y in CPUFolders) { if (y.ID == cpuid && y.CpuType == PLCType.SimaticET200) { foreach (var z in S7ProgrammFolders) { if (z.ID == fldid) { z.Parent = y; y.SubItems.Add(z); tmpS7ProgrammFolders.Remove(z); } } } } } } } } //Combine Folder and CPU (400) if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["RELID"] == 16) { int cpuid = (int)row["SOBJID"]; int fldid = (int)row["TOBJID"]; foreach (var y in CPUFolders) { if (y.ID == cpuid && (y.CpuType == PLCType.Simatic400 || y.CpuType == PLCType.Simatic400H)) { foreach (var z in S7ProgrammFolders) { if (z.ID == fldid) { z.Parent = y; y.SubItems.Add(z); tmpS7ProgrammFolders.Remove(z); } } } } } } } } //Add the BlockFolders without CPU to the Ground project foreach (var z in tmpS7ProgrammFolders) { z.Parent = ProjectStructure; ProjectStructure.SubItems.Add(z); } //Get Symbol Tables foreach (var z in S7ProgrammFolders) { var symtab = _GetSymTabForProject(z, this._showDeleted); if (symtab != null) { symtab.Parent = z; z.SymbolTable = symtab; z.SubItems.Add(symtab); } } var tmpBlocksOfflineFolders = new List<BlocksOfflineFolder>(); //Create the Programm Block folders... if (_ziphelper.FileExists(ProjectFolder + "ombstx" + _DirSeperator + "offline" + _DirSeperator + "BSTCNTOF.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "ombstx" + _DirSeperator + "offline" + _DirSeperator + "BSTCNTOF.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { var x = new BlocksOfflineFolder() { Project = this }; x.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) x.Name = "$$_" + x.Name; x.ID = (int) row["ID"]; x.Folder = ProjectFolder + "ombstx" + _DirSeperator + "offline" + _DirSeperator + x.ID.ToString("X").PadLeft(8, '0') + _DirSeperator; tmpBlocksOfflineFolders.Add(x); _blocksOfflineFolders.Add(x); } } } var Step7ProjectTypeStep7Sources = new List<SourceFolder>(); //Create the Source Block folders... if (_ziphelper.FileExists(ProjectFolder + "s7asrcom" + _DirSeperator + "S7CNTREF.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "s7asrcom" + _DirSeperator + "S7CNTREF.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { var x = new SourceFolder() { Project = this }; x.Name = ((string)row["Name"]).Replace("\0",""); if ((bool)row["DELETED_FLAG"]) x.Name = "$$_" + x.Name; x.ID = (int)row["ID"]; x.Folder = ProjectFolder + "s7asrcom" + _DirSeperator + x.ID.ToString("X").PadLeft(8, '0') + _DirSeperator; Step7ProjectTypeStep7Sources.Add(x); } } } //Infos about Link file hrs\linkhrs.lnk //Size of a Structure in the Link File: 512 bytes //Offset of Linkfile is in hrs\S7RESOFF.DBF, Filed 12 (RSRVD3_L) //after 0x04, 0x20, 0x11 follows the Step7ProjectBlockFolder ID (2 Bytes) or maybe the source folder id //after 0x01, 0x60, 0x11 follows the Step7Programm ID (2 Bytes) //Create the Link BlocksOfflineFolder Folder with S7ProgrammFolders... if (_ziphelper.FileExists(ProjectFolder + "hrs" + _DirSeperator + "linkhrs.lnk")) { //FileStream hrsLink = new FileStream(ProjectFolder + "hrs" + _DirSeperator + "linkhrs.lnk", FileMode.Open, FileAccess.Read, System.IO.FileShare.ReadWrite); Stream hrsLink = _ziphelper.GetReadStream(ProjectFolder + "hrs" + _DirSeperator + "linkhrs.lnk"); BinaryReader rd = new BinaryReader(hrsLink); byte[] completeBuffer = rd.ReadBytes((int)_ziphelper.GetStreamLength(ProjectFolder + "hrs" + _DirSeperator + "linkhrs.lnk", hrsLink)); rd.Close(); hrsLink.Close(); hrsLink = new MemoryStream(completeBuffer); foreach (var x in S7ProgrammFolders) { byte[] tmpLink = new byte[0x200]; hrsLink.Position = x._linkfileoffset; hrsLink.Read(tmpLink, 0, 0x200); int pos1 = ASCIIEncoding.ASCII.GetString(tmpLink).IndexOf(ASCIIEncoding.ASCII.GetString(new byte[] { 0x01, 0x60, 0x11 })); int wrt1 = tmpLink[pos1 + 3] * 0x100 + tmpLink[pos1 + 4]; int pos2 = ASCIIEncoding.ASCII.GetString(tmpLink).IndexOf(ASCIIEncoding.ASCII.GetString(new byte[] { 0x04, 0x20, 0x11 })); int wrt2 = tmpLink[pos2 + 3] * 0x100 + tmpLink[pos2 + 4]; foreach (var y in tmpBlocksOfflineFolders) { if (y.ID == wrt1) { y.Parent = x; x.SubItems.Add(y); x.BlocksOfflineFolder = y; } } foreach (var y in Step7ProjectTypeStep7Sources) { if (y.ID == wrt2) { y.Parent = x; x.SubItems.Add(y); x.SourceFolder = y; } } } hrsLink.Close(); } else { foreach (var y in tmpBlocksOfflineFolders) { y.Parent = ProjectStructure; ProjectStructure.SubItems.Add(y); } foreach (var y in Step7ProjectTypeStep7Sources) { y.Parent = ProjectStructure; ProjectStructure.SubItems.Add(y); } } }
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); 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); * */ } else if (functionBlockRow.Command=="LAR2") { } else { LargeAccess = false; retVal.AddRange(tempList); tempList.Clear(); retVal.Add(functionBlockRow); } } myFct.AWLCode = retVal; } }
internal override void LoadProject() { _projectLoaded = true; ProjectStructure = new Step7ProjectFolder() { Project = this }; CPUFolders = new List<CPUFolder>(); CPFolders = new List<CPFolder>(); S7ProgrammFolders = new List<S7ProgrammFolder>(); BlocksOfflineFolders = new List<BlocksOfflineFolder>(); ProjectStructure.Name = this.ToString(); var stations = new List<StationConfigurationFolder>(); List<CPFolder> DPFolders = new List<CPFolder>();//ProfiBusDP and MPI //Get The Project Stations... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hstatx" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hstatx" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["OBJTYP"] == objectType_Simatic300 || (int)row["OBJTYP"] == objectType_Simatic400 || (int)row["OBJTYP"] == objectType_Simatic400H) { var x = new StationConfigurationFolder() { Project = this, Parent = ProjectStructure }; x.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) x.Name = "$$_" + x.Name; x.ID = (int)row["ID"]; x.UnitID = (int)row["UNITID"]; x.ObjTyp = (int)row["OBJTYP"]; switch ((int)row["OBJTYP"]) { case objectType_Simatic300: x.StationType = PLCType.Simatic300; break; case objectType_Simatic400: x.StationType = PLCType.Simatic400; break; case objectType_Simatic400H: x.StationType = PLCType.Simatic400H; break; } x.Parent = ProjectStructure; ProjectStructure.SubItems.Add(x); stations.Add(x); _allFolders.Add(x); } else if ( Convert.ToInt32(row["OBJTYP"])==objectType_MpiDPinCPU) { var dp = new CPFolder(); dp.UnitID = Convert.ToInt32(row["UNITID"]);//is UNITID in CPUFolder dp.ID = Convert.ToInt32(row["ID"]); DPFolders.Add(dp); _allFolders.Add(dp); } } } } //Get The HW Folder for the Station... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hstatx" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hstatx" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if (Convert.ToInt32(row["RELID"]) == 1315820) { int TobjType = Convert.ToInt32(row["TOBJTYP"]); if (TobjType == objectType_MpiDP400 || TobjType == objectType_MpiDP300) { var dp = DPFolders.FirstOrDefault(x => x.ID == Convert.ToInt32(row["SOBJID"])); if (dp != null) { if (dp.IdTobjId == null) dp.IdTobjId = new List<int>(); dp.IdTobjId.Add(Convert.ToInt32(row["TOBJID"])); } } } } } } /* //Get The HW Folder for the Station... if (ZipHelper.FileExists(_zipfile,ProjectFolder + "hOmSave7" + _DirSeperator + "s7hstatx" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hstatx" + _DirSeperator + "HRELATI1.DBF", _zipfile, _DirSeperator); foreach (var y in Step7ProjectStructure.SubItems) { if (y.GetType() == typeof (StationConfigurationFolder)) { var z = (StationConfigurationFolder) y; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["SOBJID"] == z.ID && (int)row["RELID"] == 1315838) { var x = new CPUFolder() {Project = this}; x.UnitID = Convert.ToInt32(row["TUNITID"]); x.TobjTyp = Convert.ToInt32(row["TOBJTYP"]); x.CpuType = z.StationType; bool add = true; foreach (Step7ProjectFolder tmp in z.SubItems) { if (tmp.GetType() == typeof (CPUFolder) && ((CPUFolder) tmp).UnitID == x.UnitID) add = false; } if (add) { x.Parent = z; z.SubItems.Add(x); CPUFolders.Add(x); } } } } } } } */ //Get The CPs... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7wb53ax" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7wb53ax" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { var cp = new CPFolder() { Project = this }; cp.ID = Convert.ToInt32(row["ID"]); cp.UnitID = Convert.ToInt32(row["UNITID"]); cp.TobjTyp = Convert.ToInt32(row["OBJTYP"]); cp.Name = ((string)row["Name"]).Replace("\0", ""); if (Convert.ToBoolean(row["DELETED_FLAG"])) cp.Name = "$$_" + cp.Name; cp.Rack = Convert.ToInt32(row["SUBSTATN"]); cp.Slot = Convert.ToInt32(row["MODULN"]); cp.SubModulNumber = Convert.ToInt32(row["SUBMODN"]); CPFolders.Add(cp); _allFolders.Add(cp); } } } //add subitem to parent foreach(var cp in CPFolders.Where(x=>x.SubModulNumber > 0)) { var parent = CPFolders.FirstOrDefault(x => x.ID == cp.UnitID); if (parent != null) parent.SubModul = cp; } //Get The CP Folders if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7wb53ax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7wb53ax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach(DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { int relID = Convert.ToInt32(row["RELID"]); if (relID == 1315827) { var cpu = (StationConfigurationFolder)ProjectStructure.SubItems.FirstOrDefault(x => x.ID == Convert.ToInt32(row["TUNITID"])); var cp = CPFolders.FirstOrDefault(x => x.ID == Convert.ToInt32(row["SOBJID"])); if (cpu != null && cp != null) cpu.SubItems.Add(cp); } else if (relID == 64) { var cp = CPFolders.FirstOrDefault(x => x.ID == Convert.ToInt32(row["SOBJID"])); if (cp != null) { if (cp.TobjId == null) cp.TobjId = new List<int>(); cp.TobjId.Add(Convert.ToInt32(row["TOBJID"])); } } } } } //Get The CPU 300 Folders if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (var y in ProjectStructure.SubItems) { if (y.GetType() == typeof(StationConfigurationFolder)) { var z = (StationConfigurationFolder)y; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["TUNITID"] == z.ID && (int)row["TOBJTYP"] == 1314972) //((int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969)) { var x = new CPUFolder() { Project = this }; x.UnitID = Convert.ToInt32(row["TUNITID"]); x.TobjTyp = Convert.ToInt32(row["TOBJTYP"]); x.CpuType = z.StationType; x.ID = Convert.ToInt32(row["SOBJID"]); x.Parent = z; z.SubItems.Add(x); CPUFolders.Add(x); _allFolders.Add(x); } } } } } } //Get The CPU 300 ET200s Folders if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (var y in ProjectStructure.SubItems) { if (y.GetType() == typeof(StationConfigurationFolder)) { var z = (StationConfigurationFolder)y; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["TUNITID"] == z.ID && (int)row["TOBJTYP"] == 1314972) //((int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969)) { var x = new CPUFolder() { Project = this }; x.UnitID = Convert.ToInt32(row["TUNITID"]); x.TobjTyp = Convert.ToInt32(row["TOBJTYP"]); x.CpuType = z.StationType; x.ID = Convert.ToInt32(row["SOBJID"]); x.CpuType = PLCType.SimaticET200; x.Parent = z; z.SubItems.Add(x); CPUFolders.Add(x); _allFolders.Add(x); } } } } } } //Get The CPU 400 Folders if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (var y in ProjectStructure.SubItems) { if (y.GetType() == typeof(StationConfigurationFolder)) { var z = (StationConfigurationFolder)y; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["TUNITID"] == z.ID && ((int)row["TOBJTYP"] == 1314972 || (int)row["TOBJTYP"] == 1315656 /* BackupCPU bei H Sys */)) //((int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969 || (int)row["TUNITTYP"] == 1314969)) { var x = new CPUFolder() { Project = this }; x.UnitID = Convert.ToInt32(row["TUNITID"]); x.TobjTyp = Convert.ToInt32(row["TOBJTYP"]); x.CpuType = z.StationType; x.ID = Convert.ToInt32(row["SOBJID"]); x.Parent = z; z.SubItems.Add(x); CPUFolders.Add(x); _allFolders.Add(x); } } } } } } //Get The CPU(ET200S)... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (var y in CPUFolders) { foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["ID"] == y.ID && y.CpuType == PLCType.SimaticET200) //if ((int)row["UNITID"] == y.UnitID && y.CpuType == PLCType.SimaticET200) { y.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) y.Name = "$$_" + y.Name; y.ID = (int)row["ID"]; y.Rack = (int)row["SUBSTATN"]; y.Slot = (int)row["MODULN"]; } } } } } //Get The CPU(300)... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (var y in CPUFolders) { foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["ID"] == y.ID && y.CpuType == PLCType.Simatic300) //if ((int)row["UNITID"] == y.UnitID && y.CpuType == PLCType.Simatic300) { y.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) y.Name = "$$_" + y.Name; y.ID = (int)row["ID"]; y.Rack = (int)row["SUBSTATN"]; y.Slot = (int)row["MODULN"]; } } } } } //Get The CPU(300) password if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HATTRME1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HATTRME1.DBF", _ziphelper, _DirSeperator); byte[] memoarray = null; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"]) { if ((int)row["ATTRIIDM"] == 111142) { if (row["MEMOARRAYM"] != DBNull.Value) memoarray = (byte[])row["MEMOARRAYM"]; if (memoarray.Length >= 12) { // memoarray[3] : level password (1-3) byte[] mempass = new byte[8]; for (int i = 0; i < 8; i++) { if (i < 2) mempass[i] = (byte)(memoarray[i + 4] ^ 0xAA); else mempass[i] = (byte)(memoarray[i + 2] ^ memoarray[i + 4] ^ 0xAA); } string res = ProjectEncoding.GetString(mempass); foreach (var y in CPUFolders) { if ((int)row["IDM"] == y.ID) { y.PasswdHard = res.Trim(); } } } } } } } //Get The CPU(400)... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (var y in CPUFolders) { foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["ID"] == y.ID && (y.CpuType == PLCType.Simatic400 || y.CpuType == PLCType.Simatic400H)) //if ((int)row["UNITID"] == y.UnitID && (y.CpuType == PLCType.Simatic400 || y.CpuType == PLCType.Simatic400H) ) { y.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) y.Name = "$$_" + y.Name; y.ID = (int)row["ID"]; y.Rack = (int)row["SUBSTATN"]; y.Slot = (int)row["MODULN"]; } } } } } //Get The CPU(400) password if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HATTRME1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HATTRME1.DBF", _ziphelper, _DirSeperator); byte[] memoarray = null; foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"]) { if ((int)row["ATTRIIDM"] == 111142) { if (row["MEMOARRAYM"] != DBNull.Value) memoarray = (byte[])row["MEMOARRAYM"]; if (memoarray.Length >= 12) { // memoarray[3] : level password (1-3) byte[] mempass = new byte[8]; for (int i = 0; i < 8; i++) { if (i < 2) mempass[i] = (byte)(memoarray[i + 4] ^ 0xAA); else mempass[i] = (byte)(memoarray[i + 2] ^ memoarray[i + 4] ^ 0xAA); } string res = ProjectEncoding.GetString(mempass); foreach (var y in CPUFolders) { if ((int)row["IDM"] == y.ID) { y.PasswdHard = res.Trim(); } } } } } } } var tmpS7ProgrammFolders = new List<S7ProgrammFolder>(); //Get all Program Folders if (_ziphelper.FileExists(ProjectFolder + "hrs" + _DirSeperator + "S7RESOFF.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hrs" + _DirSeperator + "S7RESOFF.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { var x = new S7ProgrammFolder() { Project = this }; x.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) x.Name = "$$_" + x.Name; x.ID = (int)row["ID"]; x._linkfileoffset = (int)row["RSRVD4_L"]; S7ProgrammFolders.Add(x); tmpS7ProgrammFolders.Add(x); _allFolders.Add(x); } } } //Combine Folder and CPU (300) if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk31ax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["RELID"] == 16) { int cpuid = (int)row["SOBJID"]; int fldid = (int)row["TOBJID"]; foreach (var y in CPUFolders) { if (y.ID == cpuid && y.CpuType == PLCType.Simatic300) { foreach (var z in S7ProgrammFolders) { if (z.ID == fldid) { z.Parent = y; y.SubItems.Add(z); tmpS7ProgrammFolders.Remove(z); } } } } } } } } //Combine Folder and CPU (300 ET200s) if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkcomx" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["RELID"] == 16) { int cpuid = (int)row["SOBJID"]; int fldid = (int)row["TOBJID"]; foreach (var y in CPUFolders) { if (y.ID == cpuid && y.CpuType == PLCType.SimaticET200) { foreach (var z in S7ProgrammFolders) { if (z.ID == fldid) { z.Parent = y; y.SubItems.Add(z); tmpS7ProgrammFolders.Remove(z); } } } } } } } } //Combine Folder and CPU (400) if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hk41ax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["RELID"] == 16) { int cpuid = (int)row["SOBJID"]; int fldid = (int)row["TOBJID"]; foreach (var y in CPUFolders) { if (y.ID == cpuid && (y.CpuType == PLCType.Simatic400 || y.CpuType == PLCType.Simatic400H)) { foreach (var z in S7ProgrammFolders) { if (z.ID == fldid) { z.Parent = y; y.SubItems.Add(z); tmpS7ProgrammFolders.Remove(z); } } } } } } } } //Add the BlockFolders without CPU to the Ground project foreach (var z in tmpS7ProgrammFolders) { z.Parent = ProjectStructure; ProjectStructure.SubItems.Add(z); } //Get Symbol Tables foreach (var z in S7ProgrammFolders) { var symtab = _GetSymTabForProject(z, this._showDeleted); if (symtab != null) { symtab.Parent = z; z.SymbolTable = symtab; z.SubItems.Add(symtab); _allFolders.Add(symtab); } } var tmpBlocksOfflineFolders = new List<BlocksOfflineFolder>(); //Create the Programm Block folders... if (_ziphelper.FileExists(ProjectFolder + "ombstx" + _DirSeperator + "offline" + _DirSeperator + "BSTCNTOF.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "ombstx" + _DirSeperator + "offline" + _DirSeperator + "BSTCNTOF.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { var x = new BlocksOfflineFolder() { Project = this }; x.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) x.Name = "$$_" + x.Name; x.ID = (int)row["ID"]; x.Folder = ProjectFolder + "ombstx" + _DirSeperator + "offline" + _DirSeperator + x.ID.ToString("X").PadLeft(8, '0') + _DirSeperator; tmpBlocksOfflineFolders.Add(x); _blocksOfflineFolders.Add(x); _allFolders.Add(x); } } } var Step7ProjectTypeStep7Sources = new List<SourceFolder>(); //Create the Source Block folders... if (_ziphelper.FileExists(ProjectFolder + "s7asrcom" + _DirSeperator + "S7CNTREF.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "s7asrcom" + _DirSeperator + "S7CNTREF.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { var x = new SourceFolder() { Project = this }; x.Name = ((string)row["Name"]).Replace("\0", ""); if ((bool)row["DELETED_FLAG"]) x.Name = "$$_" + x.Name; x.ID = (int)row["ID"]; x.Folder = ProjectFolder + "s7asrcom" + _DirSeperator + x.ID.ToString("X").PadLeft(8, '0') + _DirSeperator; Step7ProjectTypeStep7Sources.Add(x); _allFolders.Add(x); } } } var pbMasterSystems = new List<ProfibusMasterSystem>(); //Get all Profibus Master Systems if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "S7HDPSSX" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "S7HDPSSX" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["OBJTYP"] == 1314971) { var x = new ProfibusMasterSystem() { Project = this, Name = row["NAME"].ToString().Replace("\0", ""), Id = (int)row["ID"] }; pbMasterSystems.Add(x); _allFolders.Add(x); } } } } //Link all PbMasterSystems to the Stations if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "S7HDPSSX" + _DirSeperator + "HRELATI1.DBF")) { var lnkLst = new List<LinkHelp>(); var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "S7HDPSSX" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { lnkLst.Add(new LinkHelp() { SOBJID = (int)row["SOBJID"], SOBJTYP = (int)row["SOBJTYP"], RELID = (int)row["RELID"], TOBJID = (int)row["TOBJID"], TOBJTYP = (int)row["TOBJTYP"], TUNITID = (int)row["TUNITID"], TUNITTYP = (int)row["TUNITTYP"] }); } } foreach (StationConfigurationFolder station in stations) { var lnks = lnkLst.Where(x => x.TOBJTYP == station.ObjTyp && x.TOBJID == station.ID); foreach (LinkHelp linkHelp in lnks) { var ms = pbMasterSystems.FirstOrDefault(x => x.Id == linkHelp.SOBJID); if (ms != null) { station.MasterSystems.Add(ms); station.SubItems.Add(ms); } } } } //Get all Profibus Parts if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hslntx" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hslntx" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["OBJTYP"] == 1314988) { var node = new ProfibusNode() { Name = row["NAME"].ToString().Replace("\0", ""), NodeId = (int)row["SUBSTATN"], GsdFile = row["CEXTTYPE"].ToString() }; var ma = pbMasterSystems.FirstOrDefault(x => x.Id == (int)row["UNITID"]); if (ma != null) ma.Children.Add(node); } } } } var pnMasterSystems = new List<ProfinetMasterSystem>(); //Get all Profibus Master Systems if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hssiox" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hssiox" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { int objType = Convert.ToInt32(row["OBJTYP"]); if (objType == 1316787) { var x = new ProfinetMasterSystem() { Project = this, Name = row["NAME"].ToString().Replace("\0", ""), Id = (int)row["ID"] }; pnMasterSystems.Add(x); _allFolders.Add(x); } else if (objType == objectType_EternetInCPU3xx || objType == objectType_EternetInCPU4xx) { var cpu = CPUFolders.FirstOrDefault(x => x.ID == Convert.ToInt32(row["UNITID"])); if (cpu != null) cpu.IdTobjId = Convert.ToInt32(row["ID"]); } else if ( objType == 2364971 || objType == 2367589 ) { var cp = CPFolders.FirstOrDefault(x => x.ID == (int)row["UNITID"]); if (cp != null) { if (cp.IdTobjId == null) cp.IdTobjId = new List<int>(); cp.IdTobjId.Add((int)row["ID"]); } } } } } //Link all PnMasterSystems to the Stations if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hssiox" + _DirSeperator + "HRELATI1.DBF")) { var lnkLst = new List<LinkHelp>(); var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hssiox" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ( Convert.ToInt32(row["RELID"]) == 64) { var cpu = CPUFolders.FirstOrDefault(x => x.IdTobjId == Convert.ToInt32(row["SOBJID"])); if (cpu != null) cpu.TobjId = Convert.ToInt32(row["TOBJID"]); var cp = CPFolders.FirstOrDefault(x => x.IdTobjId != null && x.IdTobjId.Any(c => c == (int)row["SOBJID"])); if (cp != null) { if (cp.TobjId == null) cp.TobjId = new List<int>(); cp.TobjId.Add((int)row["TOBJID"]); } } lnkLst.Add(new LinkHelp() { SOBJID = (int)row["SOBJID"], SOBJTYP = (int)row["SOBJTYP"], RELID = (int)row["RELID"], TOBJID = (int)row["TOBJID"], TOBJTYP = (int)row["TOBJTYP"], TUNITID = (int)row["TUNITID"], TUNITTYP = (int)row["TUNITTYP"] }); } } foreach (StationConfigurationFolder station in stations) { var lnks = lnkLst.Where(x => x.TOBJTYP == station.ObjTyp && x.TOBJID == station.ID); foreach (LinkHelp linkHelp in lnks) { var ms = pnMasterSystems.FirstOrDefault(x => x.Id == linkHelp.SOBJID); if (ms != null) { station.MasterSystems.Add(ms); station.SubItems.Add(ms); } } } } //Get all Profinet Parts ... if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hdevnx" + _DirSeperator + "HOBJECT1.DBF")) { var attLst = new List<AttrMeHelp>(); //Read real name from hattrme.dbf if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hdevnx" + _DirSeperator + "HATTRME1.DBF")) { var dbfTbl2 = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hdevnx" + _DirSeperator + "HATTRME1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl2.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { attLst.Add(new AttrMeHelp() { IDM = (int)row["IDM"], ATTRIIDM = (int)row["ATTRIIDM"], ATTFORMATM = (int)row["ATTFORMATM"], MEMOARRAYM = (byte[])row["MEMOARRAYM"] }); } } } var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hdevnx" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { if ((int)row["OBJTYP"] == 1316803) { var node = new ProfibusNode() { Name = row["NAME"].ToString().Replace("\0", ""), NodeId = (int)row["SUBSTATN"], GsdFile = row["CEXTTYPE"].ToString() }; var inf = attLst.FirstOrDefault(x => x.IDM == (int)row["ID"] && x.ATTRIIDM == 111386); if (inf != null) node.Name = ProjectEncoding.GetString(inf.MEMOARRAYM).Replace("\0", ""); var ma = pnMasterSystems.FirstOrDefault(x => x.Id == (int)row["UNITID"]); if (ma != null) ma.Children.Add(node); } } } } //Infos about Link file hrs\linkhrs.lnk //Size of a Structure in the Link File: 512 bytes //Offset of Linkfile is in hrs\S7RESOFF.DBF, Filed 12 (RSRVD3_L) //after 0x04, 0x20, 0x11 follows the Step7ProjectBlockFolder ID (2 Bytes) or maybe the source folder id //after 0x01, 0x60, 0x11 follows the Step7Programm ID (2 Bytes) //Create the Link BlocksOfflineFolder Folder with S7ProgrammFolders... if (_ziphelper.FileExists(ProjectFolder + "hrs" + _DirSeperator + "linkhrs.lnk")) { //FileStream hrsLink = new FileStream(ProjectFolder + "hrs" + _DirSeperator + "linkhrs.lnk", FileMode.Open, FileAccess.Read, System.IO.FileShare.ReadWrite); Stream hrsLink = _ziphelper.GetReadStream(ProjectFolder + "hrs" + _DirSeperator + "linkhrs.lnk"); BinaryReader rd = new BinaryReader(hrsLink); byte[] completeBuffer = rd.ReadBytes((int)_ziphelper.GetStreamLength(ProjectFolder + "hrs" + _DirSeperator + "linkhrs.lnk", hrsLink)); rd.Close(); hrsLink.Close(); hrsLink = new MemoryStream(completeBuffer); foreach (var x in S7ProgrammFolders) { byte[] tmpLink = new byte[0x200]; hrsLink.Position = x._linkfileoffset; hrsLink.Read(tmpLink, 0, 0x200); int pos1 = ASCIIEncoding.ASCII.GetString(tmpLink).IndexOf(ASCIIEncoding.ASCII.GetString(new byte[] { 0x01, 0x60, 0x11 })); int wrt1 = tmpLink[pos1 + 3] * 0x100 + tmpLink[pos1 + 4]; int pos2 = ASCIIEncoding.ASCII.GetString(tmpLink).IndexOf(ASCIIEncoding.ASCII.GetString(new byte[] { 0x04, 0x20, 0x11 })); int wrt2 = tmpLink[pos2 + 3] * 0x100 + tmpLink[pos2 + 4]; BlocksOfflineFolder fld = null; foreach (var y in tmpBlocksOfflineFolders) { if (y.ID == wrt1) { y.Parent = x; x.SubItems.Add(y); x.BlocksOfflineFolder = y; fld = y; break; } } if (fld != null) tmpBlocksOfflineFolders.Remove(fld); foreach (var y in Step7ProjectTypeStep7Sources) { if (y.ID == wrt2) { y.Parent = x; x.SubItems.Add(y); x.SourceFolder = y; } } } hrsLink.Close(); } else { foreach (var y in tmpBlocksOfflineFolders) { y.Parent = ProjectStructure; ProjectStructure.SubItems.Add(y); } foreach (var y in Step7ProjectTypeStep7Sources) { y.Parent = ProjectStructure; ProjectStructure.SubItems.Add(y); } } if (_showDeleted) { foreach (var y in tmpBlocksOfflineFolders) { var x = new S7ProgrammFolder() { Name = "$$tmpProgram_for_deleted" }; x.Project = this; x.Parent = ProjectStructure; y.Parent = x; x.SubItems.Add(y); x.BlocksOfflineFolder = y; ProjectStructure.SubItems.Add(x); } } //Get The ProfiBus and MPI List<DpHelp> DPlist = new List<DpHelp>(); if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkdmax" + _DirSeperator + "HOBJECT1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkdmax" + _DirSeperator + "HOBJECT1.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || _showDeleted) { var dp = new DpHelp(); dp.id = Convert.ToInt32(row["ID"]); DPlist.Add(dp); } } } if (_ziphelper.FileExists(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkdmax" + _DirSeperator + "HRELATI1.DBF")) { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "hOmSave7" + _DirSeperator + "s7hkdmax" + _DirSeperator + "HRELATI1.DBF", _ziphelper, _DirSeperator); var rrr = DPFolders; foreach (DataRow row in dbfTbl.Rows) { int relID = Convert.ToInt32(row["RELID"]); if ( relID == 1315837) { var dp = DPlist.FirstOrDefault(x => x.id == Convert.ToInt32(row["SOBJID"])); if ( dp != null) { dp.TobjID = Convert.ToInt32(row["TOBJID"]); } } else if (relID == 64) { var dp = DPlist.FirstOrDefault(x => x.id == Convert.ToInt32(row["SOBJID"])); if (dp != null) { dp.addr = Convert.ToInt32(row["TOBJID"]); } } } } //remove DP from DPlist to DPFolder foreach(var dp in DPlist) { var dpf = DPFolders.FirstOrDefault(x => x.IdTobjId.Any(y => y == dp.TobjID)); if ( dpf != null) { if (dpf.TobjId == null) dpf.TobjId = new List<int>(); dpf.TobjId.Add(dp.addr); } } //add subitem to parent //foreach (var cp in CPFolders.Where(x => x.SubModulNumber > 0)) //{ // var parent = CPFolders.FirstOrDefault(x => x.ID == cp.UnitID); // if (parent != null) parent.SubModul = cp; //} try { //read IP address from S7Netze\S7NONFGX.tab if (_ziphelper.FileExists(ProjectFolder + "S7Netze" + _DirSeperator + "S7NONFGX.tab")) { Stream hrsLink = _ziphelper.GetReadStream(ProjectFolder + "S7Netze" + _DirSeperator + "S7NONFGX.tab"); BinaryReader rd = new BinaryReader(hrsLink); int lengthFile = (int)_ziphelper.GetStreamLength(ProjectFolder + "S7Netze" + _DirSeperator + "S7NONFGX.tab", hrsLink); byte[] completeBuffer = rd.ReadBytes(lengthFile); rd.Close(); hrsLink.Close(); char[] searchValid = { 'A', 'd', 'd', 'r', 'e', 's', 's', 'I', 's', 'V', 'a', 'l', 'i', 'd' }; byte[] searchName = { (byte)'B', (byte)'a', (byte)'u', (byte)'g', (byte)'r', (byte)'u', (byte)'p', (byte)'p', (byte)'e', (byte)'n', (byte)'n', (byte)'a', (byte)'m', (byte)'e' }; byte[] startStructure = { 0x03, 0x52, 0x14, 0x00 }; byte[] startIP = { 0xE0, 0x0F, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00 }; byte[] startMAC = { 0xA2, 0x0F, 0x00, 0x00, 0xA2, 0x0F, 0x00, 0x00 }; byte[] startMask = { 0xE5, 0x0F, 0x00, 0x00, 0xE5, 0x0F, 0x00, 0x00 }; byte[] startRouter = { 0xE3, 0x0F, 0x00, 0x00, 0xE3, 0x0F, 0x00, 0x00 }; byte[] startUseRouter = { 0xE8, 0x0F, 0x00, 0x00, 0xE8, 0x0F, 0x00, 0x00 }; byte[] startUseIP = { 0xEA, 0x0F, 0x00, 0x00, 0xEA, 0x0F, 0x00, 0x00 }; byte[] startUseMac = { 0xED, 0x0F, 0x00, 0x00, 0xED, 0x0F, 0x00, 0x00 }; int position = 0; int lenStructure = 1705;// 1960; //I don't think this len is correct... (look) while ((position = indexOfByteArray(completeBuffer, startStructure, position + 1, lengthFile)) >= 0) { int number = BitConverter.ToInt32(completeBuffer, position + 4);//or ToInt16 //Debug.Print(number.ToString()); var cp = CPFolders.FirstOrDefault(x => x.TobjId != null && x.TobjId.Any(y => y == number)); var cpu = CPUFolders.FirstOrDefault(x => x.TobjId == number); EthernetNetworkInterface ethernet = new EthernetNetworkInterface(); if (cp != null) { if (cp.NetworkInterfaces == null) cp.NetworkInterfaces = new List<NetworkInterface>(); cp.NetworkInterfaces.Add(ethernet); } else if (cpu != null) { if (cpu.NetworkInterfaces == null) cpu.NetworkInterfaces = new List<NetworkInterface>(); cpu.NetworkInterfaces.Add(ethernet); } else continue; int pos = indexOfByteArray(completeBuffer, searchName, position, lenStructure); if (pos > 0) { try { string strName = System.Text.Encoding.Default.GetString(completeBuffer, pos + 25, (int)completeBuffer[pos + 24]); ethernet.Name = strName; } catch { } } pos = indexOfByteArray(completeBuffer, startIP, position, lenStructure); if (pos > 0) { try { string strIP = System.Text.Encoding.Default.GetString(completeBuffer, pos + 20, (int)completeBuffer[pos + 19]); byte[] bIP = new byte[4]; bIP[0] = byte.Parse(strIP.Substring(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier); bIP[1] = byte.Parse(strIP.Substring(2, 2), System.Globalization.NumberStyles.AllowHexSpecifier); bIP[2] = byte.Parse(strIP.Substring(4, 2), System.Globalization.NumberStyles.AllowHexSpecifier); bIP[3] = byte.Parse(strIP.Substring(6, 2), System.Globalization.NumberStyles.AllowHexSpecifier); ethernet.IpAddress = new System.Net.IPAddress(bIP); } catch { } } pos = indexOfByteArray(completeBuffer, startMAC, position, lenStructure); if (pos > 0) { try { string strMAC = System.Text.Encoding.Default.GetString(completeBuffer, pos + 20, (int)completeBuffer[pos + 19]); ethernet.Mac = System.Net.NetworkInformation.PhysicalAddress.Parse(strMAC); } catch { } } pos = indexOfByteArray(completeBuffer, startMask, position, lenStructure); if (pos > 0) { try { string strMask = System.Text.Encoding.Default.GetString(completeBuffer, pos + 20, (int)completeBuffer[pos + 19]); byte[] bIP = new byte[4]; bIP[0] = byte.Parse(strMask.Substring(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier); bIP[1] = byte.Parse(strMask.Substring(2, 2), System.Globalization.NumberStyles.AllowHexSpecifier); bIP[2] = byte.Parse(strMask.Substring(4, 2), System.Globalization.NumberStyles.AllowHexSpecifier); bIP[3] = byte.Parse(strMask.Substring(6, 2), System.Globalization.NumberStyles.AllowHexSpecifier); ethernet.SubnetMask = new System.Net.IPAddress(bIP); } catch { } } pos = indexOfByteArray(completeBuffer, startRouter, position, lenStructure); if (pos > 0) { try { string strRouter = System.Text.Encoding.Default.GetString(completeBuffer, pos + 20, (int)completeBuffer[pos + 19]); byte[] bIP = new byte[4]; bIP[0] = byte.Parse(strRouter.Substring(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier); bIP[1] = byte.Parse(strRouter.Substring(2, 2), System.Globalization.NumberStyles.AllowHexSpecifier); bIP[2] = byte.Parse(strRouter.Substring(4, 2), System.Globalization.NumberStyles.AllowHexSpecifier); bIP[3] = byte.Parse(strRouter.Substring(6, 2), System.Globalization.NumberStyles.AllowHexSpecifier); ethernet.Router = new System.Net.IPAddress(bIP); } catch { } } pos = indexOfByteArray(completeBuffer, startUseRouter, position, lenStructure); if (pos > 0) { try { ethernet.UseRouter = Convert.ToBoolean(completeBuffer[pos + 19]); } catch { } } pos = indexOfByteArray(completeBuffer, startUseIP, position, lenStructure); if (pos > 0) { try { ethernet.UseIp = Convert.ToBoolean(completeBuffer[pos + 19]); } catch { } } pos = indexOfByteArray(completeBuffer, startUseMac, position, lenStructure); if (pos > 0) { try { ethernet.UseIso = Convert.ToBoolean(completeBuffer[pos + 19]); } catch { } } } //read ProfiBus Parametrs startStructure[0] = 0x02; byte[] startAddress = { 0x36, 0x08, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00 }; lenStructure = 2000; position = 0; while ((position = indexOfByteArray(completeBuffer, startStructure, position + 1, lengthFile)) >= 0) { int number = BitConverter.ToInt32(completeBuffer, position + 4);//or ToInt16 var dp = DPFolders.FirstOrDefault(x => x.TobjId != null && x.TobjId.Any(y => y == number)); CPUFolder cpu = null; if ( dp != null) cpu = CPUFolders.FirstOrDefault(x => x.UnitID == dp.UnitID); MpiProfiBusNetworkInterface MpiDP = new MpiProfiBusNetworkInterface() { NetworkInterfaceType = NetworkType.Profibus}; if (cpu != null) { if (cpu.NetworkInterfaces == null) cpu.NetworkInterfaces = new List<NetworkInterface>(); cpu.NetworkInterfaces.Add(MpiDP); } else continue; int pos = indexOfByteArray(completeBuffer, startAddress, position, lenStructure); if (pos > 0) { try { MpiDP.Address = (int)Convert.ToByte(completeBuffer[pos + 19 + (int)Convert.ToByte(completeBuffer[pos + 8])]); } catch { } } pos = indexOfByteArray(completeBuffer, searchName, position, lenStructure); if (pos > 0) { try { string strName = System.Text.Encoding.Default.GetString(completeBuffer, pos + 25, (int)completeBuffer[pos + 24]); MpiDP.Name = strName; } catch { } } } //read MPI Parametrs startStructure[0] = 0x01; byte[] startMPIAddress = { 0x9A, 0x08, 0x00, 0x00, 0x9A, 0x08, 0x00, 0x00 }; lenStructure = 2000; position = 0; while ((position = indexOfByteArray(completeBuffer, startStructure, position + 1, lengthFile)) >= 0) { int number = BitConverter.ToInt32(completeBuffer, position + 4);//or ToInt16 var dp = DPFolders.FirstOrDefault(x => x.TobjId != null && x.TobjId.Any(y => y == number)); CPUFolder cpu = null; if (dp != null) cpu = CPUFolders.FirstOrDefault(x => x.UnitID == dp.UnitID); MpiProfiBusNetworkInterface MpiDP = new MpiProfiBusNetworkInterface() { NetworkInterfaceType = NetworkType.Mpi }; if (cpu != null) { if (cpu.NetworkInterfaces == null) cpu.NetworkInterfaces = new List<NetworkInterface>(); cpu.NetworkInterfaces.Add(MpiDP); } else continue; int pos = indexOfByteArray(completeBuffer, startMPIAddress, position, lenStructure); if (pos > 0) { try { MpiDP.Address = (int)Convert.ToByte(completeBuffer[pos + 19 + (int)Convert.ToByte(completeBuffer[pos + 8])]); } catch { } } pos = indexOfByteArray(completeBuffer, searchName, position, lenStructure); if (pos > 0) { try { string strName = System.Text.Encoding.Default.GetString(completeBuffer, pos + 25, (int)completeBuffer[pos + 24]); MpiDP.Name = strName; } catch { } } } } } catch { } //union SubModul Cp bool repeat; do { repeat = false; foreach (var cp in CPFolders.Where(x => x.SubModul != null)) { if (cp.NetworkInterfaces == null) cp.NetworkInterfaces = new List<NetworkInterface>(); cp.NetworkInterfaces.AddRange(cp.SubModul.NetworkInterfaces); CPFolders.Remove(cp.SubModul); cp.SubModul = null; repeat = true; break; } } while (repeat); }
//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; } }
//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", ""); 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"]; 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 { 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"; newPar.Value = ber.Replace('V', 'L') + ak_address.ToString(); } } 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; } }
public Block GetBlock(ProjectBlockInfo blkInfo, S7ConvertingOptions myConvOpt) { //Todo: Enable this, but then myConvOpt is only used the first time! //if (blkInfo._Block != null) // 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.BlockLanguage = (PLCLanguage)myTmpBlk.Language; 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; 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; if (blkInfo.BlockType != PLCBlockType.UDT) { retVal.CodeSize = myTmpBlk.mc7code.Length + 36; } retVal.BlockLanguage = (PLCLanguage)myTmpBlk.Language; 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(); blkInfo._Block = retVal; 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.CodeSize = myTmpBlk.mc7code.Length + 36; 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); } retVal.BlockLanguage = (PLCLanguage)myTmpBlk.Language; return(retVal); if (blkInfo.BlockType == PLCBlockType.FC || blkInfo.BlockType == PLCBlockType.FB || blkInfo.BlockType == PLCBlockType.OB) { 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.AWLCode = JumpMarks.AddJumpmarks(retVal.AWLCode, myTmpBlk.jumpmarks, myTmpBlk.nwinfo); LocalDataConverter.ConvertLocaldataToSymbols(retVal, myConvOpt); FBStaticAccessConverter.ReplaceStaticAccess(retVal, prgFld, myConvOpt); CallConverter.ConvertUCToCall(retVal, prgFld, this, myConvOpt, null); #region UseComments from Block if (myConvOpt.UseComments) { List <FunctionBlockRow> newAwlCode = new List <FunctionBlockRow>(); int n = 0; int j = 0; int subCnt = 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 > j) { while (retVal.AWLCode.Count - 1 > j && retVal.AWLCode[j].Command != "NETWORK") { newAwlCode.Add(retVal.AWLCode[j]); j++; } ((S7FunctionBlockRow)retVal.AWLCode[j]).NetworkName = tx1; ((S7FunctionBlockRow)retVal.AWLCode[j]).Comment = tx2; newAwlCode.Add(retVal.AWLCode[j]); } j++; subCnt = 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 > j) { S7FunctionBlockRow akRw = (S7FunctionBlockRow)retVal.AWLCode[j]; if (cmt[n + 4] == 0xc0 && q == anzUebsprungZeilen - 1) { akRw.CombineDBAccess = false; } //Db Zugriff zusammenfügen... if (akRw.CombineDBAccess) { S7FunctionBlockRow nRw = (S7FunctionBlockRow)retVal.AWLCode[j + 1]; nRw.Parameter = akRw.Parameter + "." + nRw.Parameter; nRw.MC7 = Helper.CombineByteArray(akRw.MC7, nRw.MC7); akRw = nRw; retVal.AWLCode.RemoveAt(j + 1); } if (akRw.GetNumberOfLines() == 1) { subCnt = 0; lastRow = akRw; newAwlCode.Add(akRw); j++; } else { lastRow = akRw; if (subCnt == 0) { newAwlCode.Add(akRw); } if (akRw.GetNumberOfLines() - 1 == subCnt) { j++; //subCnt = 0; subCnt++; } else { subCnt++; } } } } //if (lastRow == null || cmt[n + 4] != 0x80) if (lastRow == null || (cmt[n + 4] != 0x80 && cmt[n + 4] != 0xc0)) { lastRow = new S7FunctionBlockRow(); newAwlCode.Add(lastRow); subCnt = 0; } string tx1 = Project.ProjectEncoding.GetString(cmt, n + 6, kommLen); if (subCnt == 0) { lastRow.Comment = tx1; } else if (lastRow.Command == "CALL") { if (subCnt == 1) { lastRow.Comment = tx1; } else { lastRow.CallParameter[subCnt - 2].Comment = tx1; } } n += kommLen + 6; //subCnt = 0; } } } while (j < retVal.AWLCode.Count) { newAwlCode.Add(retVal.AWLCode[j]); j++; } retVal.AWLCode = newAwlCode; } #endregion } retVal.Networks = NetWork.GetNetworksList(retVal); retVal.ParentFolder = this; return(retVal); } } return(null); }
public static S7Block GetAWLBlock(byte[] MC7Code, int MnemoricLanguage, S7ProgrammFolder prjBlkFld) { /* string ttmp = ""; for (int i = 0; i < MC7Code.Length; i++) { ttmp += MC7Code[i].ToString("X").PadLeft(2, '0'); } MessageBox.Show(ttmp); Clipboard.SetText(ttmp); */ S7Block retBlock = null; if (MC7Code != null) { if ((MC7Code[5] == 0x0a) || (MC7Code[5] == 0x0b)) retBlock = (S7Block) new S7DataBlock(); else retBlock = (S7Block)new S7FunctionBlock(); const int MC7Start_or_DBBodyStart = 36; /* * Description of a MC7 Block (Common) * * 0,1 = Signature ('pp') * 2 = Block Version * 3 = Block Attribute (.0 not unlinked, .1 standart block + know how protect, .3 know how protect, .5 not retain * 4 = Block Language * 5 = Block Type (a=DB, b=SDB) * 6,7 = Block Number * 8-11 = Block Length * 12-15 = Block Password * 16-21 = Last Modified * 22-27 = Last Interface Change * 28,29 = Interface length or DB Body (actual Values Part) length * 30,31 = Segment Table Length? (Normaly 0 on a DB) (Length of networks!) * 32,33 = Local Data Length? (Normaly 0 on a DB) * 34,35 = MC7-Length or DB Body (definitions/initial values) */ /* * Description of a MC7 Block (Function - Block) * 36-xx = AWL * xx+1, = 0x01 * xx+2,xx+3 = Again Block number, Zero on OB (but bytes swapped) * xx+4,xx+5 = Interface Length (from xx+6 to yy) * xx+6,xx+7 = Interface Blocks Count (In,Out,Satic,TMP etc) * 2 * xx+8,xx+9 = allways Zero * xx+10-yy = Interface * yy+1-zz = Networks * */ /* * Description of a MC7 Block (Data - Block) * 36-xx = AWL * xx+1, = 0x05 (DB) 0x10 (DI) * xx+2,xx+3 = Again Block Number or FB Number on a DI (but bytes swapped) * xx+4,xx+5 = Interface Length * xx+6-yy = Interface * yy-zz = Start-Values * xx = Nertworks */ retBlock.BlockVersion = Convert.ToString(MC7Code[2] - 1); retBlock.BlockAttribute = Convert.ToString(MC7Code[3] - 1); retBlock.BlockLanguage = (DataTypes.PLCLanguage) MC7Code[4]; // Enum.Parse(typeof(DataTypes.PLCLanguage), Helper.GetLang(MC7Code[4])); retBlock.MnemonicLanguage = (MnemonicLanguage)MnemoricLanguage; retBlock.BlockType = Helper.GetPLCBlockType(MC7Code[5]); retBlock.BlockNumber = (MC7Code[6]*0x100) + MC7Code[7]; retBlock.Length = libnodave.getU32from(MC7Code, 8); retBlock.Password = new byte[] {MC7Code[12], MC7Code[13], MC7Code[14], MC7Code[15]}; retBlock.LastCodeChange = Helper.GetDT(MC7Code[16], MC7Code[17], MC7Code[18], MC7Code[19], MC7Code[20], MC7Code[21]); retBlock.LastInterfaceChange = Helper.GetDT(MC7Code[22], MC7Code[23], MC7Code[24], MC7Code[25], MC7Code[26], MC7Code[27]); int InterfaceLength_or_DBActualValuesLength = libnodave.getU16from(MC7Code, 28); retBlock.SegmentTableSize = libnodave.getU16from(MC7Code, 30); //(Length of networks?) int LocalDataLength = libnodave.getU16from(MC7Code, 32); int MC7Length_or_DBBodyLength = libnodave.getU16from(MC7Code, 34); int IntfStart = MC7Start_or_DBBodyStart + MC7Length_or_DBBodyLength + 3; int IntfLength = BitConverter.ToUInt16(MC7Code, IntfStart) + 2; int IntfValStart = IntfStart + IntfLength + 2; retBlock.InterfaceSize = InterfaceLength_or_DBActualValuesLength; retBlock.LocalDataSize = LocalDataLength; retBlock.CodeSize = MC7Length_or_DBBodyLength; int FooterStart = MC7Start_or_DBBodyStart + MC7Length_or_DBBodyLength + InterfaceLength_or_DBActualValuesLength + retBlock.SegmentTableSize; retBlock.Author = Helper.GetString(FooterStart + 0 , 8, MC7Code); retBlock.Family = Helper.GetString(FooterStart + 8, 8, MC7Code); retBlock.Name = Helper.GetString(FooterStart + 16, 8, MC7Code); retBlock.Version = Helper.GetVersion(MC7Code[FooterStart + 24]); if ((MC7Code[5] == 0x0a) || (MC7Code[5] == 0x0b)) { //Instance DB?? if (MC7Code[MC7Start_or_DBBodyStart + MC7Length_or_DBBodyLength] == 0x0a) { ((S7DataBlock) retBlock).IsInstanceDB = true; ((S7DataBlock)retBlock).FBNumber = BitConverter.ToUInt16(MC7Code, MC7Start_or_DBBodyStart + MC7Length_or_DBBodyLength + 1); } //((PLCDataBlock) retBlock).Structure = MC7toDB.GetDBInterface(IntfStart, IntfLength, AWLStart, IntfValStart, MC7Code); /*var interf = new byte[IntfLength]; Array.Copy(MC7Code, IntfStart, interf, 0, IntfLength); string wr = ""; for (int i=0;i<interf.Length-1;i=i+2) { wr += interf[i+1].ToString("X").PadLeft(2, '0'); wr += interf[i].ToString("X").PadLeft(2, '0'); } wr = wr;*/ List<string> tmp = new List<string>(); var interfaceBytes = new byte[IntfLength + 3]; var actualValues = new byte[MC7Length_or_DBBodyLength]; Array.Copy(MC7Code, IntfStart - 3, interfaceBytes, 0, IntfLength + 3); //-3 because of in the project file in the structere ssbpart is also the same structure with this 4 bytes!! Array.Copy(MC7Code, MC7Start_or_DBBodyStart, actualValues, 0, MC7Length_or_DBBodyLength); ((S7DataBlock)retBlock).StructureFromMC7 = Parameter.GetInterface(interfaceBytes, actualValues, ref tmp, retBlock.BlockType, ((S7DataBlock)retBlock).IsInstanceDB, retBlock); } else { var interfaceBytes = new byte[IntfLength + 3]; Array.Copy(MC7Code, IntfStart - 3, interfaceBytes, 0, IntfLength + 3); //-3 because of in the project file in the structere ssbpart is also the same structure with this 4 bytes!! List<string> ParaList = new List<string>(); ((S7FunctionBlock)retBlock).Parameter = Parameter.GetInterface(interfaceBytes, null, ref ParaList, retBlock.BlockType, false, retBlock); int[] Networks; Networks = NetWork.GetNetworks(MC7Start_or_DBBodyStart + MC7Length_or_DBBodyLength + InterfaceLength_or_DBActualValuesLength, MC7Code); ((S7FunctionBlock) retBlock).AWLCode = MC7toAWL.GetAWL(MC7Start_or_DBBodyStart, MC7Length_or_DBBodyLength - 2, MnemoricLanguage, MC7Code, Networks, ParaList, prjBlkFld); ((S7FunctionBlock) retBlock).Networks = NetWork.GetNetworksList((S7FunctionBlock) retBlock); } } return retBlock; }
public static S7Block GetAWLBlock(byte[] MC7Code, int MnemoricLanguage, S7ProgrammFolder prjBlkFld) { var retBlock = GetAWLBlockBasicInfo(MC7Code, MnemoricLanguage); if (retBlock != null) { int IntfStart = MC7Start_or_DBBodyStart + retBlock.CodeSize + 3; int IntfLength = BitConverter.ToUInt16(MC7Code, IntfStart) + 2; int IntfValStart = IntfStart + IntfLength + 2; if ((MC7Code[5] == 0x0a) || (MC7Code[5] == 0x0b)) { //Instance DB?? if (MC7Code[MC7Start_or_DBBodyStart + retBlock.CodeSize] == 0x0a) { ((S7DataBlock)retBlock).IsInstanceDB = true; ((S7DataBlock)retBlock).FBNumber = BitConverter.ToUInt16(MC7Code, MC7Start_or_DBBodyStart + retBlock.CodeSize + 1); } //((PLCDataBlock) retBlock).Structure = MC7toDB.GetDBInterface(IntfStart, IntfLength, AWLStart, IntfValStart, MC7Code); /*var interf = new byte[IntfLength]; Array.Copy(MC7Code, IntfStart, interf, 0, IntfLength); string wr = ""; for (int i=0;i<interf.Length-1;i=i+2) { wr += interf[i+1].ToString("X").PadLeft(2, '0'); wr += interf[i].ToString("X").PadLeft(2, '0'); } wr = wr;*/ List<string> tmp = new List<string>(); var interfaceBytes = new byte[IntfLength + 3]; var actualValues = new byte[retBlock.CodeSize]; Array.Copy(MC7Code, IntfStart - 3, interfaceBytes, 0, IntfLength + 3); //-3 because of in the project file in the structere ssbpart is also the same structure with this 4 bytes!! Array.Copy(MC7Code, MC7Start_or_DBBodyStart, actualValues, 0, retBlock.CodeSize); ((S7DataBlock)retBlock).StructureFromMC7 = Parameter.GetInterface(interfaceBytes, actualValues, ref tmp, retBlock.BlockType, ((S7DataBlock)retBlock).IsInstanceDB, retBlock); } else { var interfaceBytes = new byte[IntfLength + 3]; Array.Copy(MC7Code, IntfStart - 3, interfaceBytes, 0, IntfLength + 3); //-3 because of in the project file in the structere ssbpart is also the same structure with this 4 bytes!! List<string> ParaList = new List<string>(); ((S7FunctionBlock)retBlock).Parameter = Parameter.GetInterface(interfaceBytes, null, ref ParaList, retBlock.BlockType, false, retBlock); int[] Networks; Networks = NetWork.GetNetworks(MC7Start_or_DBBodyStart + retBlock.CodeSize + retBlock.InterfaceSize, MC7Code); ((S7FunctionBlock)retBlock).AWLCode = MC7toAWL.GetAWL(MC7Start_or_DBBodyStart, retBlock.CodeSize - 2, MnemoricLanguage, MC7Code, Networks, ParaList, prjBlkFld, (S7FunctionBlock)retBlock); ((S7FunctionBlock)retBlock).Networks = NetWork.GetNetworksList((S7FunctionBlock)retBlock); } } return retBlock; }
internal static List<FunctionBlockRow> GetAWL(int Start, int Count, int MN, byte[] BD, int[] Networks, List<string> ParaList, S7ProgrammFolder prjBlkFld) { var retVal = new List<FunctionBlockRow>(); //bool CombineDBOpenAndCommand = false; // true; // false; //If DB Open and Acess should be One AWL Line (like in Step 7). This should be a Parameter. int NWNr = 1; int pos = Start; int counter = 0; int oldpos = pos; while (pos <= (Start + Count) - 2) { //if (retVal.Count >103) //For Bugfixing, The Rownumber in the AWL Editor - 2 // pos=pos; if (Networks != null) NetWork.NetworkCheck(ref Networks, ref retVal, ref counter, oldpos, pos, ref NWNr); oldpos = pos; if (BD[pos] == 0x00 && BD[pos + 1] == 0x00) { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opNOP[MN], Parameter = "0" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } else if (BD[pos] == 0x01 && BD[pos + 1] == 0x00) { retVal.Add(new S7FunctionBlockRow() {Command = Mnemonic.opINVI[MN]}); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] {BD[pos], BD[pos + 1]}; pos += 2; } else if (BD[pos] == 0x05 && BD[pos + 1] == 0x00) { retVal.Add(new S7FunctionBlockRow() {Command = Mnemonic.opBEB[MN]}); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] {BD[pos], BD[pos + 1]}; pos += 2; } else if (BD[pos] == 0x09 && BD[pos + 1] == 0x00) { retVal.Add(new S7FunctionBlockRow() {Command = Mnemonic.opNEGI[MN]}); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] {BD[pos], BD[pos + 1]}; pos += 2; } else if (BD[pos] == 0x49 && BD[pos + 1] == 0x00) { retVal.Add(new S7FunctionBlockRow() {Command = Mnemonic.opOW[MN]}); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] {BD[pos], BD[pos + 1]}; pos += 2; } else if (BD[pos] == 0x00 || BD[pos] == 0x01 || BD[pos] == 0x05 || BD[pos] == 0x09 || BD[pos] == 0x49) { string curr_op = ""; string curr_ad = ""; int HighByte = BD[pos + 1] & 0xF0; //Only Highbyte switch (BD[pos]) { case (0x00): curr_op = HighByte < 0x90 ? Mnemonic.opU[MN] : Mnemonic.opUN[MN]; break; case (0x01): curr_op = HighByte < 0x90 ? Mnemonic.opO[MN] : Mnemonic.opON[MN]; break; case (0x05): curr_op = HighByte < 0x90 ? Mnemonic.opX[MN] : Mnemonic.opXN[MN]; break; case (0x09): curr_op = HighByte < 0x90 ? Mnemonic.opS[MN] : Mnemonic.opR[MN]; break; case (0x49): curr_op = HighByte < 0x90 ? Mnemonic.opFP[MN] : Mnemonic.opFN[MN]; break; } string par = ""; byte[] DBByte = null; switch (HighByte) { case (0x10): case (0x90): curr_ad = Mnemonic.adE[MN]; break; case (0x20): case (0xA0): curr_ad = Mnemonic.adA[MN]; break; case (0x30): case (0xB0): curr_ad = Mnemonic.adM[MN]; break; case (0x40): case (0xC0): if (retVal[retVal.Count - 1].Command == Mnemonic.opAUF[MN] && !((S7FunctionBlockRow)retVal[retVal.Count - 1]).Parameter.Contains("["))// && CombineDBOpenAndCommand) { ((S7FunctionBlockRow) retVal[retVal.Count - 1]).CombineDBAccess = true; //DBByte = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7; //par = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).Parameter + "."; //retVal.RemoveAt(retVal.Count - 1); } curr_ad = Mnemonic.adDBX[MN]; break; case (0x50): case (0xD0): curr_ad = Mnemonic.adDIX[MN]; break; case (0x60): case (0xE0): curr_ad = Mnemonic.adL[MN]; break; } int LowByte = BD[pos + 1] & 0x0F; retVal.Add(new S7FunctionBlockRow() { Command = curr_op, Parameter = par + curr_ad + " " + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "." + Convert.ToString(BD[pos + 1] - HighByte) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; if (DBByte != null) ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = Helper.CombineByteArray(DBByte, ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7); pos += 4; } else switch (BD[pos]) { case 0x00: { switch (BD[pos + 1]) { case 0x00: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opNOP[MN], Parameter = "0" }); //Result = Result + Memnoic.opNOP[MN] + "0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; default: retVal.Add(new S7FunctionBlockRow() { Command = "errx" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; } } break; case 0x02: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x04: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opFR[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x0A: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adMB[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x0B: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adMB[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x0C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLC[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x10: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opBLD[MN], Parameter = Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x11: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opINC[MN], Parameter = Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x12: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adMW[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x13: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adMW[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x14: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSA[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x19: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opDEC[MN], Parameter = Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x1A: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adMD[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x1b: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adMD[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x1C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSV[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x1D: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opCC[MN], Parameter = Mnemonic.adFC[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opCC[MN] + Memnoic.adFC[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5] }; pos += 6; } break; case 0x20: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDB[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x21: { switch (BD[pos + 1]) { case 0x20: retVal.Add(new S7FunctionBlockRow() { Command = ">I" }); break; case 0x40: retVal.Add(new S7FunctionBlockRow() { Command = "<I" }); break; case 0x60: retVal.Add(new S7FunctionBlockRow() { Command = "<>I" }); break; case 0x80: retVal.Add(new S7FunctionBlockRow() { Command = "==I" }); break; case 0xA0: retVal.Add(new S7FunctionBlockRow() { Command = ">=I" }); break; case 0xC0: retVal.Add(new S7FunctionBlockRow() { Command = "<=I" }); break; } ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x24: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSE[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opSE[MN] + Memnoic.adT[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x28: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = "B#16#" + (BD[pos + 1]).ToString("X") }); //Result = Result + Memnoic.opL[MN] + "B#16#" + (BD[pos + 1]).ToString("X"); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x29: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSLD[MN], Parameter = (BD[pos + 1]).ToString() }); //Result = Result + Memnoic.opSLD[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x2C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSS[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opSS[MN] + Memnoic.adT[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x30: { //Result = Result + Memnoic.opL[MN]; string par = ""; switch (BD[pos + 1]) { case 0x02: //Result = Result + "2#" + Helper.GetWordBool(BD[pos + 2], BD[pos + 3]); par = "2#" + Helper.GetWordBool(BD[pos + 2], BD[pos + 3]); break; case 0x03: par = Convert.ToString(libnodave.getS16from(BD, pos + 2)); //Helper.GetInt(BD[pos + 2], BD[pos + 3])); //Result = Result + Convert.ToString(Helper.GetInt(BD[pos + 2], BD[pos + 3])); break; case 0x05: par = Helper.GetS7String(pos + 2, 2, BD); //Result = Result + Helper.GetS7String(pos + 2, 2, BD); break; case 0x06: par = "B#(" + Convert.ToString(BD[pos + 2]) + ", " + Convert.ToString(BD[pos + 3]) + ")"; break; case 0x00: case 0x07: par = "W#16#" + libnodave.getU16from(BD, pos + 2).ToString("X"); // Helper.GetWord(BD[pos + 2], BD[pos + 3]).ToString("X"); //Result = Result + "W#16#" + // Helper.GetWord(BD[pos + 2], BD[pos + 3]).ToString("X"); break; case 0x08: par = "C#" + libnodave.getU16from(BD, pos + 2).ToString("X"); // Helper.GetWord(BD[pos + 2], BD[pos + 3]).ToString("X"); //Result = Result + "C#" + Helper.GetWord(BD[pos + 2], BD[pos + 3]).ToString("X"); break; case 0x0A: par = Helper.GetDate(BD[pos + 2], BD[pos + 3]); //Result = Result + Helper.GetDate(BD[pos + 2], BD[pos + 3]); break; case 0x0C: par = Helper.GetS5Time(BD[pos + 2], BD[pos + 3]); //Result = Result + Helper.GetS5Time(BD[pos + 2], BD[pos + 3]); break; } retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x31: { switch (BD[pos + 1]) { case 0x20: //Result = Result + ">R"; retVal.Add(new S7FunctionBlockRow() { Command = ">R" }); break; case 0x40: retVal.Add(new S7FunctionBlockRow() { Command = "<R" }); //Result = Result + "<R"; break; case 0x60: retVal.Add(new S7FunctionBlockRow() { Command = "<>R" }); //Result = Result + "<>R"; break; case 0x80: retVal.Add(new S7FunctionBlockRow() { Command = "==R" }); //Result = Result + "==R"; break; case 0xA0: retVal.Add(new S7FunctionBlockRow() { Command = ">=R" }); //Result = Result + ">=R"; break; case 0xC0: retVal.Add(new S7FunctionBlockRow() { Command = "<=R" }); //Result = Result + "<=R"; break; } ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x34: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSI[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x38: { string par = ""; switch (BD[pos + 1]) { case 0x01: par = libnodave.getFloatfrom(BD, pos + 2).ToString("0.000000e+000"); break; case 0x02: par = "2#" + Helper.GetDWordBool(BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5]); break; case 0x03: par = "L#" + Convert.ToString(libnodave.getS32from(BD, pos + 2)); //par = "L#" + Convert.ToString(Helper.GetDInt(BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5])); break; case 0x04: par = Helper.GetPointer(BD,pos+2); break; case 0x05: par = Helper.GetS7String(pos + 2, 4, BD); break; case 0x06: par = "B#(" + Convert.ToString(BD[pos + 2]) + ", " + Convert.ToString(BD[pos + 3]) + ", " + Convert.ToString(BD[pos + 4]) + ", " + Convert.ToString(BD[pos + 5]) + ")"; break; case 0x07: //par = "DW#16#" + Helper.GetDWord(BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5]).ToString("X"); par = "DW#16#" + libnodave.getU32from(BD, pos + 2).ToString("X"); break; case 0x09: par = Helper.GetDTime(BD, pos + 2); //par = Helper.GetDTime(BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5]); break; case 0x0b: //par = Helper.GetTOD(BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5]); par = Helper.GetTOD(BD, pos + 2); break; } retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5] }; pos += 6; } break; case 0x39: { switch (BD[pos + 1]) { case 0x20: retVal.Add(new S7FunctionBlockRow() { Command = ">D" }); //Result = Result + ">D"; break; case 0x40: retVal.Add(new S7FunctionBlockRow() { Command = "<D" }); //Result = Result + "<D"; break; case 0x60: retVal.Add(new S7FunctionBlockRow() { Command = "<>D" }); //Result = Result + "<>D"; break; case 0x80: retVal.Add(new S7FunctionBlockRow() { Command = "==D" }); //Result = Result + "==D"; break; case 0xA0: retVal.Add(new S7FunctionBlockRow() { Command = ">=D" }); //Result = Result + ">=D"; break; case 0xC0: retVal.Add(new S7FunctionBlockRow() { Command = "<=D" }); //Result = Result + "<=D"; break; } ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x3C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opR[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x3D: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUC[MN], Parameter = Mnemonic.adFC[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5] }; //Get Parameter Count int paranz = (BD[pos + 5] / 2) - 1; List<string> tmplst = new List<string>(); for (int n = 1; n <= paranz; n++) { tmplst.Add(Helper.GetFCPointer(BD[pos + 6], BD[pos + 7], BD[pos + 8], BD[pos + 9])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = Helper.CombineByteArray(((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7, new byte[] { BD[pos + 6], BD[pos + 7], BD[pos + 8], BD[pos + 9] }); pos += 4; } byte[] backup = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).ExtParameter = tmplst; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = backup; pos += 6; } break; case 0x41: { switch (BD[pos + 1]) { case 0x00: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUW[MN] }); //Result = Result + Memnoic.opUW[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = Mnemonic.adE[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "." + Convert.ToString(BD[pos + 1] - 0x10) }); //Result = Result + Memnoic.opZUW[MN] + Memnoic.adE[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "." + // Convert.ToString(BD[pos + 1] - 0x10); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = Mnemonic.adA[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "." + Convert.ToString(BD[pos + 1] - 0x20) }); //Result = Result + Memnoic.opZUW[MN] + Memnoic.adA[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "." + // Convert.ToString(BD[pos + 1] - 0x20); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = Mnemonic.adM[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "." + Convert.ToString(BD[pos + 1] - 0x30) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; case 0x40: //Zuweisung with DB case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: { string par = ""; byte[] DBByte = null; if (retVal[retVal.Count - 1].Command == Mnemonic.opAUF[MN] && !((S7FunctionBlockRow)retVal[retVal.Count - 1]).Parameter.Contains("["))// && CombineDBOpenAndCommand) { ((S7FunctionBlockRow)retVal[retVal.Count - 1]).CombineDBAccess = true; //DBByte = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7; //par = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).Parameter + "."; //retVal.RemoveAt(retVal.Count - 1); } retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = par + Mnemonic.adDBX[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "." + Convert.ToString(BD[pos + 1] - 0x40) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; if (DBByte != null) ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = Helper.CombineByteArray(DBByte, ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7); pos += 4; break; } case 0x50: //Zuweisung with DI case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = Mnemonic.adDIX[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "." + Convert.ToString(BD[pos + 1] - 0x50) }); //Result = Result + Memnoic.opZUW[MN] + Memnoic.adDIX[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "." + // Convert.ToString(BD[pos + 1] - 0x50); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; } case 0x60://Zuweisung without DB case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = Mnemonic.adL[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "." + Convert.ToString(BD[pos + 1] - 0x60) }); //Result = Result + Memnoic.opZUW[MN] + Memnoic.adL[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "." + // Convert.ToString(BD[pos + 1] - 0x60); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; default: retVal.Add(new S7FunctionBlockRow() { Command = "erra" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; } } break; case 0x42: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opL[MN] + Memnoic.adZ[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x44: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opFR[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opFR[MN] + Memnoic.adZ[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x4A: { if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adEB[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opL[MN] + Memnoic.adEB[MN] + Convert.ToString(BD[pos + 1]); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adAB[MN] + Convert.ToString(BD[pos + 1] - 0x80) }); //Result = Result + Memnoic.opL[MN] + Memnoic.adAB[MN] + Convert.ToString(BD[pos + 1] - 0x80); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x4b: { if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adEB[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opT[MN] + Memnoic.adEB[MN] + Convert.ToString(BD[pos + 1]); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adAB[MN] + Convert.ToString(BD[pos + 1] - 0x80) }); //Result = Result + Memnoic.opT[MN] + Memnoic.adAB[MN] + Convert.ToString(BD[pos + 1] - 0x80); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x4C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLC[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opLC[MN] + Memnoic.adZ[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x51: case 0x58: case 0x59: { string cmd = "", par = ""; if (BD[pos + 1] == 0x00) { switch (BD[pos]) { case 0x51: cmd = Mnemonic.opXOW[MN]; retVal.Add(new S7FunctionBlockRow() { Command = cmd}); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0x58: cmd = Mnemonic.opPLU[MN]; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = libnodave.getS16from(BD, pos + 2).ToString() }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; case 0x59: cmd = "-I"; retVal.Add(new S7FunctionBlockRow() { Command = cmd}); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; } } else { int LowByte = BD[pos + 1] & 0x0F; //Only Highbyte switch (BD[pos]) { case 0x51: if (BD[pos + 1] < 0xb0) cmd = LowByte < 0x09 ? Mnemonic.opU[MN] : Mnemonic.opO[MN]; else cmd = LowByte < 0x09 ? Mnemonic.opUN[MN] : Mnemonic.opON[MN]; break; case 0x58: if (BD[pos + 1] < 0xb0) cmd = LowByte < 0x09 ? Mnemonic.opX[MN] : Mnemonic.opS[MN]; else cmd = LowByte < 0x09 ? Mnemonic.opXN[MN] : Mnemonic.opR[MN]; break; case 0x59: if (BD[pos + 1] < 0xb0) cmd = LowByte < 0x09 ? Mnemonic.opZUW[MN] : Mnemonic.opFP[MN]; else cmd = LowByte < 0x09 ? "err1" : Mnemonic.opFN[MN];//Don't know the Low Byte command break; } switch (BD[pos + 1] & 0x0F) { case 0x01: case 0x09: par = Mnemonic.adE[MN]; break; case 0x02: case 0x0A: par = Mnemonic.adA[MN]; break; case 0x03: case 0x0B: par = Mnemonic.adM[MN]; break; case 0x04: case 0x0C: par = Mnemonic.adDBX[MN]; break; case 0x05: case 0x0D: par = Mnemonic.adDIX[MN]; break; case 0x06: case 0x0E: par = Mnemonic.adL[MN]; break; } switch (BD[pos + 1] & 0xF0) { case 0x30: case 0xb0: par += Mnemonic.adMD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x40: case 0xc0: par += Mnemonic.adDBD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x50: case 0xd0: par += Mnemonic.adDID[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x60: case 0xe0: par += Mnemonic.adLD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x70: case 0xf0: par += Mnemonic.adMD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; } ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); pos += 4; } } break; case 0x52: { if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adEW[MN] + Convert.ToString(BD[pos + 1]) }); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adAW[MN] + Convert.ToString(BD[pos + 1] - 0x80) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x53: { if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adEW[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opT[MN] + Memnoic.adEW[MN] + Convert.ToString(BD[pos + 1]); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adAW[MN] + Convert.ToString(BD[pos + 1] - 0x80) }); //Result = Result + Memnoic.opT[MN] + Memnoic.adAW[MN] + Convert.ToString(BD[pos + 1] - 0x80); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x54: { if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZR[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opZR[MN] + Memnoic.adZ[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x55: { if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opCC[MN], Parameter = Mnemonic.adFB[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opCC[MN] + Memnoic.adFB[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x5A: { if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adED[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opL[MN] + Memnoic.adED[MN] + Convert.ToString(BD[pos + 1]); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adAD[MN] + Convert.ToString(BD[pos + 1] - 0x80) }); //Result = Result + Memnoic.opL[MN] + Memnoic.adAD[MN] + Convert.ToString(BD[pos + 1] - 0x80); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x5b: { if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adED[MN] + Convert.ToString(BD[pos + 1]) }); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adAD[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x5C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opS[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opS[MN] + Memnoic.adZ[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x60: { switch (BD[pos + 1]) { case 0x00: retVal.Add(new S7FunctionBlockRow() { Command = "/I" }); break; case 0x01: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opMOD[MN] }); break; case 0x02: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opABS[MN] }); break; case 0x03: retVal.Add(new S7FunctionBlockRow() { Command = "/R" }); break; case 0x04: retVal.Add(new S7FunctionBlockRow() { Command = "*I" }); break; case 0x05: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opPLU[MN], Parameter = "L#" + Convert.ToString(libnodave.getS32from(BD, pos + 2)) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5] }; pos += 6; goto brk2; } break; case 0x06: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opNEGR[MN] }); break; case 0x07: retVal.Add(new S7FunctionBlockRow() { Command = "*R" }); break; case 0x08: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opENT[MN] }); break; case 0x09: retVal.Add(new S7FunctionBlockRow() { Command = "-D" }); break; case 0x0A: retVal.Add(new S7FunctionBlockRow() { Command = "*D" }); break; case 0x0b: retVal.Add(new S7FunctionBlockRow() { Command = "-R" }); break; case 0x0D: retVal.Add(new S7FunctionBlockRow() { Command = "+D" }); break; case 0x0E: retVal.Add(new S7FunctionBlockRow() { Command = "/D" }); break; case 0x0F: retVal.Add(new S7FunctionBlockRow() { Command = "+R" }); break; case 0x10: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSIN[MN] }); break; case 0x11: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opCOS[MN] }); break; case 0x12: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAN[MN] }); break; case 0x13: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLN[MN] }); break; case 0x14: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSQRT[MN] }); break; case 0x18: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opASIN[MN] }); break; case 0x19: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opACOS[MN] }); break; case 0x1A: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opATAN[MN] }); break; case 0x1b: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opEXP[MN] }); break; case 0x1C: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSQR[MN] }); break; } ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } brk2: break; case 0x61: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSLW[MN], Parameter = Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opSLW[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x64: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opRLD[MN], Parameter = Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opRLD[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x65: { switch (BD[pos + 1]) { case 0x00: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opBE[MN] }); //Result = Result + Memnoic.opBE[MN]; break; case 0x01: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opBEA[MN] }); //Result = Result + Memnoic.opBEA[MN]; break; } ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x68: { switch (BD[pos + 1]) { case 0x06: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opDTR[MN] }); //Result = Result + Memnoic.opDTR[MN]; break; case 0x07: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opNEGD[MN] }); //Result = Result + Memnoic.opNEGD[MN]; break; case 0x08: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opITB[MN] }); //Result = Result + Memnoic.opITB[MN]; break; case 0x0C: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opBTI[MN] }); //Result = Result + Memnoic.opBTI[MN]; break; case 0x0A: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opDTB[MN] }); //Result = Result + Memnoic.opDTB[MN]; break; case 0x0D: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opINVD[MN] }); //Result = Result + Memnoic.opINVD[MN]; break; case 0x0E: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opBTD[MN] }); //Result = Result + Memnoic.opBTD[MN]; break; case 0x12: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSLW[MN] }); //Result = Result + Memnoic.opSLW[MN]; break; case 0x13: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSLD[MN] }); //Result = Result + Memnoic.opSLD[MN]; break; case 0x17: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opRLD[MN] }); //Result = Result + Memnoic.opRLD[MN]; break; case 0x18: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opRLDA[MN] }); //Result = Result + Memnoic.opRLDA[MN]; break; case 0x1A: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAW[MN] }); //Result = Result + Memnoic.opTAW[MN]; break; case 0x1b: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAD[MN] }); //Result = Result + Memnoic.opTAD[MN]; break; case 0x1C: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opCLR[MN] }); //Result = Result + Memnoic.opCLR[MN]; break; case 0x1D: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSET[MN] }); //Result = Result + Memnoic.opSET[MN]; break; case 0x1E: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opITD[MN] }); //Result = Result + Memnoic.opITD[MN]; break; case 0x22: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSRW[MN] }); //Result = Result + Memnoic.opSRW[MN]; break; case 0x23: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSRD[MN] }); //Result = Result + Memnoic.opSRD[MN]; break; case 0x24: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSSI[MN] }); //Result = Result + Memnoic.opSSI[MN]; break; case 0x25: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSSD[MN] }); //Result = Result + Memnoic.opSSD[MN]; break; case 0x27: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opRRD[MN] }); //Result = Result + Memnoic.opRRD[MN]; break; case 0x28: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opRRDA[MN] }); //Result = Result + Memnoic.opRRDA[MN]; break; case 0x2C: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSAVE[MN] }); //Result = Result + Memnoic.opSAVE[MN]; break; case 0x2D: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opNOT[MN] }); //Result = Result + Memnoic.opNOT[MN]; break; case 0x2E: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opPUSH[MN] }); //Result = Result + Memnoic.opPUSH[MN]; break; case 0x37: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUD[MN] }); //Result = Result + Memnoic.opUD[MN]; break; case 0x34: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUW[MN], Parameter = "W#16#" + (libnodave.getU16from(BD, pos + 2)).ToString("X") }); //Result = Result + Memnoic.opUW[MN] + "W#16#" + // (Helper.GetWord(BD[pos + 2], BD[pos + 3])).ToString("X"); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; goto brk1; } break; case 0x36: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUD[MN], Parameter = "DW#16#" + (libnodave.getU32from(BD,pos + 2).ToString("X")) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5] }; pos += 6; goto brk1; } break; case 0x3A: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opMCRA[MN] }); //Result = Result + Memnoic.opMCRA[MN]; break; case 0x3b: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opMCRD[MN] }); //Result = Result + Memnoic.opMCRD[MN]; break; case 0x3C: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opMCRO[MN] }); //Result = Result + Memnoic.opMCRO[MN]; break; case 0x3D: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opMCRC[MN] }); //Result = Result + Memnoic.opMCRC[MN]; break; case 0x3E: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opPOP[MN] }); //Result = Result + Memnoic.opPOP[MN]; break; case 0x44: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opOW[MN], Parameter = "W#16#" + (libnodave.getU16from(BD, pos + 2)).ToString("X") }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; goto brk1; } break; case 0x46: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opOD[MN], Parameter = "DW#16#" + libnodave.getU32from(BD,pos + 2).ToString("X") }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5] }; pos += 6; goto brk1; } break; case 0x47: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opOD[MN] }); break; case 0x4E: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLEAVE[MN] }); break; case 0x54: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXOW[MN], Parameter = "W#16#" + (libnodave.getU16from(BD, pos + 2)).ToString("X") }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; goto brk1; } break; case 0x56: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXOD[MN], Parameter = "DW#16#" + libnodave.getU32from(BD, pos + 2).ToString("X") }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5] }; pos += 6; goto brk1; } break; case 0x57: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXOD[MN] }); break; case 0x5C: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opRND[MN] }); break; case 0x5D: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opRNDM[MN] }); break; case 0x5E: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opRNDP[MN] }); break; case 0x5F: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTRUNC[MN] }); break; default: { if ((BD[pos + 1] & 0x0F) == 0x01) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSSI[MN], Parameter = Convert.ToString((BD[pos + 1] >> 4) & 0x0F) }); else retVal.Add(new S7FunctionBlockRow() { Command = "err2" }); } break; } ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } brk1: break; case 0x69: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSRW[MN], Parameter = Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opSRW[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x6C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZV[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opZV[MN] + Memnoic.adZ[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x70: { switch (BD[pos + 1]) { case 0x02: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAK[MN] }); //Result = Result + Memnoic.opTAK[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x06: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adSTW[MN] }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x07: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adSTW[MN] }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x08: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLOOP[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x09: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPL[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x0b: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPA[MN], JumpWidth = libnodave.getS16from(BD,pos+2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; default: retVal.Add(new S7FunctionBlockRow() { Command = "err3" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; } } break; case 0x71: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSSD[MN], Parameter = Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opSSD[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x74: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opRRD[MN], Parameter = Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x75: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUC[MN], Parameter = Mnemonic.adFB[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x79: { string cmd = "", par = ""; if (BD[pos + 1] == 0x00) { cmd = "+I"; retVal.Add(new S7FunctionBlockRow() { Command = cmd }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } else { int LowByte = BD[pos + 1] & 0x0F; int HighByte = BD[pos + 1] & 0xF0; switch (LowByte) { case 0x00: case 0x08: cmd += (HighByte < 0x90) ? Mnemonic.opU[MN] : Mnemonic.opS[MN]; break; case 0x01: case 0x09: cmd += (HighByte < 0x90) ? Mnemonic.opUN[MN] : Mnemonic.opR[MN]; break; case 0x02: case 0x0A: cmd += (HighByte < 0x90) ? Mnemonic.opO[MN] : Mnemonic.opZUW[MN]; break; case 0x03: case 0x0B: cmd += (HighByte < 0x90) ? Mnemonic.opON[MN] : "err5"; //Ther is no Value for this??? break; case 0x04: case 0x0C: cmd += (HighByte < 0x90) ? Mnemonic.opX[MN] : Mnemonic.opFP[MN]; break; case 0x05: case 0x0D: cmd += (HighByte < 0x90) ? Mnemonic.opXN[MN] : Mnemonic.opFN[MN]; break; } switch (HighByte) { case 0x10: par += Mnemonic.adE[MN]; break; case 0x20: par += Mnemonic.adA[MN]; break; case 0x30: par += Mnemonic.adM[MN]; break; case 0x40: par += Mnemonic.adDBX[MN]; break; case 0x50: par += Mnemonic.adDIX[MN]; break; case 0x60: par += Mnemonic.adL[MN]; break; } if (LowByte < 0x08) par += "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; else par += "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } } break; case 0x7C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opR[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x7E: case 0xBE: { string cmd = "", par = ""; if (BD[pos + 1] == 0x00) { cmd = "err6"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } else { int LowByte = BD[pos + 1] & 0x0F; int HighByte = BD[pos + 1] & 0xF0; cmd = Mnemonic.opT[MN]; //if (LowByte>= 0x05 && LowByte<=0x09 || LowByte >) //cmd = (LowByte <= 0x07) ? Memnoic.opL[MN] : Memnoic.opT[MN]; if (LowByte <= 0x04|| ((LowByte >= 0x09) && LowByte <= 0x0c)) cmd = Mnemonic.opL[MN]; switch (HighByte) { case 0x00: switch (LowByte) { case 0x01: case 0x09: par += Mnemonic.adPEB[MN]; break; case 0x02: case 0x0A: par += Mnemonic.adPEW[MN]; break; case 0x03: case 0x0B: par += Mnemonic.adPED[MN]; break; case 0x05: case 0x0D: par += Mnemonic.adPAB[MN]; break; case 0x06: case 0x0E: par += Mnemonic.adPAW[MN]; break; case 0x07: case 0x0F: par += Mnemonic.adPAD[MN]; break; } break; case 0x10: switch (LowByte) { case 0x01: case 0x05: case 0x09: case 0x0D: par += Mnemonic.adEB[MN]; break; case 0x02: case 0x06: case 0x0A: case 0x0E: par += Mnemonic.adEW[MN]; break; case 0x03: case 0x07: case 0x0B: case 0x0F: par += Mnemonic.adED[MN]; break; } break; case 0x20: switch (LowByte) { case 0x01: case 0x05: case 0x09: case 0x0D: par += Mnemonic.adAB[MN]; break; case 0x02: case 0x06: case 0x0A: case 0x0E: par += Mnemonic.adAW[MN]; break; case 0x03: case 0x07: case 0x0B: case 0x0F: par += Mnemonic.adAD[MN]; break; } break; case 0x30: switch (LowByte) { case 0x01: case 0x05: case 0x09: case 0x0D: par += Mnemonic.adMB[MN]; break; case 0x02: case 0x06: case 0x0A: case 0x0E: par += Mnemonic.adMW[MN]; break; case 0x03: case 0x07: case 0x0B: case 0x0F: par += Mnemonic.adMD[MN]; break; } break; case 0x40: switch (LowByte) { case 0x01: case 0x05: case 0x09: case 0x0D: par += Mnemonic.adDBB[MN]; break; case 0x02: case 0x06: case 0x0A: case 0x0E: par += Mnemonic.adDBW[MN]; break; case 0x03: case 0x07: case 0x0B: case 0x0F: par += Mnemonic.adDBD[MN]; break; } break; case 0x50: switch (LowByte) { case 0x01: case 0x05: case 0x09: case 0x0D: par += Mnemonic.adDIB[MN]; break; case 0x02: case 0x06: case 0x0A: case 0x0E: par += Mnemonic.adDIW[MN]; break; case 0x03: case 0x07: case 0x0B: case 0x0F: par += Mnemonic.adDID[MN]; break; } break; case 0x60: switch (LowByte) { case 0x01: case 0x05: case 0x09: case 0x0D: par += Mnemonic.adLB[MN]; break; case 0x02: case 0x06: case 0x0A: case 0x0E: par += Mnemonic.adLW[MN]; break; case 0x03: case 0x07: case 0x0B: case 0x0F: par += Mnemonic.adLD[MN]; break; } break; } if (BD[pos] == 0x7E) par += Convert.ToString(libnodave.getU16from(BD, pos + 2)); else if (BD[pos] == 0xBE) if (LowByte < 0x09) par += "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; else par += "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; //new byte[] DBByte = null; if (retVal[retVal.Count - 1].Command == Mnemonic.opAUF[MN] && par.Substring(0, 2) == "DB")// && CombineDBOpenAndCommand) { ((S7FunctionBlockRow)retVal[retVal.Count - 1]).CombineDBAccess = true; //DBByte = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7; //par = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).Parameter + "." + par; //retVal.RemoveAt(retVal.Count - 1); } retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; if (DBByte != null) ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = Helper.CombineByteArray(DBByte, ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7); pos += 4; //old //retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); //((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; //pos += 4; } } break; case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + Convert.ToString(BD[pos] - 0x80) }); //Result = Result + Memnoic.opU[MN] + Memnoic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0x80); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0x88: case 0x89: case 0x8A: case 0x8B: case 0x8C: case 0x8D: case 0x8E: case 0x8F: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + Convert.ToString(BD[pos] - 0x88) }); //Result = Result + Memnoic.opO[MN] + Memnoic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0x88); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opS[MN], Parameter = Mnemonic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + Convert.ToString(BD[pos] - 0x90) }); //Result = Result + Memnoic.opS[MN] + Memnoic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0x90); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0x98: case 0x99: case 0x9A: case 0x9B: case 0x9C: case 0x9D: case 0x9E: case 0x9F: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = Mnemonic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + Convert.ToString(BD[pos] - 0x98) }); //Result = Result + Memnoic.opZUW[MN] + Memnoic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0x98); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xA0: case 0xA1: case 0xA2: case 0xA3: case 0xA4: case 0xA5: case 0xA6: case 0xA7: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = Mnemonic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + Convert.ToString(BD[pos] - 0xA0) }); //Result = Result + Memnoic.opUN[MN] + Memnoic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0xA0); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xA8: case 0xA9: case 0xAA: case 0xAB: case 0xAC: case 0xAD: case 0xAE: case 0xAF: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = Mnemonic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + Convert.ToString(BD[pos] - 0xA8) }); //Result = Result + Memnoic.opON[MN] + Memnoic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0xA8); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xB0: case 0xB1: case 0xB2: case 0xB3: case 0xB4: case 0xB5: case 0xB6: case 0xB7: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opR[MN], Parameter = Mnemonic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + Convert.ToString(BD[pos] - 0xB0) }); //Result = Result + Memnoic.opR[MN] + Memnoic.adM[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0xB0); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xB8: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opU[MN] + Memnoic.adZ[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xB9: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opO[MN] + Memnoic.adZ[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xBA: case 0xBB: { int LowByte = BD[pos + 1] & 0x0F; int HighByte = BD[pos + 1] & 0xF0; string cmd = "", par = ""; if (BD[pos + 1] == 0x00) { switch (BD[pos]) { case 0xBA: cmd = cmd + Mnemonic.opUO[MN]; break; case 0xBB: cmd = cmd + Mnemonic.opOO[MN]; break; } retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } else { cmd += HighByte < 0x80 ? Mnemonic.opL[MN] : Mnemonic.opT[MN]; switch (BD[pos]) { case 0xBA: switch (LowByte) { case 0x00: par += HighByte < 0x80 ? Mnemonic.adPEB[MN] : Mnemonic.adPAB[MN]; break; case 0x01: par += Mnemonic.adEB[MN]; break; case 0x02: par += Mnemonic.adAB[MN]; break; case 0x03: par += Mnemonic.adMB[MN]; break; case 0x04: par += Mnemonic.adDBB[MN]; break; case 0x05: par += Mnemonic.adDIB[MN]; break; case 0x06: par += Mnemonic.adLB[MN]; break; } break; case 0xBB: switch (LowByte) { case 0x00: par += HighByte < 0x80 ? Mnemonic.adPEW[MN] : Mnemonic.adPAW[MN]; break; case 0x01: par += Mnemonic.adEW[MN]; break; case 0x02: par += Mnemonic.adAW[MN]; break; case 0x03: par += Mnemonic.adMW[MN]; break; case 0x04: par += Mnemonic.adDBW[MN]; break; case 0x05: par += Mnemonic.adDIW[MN]; break; case 0x06: par += Mnemonic.adLW[MN]; break; case 0x08: par += HighByte < 0x80 ? Mnemonic.adPED[MN] : Mnemonic.adPAD[MN]; break; case 0x09: par += Mnemonic.adED[MN]; break; case 0x0A: par += Mnemonic.adAD[MN]; break; case 0x0B: par += Mnemonic.adMD[MN]; break; case 0x0C: par += Mnemonic.adDBD[MN]; break; case 0x0D: par += Mnemonic.adDID[MN]; break; case 0x0E: par += Mnemonic.adLD[MN]; break; } break; } switch (HighByte) { case 0x00: //Not from old programm, guessed Values! case 0x80: par += "[" + Mnemonic.adPED[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x10://Not from old programm, guessed Values! case 0x90: par += "[" + Mnemonic.adED[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x20://Not from old programm, guessed Values! case 0xa0: par += "[" + Mnemonic.adAD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x30: case 0xb0: par += "[" + Mnemonic.adMD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x40: case 0xc0: par += "[" + Mnemonic.adDBD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x50: case 0xd0: par += "[" + Mnemonic.adDID[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x60: case 0xe0: par += "[" + Mnemonic.adLD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; } retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } } break; case 0xBF: { string cmd = "", par = ""; if (BD[pos + 1] == 0x00) { cmd = ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } else { int LowByte = BD[pos + 1] & 0x0F; int HighByte = BD[pos + 1] & 0xF0; switch (LowByte) { case 0x00: cmd += Mnemonic.opU[MN]; break; case 0x01: cmd += Mnemonic.opUN[MN]; break; case 0x02: cmd += Mnemonic.opO[MN]; break; case 0x03: cmd += Mnemonic.opON[MN]; break; case 0x04: cmd += Mnemonic.opX[MN]; break; case 0x05: cmd += Mnemonic.opXN[MN]; break; case 0x06: cmd += Mnemonic.opL[MN]; break; case 0x08: cmd += Mnemonic.opFR[MN]; break; case 0x09: cmd += Mnemonic.opLC[MN]; break; case 0x0A: cmd += HighByte < 0x80 ? Mnemonic.opSA[MN] : Mnemonic.opZR[MN]; break; case 0x0B: cmd += HighByte < 0x80 ? Mnemonic.opSV[MN] : Mnemonic.opS[MN]; break; case 0x0C: cmd += Mnemonic.opSE[MN]; break; case 0x0D: cmd += HighByte < 0x80 ? Mnemonic.opSS[MN] : Mnemonic.opZV[MN]; break; case 0x0E: cmd += Mnemonic.opSI[MN]; break; case 0x0F: cmd += Mnemonic.opR[MN]; break; } if (HighByte < 0x80) par += Mnemonic.adT[MN]; else par += Mnemonic.adZ[MN]; switch (HighByte) { case 0x00://Guessed Value, not from old PRG case 0x80: par += "[" + Mnemonic.adPEW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x10://Guessed Value, not from old PRG case 0x90: par += "[" + Mnemonic.adEW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x20://Guessed Value, not from old Prg case 0xa0: par += "[" + Mnemonic.adAW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x30: case 0xb0: par += "[" + Mnemonic.adMW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x40: case 0xc0: par += "[" + Mnemonic.adDBW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x50: case 0xd0: par += "[" + Mnemonic.adDIW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; case 0x60: case 0xe0: par += "[" + Mnemonic.adLW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]"; break; } retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } } break; case 0xC0: case 0xC1: case 0xC2: case 0xC3: case 0xC4: case 0xC5: case 0xC6: case 0xC7: if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adE[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xC0) }); //Result = Result + Memnoic.opU[MN] + Memnoic.adE[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0xC0); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adA[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xC0) }); //Result = Result + Memnoic.opU[MN] + Memnoic.adA[MN] + Convert.ToString(BD[pos + 1] - 0x80) + "." + // Convert.ToString(BD[pos] - 0xC0); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xC8: case 0xC9: case 0xCA: case 0xCB: case 0xCC: case 0xCD: case 0xCE: case 0xCF: if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adE[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xC8) }); //Result = Result + Memnoic.opO[MN] + Memnoic.adE[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0xC8); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adA[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xC8) }); //Result = Result + Memnoic.opO[MN] + Memnoic.adA[MN] + Convert.ToString(BD[pos + 1] - 0x80) + "." + // Convert.ToString(BD[pos] - 0xC8); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xD0: case 0xD1: case 0xD2: case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD7: if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opS[MN], Parameter = Mnemonic.adE[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xD0) }); //Result = Result + Memnoic.opS[MN] + Memnoic.adE[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0xD0); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opS[MN], Parameter = Mnemonic.adA[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xD0) }); //Result = Result + Memnoic.opS[MN] + Memnoic.adA[MN] + Convert.ToString(BD[pos + 1] - 0x80) + "." + // Convert.ToString(BD[pos] - 0xD0); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xD8: case 0xD9: case 0xDA: case 0xDB: case 0xDC: case 0xDD: case 0xDE: case 0xDF: if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = Mnemonic.adE[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xD8) }); //Result = Result + Memnoic.opZUW[MN] + Memnoic.adE[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0xD8); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = Mnemonic.adA[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xD8) }); //Result = Result + Memnoic.opZUW[MN] + Memnoic.adA[MN] + Convert.ToString(BD[pos + 1] - 0x80) + "." + // Convert.ToString(BD[pos] - 0xD8); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xE0: case 0xE1: case 0xE2: case 0xE3: case 0xE4: case 0xE5: case 0xE6: case 0xE7: if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = Mnemonic.adE[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xE0) }); //Result = Result + Memnoic.opUN[MN] + Memnoic.adE[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0xE0); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adA[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xE0) }); //Result = Result + Memnoic.opUN[MN] + Memnoic.adA[MN] + Convert.ToString(BD[pos + 1] - 0x80) + "." + // Convert.ToString(BD[pos] - 0xE0); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xE8: case 0xE9: case 0xEA: case 0xEB: case 0xEC: case 0xED: case 0xEE: case 0xEF: if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = Mnemonic.adE[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xE8) }); //Result = Result + Memnoic.opON[MN] + Memnoic.adE[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0xE8); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = Mnemonic.adA[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xE8) }); //Result = Result + Memnoic.opON[MN] + Memnoic.adA[MN] + Convert.ToString(BD[pos + 1] - 0x80) + "." + // Convert.ToString(BD[pos] - 0xE8); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xF0: case 0xF1: case 0xF2: case 0xF3: case 0xF4: case 0xF5: case 0xF6: case 0xF7: if (BD[pos + 1] < 0x80) retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opR[MN], Parameter = Mnemonic.adE[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xF0) }); //Result = Result + Memnoic.opR[MN] + Memnoic.adE[MN] + Convert.ToString(BD[pos + 1]) + "." + // Convert.ToString(BD[pos] - 0xF0); else retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opR[MN], Parameter = Mnemonic.adA[MN] + Convert.ToString(BD[pos + 1] & 0x7F) + "." + Convert.ToString(BD[pos] - 0xF0) }); //Result = Result + Memnoic.opR[MN] + Memnoic.adA[MN] + Convert.ToString(BD[pos + 1] - 0x80) + "." + // Convert.ToString(BD[pos] - 0xF0); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xF8: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opU[MN] + Memnoic.adT[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xF9: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); //Result = Result + Memnoic.opO[MN] + Memnoic.adT[MN] + Convert.ToString(BD[pos + 1]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xFB: { switch (BD[pos + 1]) { case 0x00: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN] }); //Result = Result + Memnoic.opO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x01: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adB[MN] + "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opL[MN] + Memnoic.adB[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x02: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adW[MN] + "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opL[MN] + Memnoic.adW[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x03: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adD[MN] + "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opL[MN] + Memnoic.adD[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x05: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adB[MN] + "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opT[MN] + Memnoic.adB[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x06: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adW[MN] + "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opT[MN] + Memnoic.adW[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x07: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adD[MN] + "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opT[MN] + Memnoic.adD[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x09: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adB[MN] + "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opL[MN] + Memnoic.adB[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x0A: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adW[MN] + "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opL[MN] + Memnoic.adW[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x0b: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adD[MN] + "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opL[MN] + Memnoic.adD[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x0D: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adB[MN] + "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opT[MN] + Memnoic.adB[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x0E: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adW[MN] + "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opT[MN] + Memnoic.adW[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x0F: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opT[MN], Parameter = Mnemonic.adD[MN] + "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opT[MN] + Memnoic.adD[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x10: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opU[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x11: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opUN[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x12: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opO[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x13: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opON[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x14: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opX[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x15: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opXN[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x18: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opU[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x19: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opUN[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x1A: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opO[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x1b: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opON[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x1C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opX[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x1D: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opXN[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x20: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opS[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opS[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x21: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opR[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opR[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x22: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opZUW[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x24: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opFP[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opFP[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x25: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opFN[MN], Parameter = "[" + Mnemonic.adAR1[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opFN[MN] + "[" + Memnoic.adAR1[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x28: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opS[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opS[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x29: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opR[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opR[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x2A: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZUW[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opZUW[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x2C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opFP[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opFP[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x2D: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opFN[MN], Parameter = "[" + Mnemonic.adAR2[MN] + "," + Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]" }); //Result = Result + Memnoic.opFN[MN] + "[" + Memnoic.adAR2[MN] + "," + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x38: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDB[MN] + "[" + Mnemonic.adMW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); //Result = Result + Memnoic.opAUF[MN] + Memnoic.adDB[MN] + "[" + Memnoic.adMW[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x39: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDI[MN] + "[" + Mnemonic.adMW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); //Result = Result + Memnoic.opAUF[MN] + Memnoic.adDI[MN] + "[" + Memnoic.adMW[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x3C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adDBLG[MN] }); //Result = Result + Memnoic.opL[MN] + Memnoic.adDBLG[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x3D: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adDILG[MN] }); //Result = Result + Memnoic.opL[MN] + Memnoic.adDILG[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x48: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDB[MN] + "[" + Mnemonic.adDBW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); //Result = Result + Memnoic.opAUF[MN] + Memnoic.adDB[MN] + "[" + Memnoic.adDBW[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x49: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDI[MN] + "[" + Mnemonic.adDBW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); //Result = Result + Memnoic.opAUF[MN] + Memnoic.adDI[MN] + "[" + Memnoic.adDBW[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x4C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adDBNO[MN] }); //Result = Result + Memnoic.opL[MN] + Memnoic.adDBNO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x4D: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adDINO[MN] }); //Result = Result + Memnoic.opL[MN] + Memnoic.adDINO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x58: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDB[MN] + "[" + Mnemonic.adDIW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); //Result = Result + Memnoic.opAUF[MN] + Memnoic.adDB[MN] + "[" + Memnoic.adDIW[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x59: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDI[MN] + "[" + Mnemonic.adDIW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); //Result = Result + Memnoic.opAUF[MN] + Memnoic.adDI[MN] + "[" + Memnoic.adDIW[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x68: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDB[MN] + "[" + Mnemonic.adLW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); //Result = Result + Memnoic.opAUF[MN] + Memnoic.adDB[MN] + "[" + Memnoic.adLW[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x69: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDI[MN] + "[" + Mnemonic.adLW[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); //Result = Result + Memnoic.opAUF[MN] + Memnoic.adDI[MN] + "[" + Memnoic.adLW[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])) + "]"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x70: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUC[MN], Parameter = Mnemonic.adFC[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5], BD[pos + 6], BD[pos + 7] }; //Get Parameter Count int paranz = (BD[pos + 7] / 2) - 1; List<string> tmplst = new List<string>(); for (int n = 1; n <= paranz; n++) { tmplst.Add(Helper.GetFCPointer(BD[pos + 8], BD[pos + 9], BD[pos + 10], BD[pos + 11])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = Helper.CombineByteArray(((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7, new byte[] { BD[pos + 8], BD[pos + 9], BD[pos + 10], BD[pos + 11] }); pos += 4; } byte[] backup = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).ExtParameter = tmplst; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = backup; pos += 8; } break; case 0x30: case 0x40: case 0x50: case 0x60: { string par = ""; switch (BD[pos + 1] & 0xf0) { case 0x30: par = Mnemonic.adMW[MN]; break; case 0x40: par = Mnemonic.adDBW[MN]; break; case 0x50: par = Mnemonic.adDIW[MN]; break; case 0x60: par = Mnemonic.adLW[MN]; break; } retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUC[MN], Parameter = Mnemonic.adFC[MN] + "[" + par + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5], BD[pos + 6], BD[pos + 7] }; //Get Parameter Count int paranz = (BD[pos + 7] / 2) - 1; List<string> tmplst = new List<string>(); for (int n = 1; n <= paranz; n++) { tmplst.Add(Helper.GetFCPointer(BD[pos + 8], BD[pos + 9], BD[pos + 10], BD[pos + 11])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = Helper.CombineByteArray(((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7, new byte[] { BD[pos + 8], BD[pos + 9], BD[pos + 10], BD[pos + 11] }); pos += 4; } byte[] backup = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).ExtParameter = tmplst; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = backup; pos += 8; } break; case 0x32: case 0x42: case 0x52: case 0x62: { string par = ""; switch (BD[pos + 1] & 0xf0) { case 0x30: par = Mnemonic.adMW[MN]; break; case 0x40: par = Mnemonic.adDBW[MN]; break; case 0x60: par = Mnemonic.adLW[MN]; break; case 0x50: par = Mnemonic.adDIW[MN]; break; } retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUC[MN], Parameter = Mnemonic.adFB[MN] + "[" + par + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x41: case 0x51: case 0x61: { string par = ""; switch (BD[pos + 1]) { case 0x61: par = Mnemonic.adLW[MN]; break; case 0x41: par = Mnemonic.adDBW[MN]; break; case 0x51: par = Mnemonic.adDIW[MN]; break; } retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opCC[MN], Parameter = Mnemonic.adFC[MN] + "[" + par + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5], BD[pos + 6], BD[pos + 7] }; pos += 8; } break; case 0x43: case 0x53: case 0x63: { string par = ""; switch (BD[pos + 1] & 0xf0) { case 0x60: par = Mnemonic.adLW[MN]; break; case 0x40: par = Mnemonic.adDBW[MN]; break; case 0x50: par = Mnemonic.adDIW[MN]; break; } retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opCC[MN], Parameter = Mnemonic.adFB[MN] + "[" + par + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + "]" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x71: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opCC[MN], Parameter = Mnemonic.adFC[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5], BD[pos + 6], BD[pos + 7] }; pos += 8; } break; case 0x72: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUC[MN], Parameter = Mnemonic.adFB[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x73: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opCC[MN], Parameter = Mnemonic.adFB[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x74: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUC[MN], Parameter = Mnemonic.adSFC[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5], BD[pos + 6], BD[pos + 7] }; //Get Parameter Count int paranz = (BD[pos + 7] / 2) - 1; List<string> tmplst = new List<string>(); for (int n = 1; n <= paranz; n++) { tmplst.Add(Helper.GetFCPointer(BD[pos + 8], BD[pos + 9], BD[pos + 10], BD[pos + 11])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = Helper.CombineByteArray(((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7, new byte[] { BD[pos + 8], BD[pos + 9], BD[pos + 10], BD[pos + 11] }); pos += 4; } byte[] backup = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).ExtParameter = tmplst; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = backup; pos += 8; } break; case 0x76: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUC[MN], Parameter = Mnemonic.adSFB[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x78: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDB[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opAUF[MN] + Memnoic.adDB[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x79: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opAUF[MN], Parameter = Mnemonic.adDI[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opAUF[MN] + Memnoic.adDI[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x7C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTDB[MN] }); //Result = Result + Memnoic.opTDB[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x80: case 0xA0: case 0xB0: { string cmd = "", par = ""; cmd = Mnemonic.opU[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x81: case 0xA1: case 0xB1: { string cmd = "", par = ""; cmd = Mnemonic.opUN[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x82: case 0xA2: case 0xB2: { string cmd = "", par = ""; cmd = Mnemonic.opO[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x83: case 0xA3: case 0xB3: { string cmd = "", par = ""; cmd = Mnemonic.opON[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x84: case 0xA4: case 0xB4: { string cmd = "", par = ""; cmd = Mnemonic.opX[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x85: case 0xA5: case 0xB5: { string cmd = "", par = ""; cmd = Mnemonic.opXN[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x90: case 0xBB: { string cmd = "", par = ""; cmd = Mnemonic.opS[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x91: case 0xAF: case 0xBF: { string cmd = "", par = ""; cmd = Mnemonic.opR[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x92: { string cmd = "", par = ""; cmd = Mnemonic.opZUW[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x94: { string cmd = "", par = ""; cmd = Mnemonic.opFP[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x95: { string cmd = "", par = ""; cmd = Mnemonic.opFN[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xA6: case 0xb6: case 0xc1: case 0xc2: case 0xc3: { string cmd = "", par = ""; cmd = Mnemonic.opL[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xA8: case 0xb8: { string cmd = "", par = ""; cmd = Mnemonic.opFR[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xA9: { string cmd = "", par = ""; cmd = Mnemonic.opLC[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xAA: { string cmd = "", par = ""; cmd = Mnemonic.opSA[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xAB: { string cmd = "", par = ""; cmd = Mnemonic.opSV[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xAC: { string cmd = "", par = ""; cmd = Mnemonic.opSE[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xAD: { string cmd = "", par = ""; cmd = Mnemonic.opSS[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xAE: { string cmd = "", par = ""; cmd = Mnemonic.opSI[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xBA: { string cmd = "", par = ""; cmd = Mnemonic.opZR[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xBD: { string cmd = "", par = ""; cmd = Mnemonic.opZV[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xC5: case 0xC6: case 0xC7: //case 0xCB: { string cmd = "", par = ""; cmd = Mnemonic.opT[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xCB: { string cmd = "", par = ""; cmd = Mnemonic.opL[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "P##" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xD0: case 0xD2: { string cmd = "", par = ""; cmd = Mnemonic.opUC[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5], BD[pos + 6], BD[pos + 7] }; //Get Parameter Count int paranz = (BD[pos + 7] / 2) - 1; List<string> tmplst = new List<string>(); for (int n = 1; n <= paranz; n++) { tmplst.Add(Helper.GetFCPointer(BD[pos + 8], BD[pos + 9], BD[pos + 10], BD[pos + 11])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = Helper.CombineByteArray(((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7, new byte[] { BD[pos + 8], BD[pos + 9], BD[pos + 10], BD[pos + 11] }); pos += 4; } byte[] backup = ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).ExtParameter = tmplst; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = backup; pos += 8; } break; case 0xD8: { string cmd = "", par = ""; cmd = Mnemonic.opAUF[MN]; if (ParaList.Count >= (libnodave.getU16from(BD, pos + 2) / 2) - 1) par = "#" + ParaList[(libnodave.getU16from(BD, pos + 2) / 2) - 1]; else par = "unkown parameter (" + Convert.ToString(libnodave.getU16from(BD, pos + 2)) + ")"; retVal.Add(new S7FunctionBlockRow() { Command = cmd, Parameter = par }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xE0: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opU[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xE1: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opUN[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xE2: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opO[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xE3: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opON[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xE4: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opX[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xE5: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opXN[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xE6: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opL[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opL[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xE8: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opFR[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opFR[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xE9: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLC[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opLC[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xEA: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSA[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opSA[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xEB: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSV[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opSV[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xEC: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSE[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opSE[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xED: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSS[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opSS[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xEE: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSI[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opSI[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xEF: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opR[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opR[MN] + Memnoic.adT[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xF0: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opU[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xF1: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opUN[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xF2: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opO[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xF3: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opON[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xF4: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opX[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xF5: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opXN[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xF8: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opFR[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opFR[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xFA: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZR[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opZR[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xFB: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opS[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opS[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xfd: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opZV[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opZV[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xFF: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opR[MN], Parameter = Mnemonic.adZ[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opR[MN] + Memnoic.adZ[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; default: retVal.Add(new S7FunctionBlockRow() { Command = "errd" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; } } break; case 0xFC: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xFD: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = Mnemonic.adT[MN] + Convert.ToString(BD[pos + 1]) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; case 0xFE: { switch (BD[pos + 1]) { case 0x01: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR1[MN], Parameter = Mnemonic.adAR2[MN] }); //Result = Result + Memnoic.opLAR1[MN] + Memnoic.adAR2[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x02: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opPAR1[MN], Parameter = Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) }); //Result = Result + Memnoic.opPAR1[MN] + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x03: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR1[MN], Parameter = Helper.GetPointer(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5] }; pos += 6; } break; case 0x04: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR1[MN] }); //Result = Result + Memnoic.opLAR1[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x05: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR1[MN] }); //Result = Result + Memnoic.opTAR1[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x06: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opPAR1[MN] }); //Result = Result + Memnoic.opPAR1[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x08: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR[MN] }); //Result = Result + Memnoic.opTAR[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x09: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR1[MN], Parameter = Mnemonic.adAR2[MN] }); //Result = Result + Memnoic.opTAR1[MN] + Memnoic.adAR2[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x0A: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opPAR2[MN], Parameter = Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]) }); //Result = Result + Memnoic.opPAR2[MN] + // Helper.GetShortPointer(BD[pos + 2], BD[pos + 3]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x0b: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR2[MN], Parameter = Helper.GetPointer(BD,pos+2) }); //Result = Result + Memnoic.opLAR2[MN] + // Helper.GetPointer(BD[pos + 2], BD[pos + 3], BD[pos + 4], // BD[pos + 5]); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3], BD[pos + 4], BD[pos + 5] }; pos += 6; } break; case 0x0C: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR2[MN] }); //Result = Result + Memnoic.opLAR2[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x0D: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR2[MN] }); //Result = Result + Memnoic.opTAR2[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x0E: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opPAR2[MN] }); //Result = Result + Memnoic.opPAR2[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x33: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR1[MN], Parameter = Mnemonic.adMD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x37: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR1[MN], Parameter = Mnemonic.adMD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opTAR1[MN] + Memnoic.adMD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x3b: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR2[MN], Parameter = Mnemonic.adMD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opLAR2[MN] + Memnoic.adMD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x3F: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR2[MN], Parameter = Mnemonic.adMD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opTAR2[MN] + Memnoic.adMD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x43: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR1[MN], Parameter = Mnemonic.adDBD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opLAR1[MN] + Memnoic.adDBD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x47: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR1[MN], Parameter = Mnemonic.adDBD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opTAR1[MN] + Memnoic.adDBD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x4b: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR2[MN], Parameter = Mnemonic.adDBD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opLAR2[MN] + Memnoic.adDBD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x4F: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR2[MN], Parameter = Mnemonic.adDBD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opTAR2[MN] + Memnoic.adDBD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x53: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR1[MN], Parameter = Mnemonic.adDID[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opLAR1[MN] + Memnoic.adDID[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x57: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR1[MN], Parameter = Mnemonic.adDID[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opTAR1[MN] + Memnoic.adDID[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x5b: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR2[MN], Parameter = Mnemonic.adDID[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opLAR2[MN] + Memnoic.adDID[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x5F: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR2[MN], Parameter = Mnemonic.adDID[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opTAR2[MN] + Memnoic.adDID[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x63: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR1[MN], Parameter = Mnemonic.adLD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opLAR1[MN] + Memnoic.adLD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x67: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR1[MN], Parameter = Mnemonic.adLD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opTAR1[MN] + Memnoic.adLD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x6b: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opLAR2[MN], Parameter = Mnemonic.adLD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opLAR2[MN] + Memnoic.adLD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x6F: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opTAR2[MN], Parameter = Mnemonic.adLD[MN] + Convert.ToString(libnodave.getU16from(BD, pos + 2)) }); //Result = Result + Memnoic.opTAR2[MN] + Memnoic.adLD[MN] + // Convert.ToString(Helper.GetWord(BD[pos + 2], BD[pos + 3])); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xC0: case 0xD0: case 0xE0: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSRD[MN], Parameter = Convert.ToString(BD[pos + 1] - 0xC0) }); //Result = Result + Memnoic.opSRD[MN] + Convert.ToString(BD[pos + 1] - 0xC0); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; default: switch (BD[pos + 1] & 0xf0) { case 0xC0: case 0xD0: case 0xE0: retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSRD[MN], Parameter = Convert.ToString(BD[pos + 1] - 0xC0) }); //Result = Result + Memnoic.opSRD[MN] + Convert.ToString(BD[pos + 1] - 0xC0); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] {BD[pos], BD[pos + 1]}; pos += 2; break; default: retVal.Add(new S7FunctionBlockRow() {Command = "err 99"}); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] {BD[pos], BD[pos + 1]}; pos += 2; break; } break; } } break; case 0xFF: { switch (BD[pos + 1]) { case 0x00: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adOS[MN] }); //Result = Result + Memnoic.opU[MN] + Memnoic.adOS[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x01: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = Mnemonic.adOS[MN] }); //Result = Result + Memnoic.opUN[MN] + Memnoic.adOS[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x02: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adOS[MN] }); //Result = Result + Memnoic.opO[MN] + Memnoic.adOS[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x03: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = Mnemonic.adOS[MN] }); //Result = Result + Memnoic.opON[MN] + Memnoic.adOS[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x04: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = Mnemonic.adOS[MN] }); //Result = Result + Memnoic.opX[MN] + Memnoic.adOS[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x05: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = Mnemonic.adOS[MN] }); //Result = Result + Memnoic.opXN[MN] + Memnoic.adOS[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x08: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPS[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x10: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adOV[MN] }); //Result = Result + Memnoic.opU[MN] + Memnoic.adOV[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x11: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = Mnemonic.adOV[MN] }); //Result = Result + Memnoic.opUN[MN] + Memnoic.adOV[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x12: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adOV[MN] }); //Result = Result + Memnoic.opO[MN] + Memnoic.adOV[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x13: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = Mnemonic.adOV[MN] }); //Result = Result + Memnoic.opON[MN] + Memnoic.adOV[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x14: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = Mnemonic.adOV[MN] }); //Result = Result + Memnoic.opX[MN] + Memnoic.adOV[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x15: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = Mnemonic.adOV[MN] }); //Result = Result + Memnoic.opXN[MN] + Memnoic.adOV[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x18: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPO[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x20: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = ">0" }); //Result = Result + Memnoic.opU[MN] + ">0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x21: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = ">0" }); //Result = Result + Memnoic.opUN[MN] + ">0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x22: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = ">0" }); //Result = Result + Memnoic.opO[MN] + ">0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x23: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = ">0" }); //Result = Result + Memnoic.opON[MN] + ">0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x24: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = ">0" }); //Result = Result + Memnoic.opX[MN] + ">0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x25: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = ">0" }); //Result = Result + Memnoic.opXN[MN] + ">0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x28: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPP[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x40: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = "<0" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x41: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = "<0" }); //Result = Result + Memnoic.opUN[MN] + "<0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x42: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = "<0" }); //Result = Result + Memnoic.opO[MN] + "<0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x43: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = "<0" }); //Result = Result + Memnoic.opON[MN] + "<0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x44: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = "<0" }); //Result = Result + Memnoic.opX[MN] + "<0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x45: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = "<0" }); //Result = Result + Memnoic.opXN[MN] + "<0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x48: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPM[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x50: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adUO[MN] }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x51: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = Mnemonic.adUO[MN] }); //Result = Result + Memnoic.opUN[MN] + Memnoic.adUO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x52: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adUO[MN] }); //Result = Result + Memnoic.opO[MN] + Memnoic.adUO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x53: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = Mnemonic.adUO[MN] }); //Result = Result + Memnoic.opON[MN] + Memnoic.adUO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x54: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = Mnemonic.adUO[MN] }); //Result = Result + Memnoic.opX[MN] + Memnoic.adUO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x55: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = Mnemonic.adUO[MN] }); //Result = Result + Memnoic.opXN[MN] + Memnoic.adUO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x58: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPU[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x60: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = "<>0" }); //Result = Result + Memnoic.opU[MN] + "<>0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x61: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = "<>0" }); //Result = Result + Memnoic.opUN[MN] + "<>0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x62: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = "<>0" }); //Result = Result + Memnoic.opO[MN] + "<>0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x63: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = "<>0" }); //Result = Result + Memnoic.opON[MN] + "<>0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x64: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = "<>0" }); //Result = Result + Memnoic.opX[MN] + "<>0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x65: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = "<>0" }); //Result = Result + Memnoic.opXN[MN] + "<>0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x68: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPN[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); //Result = Result + Memnoic.opSPN[MN] + "(Springe " + // Helper.JumpStr(Helper.GetInt(BD[pos + 2], BD[pos + 3])) + " W)"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x78: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPBIN[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); //Result = Result + Memnoic.opSPBIN[MN] + "(Springe " + // Helper.JumpStr(Helper.GetInt(BD[pos + 2], BD[pos + 3])) + " W)"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x80: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = "==0" }); //Result = Result + Memnoic.opU[MN] + "==0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x81: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = "==0" }); //Result = Result + Memnoic.opUN[MN] + "==0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x82: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = "==0" }); //Result = Result + Memnoic.opO[MN] + "==0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x83: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = "==0" }); //Result = Result + Memnoic.opON[MN] + "==0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x84: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = "==0" }); //Result = Result + Memnoic.opX[MN] + "==0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x85: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = "==0" }); //Result = Result + Memnoic.opXN[MN] + "==0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0x88: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPZ[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); //Result = Result + Memnoic.opSPZ[MN] + "(Springe " + // Helper.JumpStr(Helper.GetInt(BD[pos + 2], BD[pos + 3])) + " W)"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0x98: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPBNB[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); //Result = Result + Memnoic.opSPBNB[MN] + "(Springe " + // Helper.JumpStr(Helper.GetInt(BD[pos + 2], BD[pos + 3])) + " W)"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xA0: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = ">=0" }); //Result = Result + Memnoic.opU[MN] + ">=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xA1: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = ">=0" }); //Result = Result + Memnoic.opUN[MN] + ">=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xA2: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = ">=0" }); //Result = Result + Memnoic.opO[MN] + ">=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xA3: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = ">=0" }); //Result = Result + Memnoic.opON[MN] + ">=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xA4: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = ">=0" }); //Result = Result + Memnoic.opX[MN] + ">=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xA5: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = ">=0" }); //Result = Result + Memnoic.opXN[MN] + ">=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xA8: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPPZ[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); //Result = Result + Memnoic.opSPPZ[MN] + "(Springe " + // Helper.JumpStr(Helper.GetInt(BD[pos + 2], BD[pos + 3])) + " W)"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xB8: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPBN[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); //Result = Result + Memnoic.opSPBN[MN] + "(Springe " + // Helper.JumpStr(Helper.GetInt(BD[pos + 2], BD[pos + 3])) + " W)"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xC0: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = "<=0" }); //Result = Result + Memnoic.opU[MN] + "<=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xC1: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = "<=0" }); //Result = Result + Memnoic.opUN[MN] + "<=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xC2: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = "<=0" }); //Result = Result + Memnoic.opO[MN] + "<=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xC3: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = "<=0" }); //Result = Result + Memnoic.opON[MN] + "<=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xC4: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = "<=0" }); //Result = Result + Memnoic.opX[MN] + "<=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xC5: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = "<=0" }); //Result = Result + Memnoic.opXN[MN] + "<=0"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xC8: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPMZ[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xD8: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPBB[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xE0: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opU[MN], Parameter = Mnemonic.adBIE[MN] }); //Result = Result + Memnoic.opU[MN] + Memnoic.adBIE[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xE1: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUN[MN], Parameter = Mnemonic.adBIE[MN] }); //Result = Result + Memnoic.opUN[MN] + Memnoic.adBIE[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xE2: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opO[MN], Parameter = Mnemonic.adBIE[MN] }); //Result = Result + Memnoic.opO[MN] + Memnoic.adBIE[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xE3: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opON[MN], Parameter = Mnemonic.adBIE[MN] }); //Result = Result + Memnoic.opON[MN] + Memnoic.adBIE[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xE4: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opX[MN], Parameter = Mnemonic.adBIE[MN] }); //Result = Result + Memnoic.opX[MN] + Memnoic.adBIE[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xE5: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXN[MN], Parameter = Mnemonic.adBIE[MN] }); //Result = Result + Memnoic.opXN[MN] + Memnoic.adBIE[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xE8: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPBI[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xF8: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opSPB[MN], JumpWidth = libnodave.getS16from(BD, pos + 2) }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; } break; case 0xF1: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opUNO[MN], }); //Result = Result + Memnoic.opUNO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xF3: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opONO[MN], }); //Result = Result + Memnoic.opONO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xF4: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXO[MN], }); //Result = Result + Memnoic.opXO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xF5: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opXNO[MN], }); //Result = Result + Memnoic.opXNO[MN]; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; case 0xFF: { retVal.Add(new S7FunctionBlockRow() { Command = Mnemonic.opNOP[MN], Parameter = "1" }); //Result = Result + Memnoic.opNOP[MN] + "1"; ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; } break; default: retVal.Add(new S7FunctionBlockRow() { Command = "errf" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1], BD[pos + 2], BD[pos + 3] }; pos += 4; break; } } break; default: retVal.Add(new S7FunctionBlockRow() { Command = "err7" }); ((S7FunctionBlockRow)retVal[retVal.Count - 1]).MC7 = new byte[] { BD[pos], BD[pos + 1] }; pos += 2; break; } //Result = Result + "\r\n"; } if (Networks != null) NetWork.NetworkCheck(ref Networks, ref retVal, ref counter, oldpos, pos, ref NWNr); //Go throug retval and add Symbols... if (prjBlkFld!=null) { if (prjBlkFld.SymbolTable!=null) { foreach (S7FunctionBlockRow awlRow in retVal) { string para = awlRow.Parameter.Replace(" ", ""); awlRow.SymbolTableEntry = prjBlkFld.SymbolTable.GetEntryFromOperand(para); } } } /* //Use the Jump-Marks from the Step7 project.... string[] jumpNames = null; int cntJ = 0; if (JumpMarks!=null) { string aa = System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(JumpMarks); int anzJ = JumpMarks[4] + JumpMarks[5]*0x100; jumpNames = new string[anzJ]; for (int n = 6; n < JumpMarks.Length; n++) { if (JumpMarks[n] != 0 && cntJ < anzJ) { if (jumpNames[cntJ] == null) jumpNames[cntJ] = ""; jumpNames[cntJ] = jumpNames[cntJ] + (char) JumpMarks[n]; } else cntJ++; } cntJ = 0; } */ //Build the Jumps: Create a List with the Addresses, Look for Jumps, Add Jump Marks int JumpCount = 0; int akBytePos = 0; Dictionary<int, S7FunctionBlockRow> ByteAdressNumerPLCFunctionBlocks = new Dictionary<int, S7FunctionBlockRow>(); foreach (S7FunctionBlockRow tmp in retVal) { if (tmp.ByteSize > 0) { ByteAdressNumerPLCFunctionBlocks.Add(akBytePos, tmp); akBytePos += tmp.ByteSize; } } akBytePos = 0; foreach (S7FunctionBlockRow tmp in retVal) { if (Helper.IsJump(tmp,MN)) { int jmpBytePos = 0; if (tmp.Command==Mnemonic.opSPL[MN]) jmpBytePos = akBytePos + ((tmp.JumpWidth+1)*4); else jmpBytePos = akBytePos + (tmp.JumpWidth*2); if (ByteAdressNumerPLCFunctionBlocks.ContainsKey(jmpBytePos)) { var target = ByteAdressNumerPLCFunctionBlocks[jmpBytePos]; if (target.Label == "") { target.Label = "M" + JumpCount.ToString().PadLeft(3, '0'); JumpCount++; } //Backup the MC7 Code, because the MC7 Code is always deleted when the command or parameter changes! byte[] backup = tmp.MC7; tmp.Parameter = target.Label; tmp.MC7 = backup; } else { byte[] backup = tmp.MC7; tmp.Parameter = "Error! JumpWidth :" + tmp.JumpWidth; tmp.MC7 = backup; } } akBytePos += tmp.ByteSize; } //End Building of the Jumps.*/ return retVal; }
private SymbolTable _GetSymTabForProject(S7ProgrammFolder myBlockFolder, bool showDeleted) { string tmpId1 = ""; var retVal = new SymbolTable() { Project = this }; int tmpId2 = 0; //Look in Sym-LinkList for ID { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "YDBs" + _DirSeperator + "YLNKLIST.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool) row["DELETED_FLAG"]) { if ((int) row["TOI"] == myBlockFolder.ID) { tmpId2 = (int) row["SOI"]; break; } } } if (tmpId2 == 0 && showDeleted) foreach (DataRow row in dbfTbl.Rows) { if ((int) row["TOI"] == myBlockFolder.ID) { tmpId2 = (int) row["SOI"]; retVal.Folder = ProjectFolder + "YDBs" + _DirSeperator + tmpId2.ToString() + _DirSeperator; break; } } } //Look fro Symlist Name { var dbfTbl = DBF.ParseDBF.ReadDBF(ProjectFolder + "YDBs" + _DirSeperator + "SYMLISTS.DBF", _ziphelper, _DirSeperator); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || showDeleted) { if ((int)row["_ID"] == tmpId2) { retVal.Name = (string)row["_UName"]; if ((bool)row["DELETED_FLAG"]) retVal.Name = "$$_" + retVal.Name; break; } } } } if (string.IsNullOrEmpty(retVal.Name) && !File.Exists(ProjectFolder + "YDBs" + _DirSeperator + tmpId2.ToString() + _DirSeperator + "SYMLIST.DBF")) return null; retVal.showDeleted = showDeleted; if (tmpId2 != 0) retVal.Folder = ProjectFolder + "YDBs" + _DirSeperator + tmpId2.ToString() + _DirSeperator; //Look in Sym-List /* if (tmpId2 != 0) { try { var dbfTbl = DBF.ParseDBF.ReadDBF(_projectfolder + "YDBs" + _DirSeperator + tmpId2.ToString() + _DirSeperator + "SYMLIST.DBF", _zipfile); foreach (DataRow row in dbfTbl.Rows) { if (!(bool)row["DELETED_FLAG"] || showDeleted) { SymbolTableEntry sym = new SymbolTableEntry(); sym.Symbol = (string)row["_SKZ"]; sym.Operand = (string)row["_OPHIST"]; sym.OperandIEC = (string)row["_OPIEC"]; sym.DataType = (string)row["_DATATYP"]; sym.Comment = (string)row["_COMMENT"]; if ((bool)row["DELETED_FLAG"]) sym.Comment = "(deleted) " + sym.Comment; retVal.Step7SymbolTableEntrys.Add(sym); } } } catch (Exception) { } } */ return retVal; }