using System; using System.Collections.Generic; using EasyModbus; namespace HH.WCS.Mobox3.RiDong.device; /// /// modbus tcp 用第三方的包 /// internal static class ModbusHelper { private static Dictionary clients = new Dictionary(); /// /// 读线圈 /// /// /// /// /// /// internal static bool[] ReadCoils(int address, int qty, string ip, int port = 502) { bool[] res = new bool[0]; var client = GetClient(ip, port); if (client != null && client.Connected) { try { res = client.ReadCoils(address, qty); } catch (Exception ex) { //LogHelper.Error(ex.Message, ex); } } return res; } /// /// 读离散输入 /// /// /// /// /// /// internal static bool[] ReadDiscreteInputs(int address, int qty, string ip, int port = 502) { bool[] res = new bool[0]; var client = GetClient(ip, port); if (client != null && client.Connected) { try { res = client.ReadDiscreteInputs(address, qty); } catch (Exception ex) { //LogHelper.Error(ex.Message, ex); } } return res; } /// /// 读保持寄存器 /// /// /// /// /// /// internal static int[] ReadHoldingRegisters(int address, int qty, string ip, int port = 502) { int[] res = new int[0]; var client = GetClient(ip, port); if (client != null && client.Connected) { try { //一个寄存器是16位,返回2个int类型 // address是起始地址,qty是长度 res = client.ReadHoldingRegisters(address, qty); if (res != null) { Console.WriteLine($"读寄存器{ip},address={address},qty={qty},length={res.Length},res={string.Join(",", res)}"); } else { Console.WriteLine($"读寄存器{ip},address={address},qty={qty},失败"); } } catch (Exception ex) { Console.WriteLine("ReadHoldingRegisters:err=" + ex.Message); } } else { Console.WriteLine($"{ip}连接已经断开"); } return res; } /// /// 读输入寄存器 /// /// /// /// /// /// internal static int[] ReadInputRegisters(int address, int qty, string ip, int port = 502) { int[] res = new int[0]; var client = GetClient(ip, port); if (client != null && client.Connected) { try { res = client.ReadInputRegisters(address, qty); } catch (Exception ex) { //LogHelper.Error(ex.Message, ex); } } return res; } /// /// 写单个线圈 /// /// /// /// /// internal static bool WriteSingleCoil(int address, bool value, string ip, int port = 502) { var res = false; var client = GetClient(ip, port); if (client != null && client.Connected) { try { client.WriteSingleCoil(address, value); res = true; } catch (Exception ex) { //LogHelper.Error(ex.Message, ex); } } return res; } /// /// 写多个线圈 /// /// /// /// /// internal static bool WriteMultipleCoils(int address, bool[] values, string ip, int port = 502) { var res = false; var client = GetClient(ip, port); if (client != null && client.Connected) { try { client.WriteMultipleCoils(address, values); res = true; } catch (Exception ex) { //LogHelper.Error(ex.Message, ex); } } return res; } /// /// 写单个寄存器 /// /// /// /// /// internal static bool WriteSingleRegister(int address, int value, string ip, int port = 502) { var res = false; var client = GetClient(ip, port); if (client != null && client.Connected) { try { client.WriteSingleRegister(address, value); res = true; Console.WriteLine($"写寄存器{ip},address={address},value={value},成功"); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine($"写寄存器{ip},address={address},value={value},失败"); } } return res; } /// /// 写多个寄存器 /// /// /// /// /// internal static bool WriteMultipleRegisters(int address, int[] values, string ip, int port = 502) { var res = false; var client = GetClient(ip, port); if (client != null && client.Connected) { try { client.WriteMultipleRegisters(address, values); res = true; } catch (Exception ex) { //LogHelper.Error(ex.Message, ex); } } return res; } private static ModbusClient GetClient(string ip, int port) { ModbusClient client = null; if (!clients.ContainsKey(ip)) { client = new ModbusClient(ip, port); try { client.Connect(); clients[ip] = client; } catch (Exception ex) { //LogHelper.Error(ex.Message, ex); Console.WriteLine($"连接plc失败{ip},err=" + ex.Message); } } else { client = clients[ip]; if (!clients[ip].Connected) { try { clients[ip].Connect(); } catch (Exception ex) { //LogHelper.Error(ex.Message, ex); Console.WriteLine($"连接plc失败{ip},err=" + ex.Message); } } } return client; } }