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) + 4; int IntfValStart = IntfStart + IntfLength; //MC7Code[5] = BlockType //0x0a = DB //0x0b = SDB if ((MC7Code[5] == 0x0a) || (MC7Code[5] == 0x0b)) //Block is an Data block or System Data block { //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 //Block is an code block (FB, FC or OB) { 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); }
public static S7Block GetAWLBlock(byte[] MC7Code, MnemonicLanguage MnemoricLanguage, S7ProgrammFolder prjBlkFld) { var retBlock = ParseBlockHeaderAndFooterFromMC7(MC7Code, MnemoricLanguage); if (retBlock != null) { int IntfStart = MC7Start_or_DBBodyStart + retBlock.CodeSize + 3; int IntfLength = BitConverter.ToUInt16(MC7Code, IntfStart) + 4; int InitialValStart = IntfStart + IntfLength; if (retBlock.BlockType == PLCBlockType.DB || retBlock.BlockType == PLCBlockType.SDB) //Block is an Data block or System Data block { //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); } List <string> tmp = new List <string>(); //to hold the temporary parameter list while parsing the Interface 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); //Some blocks do not have current values. These can be identified by checking the MC7 code length. //the Interface Header is structured as follows /// 0 Block Type: 0x05 (DB) 0x10 (DI),... /// 1-2 Again Block Number or FB Number on a DI (but bytes swapped) /// 3-4 Interface Length minus this header (7 bytes) /// 5-6 Start Value Length byte[] startValues = null; int startValueLength = BitConverter.ToUInt16(interfaceBytes, 5); if (startValueLength > 0) { startValues = new byte[startValueLength]; Array.Copy(MC7Code, InitialValStart, startValues, 0, startValueLength); } //Parse the Interface from MC7 code ((S7DataBlock)retBlock).StructureFromMC7 = Parameter.GetInterface(interfaceBytes, startValues, actualValues, ref tmp, retBlock.BlockType, ((S7DataBlock)retBlock).IsInstanceDB, retBlock); } else //Block is an code block (FB, FC or OB) { 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!! //Some blocks do not have current values. These can be identified by checking the MC7 code length. //the Interface Header is structured as follows /// 0 Block Type: 0x05 (DB) 0x10 (DI),... /// 1-2 Again Block Number or FB Number on a DI (but bytes swapped) /// 3-4 Interface Length minus this header (7 bytes) /// 5-6 Start Value Length byte[] startValues = null; int startValueLength = BitConverter.ToUInt16(interfaceBytes, 5); if (retBlock.BlockType == PLCBlockType.FB && startValueLength > 0) //only FB's my have start values, even then they might not exist if none are defined (length = 0) { startValues = new byte[startValueLength]; Array.Copy(MC7Code, InitialValStart, startValues, 0, startValueLength); } List <string> ParaList = new List <string>(); ((S7FunctionBlock)retBlock).Parameter = Parameter.GetInterface(interfaceBytes, startValues, null /*there are never Current values in code blocks*/, ref ParaList, retBlock.BlockType, false, retBlock); int[] Networks = null; //Only if there are network descriptions. This generall only happens when the Block is empty and does not contain any code. //the Network list always starts after the Interface of the block and have the following format if (retBlock.SegmentTableSize > 0) { Networks = NetWork.GetNetworks(MC7Start_or_DBBodyStart + retBlock.CodeSize + retBlock.InterfaceSize, MC7Code); } ((S7FunctionBlock)retBlock).AWLCode = MC7toAWL.GetAWL(MC7Start_or_DBBodyStart, retBlock.CodeSize - 2, (int)MnemoricLanguage, MC7Code, Networks, ParaList, prjBlkFld, (S7FunctionBlock)retBlock); ((S7FunctionBlock)retBlock).Networks = NetWork.GetNetworksList((S7FunctionBlock)retBlock); } } return(retBlock); }
/// <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); }
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); }