From e1a97fc8b29f063e96e3ebbae2f07ee95b276069 Mon Sep 17 00:00:00 2001 From: lss <Lss@HanInfo> Date: 星期四, 05 六月 2025 17:25:31 +0800 Subject: [PATCH] 合肥佳通优化 --- HH.WCS.Mobox3/HH.WCS.Mobox3.JiaTong/device/S7Helper.cs | 326 +++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 239 insertions(+), 87 deletions(-) diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.JiaTong/device/S7Helper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.JiaTong/device/S7Helper.cs index 9ebdd29..97eaf35 100644 --- a/HH.WCS.Mobox3/HH.WCS.Mobox3.JiaTong/device/S7Helper.cs +++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.JiaTong/device/S7Helper.cs @@ -1,65 +1,85 @@ 锘縰sing HH.WCS.JiaTong.api; +using Microsoft.Owin.BuilderProperties; using Newtonsoft.Json.Linq; +using Opc.UaFx; using S7.Net; using S7.Net.Types; using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Web.Services.Description; +using System.Web.UI.WebControls.WebParts; -namespace HH.WCS.JiaTong.device { +namespace HH.WCS.JiaTong.device +{ /// <summary> /// 瑗块棬瀛恜lc /// </summary> - public class S7Helper { + public class S7Helper + { private static bool debug = true; private static S7.Net.Plc plc = null; - static S7Helper() { + + static S7Helper() + { Init(); } private static Dictionary<string, Plc> plcDic = new Dictionary<string, Plc>(); - private static void Init() { + private static void Init() + { //閰嶇疆鏂囦欢璇诲彇鎵�湁鐨刾lc杩涜鍒濆鍖�- try { + try + { var plc1 = new Plc(CpuType.S71500, "", 0, 1); plcDic.Add("plc1", plc1); Link(plc1); } - catch (Exception ex) { + catch (Exception ex) + { Console.WriteLine("S7Helper Init err=" + ex.Message); } } - private static Plc GetPlc(string plc) { - if (plcDic.ContainsKey(plc)) { + private static Plc GetPlc(string plc) + { + if (plcDic.ContainsKey(plc)) + { return plcDic[plc]; } - else { + 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"); - } + 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}"); + catch (Exception ex) + { + // Console.WriteLine($"plc{plc.IP}杩炴帴澶辫触锛宔rr={ex.Message}"); + LogHelper.Error($"Link Error plc{plc.IP}杩炴帴澶辫触锛宔rr={ex.Message}",ex); //Init(); } @@ -67,71 +87,164 @@ //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 + private static object _lockdpj=new object(); + /// <summary> /// 鍚堣偉浣抽�璇诲彇鍙犵洏鏈� /// </summary> - /// <param name="pyl">鍋忕Щ閲忓湴鍧�紝浣抽�byte鍗犱綅鎵�互鍙互鐢ㄨ繖鏍锋柟寮忕洿鎺ヨ鍙栧啓鍏�DB200.DBX0.1</param> + /// <param name="startByte">鍋忕Щ閲忓湴鍧�vb2001</param> + /// /// <param name="varType">鍊肩被鍨�/param> /// <returns></returns> - public static int ReadDpj(string pyl) - { var plc = new Plc(CpuType.S71500, "192.168.1.1", 0, 1); - S7Helper.Link(plc); - return (int)plc.Read(pyl); + public static int ReadDpj(string ip,int startByte, S7.Net.VarType varType) + { + // string ip = "10.68.9.15"; + short port = 102; + lock (_lockdpj) + { + try + { + var plc = new Plc(CpuType.S7200Smart, ip, port, 0, 0); + LogHelper.Info($"閾炬帴鍙犵洏鏈猴紝ip锛歿ip}锛岀鍙o細{port}"); + S7Helper.Link(plc); + int result = 0; + if (varType == VarType.Int) + { + var value = (short)plc.Read(DataType.DataBlock, 1, startByte, VarType.Int, 1); + LogHelper.Info($"閾炬帴鍙犵洏鏈猴紝ip锛歿ip}锛岀鍙o細{port},璇诲彇绫诲瀷{varType},璇诲彇鍊納value}"); + result = int.Parse(value.ToString()); + } + else//鍚堣偉浣抽�闄や簡鏁伴噺锛屽叾浠栭兘鏄痓yte绫诲瀷 + { + + byte value = (byte)plc.Read(DataType.DataBlock, 1, startByte, VarType.Byte, 1); + LogHelper.Info($"閾炬帴鍙犵洏鏈猴紝ip锛歿ip}锛岀鍙o細{port},璇诲彇绫诲瀷{varType},璇诲彇鍊納value}"); + result = value; + } + + LogHelper.Info($"璇诲彇鍙犵洏鏈猴紝ip锛歿ip}锛岀鍙o細{port},鍦板潃锛歿startByte},璇诲彇鍊艰浆鎹�{result}"); + return result; + } + catch (Exception ex) + { + LogHelper.Info($"鍙犵洏鏈�{ip}閾炬帴澶辫触"); + LogHelper.Error($"ReadDpj ip:{ip},startByte:{startByte} Error:{ex}", ex); + throw; + } + } + + } /// <summary> /// 鍚堣偉浣抽�鍐欏叆鍙犵洏鏈� /// </summary> - /// <param name="pyl">鍋忕Щ閲忓湴鍧�紝浣抽�byte鍗犱綅鎵�互鍙互鐢ㄨ繖鏍锋柟寮忕洿鎺ヨ鍙栧啓鍏�DB200.DBX0.1</param> + /// <param name="startByte">鍋忕Щ閲忓湴鍧�/param> /// <param name="value">鍐欏叆鍊�byte绫诲瀷鍙兘0 1</param> /// <returns></returns> - public static int WriteDpj(string pyl,int value) + public static bool WriteDpj(string ip,int startByte, byte value) { - var plc = new Plc(CpuType.S71500, "192.168.1.1", 0, 1); - S7Helper.Link(plc); - return (int)plc.Write(pyl, value); + bool result = false; + // string ip = "10.68.9.15"; + short port = 102; + lock (_lockdpj) + { + try + { + var plc = new Plc(CpuType.S7200Smart, ip, port, 0, 0); + + LogHelper.Info($"閾炬帴鍙犵洏鏈猴紝ip锛歿ip}锛岀鍙o細{port}"); + S7Helper.Link(plc); + // plc.Write($"VB{startByte}", value); + Thread.Sleep(300); + plc.Write( + dataType: DataType.DataBlock, + db: 1, + startByteAdr: startByte, + value: value + ); + LogHelper.Info($"鍐欏叆鍙犵洏鏈猴紝ip锛歿ip}锛岀鍙o細{port},鍦板潃锛歿startByte},鍐欏叆鍊�{value}"); + Thread.Sleep(300); + byte fdvalue = (byte)plc.Read(DataType.DataBlock, 1, startByte, VarType.Byte, 1); + if (fdvalue == value) + { + result = true; + LogHelper.Info($"鍙犵洏鏈哄啓鍏ユ垚鍔燂紝鍥炶鍊硷細{fdvalue}"); + } + else + { + LogHelper.Info($"鍙犵洏鏈哄啓鍏ュけ璐ワ紝鍥炶鍊硷細{fdvalue}"); + } + + return result; + } + catch (Exception ex) + { + LogHelper.Info($"WriteDpj Error{ex}"); + throw; + } + } + + + + // S7-200 Smart鐨刅鍖轰篃鏄犲皠涓篋B1 + + } - internal static short[] ReadInt(string device, int db, int byteAddr, int count) { + internal static short[] ReadInt(string device, int db, int byteAddr, int count) + { short[] result = null; - try { - if (debug) { + try + { + if (debug) + { var s7Key = $"int_{db}_{byteAddr}_{count}"; - if (s7TestData.ContainsKey(s7Key)) { + if (s7TestData.ContainsKey(s7Key)) + { var data = s7TestData[s7Key].Split(','); - if (data.Length == count) { + if (data.Length == count) + { result = Array.ConvertAll(data, s => short.Parse(s)); } - else { + else + { result = new short[count]; s7TestData[s7Key] = string.Join(",", result); } Console.WriteLine($"璇诲彇plc {device}淇℃伅鎴愬姛锛� addr={byteAddr} data={string.Join(",", result)}"); } } - else { + else + { var plc = GetPlc(device); - if (plc != null) { - if (plc.IsConnected) { + 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) { + if (result.Length == 0) + { Console.WriteLine($"plc {device}鍑嗗閲嶆柊杩炴帴"); Link(plc); } } - else { + else + { Console.WriteLine($"鍑嗗杩炴帴plc {device}"); Link(plc); } } - else { + else + { Console.WriteLine($"plc {device}涓嶅瓨鍦�); } } } - catch (Exception ex) { + 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); } @@ -145,14 +258,18 @@ /// <param name="byteAddr"></param> /// <param name="data"></param> /// <returns></returns> - internal static bool WriteInt(int db, int byteAddr, short data) { + internal static bool WriteInt(int db, int byteAddr, short data) + { var result = false; - try { - if (plc.IsConnected) { + 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) { + 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)}"); @@ -162,81 +279,104 @@ } - else { + else + { Console.WriteLine("鍑嗗杩炴帴plc1"); Link(plc); } } - catch (Exception ex) { + 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) { + public static object ReadBit(string device, int db, int byteAddr, byte bitAddr) + { object result = null; - try { - if (debug) { + try + { + if (debug) + { var s7Key = $"bit_{db}_{byteAddr}_{bitAddr}"; - if (s7TestData.ContainsKey(s7Key)) { + if (s7TestData.ContainsKey(s7Key)) + { var data = s7TestData[s7Key]; - if (data == "1") { + if (data == "1") + { result = true; } else { result = false; } Console.WriteLine($"璇诲彇plc {device}淇℃伅鎴愬姛锛� addr={byteAddr} data={result.ToString()}"); } } - else { + else + { var plc = GetPlc(device); - if (plc != null) { - if (plc.IsConnected) { + 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 { + else + { Console.WriteLine($"鍑嗗杩炴帴plc {device}"); Link(plc); } } - else { + else + { Console.WriteLine($"plc {device}涓嶅瓨鍦�); } } } - catch (Exception ex) { + 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) { + public static string ReadStr(string device, int db, int byteAddr, int count) + { string result = string.Empty; - try { - if (debug) { + try + { + if (debug) + { var s7Key = $"str_{db}_{byteAddr}_{count}"; - if (s7TestData.ContainsKey(s7Key)) { + if (s7TestData.ContainsKey(s7Key)) + { var data = s7TestData[s7Key]; - if (data.Length == count) { + if (data.Length == count) + { result = data; Console.WriteLine($"ReadStr 鎴愬姛锛�addr={byteAddr} res={result}"); } } } - else { - if (plc.IsConnected) { + 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) { + if (result.Length == 0) + { Link(plc); } } - else { + else + { Console.WriteLine("鍑嗗杩炴帴plc"); Link(plc); } } } - catch (Exception ex) { + 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); } @@ -248,7 +388,8 @@ /// <summary> /// short绫诲瀷锛屼竴涓崰2涓猙yte /// </summary> - public class DBWModel { + public class DBWModel + { public int db { get; set; } public int byteAddr { get; set; } /// <summary> @@ -259,12 +400,14 @@ /// <summary> /// 瀛楃涓茬被鍨嬶紝涓�釜鍗�涓猙yte /// </summary> - public class DBBModel { + public class DBBModel + { public int db { get; set; } public int byteAddr { get; set; } public string value { get; set; } } - public class DBXModel { + public class DBXModel + { public int db { get; set; } public int byteAddr { get; set; } public int bitAddr { get; set; } @@ -273,34 +416,43 @@ /// </summary> public int value { get; set; } } - public static void s7SetInt(DBWModel model) { + public static void s7SetInt(DBWModel model) + { var data = model.value.Replace(",", ""); var s7Key = $"int_{model.db}_{model.byteAddr}_{data.Length}"; - if (s7TestData.ContainsKey(s7Key)) { + if (s7TestData.ContainsKey(s7Key)) + { s7TestData[s7Key] = model.value; } - else { + else + { s7TestData.Add(s7Key, model.value); } } - internal static void s7SetBit(DBXModel model) { + 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)) { + if (s7TestData.ContainsKey(s7Key)) + { s7TestData[s7Key] = value; } - else { + else + { s7TestData.Add(s7Key, value); } } - internal static void s7SetStr(DBBModel model) { + internal static void s7SetStr(DBBModel model) + { var s7Key = $"str_{model.db}_{model.byteAddr}_{model.value.Length}"; - if (s7TestData.ContainsKey(s7Key)) { + if (s7TestData.ContainsKey(s7Key)) + { s7TestData[s7Key] = model.value; } - else { + else + { s7TestData.Add(s7Key, model.value); } } -- Gitblit v1.9.1