using HH.WCS.JiaTong.api; 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; namespace HH.WCS.JiaTong.device { /// /// 西门子plc /// public class S7Helper { private static bool debug = true; private static S7.Net.Plc plc = null; static S7Helper() { Init(); } private static Dictionary plcDic = new Dictionary(); private static void Init() { //配置文件读取所有的plc进行初始化 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 s7TestData = new Dictionary(); 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}连接失败,err={ex.Message}"); LogHelper.Info($"plc{plc.IP}连接失败,err={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 /// /// 合肥佳通读取叠盘机 /// /// 偏移量地址,佳通byte占位所以可以用这样方式直接读取写入 DB200.DBX0.1 /// 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); } /// /// 合肥佳通写入叠盘机 /// /// 偏移量地址,佳通byte占位所以可以用这样方式直接读取写入 DB200.DBX0.1 /// 写入值 byte类型只能0 1 /// public static int WriteDpj(string pyl,int value) { var plc = new Plc(CpuType.S71500, "192.168.1.1", 0, 1); S7Helper.Link(plc); return (int)plc.Write(pyl, value); } 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}信息成功,ip={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,device={device} addr={byteAddr} count={count} err={ex.Message}"); LogHelper.Error($"ReadInt,device={device} addr={byteAddr} count={count} err={ex.Message}", ex); } return result; } /// /// /// /// /// /// /// 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信息,ip={plc.IP} addr={byteAddr} data={data} "); LogHelper.Info($"写入plc信息,ip={plc.IP} addr={byteAddr} data={data} "); if (result) { //写完再读一次确认 var readData = (short)plc.Read(DataType.DataBlock, db, byteAddr, VarType.Int, 1, 0); Console.WriteLine($"读取plc信息,ip={plc.IP} addr={byteAddr} data={data} res={string.Join(", ", readData)}"); LogHelper.Info($"读取plc信息,ip={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信息失败,ip={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}信息成功,ip={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,device={device} addr={byteAddr} bit={bitAddr} err={ex.Message}"); LogHelper.Error($"ReadBit,device={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 成功,ip={plc.IP} addr={byteAddr} res={result}"); if (result.Length == 0) { Link(plc); } } else { Console.WriteLine("准备连接plc"); Link(plc); } } } catch (Exception ex) { Console.WriteLine($"ReadStr,device={device} addr={byteAddr} count={count} err={ex.Message}"); LogHelper.Error($"ReadStr,device={device} addr={byteAddr} count={count} err={ex.Message}", ex); } return result; } #region 用于模拟测试 /// /// short类型,一个占2个byte /// public class DBWModel { public int db { get; set; } public int byteAddr { get; set; } /// /// int类型需要用逗号分开,string不需要 /// public string value { get; set; } } /// /// 字符串类型,一个占1个byte /// 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; } /// /// 1:true 0:false /// 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 }