public wCpuBlock(S7Client.S7BlockInfo info, byte[] data) { if (info.BlkType == (int)wSubBlockType.OB) { this.blockType = wBlockType.OB; } else if (info.BlkType == (int)wSubBlockType.FC) { this.blockType = wBlockType.FC; } else if (info.BlkType == (int)wSubBlockType.FB) { this.blockType = wBlockType.FB; } else if (info.BlkType == (int)wSubBlockType.DB) { this.blockType = wBlockType.DB; } else if (info.BlkType == (int)wSubBlockType.SFC) { this.blockType = wBlockType.SFC; } else if (info.BlkType == (int)wSubBlockType.SFB) { this.blockType = wBlockType.SFB; } else if (info.BlkType == (int)wSubBlockType.SDB) { this.blockType = wBlockType.SDB; } this.language = (wLanguage)info.BlkLang; this.name = wCpu.cleanString(info.Header); this.family = wCpu.cleanString(info.Family); this.author = wCpu.cleanString(info.Author); this.codeDate = wCpu.cleanString(info.CodeDate); this.interfaceDate = wCpu.cleanString(info.IntfDate); this.loadSize = info.LoadSize; this.MC7Size = info.MC7Size; this.blockNumber = info.BlkNumber; this.blockFlags = info.BlkFlags; this.localData = info.LocalData; this.SBBLength = info.SBBLength; this.checksum = info.CheckSum; this.data = data; }
void GetBlockInfo() { S7Client.S7BlockInfo BI = new S7Client.S7BlockInfo(); int[] BlockType = { S7Client.Block_OB, S7Client.Block_DB, S7Client.Block_SDB, S7Client.Block_FC, S7Client.Block_SFC, S7Client.Block_FB, S7Client.Block_SFB }; txtBI.Text = ""; int Result = Client.GetAgBlockInfo(BlockType[CBBlock.SelectedIndex], System.Convert.ToInt32(txtBlockNum.Text), ref BI); ShowResult(Result); if (Result == 0) { // Here a more descriptive Block Type, Block lang and so on, are needed, // but I'm too lazy, do it yourself. txtBI.Text = txtBI.Text + "Block Type : " + HexByte((byte)BI.BlkType) + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Block Number : " + Convert.ToString(BI.BlkNumber) + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Block Lang : " + HexByte((byte)BI.BlkLang) + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Block Flags : " + HexByte((byte)BI.BlkFlags) + (char)13 + (char)10; txtBI.Text = txtBI.Text + "MC7 Size : " + Convert.ToString(BI.MC7Size) + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Load Size : " + Convert.ToString(BI.LoadSize) + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Local Data : " + Convert.ToString(BI.LocalData) + (char)13 + (char)10; txtBI.Text = txtBI.Text + "SBB Length : " + Convert.ToString(BI.SBBLength) + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Checksum : " + HexWord((ushort)BI.CheckSum) + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Version : 0." + Convert.ToString(BI.Version) + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Code Date : " + BI.CodeDate + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Intf.Date : " + BI.IntfDate + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Author : " + BI.Author + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Family : " + BI.Family + (char)13 + (char)10; txtBI.Text = txtBI.Text + "Header : " + BI.Header; } }
public void addCpuBlock(S7Client.S7BlockInfo block, byte[] data) { this.blocks.Add(new wCpuBlock(block, data)); }
public void upload() { Console.WriteLine("Getting CPU information..."); S7Client.S7OrderCode oc = new S7Client.S7OrderCode(); int result = MyClient.GetOrderCode(ref oc); if (result == 0) { this.setOrderCode(oc); } else { string error = "Failed to get Order Code"; throw new wPlcException(error, result); } S7Client.S7CpuInfo ci = new S7Client.S7CpuInfo(); result = MyClient.GetCpuInfo(ref ci); if (result == 0) { this.setCpuInfo(ci); } else { string error = "Failed to get CPU info"; throw new wPlcException(error, result); } Console.WriteLine("Uploading program blocks... "); Dictionary <wBlockType, ushort[]> blockList = new Dictionary <wBlockType, ushort[]>(); Dictionary <wBlockType, int> blockCount = new Dictionary <wBlockType, int>(); int totalBlockCount = 0; blockList = new Dictionary <wBlockType, ushort[]>(); S7Client.S7BlocksList bl = new S7Client.S7BlocksList(); result = MyClient.ListBlocks(ref bl); List <wBlockType> blockTypeList = new List <wBlockType>(); if (result == 0) { if (bl.OBCount > 0) { blockTypeList.Add(wBlockType.OB); } if (bl.FBCount > 0) { blockTypeList.Add(wBlockType.FB); } if (bl.FCCount > 0) { blockTypeList.Add(wBlockType.FC); } if (bl.DBCount > 0) { blockTypeList.Add(wBlockType.DB); } if (bl.SFBCount > 0) { blockTypeList.Add(wBlockType.SFB); } if (bl.SFCCount > 0) { blockTypeList.Add(wBlockType.SFC); } if (bl.SDBCount > 0) { blockTypeList.Add(wBlockType.SDB); } } else { string error = "Failed to list all blocks"; throw new wPlcException(error, result); } foreach (wBlockType blockType in blockTypeList) { blockList.Add(blockType, new ushort[MAX_BLOCK]); int resultBlockCount = blockList[blockType].Length; result = MyClient.ListBlocksOfType((int)blockType, blockList[blockType], ref resultBlockCount); if (result == 0) { blockCount.Add(blockType, resultBlockCount); totalBlockCount += resultBlockCount; } else { string error = "Failed to list blocks of type " + blockType; throw new wPlcException(error, result); } } int uploadedBlockCount = 0; foreach (wBlockType blockType in blockTypeList) { for (int i = 0; i < blockCount[blockType]; i++) { //p.setValue(((uploadedBlockCount + 1) / totalBlockCount) * 100); S7Client.S7BlockInfo blockInfo = new S7Client.S7BlockInfo(); result = MyClient.GetAgBlockInfo((int)blockType, blockList[blockType][i], ref blockInfo); if (result == 0) { byte[] buffer = new byte[16384]; int bufferSize = buffer.Length; if (blockType != wBlockType.SFC && blockType != wBlockType.SFB) { result = MyClient.FullUpload((int)blockType, blockList[blockType][i], buffer, ref bufferSize); if (result != 0) { string error = "Could not upload " + blockType + blockList[blockType][i]; throw new wPlcException(error, result); } } else { bufferSize = 0; } byte[] data = new byte[bufferSize]; Array.Copy(buffer, data, data.Length); this.addCpuBlock(blockInfo, data); Console.WriteLine(this.blocks.Last().ToString() + " loaded. Size: " + this.blocks.Last().loadSize + " bytes."); } else { string error = "Could not get Block Info for " + blockType + blockList[blockType][i]; throw new wPlcException(error, result); } uploadedBlockCount++; } } Console.WriteLine("Done!"); }