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!"); }
// Thread to Process PLC Read Queue static void ProcessPLC(S7PLC plc) { do { try { System.Threading.Thread.Sleep(5000); S7Client client = new S7Client(); client.SetConnectionType(System.Convert.ToUInt16(plc.connection_type)); client.SetConnectionParams(plc.ip, System.Convert.ToUInt16(plc.local_tsap), System.Convert.ToUInt16(plc.remote_tsap)); Console.WriteLine("Try to connect " + plc.server_name); int res = client.Connect(); if (res != 0 || client.Connected == false) { continue; } Console.WriteLine("Connected " + plc.server_name + " IP:" + plc.ip); S7Client.S7CpuInfo Info = new S7Client.S7CpuInfo(); res = client.GetCpuInfo(ref Info); if (res == 0) { Console.WriteLine(plc.server_name + " Module Type Name : " + Info.ModuleTypeName); Console.WriteLine(plc.server_name + " Serial Number : " + Info.SerialNumber); Console.WriteLine(plc.server_name + " AS Name : " + Info.ASName); Console.WriteLine(plc.server_name + " Module Name : " + Info.ModuleName); } ; System.Threading.Thread.Sleep(1000); while (client.Connected) { foreach (S7RW read in plc.reads) { CheckCommand(client, plc); byte[] Buffer = new byte[1024]; int BytesRead = 0; res = client.ReadArea( System.Convert.ToInt32(read.data_area), System.Convert.ToInt32(read.db), System.Convert.ToInt32(read.offset), System.Convert.ToInt32(read.amount), System.Convert.ToInt32(StringToWordLengthCode(read.data_type)), Buffer, ref BytesRead); if (res == 0) { // HexDump(Buffer, BytesRead); for (int i = 0; i < read.amount; i++) { int bytecnt; double value = 0; switch (read.data_type) { case "BIT": bytecnt = i / 8; value = System.Convert.ToDouble(S7.GetBitAt(Buffer, bytecnt, i % 8)); break; case "BYTE": bytecnt = i; value = S7.GetByteAt(Buffer, bytecnt); break; case "CHAR": bytecnt = i; value = S7.GetByteAt(Buffer, bytecnt); break; case "WORD": bytecnt = i * 2; value = S7.GetWordAt(Buffer, bytecnt); break; case "DWORD": bytecnt = i * 4; value = S7.GetDWordAt(Buffer, bytecnt); break; case "INT": bytecnt = i * 2; value = S7.GetIntAt(Buffer, bytecnt); break; case "DINT": bytecnt = i * 4; value = S7.GetDIntAt(Buffer, bytecnt); break; case "REAL": bytecnt = i * 4; value = S7.GetRealAt(Buffer, bytecnt); break; case "COUNTER": bytecnt = i * 2; value = S7.GetCounter((ushort)((Buffer[bytecnt + 1] << 8) + (Buffer[bytecnt]))); break; case "TIMER": bytecnt = i * 2; value = (ushort)((Buffer[bytecnt + 1] << 8) + (Buffer[bytecnt])); break; default: Console.WriteLine("Unsupported data type: " + read.data_type); break; } SendUdp(Encoding.ASCII.GetBytes( "[{\"point_key\":" + (read.point_number + i) + ",\"value\":" + value + ",\"failed\":false" + "}]")); if (logread) { Console.WriteLine(plc.server_name + " " + read.name + " OSHMI_POINT_NUMBER=" + (read.point_number + i) + " VALUE=" + value + " " + read.data_type); } } } else { Console.WriteLine(plc.server_name + " Error " + read.name); } System.Threading.Thread.Sleep(System.Convert.ToInt32(read.delay_ms)); } } // client.Disconnect(); Console.WriteLine("Disconnected " + plc.server_name); } catch (Exception e) { // EXCEPTION HANDLER Console.WriteLine("Exception " + plc.server_name); Console.WriteLine(e); } System.Threading.Thread.Sleep(10000); } while (true); }