From 77f9799304c059996d38914b1adc5c9c965e070e Mon Sep 17 00:00:00 2001 From: zxx <Zxx@HanInfo> Date: 星期五, 30 五月 2025 13:27:50 +0800 Subject: [PATCH] RGVS7写入修改 --- HH.WCS.Mobox3/HH.WCS.Mobox3.JuShi/device/S7Helper.cs | 290 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 221 insertions(+), 69 deletions(-) diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.JuShi/device/S7Helper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.JuShi/device/S7Helper.cs index d72dc35..c2d558a 100644 --- a/HH.WCS.Mobox3/HH.WCS.Mobox3.JuShi/device/S7Helper.cs +++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.JuShi/device/S7Helper.cs @@ -3,6 +3,7 @@ using Microsoft.Owin.BuilderProperties; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Opc.Ua; using S7.Net; using S7.Net.Types; using SqlSugar; @@ -11,6 +12,7 @@ using System.Data.SqlTypes; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Web.Services.Description; using static HH.WCS.JuShi.util.Settings; @@ -164,6 +166,9 @@ var result = false; try { + var linkplc = Settings.SafeInteractions.First(); + var plc = new Plc(CpuType.S71200, linkplc.ip, 0, 1); + Link(plc); if (plc.IsConnected) { plc.Write(DataType.DataBlock, db, byteAddr, data); @@ -285,76 +290,187 @@ } - public static List<PlcDeviceTable> plcDeviceTables = new List<PlcDeviceTable>(); + public static PlcDeviceTable plcDeviceTables = new PlcDeviceTable(); /// <summary> /// 鑾峰彇杈撻�绾挎暟鎹� /// </summary> public static void ReadSsxPLc() { - //#region 娴嬭瘯鍐欏叆鏁版嵁 - //List<S7Model> s7Models = new List<S7Model>(); - //s7Models.Add(new S7Model() { addr = 0, value = "1", type = "Int", length = 2 }); - //s7Models.Add(new S7Model() { addr = 2, value = "2", type = "Int", length = 2 }); - //s7Models.Add(new S7Model() { addr = 4, value = "4", type = "Int", length = 2 }); - //s7Models.Add(new S7Model() { addr = 18, value = "TP24121108", type = "String", length = 20 }); - //var plcInfo = Settings.linePlcInfo.Where(a => (a.deviceNo == "2") && a.enable == 1).FirstOrDefault(); - //Write(s7Models, 100, plcInfo); - //#endregion - var db = new SqlHelper<WCSTask>().GetInstance(); - //涓や釜鎷嗘墭鏈�- var linkplcs = Settings.linePlcInfos.FindAll(a => a.enable == 1).ToList(); - foreach (var linkplc in linkplcs){ - //鑾峰彇璁惧閰嶇疆鏂囦欢 - var deviceInfos = Settings.ConveyorLinesInfos.Where(a => a.enable == 1 &&a.deviceNo== linkplc.deviceNo).ToList(); - if (deviceInfos.Count > 0) + try + { + var linkplc = Settings.SafeInteractions.FindAll(a => a.code == 1|| a.code == 7).ToList(); + var plc = new Plc(CpuType.S71500, linkplc[1].ip, 0, 1); + Link(plc); + var plc1 = new Plc(CpuType.S71200, linkplc[0].ip, 0, 1); + Link(plc1); + //鎷嗘墭鏈� + //object rawValue = plc.Read(DataType.DataBlock, 8, 230, VarType.Byte, 1); + //LogHelper.Info($"Raw value: {rawValue} (Type: {rawValue?.GetType()})"); + // 鍏堣鍙栨暣涓瓧鑺�+ byte data = (byte)plc.Read(DataType.DataBlock, 8, 230, VarType.Byte, 1); + // 鐒跺悗鎻愬彇鍚勪釜浣�+ bool requestPut1 = (data & 0x01) != 0; // 230.0 1001 + bool requestTake1 = (data & 0x02) != 0; // 230.1 1003 + bool requestPut2 = (data & 0x04) != 0; // 230.2 1004 + bool requestTake2 = (data & 0x08) != 0; // 230.3 1006 + LogHelper.Info($"鎷嗘墭鏈烘帴鏀朵俊鍙�===={requestPut1}锛寋requestTake1}锛寋requestPut2}锛寋requestTake2}"); + + //RGV + //var rawValue = plc1.Read(DataType.DataBlock, 51, 0, VarType.Int, 1); + //LogHelper.Info($"Raw value: {rawValue}, Type: {rawValue?.GetType()}"); + + // RGV鍏佽鍗歌揣鐘舵�璇诲彇 (浠嶥B51璇诲彇) + int rgv1AllowUnload = Convert.ToInt32(plc1.Read(DataType.DataBlock, 51, 0, VarType.Int, 1)); + int rgv2AllowUnload = Convert.ToInt32(plc1.Read(DataType.DataBlock, 51, 2, VarType.Int, 1)); + int rgv3AllowUnload = Convert.ToInt32(plc1.Read(DataType.DataBlock, 51, 4, VarType.Int, 1)); + int rgv4AllowUnload = Convert.ToInt32(plc1.Read(DataType.DataBlock, 51, 6, VarType.Int, 1)); + int rgv5AllowUnload = Convert.ToInt32(plc1.Read(DataType.DataBlock, 51, 8, VarType.Int, 1)); + int rgv6AllowUnload = Convert.ToInt32(plc1.Read(DataType.DataBlock, 51, 10, VarType.Int, 1)); + + LogHelper.Info($"RGV鎺ユ敹淇″彿=== 1={rgv1AllowUnload}, 2={rgv2AllowUnload}, 3={rgv3AllowUnload}, 4={rgv4AllowUnload}, 5={rgv5AllowUnload}, 6={rgv6AllowUnload}"); + + //瀛樺埌缂撳瓨 + if (plcDeviceTables != null) { - int slen =int.Parse(deviceInfos.Min(a => a.readAddr).ToString()); - int elen = int.Parse(deviceInfos.Max(a => a.readAddr).ToString()); - - //璇诲彇杈撻�绾挎暣涓亸绉婚噺鐨刡yte鏁扮粍 鏀惧唴瀛橀噷涓�捣瑙f瀽锛岄槻姝㈣繃搴﹁鍙�- //PLCRead(linkplc.address, 8, slen, elen + 18, out Ssxbytes); - - var plc = new Plc(CpuType.S71500, linkplc.address, 0, 1); - Link(plc); - //涓�釜鎷嗘墭鏈轰袱涓嚎浣�- foreach (var device in deviceInfos) + plcDeviceTables.requestTake1 = requestTake1; + plcDeviceTables.requestPut1 = requestPut1; + plcDeviceTables.requestTake2 = requestTake2; + plcDeviceTables.requestPut2 = requestPut2; + plcDeviceTables.RGVAllowUnload = new Dictionary<int, int> { - //int workMode = int.Parse(GetValue(int.Parse(device.readAddr.ToString()), VarType.Int, Ssxbytes)); //宸ヤ綔妯″紡 - //int lightAction = int.Parse(GetValue(int.Parse((device.readAddr + 2).ToString()), VarType.Int, Ssxbytes)); //鏄惁鏈夎揣锛屽厜鐢典俊鍙�- - int workMode = (short)plc.Read(DataType.DataBlock, 8, int.Parse(device.readAddr.ToString()), VarType.Int, 1, 0); - int lightAction = (short)plc.Read(DataType.DataBlock, 8, int.Parse((device.readAddr + 2).ToString()), VarType.Int, 1, 0); - var requestTake = plc.Read("DB8.DBX"+ device.readAddr+16.0);//杈撻�绾胯姹傚彇妗�- var requestPut = plc.Read("DB8.DBX"+ device.readAddr + 16.1);//杈撻�绾垮厑璁告斁妗�- //瀛樺埌缂撳瓨 - var task = plcDeviceTables.Find(a => a.DeviceNo == device.code); - if (task != null) - { - task.DeviceNo = device.code; - task.workMode = workMode; - task.lightAction = lightAction; - task.requestTake =bool.Parse(requestTake.ToString()); - task.requestPut = bool.Parse(requestPut.ToString()); - } - else - { - var plcDeviceTable = new PlcDeviceTable(); - plcDeviceTable.DeviceNo = device.code; - plcDeviceTable.workMode = workMode; - plcDeviceTable.lightAction = lightAction; - plcDeviceTable.requestTake = bool.Parse(requestTake.ToString()); - plcDeviceTable.requestPut = bool.Parse(requestPut.ToString()); - plcDeviceTables.Add(plcDeviceTable); - } - - } + {1, rgv1AllowUnload}, + {2, rgv2AllowUnload}, + {3, rgv3AllowUnload}, + {4, rgv4AllowUnload}, + {5, rgv5AllowUnload}, + {6, rgv6AllowUnload} + }; + LogHelper.Info($"S7鍗忚绗竴娆¤鍙栧弬鏁�{JsonConvert.SerializeObject(plcDeviceTables)}"); } + else + { + var plcDeviceTable = new PlcDeviceTable(); + plcDeviceTable.requestTake1 = requestTake1; + plcDeviceTable.requestPut1 = requestPut1; + plcDeviceTable.requestTake2 = requestTake2; + plcDeviceTable.requestPut2 = requestPut2; + plcDeviceTable.RGVAllowUnload = new Dictionary<int, int> + { + {1, rgv1AllowUnload}, + {2, rgv2AllowUnload}, + {3, rgv3AllowUnload}, + {4, rgv4AllowUnload}, + {5, rgv5AllowUnload}, + {6, rgv6AllowUnload} + }; + plcDeviceTables = plcDeviceTable; + LogHelper.Info($"S7鍗忚璇诲彇鍙傛暟:{JsonConvert.SerializeObject(plcDeviceTable)}"); + } + + + } + catch (Exception ex) + { + Console.WriteLine("ReadSsxPLc:" + ex.Message + ex.StackTrace); + LogHelper.Error("ReadSsxPLc:" + ex.Message, ex); + throw; } } + ///// <summary> + ///// 鑾峰彇杈撻�绾挎暟鎹�+ ///// </summary> + //public static void oldReadSsxPLc() + //{ + // //#region 娴嬭瘯鍐欏叆鏁版嵁 + // //List<S7Model> s7Models = new List<S7Model>(); + // //s7Models.Add(new S7Model() { addr = 0, value = "1", type = "Int", length = 2 }); + // //s7Models.Add(new S7Model() { addr = 2, value = "2", type = "Int", length = 2 }); + // //s7Models.Add(new S7Model() { addr = 4, value = "4", type = "Int", length = 2 }); + // //s7Models.Add(new S7Model() { addr = 18, value = "TP24121108", type = "String", length = 20 }); + // //var plcInfo = Settings.linePlcInfo.Where(a => (a.deviceNo == "2") && a.enable == 1).FirstOrDefault(); + // //Write(s7Models, 100, plcInfo); + // //#endregion + // var db = new SqlHelper<WCSTask>().GetInstance(); + // try + // { + // //涓や釜鎷嗘墭鏈�+ // var linkplcs = Settings.linePlcInfos.FindAll(a => a.enable == 1).ToList(); + // foreach (var linkplc in linkplcs) + // { + // //鑾峰彇璁惧閰嶇疆鏂囦欢 + // var deviceInfos = Settings.ConveyorLinesInfos.Where(a => a.enable == 1 && a.deviceNo == linkplc.deviceNo).ToList(); + // if (deviceInfos.Count > 0) + // { + // int slen = int.Parse(deviceInfos.Min(a => a.readAddr).ToString()); + // int elen = int.Parse(deviceInfos.Max(a => a.readAddr).ToString()); + + // //璇诲彇杈撻�绾挎暣涓亸绉婚噺鐨刡yte鏁扮粍 鏀惧唴瀛橀噷涓�捣瑙f瀽锛岄槻姝㈣繃搴﹁鍙�+ // //PLCRead(linkplc.address, 8, slen, elen + 18, out Ssxbytes); + + // var plc = new Plc(CpuType.S71500, linkplc.address, 0, 1); + // Link(plc); + // //涓�釜鎷嗘墭鏈轰袱涓嚎浣�+ // foreach (var device in deviceInfos) + // { + // //int workMode = int.Parse(GetValue(int.Parse(device.readAddr.ToString()), VarType.Int, Ssxbytes)); //宸ヤ綔妯″紡 + // //int lightAction = int.Parse(GetValue(int.Parse((device.readAddr + 2).ToString()), VarType.Int, Ssxbytes)); //鏄惁鏈夎揣锛屽厜鐢典俊鍙�+ + // //int workMode = (short)plc.Read(DataType.DataBlock, 8, int.Parse(device.readAddr.ToString()), VarType.Int, 1, 0); + // //int lightAction = (short)plc.Read(DataType.DataBlock, 8, int.Parse((device.readAddr + 2).ToString()), VarType.Int, 1, 0); + + // int requestTake1 = (short)plc.Read(DataType.DataBlock, 8, 230, VarType.Int, 1, 0); + // int requestPut1 = (short)plc.Read(DataType.DataBlock, 8, 230, VarType.Int, 1, 1); + // int requestTake2 = (short)plc.Read(DataType.DataBlock, 8, 230, VarType.Int, 1, 2); + // int requestPut2 = (short)plc.Read(DataType.DataBlock, 8, 230, VarType.Int, 1, 3); + + // LogHelper.Info($"readbool2================={requestTake1}锛寋requestPut1}锛寋requestTake2}锛寋requestPut2}"); + // //var requestTake = plc.Read("DB8.DBX" + device.readAddr + 16.0);//杈撻�绾胯姹傚彇妗�+ // //var requestPut = plc.Read("DB8.DBX" + device.readAddr + 16.1);//杈撻�绾垮厑璁告斁妗�+ + // //瀛樺埌缂撳瓨 + // //var task = plcDeviceTables.Find(a => a.DeviceNo == device.code); + // if (task != null) + // { + // task.DeviceNo = device.code; + // //task.workMode = workMode; + // //task.lightAction = lightAction; + // task.requestTake1 = requestTake1; + // task.requestPut1 = requestPut1; + // task.requestTake2 = requestTake2; + // task.requestPut2 = requestPut2; + // LogHelper.Info($"S7鍗忚绗竴娆¤鍙栧弬鏁�{JsonConvert.SerializeObject(task)}"); + // } + // else + // { + // var plcDeviceTable = new PlcDeviceTable(); + // plcDeviceTable.DeviceNo = device.code; + // //plcDeviceTable.workMode = workMode; + // //plcDeviceTable.lightAction = lightAction; + // plcDeviceTable.requestTake1 = requestTake1; + // plcDeviceTable.requestPut1 = requestPut1; + // plcDeviceTable.requestTake2 = requestTake2; + // plcDeviceTable.requestPut2 = requestPut2; + // plcDeviceTables.Add(plcDeviceTable); + // LogHelper.Info($"S7鍗忚璇诲彇鍙傛暟:{JsonConvert.SerializeObject(plcDeviceTable)}"); + // } + + // } + // } + // } + // } + // catch (Exception ex) + // { + // Console.WriteLine("ReadSsxPLc:" + ex.Message + ex.StackTrace); + // LogHelper.Error("ReadSsxPLc:" + ex.Message, ex); + // throw; + // } + + + //} ///// <summary> ///// 鎵归噺鍐欏叆鏂规硶 ///// </summary> @@ -669,7 +785,7 @@ } } - internal static bool WriteDouble(string deviceNo,int db, double? byteAddr, int data) + internal static bool WriteDouble(string deviceNo, int db, int byteAddr, int offsetAddr, int data) { var result = false; try @@ -679,22 +795,47 @@ Link(plc); if (plc.IsConnected) { - if (byteAddr != 0) { - plc.Write("DB9.DBX" + byteAddr, data); - //plc.Write(DataType.DataBlock, db, byteAddr, data); + if (byteAddr != 0) + { + plc.WriteBit(DataType.DataBlock, db, byteAddr, offsetAddr, true); Console.WriteLine($"鍐欏叆plc淇℃伅锛宨p={plc.IP} addr={byteAddr} data={data} "); LogHelper.Info($"鍐欏叆plc淇℃伅锛宨p={plc.IP} addr={byteAddr} data={data} "); - if (result) + //鐫′笁绉�濡傛灉杩樼户缁彂璇锋眰鐨勮瘽灏遍噸鍐欏叆 鍚﹀垯鍐欏叆false + Thread.Sleep(3000); + var plcDeviceTable = S7Helper.plcDeviceTables; + if (plcDeviceTable != null) { - //鍐欏畬鍐嶈涓�纭 - //var readData = (short)plc.Read(DataType.DataBlock, db, byteAddr, VarType.Int, 1, 0); - var readData = (short)plc.Read("DB9.DBX" + byteAddr); - 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; + if ((offsetAddr == 0 && plcDeviceTable.requestPut1) + || (offsetAddr == 1 && plcDeviceTable.requestTake1) + || (offsetAddr == 2 && plcDeviceTable.requestPut2) + || (offsetAddr == 3 && plcDeviceTable.requestTake2)) + { + WriteDouble(deviceNo, db, byteAddr, offsetAddr, data); + } + else + { + plc.WriteBit(DataType.DataBlock, db, byteAddr, offsetAddr, false); + LogHelper.Info($"S7鍙戦�澶嶄綅淇″彿"); + } + } + + //if (result) + //{ + // //鍐欏畬鍐嶈涓�纭 + // //var readData = (short)plc.Read(DataType.DataBlock, db, byteAddr, VarType.Int, 1, 0); + + // //byte data1 = (byte)plc.Read(DataType.DataBlock, db, byteAddr, VarType.Byte, 1); + // //// 鐒跺悗鎻愬彇鍚勪釜浣�+ // //bool requestPut1 = (data1 & 0x01) != 0; // 230.0 1001 + + // var readData = (short)plc.Read("DB9.DBX" + byteAddr); + // 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 { @@ -829,7 +970,18 @@ public string value { get; set; } } - + //S7鍐欏叆淇″彿 娴嬭瘯鐢�+ internal static Results S7Write(Isusing offsetAddr) + { + //var linkplcs = Settings.linePlcInfos.Find(a => a.deviceNo == "1"); + //var plc = new Plc(CpuType.S71200, linkplcs.address, 0, 1); + var linkplc = Settings.SafeInteractions.First(); + var plc = new Plc(CpuType.S71200, linkplc.ip, 0, 1); + Link(plc); + S7Helper.WriteInt(50, offsetAddr.S_STATUS*2-2, (short)(offsetAddr.S_STATUS * 10 + int.Parse(offsetAddr.S_TYPE))); + //plc.WriteBit(DataType.DataBlock, 9, 182, offsetAddr, false); + return new Results() { Code = "0", Message = $"鍐欏叆鎴愬姛", Data = null }; + } #region 鐢ㄤ簬妯℃嫙娴嬭瘯 /// <summary> -- Gitblit v1.9.1