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;
|
|
namespace GZ.Projects.mttest.代码
|
{
|
internal static class MBTCP
|
{
|
static Dictionary<string, ModbusClient> mcs = new Dictionary<string, ModbusClient>();
|
|
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<PlcParam> list = (plc.Config.ParamList) ?? new List<PlcParam>();
|
|
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<int>(item.FullName, out string msg);
|
|
Console.WriteLine(item.FullName + ":::" + obj);
|
}
|
client.WriteSingleRegister(41201, DateTime.Now.Second); // 向地址0000写入值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<PlcParam> list = (plc.Config.ParamList) ?? new List<PlcParam>();
|
|
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);
|
}
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
client.Connect();
|
Console.WriteLine(ex.Message + "" + p.Key + ">>" + ex.StackTrace);
|
}
|
}
|
return true;
|
}
|
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;
|
}
|
|
}
|
}
|