using EasyModbus; using GZ.Device.PLC; using GZ.Modular.Redis; using ServiceStack; using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Documents; using System.Runtime.CompilerServices; using ServiceStack.Text; using System.Threading; using System.Windows.Interop; using Newtonsoft.Json.Linq; using System.Windows.Input; using System.Xml.Linq; namespace GZ.Projects.mttest.代码 { internal static class MBTCP { static Dictionary mcs = new Dictionary(); public static ModbusClient initTCP(PlcBase plc) { if (plc == null) return null; else if (plc.State == PlcRunState.Runing) { plc.Stop(); return null; } else if (plc.State == PlcRunState.WaitStop) { return null; } if (!mcs.TryGetValue(plc.Config.IP, out ModbusClient client)) { var serverUrl = plc.Config.IP; string[] array = serverUrl.Split(':'); int port = int.Parse(array[1]); client = new ModbusClient(array[0], port); client.Connect(); mcs.Add(plc.Config.IP, client); } if (!client.Connected) { Console.WriteLine("连接成功"); } //return client; GandWRedis(plc, client); return client; } private static void GandWRedis(PlcBase plc, ModbusClient client) { if (client != null) { List list = (plc.Config.ParamList) ?? new List(); foreach (var p in list.GroupBy(x => x.AddrType)) { int max = p.ToList().Max(x => int.Parse(x.Address)); int min = p.ToList().Min(x => int.Parse(x.Address)); try { int adr = min; int len = max - min + 1; //int[] list21= client.ReadHoldingRegisters(41201, 3); // 从地址0开始读取10个寄存器 int[] list2 = client.ReadHoldingRegisters(min, len); if (list2 != null && list2.Length > 0) { foreach (PlcParam item2 in p) { object value = PlcHelper.ChangeType(list2[int.Parse(item2.Address) - min], item2.DataType); RedisHelper.Add(item2.FullName ?? "", value, out var msg2); string key = item2.FullName + "_LAST"; if (item2.Trigger && !RedisHelper.Exists(key, out msg2)) { RedisHelper.Add(key, (object)0, out msg2); } } } Thread.Sleep(1000); foreach (var item in p.ToList()) { int obj = RedisHelper.Get(item.FullName, out string msg); Console.WriteLine(item.FullName + ":::" + obj); } client.WriteSingleRegister(41201, DateTime.Now.Second); // 向地址0写入值1234 } catch (Exception ex) { client.Connect(); Console.WriteLine(ex.Message + "" + p.Key + ">>" + ex.StackTrace); } } } } public static bool GetinRedis(this PlcBase plc) { var client = initTCP(plc); if (client != null) { List list = (plc.Config.ParamList) ?? new List(); foreach (var p in list.GroupBy(x => x.AddrType)) { int max = p.ToList().Max(x => int.Parse(x.Address)); int min = p.ToList().Min(x => int.Parse(x.Address)); try { int adr = min; int len = max - min + 1; int[] list2 = client.ReadHoldingRegisters(min, len); // 从地址0开始读取10个寄存器 if (list2 != null && list2.Length > 0) { foreach (PlcParam item2 in p) { object value = PlcHelper.ChangeType(list2[int.Parse(item2.Address) - min], item2.DataType); RedisHelper.Add(item2.FullName ?? "", value, out var msg2); string key = item2.FullName + "_LAST"; if (item2.Trigger && !RedisHelper.Exists(key, out msg2)) { RedisHelper.Add(key, (object)0, out msg2); } } } foreach (PlcParam item2 in p) { var key = item2.FullName + "_Write"; if (RedisHelper.Exists(key, out string msg2)) { var val = RedisHelper.Get(key, out msg2); client.WriteSingleRegister(int.Parse(item2.Address), val); RedisHelper.Remove(key, out msg2); } } } catch (Exception ex) { client.Connect(); Console.WriteLine(ex.Message + "" + p.Key + ">>" + ex.StackTrace); } } return true; } return false; } public static bool SetRedis(string key, string value) { try { key = key + "_Write"; if (!RedisHelper.Exists(key, out string msg2)) { RedisHelper.Add(key, value, out msg2); } return true; } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); return false; } } public static bool SetinPlc(this PlcBase plc, int address, int value) { var client = initTCP(plc); if (client != null) { try { client.WriteSingleRegister(address, value); return true; } catch (Exception ex) { Console.WriteLine(ex.Message + $">{address}-{value}>" + ex.StackTrace); } } return false; } } }