protected override void LoadProject() { _projectLoaded = true; //Read Step5 Project into a Byte-Array Stream fsProject = _ziphelper.GetReadStream(_projectfilename); s5ProjectByteArray = new byte[_ziphelper.GetStreamLength(_projectfilename, fsProject)]; fsProject.Read(s5ProjectByteArray, 0, s5ProjectByteArray.Length); fsProject.Close(); //Read the Project Name ProjectName = System.Text.Encoding.UTF7.GetString(s5ProjectByteArray, 0x08, 8); //Read the Project Size Size = s5ProjectByteArray[0x14] + s5ProjectByteArray[0x15] * 0x100; //Create the main Project Folder ProjectStructure = new Step5ProgrammFolder() { Project = this, Name = this.ToString() }; _allFolders.Add(ProjectStructure); //int startpos = s5ProjectByteArray[0x12] * 0x80; int anz_sections = s5ProjectByteArray[0x16]; List <int> sections_lst = new List <int>(); for (int j = 0; j < anz_sections; j++) { int pos = 0x44 + j * 19; sections_lst.Add(s5ProjectByteArray[pos + 15] + s5ProjectByteArray[pos + 16] * 0x100); } Step5BlocksFolder blkFld = new Step5BlocksFolder() { Name = "Blocks", Project = this, Parent = ProjectStructure }; BlocksFolder = blkFld; ProjectStructure.SubItems.Add(blkFld); //int section_start = startpos; int n = 0; List <int> ByteAddressOFExistingBlocks = new List <int>(); foreach (int secpos in sections_lst) { int section_start = secpos * 0x80; /* The len for a Section is not always calculated right, so if the Section does not begin with the filename add 0x80 until it works */ /* But I don't know why it's wrong */ /* * while (System.Text.Encoding.UTF7.GetString(s5ProjectByteArray, section_start, 8) != ProjectName) * { * section_start += 0x80; * if (section_start>=s5ProjectByteArray.Length) * break; * } */ if (section_start >= s5ProjectByteArray.Length) { break; } //if (section_start == 0x1580) //only for debbuging // section_start = section_start; //Don't know what this Byte means, maybe it describes wich Blocks are in the Section? int section_header_type = s5ProjectByteArray[section_start + 8]; int akanz = 0; int anzbst = s5ProjectByteArray[section_start + 22]; List <byte[]> bstHeaders = new List <byte[]>(); for (int j = 0; j < anzbst; j++) { byte[] tmp = new byte[15]; Array.Copy(s5ProjectByteArray, section_start + 68 + j * 15, tmp, 0, 15); bstHeaders.Add(tmp); } //int section_size = ((s5ProjectByteArray[section_start + 21] * 0x100) + s5ProjectByteArray[section_start + 20]) * 0x80; //if (section_size == 0) //only for debbuging // section_size = section_size; /* * int section_header_size = anzbst * 15 + 68; * section_header_size = (section_header_size / 0x80) * 0x80; * if ((anzbst * 15 + 68) % 0x80 != 0) * section_header_size += 0x80; */ //Don't know wich Information is in the Section Header! int section_header_size = s5ProjectByteArray[section_start + 18] * 0x80; //Read the Block normaly (using the Section-Headers) { //for (int n = blkstart + blkheadersize; n < blkstart + blksize /* s5ProjectByteArray.Length - 2 */; n++) n = section_start + section_header_size; //while (s5ProjectByteArray[n] == 0x00 && s5ProjectByteArray[n + 1] == 0x00) // n += 0x80; while (akanz < anzbst && n + 1 < s5ProjectByteArray.Length) //n < section_start + section_size) { akanz++; int len = 0; ByteAddressOFExistingBlocks.Add(n); var tmp = AddBlockInfo(s5ProjectByteArray, ref n, blkFld, bstHeaders[akanz - 1]); if (tmp != null) { blkFld.step5BlocksinfoList.Add(tmp); } /* * if (s5ProjectByteArray[n] == 0x70 && s5ProjectByteArray[n + 1] == 0x70) //Step5 Block * // && s5ProjectByteArray[n - 1] == 0x00) * { * len = (s5ProjectByteArray[n + 8] * 0x100 + s5ProjectByteArray[n + 9]) * 2; * * Step5ProjectBlockInfo tmpBlk = new Step5ProjectBlockInfo(); * //S5Block tmpBlk = new S5Block(); * * //if (((IList<int>)Enum.GetValues(typeof(PLCBlockType))).Contains((s5ProjectByteArray[n + 2] | 0xf00))) //only for debbuging * tmpBlk.BlockType = (PLCBlockType)(s5ProjectByteArray[n + 2] | 0xf00); * //else * // tt_nr = tt_nr; * * tmpBlk.BlockNumber = s5ProjectByteArray[n + 3]; * * tmpBlk._blkHeaderByte = bstHeaders[akanz - 1]; * * //byte n+4 -> kennungen für das programiergerät * //byte n+5,6,7 -> bib nummer * * byte[] code = new byte[len]; * Array.Copy(s5ProjectByteArray, n, code, 0, len); * tmpBlk._blkByte = code; * tmpBlk.ParentFolder = blkFld; * * blkFld.step5BlocksinfoList.Add(tmpBlk); * //string aa = System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(code); * } * else if (s5ProjectByteArray[n] == 0x06) //DB - Vorkopf * { * len = (s5ProjectByteArray[n + 4] * 0x100 + s5ProjectByteArray[n + 5]) * 2; * Step5ProjectBlockInfo tmpBlk = new Step5ProjectBlockInfo(); * //S5Block tmpBlk = new S5Block(); * * tmpBlk.BlockType = PLCBlockType.S5_DV; * * tmpBlk.BlockNumber = s5ProjectByteArray[n + 1]; * * byte[] code = new byte[len]; * Array.Copy(s5ProjectByteArray, n, code, 0, len); * tmpBlk._blkByte = code; * tmpBlk.ParentFolder = blkFld; * * blkFld.step5BlocksinfoList.Add(tmpBlk); * } * else if (s5ProjectByteArray[n] == 0x11) //DX - Vorkopf * { * len = (s5ProjectByteArray[n + 4] * 0x100 + s5ProjectByteArray[n + 5]) * 2; * Step5ProjectBlockInfo tmpBlk = new Step5ProjectBlockInfo(); * //S5Block tmpBlk = new S5Block(); * * tmpBlk.BlockType = PLCBlockType.S5_DVX; * * tmpBlk.BlockNumber = s5ProjectByteArray[n + 1]; * * byte[] code = new byte[len]; * Array.Copy(s5ProjectByteArray, n, code, 0, len); * tmpBlk._blkByte = code; * tmpBlk.ParentFolder = blkFld; * * blkFld.step5BlocksinfoList.Add(tmpBlk); * } * else if (s5ProjectByteArray[n] == 0x0D) //FB - Vorkopf * { * len = (s5ProjectByteArray[n + 4] * 0x100 + s5ProjectByteArray[n + 5]) * 2; * Step5ProjectBlockInfo tmpBlk = new Step5ProjectBlockInfo(); * //S5Block tmpBlk = new S5Block(); * * tmpBlk.BlockType = PLCBlockType.S5_FV; * * tmpBlk.BlockNumber = s5ProjectByteArray[n + 1]; * * byte[] code = new byte[len]; * Array.Copy(s5ProjectByteArray, n, code, 0, len); * tmpBlk._blkByte = code; * tmpBlk.ParentFolder = blkFld; * * blkFld.step5BlocksinfoList.Add(tmpBlk); * } * else if (s5ProjectByteArray[n] == 0x0A) //FX - Vorkopf * { * len = (s5ProjectByteArray[n + 4] * 0x100 + s5ProjectByteArray[n + 5]) * 2; * Step5ProjectBlockInfo tmpBlk = new Step5ProjectBlockInfo(); * //S5Block tmpBlk = new S5Block(); * * tmpBlk.BlockType = PLCBlockType.S5_FVX; * * tmpBlk.BlockNumber = s5ProjectByteArray[n + 1]; * * byte[] code = new byte[len]; * Array.Copy(s5ProjectByteArray, n, code, 0, len); * tmpBlk._blkByte = code; * tmpBlk.ParentFolder = blkFld; * * blkFld.step5BlocksinfoList.Add(tmpBlk); * } * else * { * //Here are the $ Blocks woch are not yet implemented! * //akanz--; * len = 0x80; * } * * n += (len / 0x80) * 0x80; * if (len % 0x80 != 0) * n += 0x80; */ } } section_start = n; //section_start += section_size; } if (_showDeleted) { //Read also the deleted Blocks, that means, don't use the Section Headers ... int akpos = s5ProjectByteArray[0x12] * 0x80; while (akpos <= s5ProjectByteArray.Length - 0x80) { while (!IsCurrentPosABlockStart(s5ProjectByteArray, akpos) && akpos <= s5ProjectByteArray.Length - 0x80) { akpos += 0x80; } if (akpos <= s5ProjectByteArray.Length - 0x80) { bool blkExists = ByteAddressOFExistingBlocks.Contains(akpos); var tmp = AddBlockInfo(s5ProjectByteArray, ref akpos, blkFld, null); if (!blkExists) { tmp.Deleted = true; blkFld.step5BlocksinfoList.Add(tmp); } } } } if (_projectfilename.ToLower().Contains("st.s5d") && _ziphelper.FileExists(_projectfilename.ToLower().Replace("st.s5d", "z0.seq"))) { Stream symTabStream = _ziphelper.GetReadStream(_projectfilename.ToLower().Replace("st.s5d", "z0.seq")); SymbolTable symtab = new SymbolTable(); symtab.LoadSymboltable(symTabStream); symTabStream.Close(); symtab.Parent = ProjectStructure; symtab.Project = this; ProjectStructure.SubItems.Add(symtab); _allFolders.Add(symtab); } var refFld = new ReferenceData((Step5ProgrammFolder)ProjectStructure, this); ProjectStructure.SubItems.Add(refFld); // { Parent = ProjectStructure, Project = this }); _allFolders.Add(refFld); }
private static List <FunctionBlockRow> GetMC5Rows(byte[] code, int codestart, List <S5Parameter> parameters, Step5BlocksFolder blkFld, S5FunctionBlock block) { List <FunctionBlockRow> retVal = new List <FunctionBlockRow>(); int codepos = codestart; retVal.Add(new S5FunctionBlockRow() { Command = "BLD", Parameter = "255", Parent = block }); //Command for first Network does not exist! //This needs to be removen when written back to S5D! while (codepos < code.Length) { byte mc = code[codepos]; // finde Befehle in der Symbol Tabelle int index = find_mc5_code(code, codepos); S5FunctionBlockRow newRow = new S5FunctionBlockRow() { Parent = block }; if (index >= 0) { newRow.MC5LIB_SYMTAB_Row = (object[])sym[index]; bool fb = false; newRow.Command = (string)((object[])sym[index])[operation]; string oper = (string)((object[])sym[index])[operand]; if (oper == "PAR") { int paridx = find_mc5_param(code, codepos, index); if (parameters != null && parameters.Count > paridx - 1) { newRow.Parameter = "=" + parameters[paridx - 1].Name; } else { newRow.Parameter = "$$error$$ -> invalid Parameter, idx:" + (paridx - 1); } } else { if (oper != null) { newRow.Parameter = oper; } fb = IsCall(newRow); //false; /*if ((newRow.Command=="SPA" && newRow.Parameter=="FB") || * (newRow.Command=="SPB" && newRow.Parameter=="FB") || * (newRow.Command=="BA" && newRow.Parameter=="FX") || * (newRow.Command=="BAB" && newRow.Parameter=="FX")) * { * fb = true; * }*/ int par = find_mc5_param(code, codepos, index); switch ((string)((object[])sym[index])[printpar]) { case null: break; case "PrintNummer": if (!string.IsNullOrEmpty(newRow.Parameter)) { newRow.Parameter += " "; } Int16 wrt = (Int16)par; if (wrt >= 0 && newRow.Parameter == "KF ") { newRow.Parameter += " +"; } newRow.Parameter += wrt.ToString(); break; case "PrintKY": newRow.Parameter += BitConverter.GetBytes(par)[1].ToString() + "," + BitConverter.GetBytes(par)[0].ToString(); break; case "PrintChar": if (!string.IsNullOrEmpty(newRow.Parameter)) { newRow.Parameter += " "; } newRow.Parameter += ((char)(BitConverter.GetBytes((Int16)par)[0])).ToString() + ((char)(BitConverter.GetBytes((Int16)par)[1])); break; case "PrintHEX4": if (!string.IsNullOrEmpty(newRow.Parameter)) { newRow.Parameter += " "; } newRow.Parameter += par.ToString("X").PadLeft(4, '0'); break; case "PrintGleitpunkt": if (!string.IsNullOrEmpty(newRow.Parameter)) { newRow.Parameter += " "; } newRow.Parameter += "gleit"; break; case "PrintHEX8": if (!string.IsNullOrEmpty(newRow.Parameter)) { newRow.Parameter += " "; } newRow.Parameter += par.ToString("X").PadLeft(4, '0'); break; case "PrintMerkerBit": if (!string.IsNullOrEmpty(newRow.Parameter)) { newRow.Parameter += " "; } newRow.Parameter += (par & 0x00FF).ToString() + "." + (par >> 8).ToString(); break; case "PrintSMerkerBit": if (!string.IsNullOrEmpty(newRow.Parameter)) { newRow.Parameter += " "; } newRow.Parameter += (par & 0x0FFF).ToString() + "." + (par >> 12).ToString(); break; } } int _parlen = (int)((object[])sym[index])[parlen]; int _codelen = (int)((object[])sym[index])[codelen]; int btSize = (_codelen + _parlen) / 8; codepos += btSize; // Schleifenzähler if (fb) { //FB-Call index = find_mc5_code(code, codepos); if (index < 0 || (string)((object[])sym[index])[operation] != "SPA=") { newRow.Command = "Error reading Jump after FB/FX Call!"; } int spa = find_mc5_param(code, codepos, index); newRow.ExtParameter = new List <S5Parameter>(); //newRow.ExtParameter = new List<string>(); byte[] calledfb = blkFld.GetBlockInByte(/* "S5_" + */ newRow.Parameter.Replace(" ", "")); if (calledfb != null) { S5Parameter newPar = new S5Parameter(); newRow.ExtParameter.Add(newPar); string fbNM = System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(calledfb, 12, 8); //newRow.ExtParameter.Add("Name :" + fbNM); newPar.Name = "Name :"; newPar.Value = fbNM; List <S5Parameter> par = GetParameters(calledfb); int j = 0; foreach (var s5Parameter in par) { newPar = new S5Parameter(); newRow.ExtParameter.Add(newPar); j++; string akOper = ""; int pos = codepos + j * 2; switch (s5Parameter.S5ParameterType) { case S5ParameterType.A: case S5ParameterType.E: int ber = code[pos]; switch (s5Parameter.S5ParameterFormat) { case S5ParameterFormat.BI: switch (ber & 0xf0) { case 0x80: akOper += "M"; break; } akOper += code[pos + 1].ToString(); akOper += "." + (code[pos] & 0x0f).ToString(); break; case S5ParameterFormat.BY: switch (ber) { case 0x0a: akOper += "MB"; break; case 0x2a: akOper += "DR"; break; case 0x22: akOper += "DL"; break; default: akOper += ""; break; } akOper += code[pos + 1].ToString(); break; case S5ParameterFormat.W: switch (ber) { case 0x12: akOper += "MW"; break; case 0x32: akOper += "DW"; break; } akOper += code[pos + 1].ToString(); break; case S5ParameterFormat.D: break; } break; case S5ParameterType.D: int wrt = code[pos] * 0x100 + code[pos + 1]; akOper += s5Parameter.S5ParameterFormat.ToString() + " "; switch (s5Parameter.S5ParameterFormat) { case S5ParameterFormat.KF: if (((Int16)wrt) > 0) { akOper += "+"; } akOper += ((Int16)wrt).ToString(); break; case S5ParameterFormat.KT: //code[pos + 1] // Bit 4-7 0-3 4-7 0-3 //Format: Zeitbasis, 100er, 10er, 1er akOper += wrt.ToString().PadLeft(3, '0') + ".0"; break; case S5ParameterFormat.KC: akOper += (char)code[pos] + (char)code[pos + 1]; break; case S5ParameterFormat.KM: akOper += libnodave.dec2bin(code[pos]) + " "; akOper += libnodave.dec2bin(code[pos + 1]); break; case S5ParameterFormat.KY: akOper += code[pos].ToString() + "," + code[pos + 1].ToString(); break; default: akOper += ((Int16)wrt).ToString("X").PadLeft(4, '0'); break; } break; case S5ParameterType.B: int bst = code[pos]; switch (bst) { case 0x20: akOper += "DB"; break; } akOper += code[pos + 1].ToString(); break; case S5ParameterType.T: //int abst = code[pos]; akOper += "T " + code[pos + 1].ToString(); break; case S5ParameterType.Z: akOper += "Z " + code[pos + 1].ToString(); break; } newPar.Name = s5Parameter.Name; newPar.Value = akOper; //newRow.ExtParameter.Add(s5Parameter.Name.PadRight(5, ' ') + ": " + akOper); } } else { for (int j = 1; j < spa; j++) { int myPar = (code[codepos + j * 2] << 8) | code[codepos + j * 2 + 1]; //newRow.ExtParameter.Add(myPar.ToString()); S5Parameter newPar = new S5Parameter(); newRow.ExtParameter.Add(newPar); newPar.Name = myPar.ToString(); } } btSize += spa * 2; codepos += spa * 2; fb = false; } byte[] MC5 = new byte[btSize]; Array.Copy(code, codepos - btSize, MC5, 0, btSize); newRow.MC5 = MC5; } else { newRow.Command = "Error converting command!"; codepos += 2; //throw new Exception("Code nicht in Symtab!"); } retVal.Add(newRow); } #region Build the Jumpsmarks.... int JumpCount = 1; int akBytePos = 0; Dictionary <int, S5FunctionBlockRow> ByteAdressNumerPLCFunctionBlocks = new Dictionary <int, S5FunctionBlockRow>(); foreach (S5FunctionBlockRow tmp in retVal) { if (tmp.ByteSize > 0) { ByteAdressNumerPLCFunctionBlocks.Add(akBytePos, tmp); akBytePos += tmp.ByteSize; } } akBytePos = 0; foreach (S5FunctionBlockRow tmp in retVal) { if (tmp.Command == "SPA=" || tmp.Command == "SPB=" || tmp.Command == "SPZ=" || tmp.Command == "SPN=" || tmp.Command == "SPP=" || tmp.Command == "SPM=" || tmp.Command == "SPO=") { int jmpBytePos = 0; byte[] backup = tmp.MC5; tmp.Command = tmp.Command.Substring(0, tmp.Command.Length - 1); tmp.JumpWidth = (SByte)Convert.ToInt32(tmp.Parameter); jmpBytePos = akBytePos + (tmp.JumpWidth * 2); if (ByteAdressNumerPLCFunctionBlocks.ContainsKey(jmpBytePos)) { var target = ByteAdressNumerPLCFunctionBlocks[jmpBytePos]; if (target.Label.Trim() == "") { target.Label = "M" + JumpCount.ToString().PadLeft(3, '0'); JumpCount++; } //Backup the MC7 Code, because the MC7 Code is always deleted when the command or parameter changes! tmp.Parameter = "=" + target.Label; tmp.MC5 = backup; } else { tmp.Parameter = "Error! JumpWidth :" + tmp.JumpWidth; tmp.MC5 = backup; } } akBytePos += tmp.ByteSize; } #endregion return(retVal); }
private S5ProjectBlockInfo AddBlockInfo(byte[] s5ProjectByteArray, ref int pos, Step5BlocksFolder blkFld, byte[] header) { int len = 0; S5ProjectBlockInfo tmpBlk = new S5ProjectBlockInfo(); tmpBlk._blkHeaderByte = header; if (s5ProjectByteArray[pos] == 0x70 && s5ProjectByteArray[pos + 1] == 0x70) //Step5 Block // && s5ProjectByteArray[n - 1] == 0x00) { len = (s5ProjectByteArray[pos + 8] * 0x100 + s5ProjectByteArray[pos + 9]) * 2; tmpBlk.BlockType = (PLCBlockType)(s5ProjectByteArray[pos + 2] | 0xf00); tmpBlk.BlockNumber = s5ProjectByteArray[pos + 3]; //byte n+4 -> kennungen für das programiergerät //byte n+5,6,7 -> bib nummer byte[] code = new byte[len]; Array.Copy(s5ProjectByteArray, pos, code, 0, len); tmpBlk._blkByte = code; tmpBlk.ParentFolder = blkFld; //blkFld.step5BlocksinfoList.Add(tmpBlk); //string aa = System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(code); } else if (s5ProjectByteArray[pos] == 0x06) //DB - Vorkopf { len = (s5ProjectByteArray[pos + 4] * 0x100 + s5ProjectByteArray[pos + 5]) * 2; tmpBlk.BlockType = PLCBlockType.S5_DV; tmpBlk.BlockNumber = s5ProjectByteArray[pos + 1]; byte[] code = new byte[len]; Array.Copy(s5ProjectByteArray, pos, code, 0, len); tmpBlk._blkByte = code; tmpBlk.ParentFolder = blkFld; //blkFld.step5BlocksinfoList.Add(tmpBlk); } else if (s5ProjectByteArray[pos] == 0x11) //DX - Vorkopf { len = (s5ProjectByteArray[pos + 4] * 0x100 + s5ProjectByteArray[pos + 5]) * 2; tmpBlk.BlockType = PLCBlockType.S5_DVX; tmpBlk.BlockNumber = s5ProjectByteArray[pos + 1]; byte[] code = new byte[len]; Array.Copy(s5ProjectByteArray, pos, code, 0, len); tmpBlk._blkByte = code; tmpBlk.ParentFolder = blkFld; //blkFld.step5BlocksinfoList.Add(tmpBlk); } else if (s5ProjectByteArray[pos] == 0x0D) //FB - Vorkopf { len = (s5ProjectByteArray[pos + 4] * 0x100 + s5ProjectByteArray[pos + 5]) * 2; tmpBlk.BlockType = PLCBlockType.S5_FV; tmpBlk.BlockNumber = s5ProjectByteArray[pos + 1]; byte[] code = new byte[len]; Array.Copy(s5ProjectByteArray, pos, code, 0, len); tmpBlk._blkByte = code; tmpBlk.ParentFolder = blkFld; //blkFld.step5BlocksinfoList.Add(tmpBlk); } else if (s5ProjectByteArray[pos] == 0x0A) //FX - Vorkopf { len = (s5ProjectByteArray[pos + 4] * 0x100 + s5ProjectByteArray[pos + 5]) * 2; tmpBlk.BlockType = PLCBlockType.S5_FVX; tmpBlk.BlockNumber = s5ProjectByteArray[pos + 1]; byte[] code = new byte[len]; Array.Copy(s5ProjectByteArray, pos, code, 0, len); tmpBlk._blkByte = code; tmpBlk.ParentFolder = blkFld; //blkFld.step5BlocksinfoList.Add(tmpBlk); } else { //Here are the $ Blocks woch are not yet implemented! //akanz--; len = 0x80; tmpBlk = null; } if (len == 0) { len = 0x80; } pos += (len / 0x80) * 0x80; if (len % 0x80 != 0) { pos += 0x80; } return(tmpBlk); }
private S5ProjectBlockInfo AddBlockInfo(byte[] s5ProjectByteArray, ref int pos, Step5BlocksFolder blkFld, byte[] header) { int len = 0; S5ProjectBlockInfo tmpBlk = new S5ProjectBlockInfo(); tmpBlk._blkHeaderByte = header; if (s5ProjectByteArray[pos] == 0x70 && s5ProjectByteArray[pos + 1] == 0x70) //Step5 Block // && s5ProjectByteArray[n - 1] == 0x00) { len = (s5ProjectByteArray[pos + 8] * 0x100 + s5ProjectByteArray[pos + 9]) * 2; tmpBlk.BlockType = (PLCBlockType)(s5ProjectByteArray[pos + 2] | 0xf00); tmpBlk.BlockNumber = s5ProjectByteArray[pos + 3]; var bits = s5ProjectByteArray[pos + 4]; //siehe: https://www.yumpu.com/de/document/view/5702154/3-s5-power-bios-process-informatik-entwicklungsgesellschaft-mbh/26 tmpBlk.Assembler = (bits & 0b00001000) > 0; // -> Assembler var bibNumber = s5ProjectByteArray[pos + 5] * 0x10000 + s5ProjectByteArray[pos + 6] * 0x100 + s5ProjectByteArray[pos + 7]; //Console.WriteLine(tmpBlk.BlockType.ToString() + " - " + tmpBlk.BlockNumber + " - " + bibNumber); //byte n+4 -> kennungen für das programiergerät //byte n+5,6,7 -> bib nummer byte[] code = new byte[len]; Array.Copy(s5ProjectByteArray, pos, code, 0, len); tmpBlk._blkByte = code; tmpBlk.ParentFolder = blkFld; //blkFld.step5BlocksinfoList.Add(tmpBlk); //string aa = System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(code); } else if (s5ProjectByteArray[pos] == 0x06) //DB - Vorkopf { len = (s5ProjectByteArray[pos + 4] * 0x100 + s5ProjectByteArray[pos + 5]) * 2; tmpBlk.BlockType = PLCBlockType.S5_DV; tmpBlk.BlockNumber = s5ProjectByteArray[pos + 1]; byte[] code = new byte[len]; Array.Copy(s5ProjectByteArray, pos, code, 0, len); tmpBlk._blkByte = code; tmpBlk.ParentFolder = blkFld; //blkFld.step5BlocksinfoList.Add(tmpBlk); } else if (s5ProjectByteArray[pos] == 0x11) //DX - Vorkopf { len = (s5ProjectByteArray[pos + 4] * 0x100 + s5ProjectByteArray[pos + 5]) * 2; tmpBlk.BlockType = PLCBlockType.S5_DVX; tmpBlk.BlockNumber = s5ProjectByteArray[pos + 1]; byte[] code = new byte[len]; Array.Copy(s5ProjectByteArray, pos, code, 0, len); tmpBlk._blkByte = code; tmpBlk.ParentFolder = blkFld; //blkFld.step5BlocksinfoList.Add(tmpBlk); } else if (s5ProjectByteArray[pos] == 0x0D) //FB - Vorkopf { len = (s5ProjectByteArray[pos + 4] * 0x100 + s5ProjectByteArray[pos + 5]) * 2; tmpBlk.BlockType = PLCBlockType.S5_FV; tmpBlk.BlockNumber = s5ProjectByteArray[pos + 1]; byte[] code = new byte[len]; Array.Copy(s5ProjectByteArray, pos, code, 0, len); tmpBlk._blkByte = code; tmpBlk.ParentFolder = blkFld; //blkFld.step5BlocksinfoList.Add(tmpBlk); } else if (s5ProjectByteArray[pos] == 0x0A) //FX - Vorkopf { len = (s5ProjectByteArray[pos + 4] * 0x100 + s5ProjectByteArray[pos + 5]) * 2; tmpBlk.BlockType = PLCBlockType.S5_FVX; tmpBlk.BlockNumber = s5ProjectByteArray[pos + 1]; byte[] code = new byte[len]; Array.Copy(s5ProjectByteArray, pos, code, 0, len); tmpBlk._blkByte = code; tmpBlk.ParentFolder = blkFld; //blkFld.step5BlocksinfoList.Add(tmpBlk); } else if (s5ProjectByteArray[pos] == 0x6E) //????? { len = 0x80; tmpBlk = null; } else { //Here are the $ Blocks woch are not yet implemented! //akanz--; len = 0x80; tmpBlk = null; } if (len == 0) { len = 0x80; } pos += (len / 0x80) * 0x80; if (len % 0x80 != 0) { pos += 0x80; } return(tmpBlk); }