From b7308bba3d7ffad271ce7fc7a93c8c45d76be87d Mon Sep 17 00:00:00 2001 From: 杨前锦 <1010338399@qq.com> Date: 星期五, 13 六月 2025 17:21:03 +0800 Subject: [PATCH] 优化印尼佳通-硫化胚胎出入库逻辑策略优化 --- HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/device/S7Helper.cs | 776 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 776 insertions(+), 0 deletions(-) diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/device/S7Helper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/device/S7Helper.cs new file mode 100644 index 0000000..673a5d9 --- /dev/null +++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/device/S7Helper.cs @@ -0,0 +1,776 @@ +锘縰sing HH.WCS.Mobox3.FJJT.api; +using HH.WCS.Mobox3.FJJT.util; +using Newtonsoft.Json.Linq; +using S7.Net; +using S7.Net.Types; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web.Services.Description; +using static HH.WCS.Mobox3.FJJT.util.Settings; + +namespace HH.WCS.Mobox3.FJJT.device +{ + + /// <summary> + /// 瑗块棬瀛恜lc + /// </summary> + public class S7Helper + { + private static bool debug = true; + private static S7.Net.Plc plc = null; + static S7Helper() + { + Init(); + } + private static Dictionary<string, Plc> plcDic = new Dictionary<string, Plc>(); + private static void Init() + { + //閰嶇疆鏂囦欢璇诲彇鎵�湁鐨刾lc杩涜鍒濆鍖�+ try + { + var plc1 = new Plc(CpuType.S71500, "", 0, 1); + plcDic.Add("plc1", plc1); + Link(plc1); + } + catch (Exception ex) + { + + Console.WriteLine("S7Helper Init err=" + ex.Message); + } + } + private static Plc GetPlc(string plc) + { + if (plcDic.ContainsKey(plc)) + { + return plcDic[plc]; + } + else + { + return null; + } + } + public static Dictionary<string, string> s7TestData = new Dictionary<string, string>(); + private static void Link(Plc plc) + { + try + { + //if (!plc.IsConnected) { + plc.Close(); + plc.Open(); + if (plc.IsConnected) + { + Console.WriteLine($"宸茶繛鎺ュ埌plc{plc.IP}"); + } + else + { + Console.WriteLine($"plc{plc.IP}杩炴帴澶辫触"); + LogHelper.Info($"plc{plc.IP}杩炴帴澶辫触", "Plc"); + } + + //} + } + catch (Exception ex) + { + Console.WriteLine($"plc{plc.IP}杩炴帴澶辫触锛宔rr={ex.Message}"); + LogHelper.Info($"plc{plc.IP}杩炴帴澶辫触锛宔rr={ex.Message}"); + //Init(); + } + + } + //https://www.ad.siemens.com.cn/productportal/Prods/S7-1200_PLC_EASY_PLUS/SmartSMS/060.html + //https://www.ad.siemens.com.cn/productportal/Prods/S7-1200_PLC_EASY_PLUS/07-Program/02-basic/01-Data_Type/09-String.html + + + + internal static short[] ReadInt(string device, int db, int byteAddr, int count) + { + short[] result = null; + try + { + if (debug) + { + var s7Key = $"int_{db}_{byteAddr}_{count}"; + if (s7TestData.ContainsKey(s7Key)) + { + var data = s7TestData[s7Key].Split(','); + if (data.Length == count) + { + result = Array.ConvertAll(data, s => short.Parse(s)); + } + else + { + result = new short[count]; + s7TestData[s7Key] = string.Join(",", result); + } + Console.WriteLine($"璇诲彇plc {device}淇℃伅鎴愬姛锛� addr={byteAddr} data={string.Join(",", result)}"); + } + } + else + { + var plc = GetPlc(device); + if (plc != null) + { + if (plc.IsConnected) + { + result = (short[])plc.Read(DataType.DataBlock, db, byteAddr, VarType.Int, count, 0); + Console.WriteLine($"璇诲彇plc {device}淇℃伅鎴愬姛锛宨p={plc.IP} addr={byteAddr} data={string.Join(",", result)}"); + if (result.Length == 0) + { + Console.WriteLine($"plc {device}鍑嗗閲嶆柊杩炴帴"); + Link(plc); + } + } + else + { + Console.WriteLine($"鍑嗗杩炴帴plc {device}"); + Link(plc); + } + } + else + { + Console.WriteLine($"plc {device}涓嶅瓨鍦�); + } + + } + + } + catch (Exception ex) + { + Console.WriteLine($"ReadInt锛宒evice={device} addr={byteAddr} count={count} err={ex.Message}"); + LogHelper.Error($"ReadInt锛宒evice={device} addr={byteAddr} count={count} err={ex.Message}", ex); + } + return result; + } + + /// <summary> + /// + /// </summary> + /// <param name="db"></param> + /// <param name="byteAddr"></param> + /// <param name="data"></param> + /// <returns></returns> + internal static bool WriteInt(int db, int byteAddr, short data) + { + var result = false; + try + { + if (plc.IsConnected) + { + plc.Write(DataType.DataBlock, db, byteAddr, data); + Console.WriteLine($"鍐欏叆plc淇℃伅锛宨p={plc.IP} addr={byteAddr} data={data} "); + LogHelper.Info($"鍐欏叆plc淇℃伅锛宨p={plc.IP} addr={byteAddr} data={data} "); + if (result) + { + //鍐欏畬鍐嶈涓�纭 + var readData = (short)plc.Read(DataType.DataBlock, db, byteAddr, VarType.Int, 1, 0); + Console.WriteLine($"璇诲彇plc淇℃伅锛宨p={plc.IP} addr={byteAddr} data={data} res={string.Join(", ", readData)}"); + LogHelper.Info($"璇诲彇plc淇℃伅锛宨p={plc.IP} addr={byteAddr} data={data} res={string.Join(", ", readData)}", "PLC"); + result = readData == data; + } + + + } + else + { + Console.WriteLine("鍑嗗杩炴帴plc1"); + Link(plc); + } + } + catch (Exception ex) + { + LogHelper.Error($"鍐欏叆plc1淇℃伅澶辫触锛宨p={plc.IP} addr={byteAddr} data={data} err={ex.Message}", ex); + } + return result; + } + public static object ReadBit(string device, int db, int byteAddr, byte bitAddr) + { + object result = null; + try + { + if (debug) + { + var s7Key = $"bit_{db}_{byteAddr}_{bitAddr}"; + if (s7TestData.ContainsKey(s7Key)) + { + var data = s7TestData[s7Key]; + if (data == "1") + { + result = true; + } + else { result = false; } + Console.WriteLine($"璇诲彇plc {device}淇℃伅鎴愬姛锛� addr={byteAddr} data={result.ToString()}"); + } + } + else + { + var plc = GetPlc(device); + if (plc != null) + { + if (plc.IsConnected) + { + result = plc.Read(DataType.DataBlock, db, byteAddr, VarType.Int, 1, bitAddr); + Console.WriteLine($"璇诲彇plc {device}淇℃伅鎴愬姛锛宨p={plc.IP} addr={byteAddr} data={result.ToString()}"); + } + else + { + Console.WriteLine($"鍑嗗杩炴帴plc {device}"); + Link(plc); + } + } + else + { + Console.WriteLine($"plc {device}涓嶅瓨鍦�); + } + } + } + catch (Exception ex) + { + Console.WriteLine($"ReadBit锛宒evice={device} addr={byteAddr} bit={bitAddr} err={ex.Message}"); + LogHelper.Error($"ReadBit锛宒evice={device} addr={byteAddr} bit={bitAddr} err={ex.Message}", ex); + } + return result; + } + public static string ReadStr(string device, int db, int byteAddr, int count) + { + string result = string.Empty; + try + { + if (debug) + { + var s7Key = $"str_{db}_{byteAddr}_{count}"; + if (s7TestData.ContainsKey(s7Key)) + { + var data = s7TestData[s7Key]; + if (data.Length == count) + { + result = data; + Console.WriteLine($"ReadStr 鎴愬姛锛�addr={byteAddr} res={result}"); + } + } + } + else + { + if (plc.IsConnected) + { + result = plc.Read(DataType.DataBlock, 100, byteAddr, VarType.String, count, 0).ToString(); + Console.WriteLine($"ReadStr 鎴愬姛锛宨p={plc.IP} addr={byteAddr} res={result}"); + if (result.Length == 0) + { + Link(plc); + } + } + else + { + Console.WriteLine("鍑嗗杩炴帴plc"); + Link(plc); + } + } + } + catch (Exception ex) + { + Console.WriteLine($"ReadStr锛宒evice={device} addr={byteAddr} count={count} err={ex.Message}"); + LogHelper.Error($"ReadStr锛宒evice={device} addr={byteAddr} count={count} err={ex.Message}", ex); + } + return result; + } + + #region 鎵归噺鍐欏叆 璇诲彇 + + /// <summary> + /// s7鍐欏叆鍙栧�鏂规硶 + /// </summary> + public static void Write() + { + var plcInfo = Settings.linePlcInfo.Where(a => (a.deviceNo == "1") && a.enable == 1).FirstOrDefault(); + + //鑾峰彇閰嶇疆鏂囦欢鍐欏叆鐨勫湴鍧�+ List<S7Model> writemodels = Settings.plcValue.Find(a => a.address == plcInfo.address).read; + + if (writemodels.Count > 0) + { + writemodels.Find(a => a.addr == 0).value = "1"; + writemodels.Find(a => a.addr == 2).value = "2"; + writemodels.Find(a => a.addr == 4).value = "4"; + writemodels.Find(a => a.addr == 18).value = "TP24121108"; + byte[] bytes = GetWriteByte(writemodels); + if (PLCWrite(plcInfo, 100, bytes)) + { + Console.WriteLine("鍐欏叆鎴愬姛"); + //鍐欏叆鎴愬姛鏍¢獙鏁版嵁 + Read(); + if (Dictvalues[plcInfo.address].Find(a => a.addr == 2).value == "2") + { + Console.WriteLine("鏁版嵁鏍¢獙鎴愬姛锛屼慨鏀逛换鍔$姸鎬�); + } + } + else + { + Console.WriteLine("鍐欏叆澶辫触"); + } + } + + + } + + /// <summary> + /// 灏嗚鍐欑殑鏁版嵁杞崲鎴恇yte + /// </summary> + /// <param name="writemodels"></param> + /// <returns></returns> + public static byte[] GetWriteByte(List<S7Model> writemodels) + { + var model = writemodels.OrderByDescending(a => a.addr).First(); + var readlen = model.addr + model.length; + byte[] bytes = new byte[readlen]; + + foreach (var item in writemodels) + { + if (!string.IsNullOrEmpty(item.value)) + { + //杞崲byte + switch (item.type) + { + case "Int": + case "Bit": + bytes[item.addr] = (byte)((uint)(int.Parse(item.value) >> 8) & 0xFFu); + bytes[item.addr + 1] = (byte)((uint)(int.Parse(item.value) >> 0) & 0xFFu); + break; + case "DInt": + case "Real": + bytes[item.addr] = (byte)((uint)(int.Parse(item.value) >> 24) & 0xFFu); + bytes[item.addr + 1] = (byte)((uint)(int.Parse(item.value) >> 16) & 0xFFu); + bytes[item.addr + 2] = (byte)((uint)(int.Parse(item.value) >> 8) & 0xFFu); + bytes[item.addr + 3] = (byte)((uint)(int.Parse(item.value) >> 0) & 0xFFu); + break; + case "String": + case "Byte": + var bytevalue = Encoding.UTF8.GetBytes(item.value); + if (bytevalue.Count() <= item.length) + { + for (int i = 0; i < bytevalue.Count(); i++) + { + + bytes[item.addr + item.length - bytevalue.Count() + i] = bytevalue[i]; + } + } + break; + } + } + + } + return bytes; + } + + public static Dictionary<string, List<S7Model>> Dictvalues = new Dictionary<string, List<S7Model>>(); + + /// <summary> + /// s7璇诲彇鏂规硶 + /// </summary> + public static void Read() + { + var plcInfo = Settings.linePlcInfo.Where(a => (a.deviceNo == "1") && a.enable == 1).FirstOrDefault(); + var bytes = new byte[0]; + //鑾峰彇閰嶇疆鏂囦欢璇诲彇鐨勫湴鍧�+ List<S7Model> readmodels = Settings.plcValue.Find(a => a.address == plcInfo.address).read; + if (readmodels.Count > 0) + { + //鑾峰彇璇诲彇闀垮害 + + var model = readmodels.OrderByDescending(a => a.addr).First(); + var readlen = model.addr + model.length; + PLCRead(plcInfo, 100, 0, readlen, out bytes); + + //灏嗛厤缃枃浠堕厤缃殑鍋忕Щ閲忚浆鎹㈠瓨鏀惧埌瀛楀吀閲�+ // List<S7Value> s7Values = new List<S7Value>(); + foreach (var item in readmodels) + { + //瑙f瀽鏁版嵁 + string value = ""; + switch (item.type) + { + case "Int": + value = GetInt(bytes, item.addr, VarType.Int).ToString(); + break; + case "DInt": + value = GetInt(bytes, item.addr, VarType.DInt).ToString(); + break; + case "Real": + value = GetInt(bytes, item.addr, VarType.Real).ToString(); + break; + case "String": + value = GetString(bytes, item.addr, VarType.String, item.length).ToString(); + break; + //case "Byte": + // value = S7Help.GetInt(bytes, item.addr, VarType.Byte,item.length).ToString(); + // break; + } + item.value = value; + // s7Values.Add(new S7Value { addr = item.addr, type = item.type, value = value }); + } + //鏁版嵁瀛樺叆瀛楀吀 + if (Dictvalues.Keys.Contains(plcInfo.address)) + { + Dictvalues[plcInfo.address] = readmodels; + } + else + { + Dictvalues.Add(plcInfo.address, readmodels); + + } + } + + } + /// <summary> + /// S7鍐欏叆byte鏁扮粍 + /// </summary> + /// <param name="plcInfo">閰嶇疆鏂囦欢</param> + /// <param name="db">DB鍧�/param> + /// <param name="bytes"></param> + /// <returns></returns> + public static bool PLCWrite(Settings.LinePlcInfo plcInfo, int db, byte[] bytes) + { + bool result = false; + var plc = new Plc(CpuType.S71500, plcInfo.address, 0, 1); + Link(plc); + + try + { + result = plc.WriteBytes(DataType.DataBlock, Convert.ToInt16(db), Convert.ToInt16(plcInfo.writeAddr), bytes) == ErrorCode.NoError; + return result; + } + catch (Exception ex) + { + + throw ex; + } + } + + /// <summary> + /// S7璇诲彇byte鏁扮粍 + /// </summary> + /// <param name="plcInfo">閰嶇疆鏂囦欢</param> + /// <param name="db">DB鍧�/param> + /// <param name="addr">璇诲彇璧峰鍋忕Щ閲�/param> + /// <param name="bytes">杈撳嚭byte</param> + /// <returns></returns> + public static bool PLCRead(Settings.LinePlcInfo plcInfo, int db, int addr, int len, out byte[] bytes) + { + + bool result = false; + var plc = new Plc(CpuType.S71500, plcInfo.address, 0, 1); + Link(plc); + + string res = string.Empty; + bytes = new byte[len]; + try + { + if (plcInfo != null) + { + + bytes = plc.ReadBytes(DataType.DataBlock, Convert.ToInt16(db), Convert.ToInt16(plcInfo.readAddr + addr), len); + var r1 = "new byte[] {" + string.Join(",", bytes) + " }"; + res = $" B{db} A{addr} L{len} A{r1}"; + + } + else + { + res = " 娌¤澶囥�"; + } + } + catch (Exception ex) + { + res = "Err" + ex.Message + ex.StackTrace; + } + + // result = plc.WriteBytes(DataType.DataBlock, Convert.ToInt16(1000), Convert.ToInt16(linePlcInfo.writeAddr + 6), bytes) == ErrorCode.NoError; + return result; + } + + /// <summary> + /// 瑙f瀽鍫嗗灈鏈篵yte鏁扮粍int绫诲瀷 + /// </summary> + /// <param name="adr">鍋忕Щ閲�/param> + /// <param name="varType">绫诲瀷</param> + /// <param name="action">瑙f瀽澶辫触璋冨彇鏂规硶鍗曚釜璇诲彇</param> + /// <returns></returns> + public static int GetInt(byte[] bytes, int adr, VarType varType, Func<int> action = null) + { + var b = -1; + byte[] by = new byte[0]; + + by = bytes; + + if (by.Count() > 0) + { + b = GetInt(adr, varType, by); + } + if (b == -1 && action != null) + { + b = action(); + } + + + return b; + } + + public static int GetInt(int adr, VarType varType, byte[] d, int length = 1) + { + //璁$畻绫诲瀷闀垮害锛宻tring绫诲瀷涓哄彲鍙橀暱搴︾敤閰嶇疆鏂囦欢瀹氫箟鐨勯暱搴�+ var vlen = VarTypeToByteLength(varType); + if (varType == VarType.String) + { + vlen = length; + } + + if (adr + vlen > d.Length) + { + return -1; + } + + var adrbyte = d.Skip(adr).Take(vlen).ToArray(); + var obj = ParseBytes(varType, adrbyte, 1, 0); + return Convert.ToInt32(obj); + } + /// <summary> + /// 瑙f瀽string绫诲瀷 + /// </summary> + /// <param name="bytes"></param> + /// <param name="adr"></param> + /// <param name="varType"></param> + /// <param name="count"></param> + /// <param name="action"></param> + /// <returns></returns> + public static string GetString(byte[] bytes, int adr, VarType varType, int count, Func<int> action = null) + { + string b = null; + byte[] by = new byte[0]; + + by = bytes; + + if (by.Count() > 0) + { + b = GetString(adr, varType, by, count); + } + if (string.IsNullOrEmpty(b) && action != null) + { + b = action().ToString(); + } + + + return b; + } + public static string GetString(int adr, VarType varType, byte[] d, int length = 1) + { + //璁$畻绫诲瀷闀垮害锛宻tring绫诲瀷涓哄彲鍙橀暱搴︾敤閰嶇疆鏂囦欢瀹氫箟鐨勯暱搴�+ var vlen = VarTypeToByteLength(varType); + if (varType == VarType.String) + { + vlen = length; + } + + if (adr + vlen > d.Length) + { + return ""; + } + + var adrbyte = d.Skip(adr).Take(vlen).ToArray(); + adrbyte = adrbyte.Skip(adrbyte.ToList().FindIndex(x => x > 0)).ToArray(); + var obj = ParseBytes(varType, adrbyte, 1, 0); + return obj.ToString(); + } + + private static int VarTypeToByteLength(VarType varType, int varCount = 1) + { + switch (varType) + { + case VarType.Bit: + return varCount; + case VarType.Byte: + if (varCount >= 1) + { + return varCount; + } + + return 1; + case VarType.String: + return varCount; + case VarType.StringEx: + return varCount + 2; + case VarType.Word: + case VarType.Int: + case VarType.Timer: + case VarType.Counter: + return varCount * 2; + case VarType.DWord: + case VarType.DInt: + case VarType.Real: + return varCount * 4; + default: + return 0; + } + } + private static object ParseBytes(VarType varType, byte[] bytes, int varCount, byte bitAdr = 0) + { + if (bytes == null) + { + return null; + } + + switch (varType) + { + case VarType.Byte: + if (varCount == 1) + { + return bytes[0]; + } + + return bytes; + case VarType.Word: + if (varCount == 1) + { + return Word.FromByteArray(bytes); + } + + return Word.ToArray(bytes); + case VarType.Int: + if (varCount == 1) + { + return Int.FromByteArray(bytes); + } + + return Int.ToArray(bytes); + case VarType.DWord: + if (varCount == 1) + { + return DWord.FromByteArray(bytes); + } + + return DWord.ToArray(bytes); + case VarType.DInt: + if (varCount == 1) + { + return DInt.FromByteArray(bytes); + } + + return DInt.ToArray(bytes); + case VarType.Real: + if (varCount == 1) + { + return S7.Net.Types.Double.FromByteArray(bytes); + } + + return S7.Net.Types.Double.ToArray(bytes); + case VarType.String: + return S7.Net.Types.String.FromByteArray(bytes); + case VarType.StringEx: + return StringEx.FromByteArray(bytes); + case VarType.Timer: + if (varCount == 1) + { + return S7.Net.Types.Timer.FromByteArray(bytes); + } + + return S7.Net.Types.Timer.ToArray(bytes); + case VarType.Counter: + if (varCount == 1) + { + return Counter.FromByteArray(bytes); + } + + return Counter.ToArray(bytes); + case VarType.Bit: + if (varCount == 1) + { + if (bitAdr > 7) + { + return null; + } + + return Bit.FromByte(bytes[0], bitAdr); + } + + return Bit.ToBitArray(bytes); + default: + return null; + } + } + #endregion + + #region 鐢ㄤ簬妯℃嫙娴嬭瘯 + /// <summary> + /// short绫诲瀷锛屼竴涓崰2涓猙yte + /// </summary> + public class DBWModel + { + public int db { get; set; } + public int byteAddr { get; set; } + /// <summary> + /// int绫诲瀷闇�鐢ㄩ�鍙峰垎寮�紝string涓嶉渶瑕�+ /// </summary> + public string value { get; set; } + } + /// <summary> + /// 瀛楃涓茬被鍨嬶紝涓�釜鍗�涓猙yte + /// </summary> + public class DBBModel + { + public int db { get; set; } + public int byteAddr { get; set; } + public string value { get; set; } + } + public class DBXModel + { + public int db { get; set; } + public int byteAddr { get; set; } + public int bitAddr { get; set; } + /// <summary> + /// 1:true 0:false + /// </summary> + public int value { get; set; } + } + public static void s7SetInt(DBWModel model) + { + var data = model.value.Replace(",", ""); + var s7Key = $"int_{model.db}_{model.byteAddr}_{data.Length}"; + if (s7TestData.ContainsKey(s7Key)) + { + s7TestData[s7Key] = model.value; + } + else + { + s7TestData.Add(s7Key, model.value); + } + } + + internal static void s7SetBit(DBXModel model) + { + var s7Key = $"bit_{model.db}_{model.byteAddr}_{model.bitAddr}"; + var value = model.value == 1 ? "1" : "0"; + if (s7TestData.ContainsKey(s7Key)) + { + s7TestData[s7Key] = value; + } + else + { + s7TestData.Add(s7Key, value); + } + } + + internal static void s7SetStr(DBBModel model) + { + var s7Key = $"str_{model.db}_{model.byteAddr}_{model.value.Length}"; + if (s7TestData.ContainsKey(s7Key)) + { + s7TestData[s7Key] = model.value; + } + else + { + s7TestData.Add(s7Key, model.value); + } + } + } + #endregion +} -- Gitblit v1.9.1