using CommunityToolkit.Mvvm.ComponentModel;
using HslCommunication;
using HslCommunication.ModBus;
using System.Windows;
using System.Windows.Controls;
namespace Plugin.CurrentSensorControl
{
///
/// SingleSensor.xaml 的交互逻辑
///
[ObservableObject]
public partial class SingleSensor : UserControl
{
private static Dictionary clients = new Dictionary();
private static Dictionary status = new Dictionary();
[ObservableProperty]
private string sensorName;
[ObservableProperty]
private bool isConnected;
[ObservableProperty]
private string current;
[ObservableProperty]
private string ip;
[ObservableProperty]
private int port;
///
/// 地址(站号)
///
[ObservableProperty]
private int address;
[ObservableProperty]
private string errMsg;
///
/// 通道
///
[ObservableProperty]
private int channel;
private ModbusRtuOverTcp client;
public SingleSensor()
{
DataContext = this;
InitializeComponent();
}
public SingleSensor(string name, string ip, int port, int address, int channel) : this()
{
SensorName = name;
Ip = ip;
Port = port;
Address = address;
Channel = channel;
string key = $"{Ip}:{Port}:{Address}";
if (!clients.ContainsKey(key))
{
client = new ModbusRtuOverTcp(Ip, Port, (byte)Address);
clients[key] = client;
}
else
{
client = clients[key];
}
}
private void controlBtn_Click(object sender, RoutedEventArgs e)
{
if (IsConnected)
{
this.Close();
}
else
{
Task.Factory.StartNew(() => { this.Connect(); });
}
}
public void Connect()
{
lock (client)
{
if (!status.ContainsKey(client) || !status[client])
{
var res = client.ConnectServer();
IsConnected = res.IsSuccess;
status[client] = IsConnected;
}
else
{
IsConnected = status[client];
}
}
}
public void ReadCurrent()
{
//if (status.ContainsKey(client) && status[client])
//{
// OperateResult res;
// lock (client)
// {
// res = client.ReadDouble(channel.ToString(), 1);
// }
// Dispatcher.Invoke(() =>
// {
// if (res.IsSuccess)
// {
// Current = res.Content[0].ToString();
// ErrMsg = string.Empty;
// }
// else
// {
// ErrMsg = res.Message;
// //Close();
// }
// });
//}
//else
//{
// IsConnected = false;
//}
var sb = status[client];
if (IsConnected)
{
OperateResult res;
lock (client)
{
res = client.ReadDouble(channel.ToString(), 1);
}
Dispatcher.Invoke(() =>
{
if (res.IsSuccess)
{
Current = res.Content[0].ToString();
ErrMsg = string.Empty;
}
else
{
ErrMsg = res.Message;
//Close();
}
});
}
}
public void Close()
{
lock (client)
{
var connected = status[client];
if (connected)
{
var res = client.ConnectClose();
if (res.IsSuccess)
{
client.Dispose();
}
IsConnected = !res.IsSuccess;
status[client] = IsConnected;
}
else
{
IsConnected = connected;
}
}
}
}
}