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 void ReplaceStaticAccess(S7FunctionBlock myFct, S7ProgrammFolder myFld, S7ConvertingOptions myOpt) { if (myOpt.ReplaceDIAccessesWithSymbolNames && myFct.BlockType == PLCBlockType.FB) { List <FunctionBlockRow> retVal = new List <FunctionBlockRow>(); List <FunctionBlockRow> tempList = new List <FunctionBlockRow>(); bool LargeAccess = false; int add_adresse = 0; foreach (var functionBlockRow in myFct.AWLCode) { if (functionBlockRow.Command == "TAR2") { tempList.Add(functionBlockRow); LargeAccess = true; } else if (functionBlockRow.Command == "+AR2" && LargeAccess) { tempList.Add(functionBlockRow); add_adresse += Convert.ToInt32(Convert.ToDouble(((S7FunctionBlockRow)functionBlockRow).Parameter.Substring(2), new NumberFormatInfo() { NumberDecimalSeparator = "." })); } else if (((S7FunctionBlockRow)functionBlockRow).Parameter.Contains("[AR2,P#") && ((S7FunctionBlockRow)functionBlockRow).Parameter.Substring(0, 2) == "DI" && !LargeAccess) { string para = ((S7FunctionBlockRow)functionBlockRow).Parameter; ByteBitAddress adr = new ByteBitAddress(para.Substring(10, para.Length - 11)); var parRow = S7DataRow.GetDataRowWithAddress(myFct.Parameter, adr, true); if (parRow != null) { byte[] tmp = ((S7FunctionBlockRow)functionBlockRow).MC7; ((S7FunctionBlockRow)functionBlockRow).Parameter = "#" + parRow.StructuredName.Substring(parRow.StructuredName.IndexOf('.') + 1); ((S7FunctionBlockRow)functionBlockRow).MC7 = tmp; } retVal.Add(functionBlockRow); } else if (((S7FunctionBlockRow)functionBlockRow).Parameter.Contains("[AR2,P#") && ((S7FunctionBlockRow)functionBlockRow).Parameter.Substring(0, 2) == "DI" && LargeAccess) { /* * string para = ((S7FunctionBlockRow)functionBlockRow).Parameter; * ByteBitAddress adr = new ByteBitAddress(para.Substring(10, para.Length - 11)); * adr.ByteAddress += add_adresse; * var parRow = S7DataRow.GetDataRowWithAddress(myFct.Parameter, adr); * if (parRow != null) * { * byte[] tmp = ((S7FunctionBlockRow)functionBlockRow).MC7; * ((S7FunctionBlockRow)functionBlockRow).Parameter = "#" + parRow.StructuredName; * ((S7FunctionBlockRow)functionBlockRow).MC7 = tmp; * } * retVal.Add(functionBlockRow); */ LargeAccess = false; } else if (functionBlockRow.Command == "LAR2") { } else { LargeAccess = false; retVal.AddRange(tempList); tempList.Clear(); retVal.Add(functionBlockRow); } } myFct.AWLCode = retVal; } }
public static 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); }
public static S7Block GetAWLBlock(byte[] MC7Code, int MnemoricLanguage, S7ProgrammFolder prjBlkFld) { return(GetAWLBlock(MC7Code, (MnemonicLanguage)MnemoricLanguage, prjBlkFld)); }
//In this Class a UC is converted to a Call and also backwards... public static void ConvertUCToCall(S7FunctionBlock myFct, S7ProgrammFolder myFld, BlocksOfflineFolder myblkFld, S7ConvertingOptions myOpt, byte[] addInfoFromBlock) { if (myOpt.GenerateCallsfromUCs) { int inBld = 0; //1=nach BLD 1 S7FunctionBlockRow newRow = null; Dictionary <string, string> Parameters = new Dictionary <string, string>(); List <FunctionBlockRow> retVal = new List <FunctionBlockRow>(); List <FunctionBlockRow> tempList = new List <FunctionBlockRow>(); string registerDi = "DI"; string registerDb = ""; string registerAkku1 = ""; string registerAkku2 = ""; string registerAR1 = ""; string registerAR2 = ""; string diName = ""; string akPar = ""; string db = ""; string label = ""; string akku = ""; bool afterCall = false; bool multiInstance = false; int multiInstanceOffset = 0; Pointer ar2Addr = new Pointer(0, 0); S7FunctionBlockRow callRow = null; for (int n = 0; n < myFct.AWLCode.Count; n++) { S7FunctionBlockRow row = (S7FunctionBlockRow)myFct.AWLCode[n]; if (row.Command == Mnemonic.opBLD[(int)myOpt.Mnemonic] && (row.Parameter == "1" || row.Parameter == "7" || row.Parameter == "3" || row.Parameter == "16" || row.Parameter == "14") && inBld == 0) { retVal.AddRange(tempList); tempList.Clear(); Parameters.Clear(); db = ""; label = row.Label; inBld = Convert.ToInt32(row.Parameter); newRow = null; afterCall = false; callRow = null; diName = ""; multiInstance = false; multiInstanceOffset = 0; ar2Addr = new Pointer(0, 0); tempList.Add(row); } else if (inBld == 1 || inBld == 7) { #region FC Aufruf tempList.Add(row); if (row.Command == "=" && n > 0 && myFct.AWLCode[n - 1].Command == Mnemonic.opBLD[(int)myOpt.Mnemonic]) { //Do nothing, but this line needs to be there! } else if (row.Command == Mnemonic.opU[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opUN[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opO[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opON[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opO[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opON[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opX[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opXN[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opL[(int)myOpt.Mnemonic]) { akPar = row.Parameter; } else if (row.Command == Mnemonic.opAUF[(int)myOpt.Mnemonic]) { db = row.Parameter + "."; } else if (row.Command == Mnemonic.opCLR[(int)myOpt.Mnemonic]) { akPar = "FALSE"; } else if (row.Command == Mnemonic.opSET[(int)myOpt.Mnemonic]) { akPar = "TRUE"; } else if (row.Command == Mnemonic.opTAR2[(int)myOpt.Mnemonic]) { //look what we need to do here!!! } else if (row.Command == Mnemonic.opPAR2[(int)myOpt.Mnemonic]) { //look what we need to do here!!! } else if (row.Command == Mnemonic.opLAR2[(int)myOpt.Mnemonic]) { //look what we need to do here!!! } else if (row.Command == Mnemonic.opLAR1[(int)myOpt.Mnemonic]) { //look what we need to do here!!! } else if ((row.Command == "=") && akPar != "") { if (afterCall == false) { string key = row.Parameter.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", ""); if (!Parameters.ContainsKey(key)) { Parameters.Add("P#V " + key, db + akPar); } } else { string key = akPar.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", ""); if (!Parameters.ContainsKey(key)) { Parameters.Add("P#V " + key, db + row.Parameter); } } akPar = ""; db = ""; } else if (row.Command == Mnemonic.opT[(int)myOpt.Mnemonic] && akPar != "") { if (afterCall == false) { string key = row.Parameter.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", ""); //Fix for replace db accesses with symbols if (myOpt.ReplaceDBAccessesWithSymbolNames && db != "") { string dbnr = db.Substring(0, db.Length - 1); string dbSymbol = Helper.TryGetSymbolFromOperand(myblkFld, dbnr); db = (dbSymbol != null ? "\"" + dbSymbol + "\"" : dbnr) + "."; akPar = Helper.TryGetStructuredName(myblkFld, dbnr, akPar); } //end fix if (!Parameters.ContainsKey(key)) { Parameters.Add("P#V " + key + ".0", db + akPar); } } else { string key = akPar.Replace("L", "").Replace("W", "").Replace("B", "").Replace("D", ""); if (!Parameters.ContainsKey("P#V " + key)) { Parameters.Add("P#V " + key, db + row.Parameter); } } akPar = ""; db = ""; } else if (row.Command == Mnemonic.opT[(int)myOpt.Mnemonic] && akPar == "") { //look what we need to do here!!! } else if (row.Command == Mnemonic.opUC[(int)myOpt.Mnemonic]) { //Commands after a Call --> Out-Para callRow = row; afterCall = true; } else if (row.Command == Mnemonic.opBLD[(int)myOpt.Mnemonic] && (row.Parameter == "2" || row.Parameter == "8")) { //Block Interface auslesen (von FC oder vom Programm) S7DataRow para = myblkFld.GetInterface(callRow.Parameter); newRow = new S7FunctionBlockRow(); newRow.Command = Mnemonic.opCALL[(int)myOpt.Mnemonic]; newRow.Parent = callRow.Parent; newRow.Parameter = callRow.Parameter; newRow.CallParameter = new List <S7FunctionBlockParameter>(); for (int i = 0; i < callRow.ExtParameter.Count; i++) { string s = callRow.ExtParameter[i]; string parnm = ""; S7DataRow akRow = Parameter.GetFunctionParameterFromNumber(para, i); if (akRow != null) { parnm = akRow.Name + ""; } else { parnm = "$$undef"; } S7FunctionBlockParameter newPar = new S7FunctionBlockParameter(newRow); newPar.Name = parnm; if (akRow != null) { newPar.ParameterDataType = akRow.DataType; if (akRow.Parent.Name == "OUT") { newPar.ParameterType = S7FunctionBlockParameterDirection.OUT; } else if (akRow.Parent.Name == "IN_OUT") { newPar.ParameterType = S7FunctionBlockParameterDirection.IN_OUT; } else { newPar.ParameterType = S7FunctionBlockParameterDirection.IN; } } if (akRow != null) { int posL = s.IndexOf(' '); int ak_address = 0; if (posL >= 0) { ak_address = Convert.ToInt32(s.Substring(posL + 1).Split('.')[0]); } else { ak_address = Convert.ToInt32(s.Substring(2).Split('.')[0]) * 8 + Convert.ToInt32(s.Substring(2).Split('.')[1]); } int lokaldata_address = -1; if (s.Substring(0, 3) == "P#V") { lokaldata_address = Convert.ToInt32(s.Substring(4).Split('.')[0]); } if (akRow.DataType == S7DataRowType.STRING || akRow.DataType == S7DataRowType.DATE_AND_TIME || akRow.DataType == S7DataRowType.STRUCT || akRow.DataType == S7DataRowType.UDT || akRow.DataType == S7DataRowType.POINTER || akRow.IsArray) { string p1 = ""; string p2 = ""; Parameters.TryGetValue("P#V " + (lokaldata_address + 0).ToString() + ".0", out p1); Parameters.TryGetValue("P#V " + (lokaldata_address + 2).ToString() + ".0", out p2); string tmp = ""; if (p1 != "" && p1 != "0") { tmp += "P#DB" + p1 + "." + (p2 == null ? "0" : p2.Substring(2)); } else { tmp += p2; } newPar.Value = tmp; newRow.CallParameter.Add(newPar); } else if (akRow.DataType == S7DataRowType.ANY) { string tmp = s; if (Parameters.ContainsKey("P#V " + (lokaldata_address + 0).ToString() + ".0") && Parameters.ContainsKey("P#V " + (lokaldata_address + 2).ToString() + ".0") && Parameters.ContainsKey("P#V " + (lokaldata_address + 4).ToString() + ".0") && Parameters.ContainsKey("P#V " + (lokaldata_address + 6).ToString() + ".0")) { string p1 = Parameters["P#V " + (lokaldata_address + 0).ToString() + ".0"]; string p2 = Parameters["P#V " + (lokaldata_address + 2).ToString() + ".0"]; string p3 = Parameters["P#V " + (lokaldata_address + 4).ToString() + ".0"]; string p4 = Parameters["P#V " + (lokaldata_address + 6).ToString() + ".0"]; //Fix for wrong construction of any pointers var anyPtr = new S7AnyPointer(p1, p2, p3, p4); if (myOpt.ReplaceDBAccessesWithSymbolNames) { //TODO: make the any pointer symbolic. tmp = "" + anyPtr.ToString(); } else { tmp = anyPtr.ToString(); } //end fix //tmp = "P#"; //if (p3 != "0") // tmp += "DB" + p3 + "."; //tmp += p4.Substring(2); //tmp += " BYTE "; //Todo Parse Byte 1 if the Type is Byte! //tmp += p2; } newPar.Value = tmp; newRow.CallParameter.Add(newPar); } else { if (Parameters.ContainsKey(s)) { string par = Parameters[s]; if (akRow.DataType == S7DataRowType.S5TIME && par[0] >= '0' && par[0] <= '9') { newPar.Value = Helper.GetS5Time( BitConverter.GetBytes(Convert.ToInt32(par))[1], BitConverter.GetBytes(Convert.ToInt32(par))[0]); } else if (akRow.DataType == S7DataRowType.TIME && par[0] >= '0' && par[0] <= '9') { newPar.Value = Helper.GetDTime(BitConverter.GetBytes(Convert.ToInt32(par)), 0); } else if (akRow.DataType == S7DataRowType.CHAR && par[0] == 'B') { newPar.Value = (char)Int32.Parse(par.Substring(5), System.Globalization.NumberStyles.AllowHexSpecifier) + "'"; } else if (akRow.DataType == S7DataRowType.REAL) { var bt = new byte[4]; libnodave.putS32at(bt, 0, Int32.Parse(par.Substring(2))); var real = libnodave.getFloatfrom(bt, 0); newPar.Value = real.ToString("e6", CultureInfo.InvariantCulture); } else { newPar.Value = Parameters[s]; } } else { if (akRow.DataType == S7DataRowType.BOOL) { newPar.Value = s.Substring(2).Replace('V', 'L'); } else if (akRow.DataType == S7DataRowType.BLOCK_DB) { newPar.Value = "DB" + ak_address.ToString(); } else if (akRow.DataType == S7DataRowType.BLOCK_FB) { newPar.Value = "FB" + ak_address.ToString(); } else if (akRow.DataType == S7DataRowType.BLOCK_FC) { newPar.Value = "FC" + ak_address.ToString(); } else if (akRow.DataType == S7DataRowType.BLOCK_SDB) { newPar.Value = "SDB" + ak_address.ToString(); } else if (akRow.DataType == S7DataRowType.TIMER) { newPar.Value = Mnemonic.adT[(int)myOpt.Mnemonic] + ak_address.ToString(); } else if (akRow.DataType == S7DataRowType.COUNTER) { newPar.Value = Mnemonic.adZ[(int)myOpt.Mnemonic] + ak_address.ToString(); } else { string ber = ""; if (s.Substring(0, 5) == "P#DBX") { ber = "DB"; } else if (s.Substring(0, 5) == "P#DIX") { ber = "DI"; } else { ber = s.Substring(2, 1); } if (akRow.ByteLength == 1) { ber += "B"; } else if (akRow.ByteLength == 2) { ber += "W"; } else if (akRow.ByteLength == 4) { ber += "D"; } var access = ber.Replace('V', 'L') + ak_address; //fix for temporary area not replaced with symbolnames if (myOpt.ReplaceLokalDataAddressesWithSymbolNames) { var tempSymbol = S7DataRow.GetDataRowWithAddress(myFct.Parameter, new ByteBitAddress(ak_address, 0)); if (tempSymbol != null) { access = "#" + tempSymbol.StructuredName.Replace("TEMP.", ""); } } newPar.Value = access; } } newRow.CallParameter.Add(newPar); } } } newRow.CombinedCommands = tempList; newRow.Label = label; int sz = 0; foreach (var functionBlockRow in newRow.CombinedCommands) { sz += ((S7FunctionBlockRow)functionBlockRow).ByteSize; } byte[] mcges = new byte[sz]; sz = 0; foreach (var functionBlockRow in newRow.CombinedCommands) { Array.Copy(((S7FunctionBlockRow)functionBlockRow).MC7, 0, mcges, sz, ((S7FunctionBlockRow)functionBlockRow).ByteSize); sz += ((S7FunctionBlockRow)functionBlockRow).ByteSize; } newRow.MC7 = mcges; retVal.Add(newRow); Parameters.Clear(); tempList = new List <FunctionBlockRow>(); inBld = 0; newRow = null; } else { retVal.AddRange(tempList); tempList.Clear(); inBld = 0; } #endregion } else if (inBld == 3 || inBld == 16 || inBld == 14) { #region FB Aufruf tempList.Add(row); if (row.Command == "=" && n > 0 && myFct.AWLCode[n - 1].Command == Mnemonic.opBLD[(int)myOpt.Mnemonic]) { //Do nothing, but this line needs to be there! } else if (row.Command == Mnemonic.opTDB[(int)myOpt.Mnemonic]) { //Do nothing, but this line needs to be there! } else if (row.Command == Mnemonic.opBLD[(int)myOpt.Mnemonic] && row.Parameter == "11") { //whatever this BLD 11 in the FB Calls means... } else if (row.Command == Mnemonic.opTAR2[(int)myOpt.Mnemonic]) { if (ar2Addr.MemoryArea == MemoryArea.None) { akPar = "P#DIX " + ar2Addr.ToString(); } else { akPar = ar2Addr.ToString(myOpt.Mnemonic); } } else if (row.Command == Mnemonic.opLAR2[(int)myOpt.Mnemonic]) { if (row.Parameter.StartsWith("P#")) { ar2Addr = new Pointer(row.Parameter.Substring(2)); } else { ar2Addr.ByteAddress = 0; ar2Addr.BitAddress = 0; } } else if (row.Command == Mnemonic.opPAR2[(int)myOpt.Mnemonic]) { ar2Addr += new Pointer(row.Parameter); } else if (row.Command == Mnemonic.opAUF[(int)myOpt.Mnemonic] && (tempList.Count == 4)) { diName = row.Parameter; } else if (row.Command == Mnemonic.opAUF[(int)myOpt.Mnemonic] && row.Parameter.Contains("[") && (tempList.Count == 6)) { multiInstance = true; diName = ""; } else if (row.Command == Mnemonic.opU[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opUN[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opO[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opON[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opO[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opON[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opX[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opXN[(int)myOpt.Mnemonic] || row.Command == Mnemonic.opL[(int)myOpt.Mnemonic]) { akPar = db + row.Parameter; db = ""; } else if (row.Command == Mnemonic.opAUF[(int)myOpt.Mnemonic]) { db = row.Parameter + "."; } else if (row.Command == "CLR") { akPar = "FALSE"; } else if (row.Command == "SET") { akPar = "TRUE"; } else if ((row.Command == "=") && akPar != "") { if (afterCall == false) { if (!Parameters.ContainsKey(row.Parameter)) { Parameters.Add(row.Parameter, akPar); } } else { if (!Parameters.ContainsKey(akPar)) { Parameters.Add(akPar, row.Parameter); } } akPar = ""; db = ""; } else if (row.Command == Mnemonic.opT[(int)myOpt.Mnemonic] && akPar != "") { if (afterCall == false) { if (!Parameters.ContainsKey(row.Parameter)) { Parameters.Add(row.Parameter, akPar); } } else { if (!Parameters.ContainsKey(akPar)) { Parameters.Add(akPar, row.Parameter); } } akPar = ""; db = ""; } else if (row.Command == Mnemonic.opT[(int)myOpt.Mnemonic]) { if (afterCall == false) { if (!Parameters.ContainsKey(row.Parameter)) { Parameters.Add(row.Parameter, ""); } } akPar = ""; db = ""; } else if (row.Command == Mnemonic.opUC[(int)myOpt.Mnemonic]) { multiInstanceOffset = 0; for (int j = tempList.Count - 2; j > -1; j--) { if (tempList[j].Command == Mnemonic.opPAR2[(int)myOpt.Mnemonic]) { multiInstanceOffset += (int)double.Parse((((S7FunctionBlockRow)tempList[j]).Parameter.Substring(2)), CultureInfo.InvariantCulture); } break; } //Commands after a Call --> Out-Para callRow = row; afterCall = true; } else if (row.Command == Mnemonic.opBLD[(int)myOpt.Mnemonic] && (row.Parameter == "4" || row.Parameter == "17" || row.Parameter == "15")) { //Block Interface auslesen (von FC oder vom Programm) S7DataRow para = myblkFld.GetInterface(callRow.Parameter); newRow = new S7FunctionBlockRow(); newRow.Parent = callRow.Parent; newRow.Command = Mnemonic.opCALL[(int)myOpt.Mnemonic]; newRow.Parameter = callRow.Parameter; if (diName.Length > 2 && !diName.StartsWith("#")) { newRow.DiName = "DI" + int.Parse(diName.Substring(2)); } else if (diName.StartsWith("#")) { newRow.DiName = diName; } newRow.CallParameter = new List <S7FunctionBlockParameter>(); if (para != null) { var allPar = para.Children.Where(itm => itm.Name == "IN" || itm.Name == "IN_OUT" || itm.Name == "OUT"); foreach (var s7DataRowMain in allPar) { foreach (var s7DataRow in s7DataRowMain.Children) { S7FunctionBlockParameter newPar = new S7FunctionBlockParameter(newRow); newPar.Name = s7DataRow.Name; string par = null; if (!multiInstance) { Parameters.TryGetValue(((S7DataRow)s7DataRow).BlockAddressInDbFormat.Replace("DB", "DI"), out par); } else if (((S7DataRow)s7DataRow).DataType == S7DataRowType.ANY) { var anySizeAddr = ((S7DataRow)s7DataRow).BlockAddress.ByteAddress + multiInstanceOffset + 2; var anyPosAddr = ((S7DataRow)s7DataRow).BlockAddress.ByteAddress + multiInstanceOffset + 6; string anySize = ""; string anyPos = ""; Parameters.TryGetValue("DIW[AR2,P#" + anySizeAddr + ".0]", out anySize); Parameters.TryGetValue("DID[AR2,P#" + anyPosAddr + ".0]", out anyPos); par = anyPos + " BYTE " + anySize; } else { var addr = ((S7DataRow)s7DataRow).BlockAddressInDbFormat; if (!string.IsNullOrEmpty(addr)) { var addrTp = addr.Substring(0, 3).Replace("DB", "DI"); double bytepos = double.Parse(addr.Substring(3), CultureInfo.InvariantCulture) + multiInstanceOffset; Parameters.TryGetValue(addrTp + "[AR2,P#" + bytepos.ToString("0.0", CultureInfo.InvariantCulture) + "]", out par); } } if (par != null && par.Contains("[AR2")) { newPar.Value = par; var addr = par.Substring(10); addr = addr.Substring(0, addr.Length - 1); var pRow = S7DataRow.GetDataRowWithAddress(myFct.Parameter.Children.Where(itm => itm.Name != "TEMP").Cast <S7DataRow>(), new ByteBitAddress(addr)); if (pRow != null) { newPar.Value = ((S7DataRow)pRow).StructuredName.Substring(((S7DataRow)pRow).StructuredName.IndexOf('.') + 1); } } else { switch (((S7DataRow)s7DataRow).DataType) { case S7DataRowType.BLOCK_DB: newPar.Value = "DB" + par; break; case S7DataRowType.BLOCK_FC: newPar.Value = "FC" + par; break; case S7DataRowType.BLOCK_FB: newPar.Value = "FB" + par; break; case S7DataRowType.TIMER: newPar.Value = Mnemonic.adT[(int)myOpt.Mnemonic] + par.ToString(); break; case S7DataRowType.COUNTER: newPar.Value = Mnemonic.adZ[(int)myOpt.Mnemonic] + par.ToString(); break; case S7DataRowType.TIME: if (par != null && par.StartsWith("L#")) { var arr = BitConverter.GetBytes(Convert.ToInt32(par.Substring(2))); Array.Reverse(arr); newPar.Value = Helper.GetDTime(arr, 0); } else { newPar.Value = par; } break; default: newPar.Value = par; break; } } newRow.CallParameter.Add(newPar); } } } newRow.CombinedCommands = tempList; newRow.Label = label; int sz = 0; foreach (var functionBlockRow in newRow.CombinedCommands) { sz += ((S7FunctionBlockRow)functionBlockRow).ByteSize; } byte[] mcges = new byte[sz]; sz = 0; foreach (var functionBlockRow in newRow.CombinedCommands) { Array.Copy(((S7FunctionBlockRow)functionBlockRow).MC7, 0, mcges, sz, ((S7FunctionBlockRow)functionBlockRow).ByteSize); sz += ((S7FunctionBlockRow)functionBlockRow).ByteSize; } newRow.MC7 = mcges; retVal.Add(newRow); Parameters.Clear(); tempList = new List <FunctionBlockRow>(); inBld = 0; newRow = null; } else { retVal.AddRange(tempList); tempList.Clear(); inBld = 0; } #endregion } else { retVal.Add(row); } } myFct.AWLCode = retVal; } }
private void Button_Click_2(object sender, RoutedEventArgs e) { myblkFld = SelectProjectPart.SelectS7ProgrammFolder(); }
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); }
override internal 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); } } }
//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; } }
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); }
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); }