_socket.BeginConnect,开药箱指令14->0

This commit is contained in:
maqiao 2024-12-10 15:54:12 +08:00
parent f2614723e2
commit c7d7a3b266
5 changed files with 117 additions and 29 deletions

View File

@ -67,6 +67,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="FluentModbus" Version="5.3.0" />
<PackageReference Include="log4net" Version="2.0.15" />
<PackageReference Include="MaterialDesignThemes" Version="4.8.0" />
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.39" />

View File

@ -39,7 +39,7 @@ namespace DM_Weight.Port
.Execute<Socket>(() => {
_socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
_socket.Connect(iep);
_socket.BeginConnect(iep,null,null);
return _socket;
});
return _socket;

View File

@ -0,0 +1,64 @@
using DM_Weight.ViewModels;
using FluentModbus;
using log4net;
using Polly;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Speech.Synthesis;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DM_Weight.Port
{
public class ModBusTcpClientHelper
{
public static ModbusTcpClient client;
public static bool BoxOperate { get; set; }
private readonly ILog logger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel));
public static ModbusTcpClient GetInstance()
{
if (client == null)
{
client = new ModbusTcpClient();
client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4002), ModbusEndianness.BigEndian);
}
else if (!client.IsConnected)
{
client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4002), ModbusEndianness.BigEndian);
}
return client;
}
public bool OpenBoxDoor(int boxNum)
{
bool bFlag = false;
try
{
BoxOperate = true;
Thread.Sleep(50);
client.WriteSingleRegister(1, (ushort)boxNum, 0);
logger.Info($"开门指令已发送{(ushort)boxNum}");
SpeakAsync("药箱已打开,请及时关闭");
bFlag = true;
}
catch (Exception ex)
{
SpeakAsync("药箱已打开,请及时关闭");
logger.Info($"药箱已打开异常:{ex.Message}");
}
return bFlag;
}
public bool[] GetAllBoxState()
{
bool[] state = new bool[1];
return state;
}
private static SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
public static void SpeakAsync(string textinfo)
{
speechSynthesizer.SpeakAsync(textinfo);
}
}
}

View File

@ -35,6 +35,7 @@ namespace DM_Weight.Port
{
logger.Info("ModbusHelper");
socket = KeepALiveSocket.MakeKeepALiveSocket(ip, port);
//socket = CreateSocket();
client = new TcpClient();
client.Client = socket;
master = ModbusIpMaster.CreateIp(client);
@ -51,7 +52,7 @@ namespace DM_Weight.Port
private void SetModusIpMaster()
{
logger.Info("SetModusIpMaster");
socket = KeepALiveSocket.MakeKeepALiveSocket(ip, port); ;
socket = KeepALiveSocket.MakeKeepALiveSocket(ip, port);
client = new TcpClient();
client.Client = socket;
master = ModbusIpMaster.CreateIp(client);
@ -128,13 +129,14 @@ namespace DM_Weight.Port
this.Dispose();
//Debug.WriteLine($"打开箱子出错,第{retryCount}次重试", exception);
logger.Info($"打开箱子出错,第{retryCount}次重试,异常信息{exception}");
SpeakAsync("打开药箱网中连接失败,正在尝试重新打开");
Thread.Sleep(50);
this.SetModusIpMaster();
//return TimeSpan.FromSeconds (1);
})).Execute(() =>
{
logger.Info($"正在打开{boxNum}号药箱");
master.WriteSingleRegister(1, (ushort)boxNum, 14);
master.WriteSingleRegister(1, (ushort)boxNum, 0);
logger.Info($"开门指令已发送{(ushort)boxNum}");
SpeakAsync("药箱已打开,请及时关闭");
//Console.WriteLine($"开门指令已发送{(ushort)boxNum}");
@ -154,5 +156,30 @@ namespace DM_Weight.Port
{
speechSynthesizer.SpeakAsync(textinfo);
}
private Socket CreateSocket()
{
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string serverIp = "127.0.0.1"; // 服务器IP地址
int port = 4002; // 服务器端口
IPAddress serverAddress = IPAddress.Parse(serverIp);
IPEndPoint remoteEP = new IPEndPoint(serverAddress, port);
clientSocket.Connect(remoteEP);
if (clientSocket.Connected)
{
// 发送数据
//byte[] msg = Encoding.ASCII.GetBytes("This is a test<EOF>");
//clientSocket.Send(msg);
// 关闭socket
//clientSocket.Shutdown(SocketShutdown.Both);
//clientSocket.Close();
}
return clientSocket;
}
}
}

View File

@ -285,37 +285,33 @@ namespace DM_Weight.ViewModels
// _regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
// }
//}
if (!ModbusHelper.BoxOperate)
if (SelectedMenu != null && SelectedMenu.PremissionName == "退出")
{
if (SelectedMenu != null && SelectedMenu.PremissionName == "退出")
//bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState();
//bool allTrue = Array.TrueForAll(boolArrs, b => b);
//false是关着,true是开着
if (!ModbusHelper.BoxOperate)
{
//bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState();
//bool allTrue = Array.TrueForAll(boolArrs, b => b);
//false是关着,true是开着
//if (!ModbusHelper.BoxOperate)
//{
logger.Info($"用户【{Operator?.Nickname}】退出登录");
Operator = null;
Reviewer = null;
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
//}
//else
//{
// //还有药箱开着不能退出
// _portUtil.SpeakAsync("请关闭药箱后再退出");
// SelectedMenu = _premissionDmList[0];
//}
logger.Info($"用户【{Operator?.Nickname}】退出登录");
Operator = null;
Reviewer = null;
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
}
else
{
//SelectedMenu.Children = SelectedMenu.Children;
//SelectedChildMenu = SelectedMenu.Children[0];
if (!_portUtil.Operate)
{
_regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
}
//还有药箱开着不能退出
_portUtil.SpeakAsync("请关闭药箱后再退出");
SelectedMenu = _premissionDmList[0];
}
}
else
{
//SelectedMenu.Children = SelectedMenu.Children;
//SelectedChildMenu = SelectedMenu.Children[0];
if (!_portUtil.Operate)
{
_regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
}
}
}