修改与网口通信相关代码

This commit is contained in:
maqiao 2024-12-16 16:44:02 +08:00
parent e75f04beaf
commit ee624a7c0d
18 changed files with 631 additions and 178 deletions

View File

@ -98,6 +98,7 @@ namespace DM_Weight
// 串口工具 // 串口工具
containerRegistry.RegisterSingleton<PortUtil>(); containerRegistry.RegisterSingleton<PortUtil>();
containerRegistry.RegisterSingleton<SocketHelper>();
// 指纹机工具 // 指纹机工具
containerRegistry.RegisterSingleton<FingerprintUtil>(); containerRegistry.RegisterSingleton<FingerprintUtil>();
// 组态屏工具 // 组态屏工具

View File

@ -67,13 +67,16 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Common.Logging" Version="3.4.1" />
<PackageReference Include="FluentModbus" Version="5.3.0" /> <PackageReference Include="FluentModbus" Version="5.3.0" />
<PackageReference Include="log4net" Version="2.0.15" /> <PackageReference Include="log4net" Version="2.0.15" />
<PackageReference Include="MaterialDesignThemes" Version="4.8.0" /> <PackageReference Include="MaterialDesignThemes" Version="4.8.0" />
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.39" /> <PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.39" />
<PackageReference Include="Mina" Version="2.0.12" />
<PackageReference Include="NModbus4.NetCore" Version="2.0.1" /> <PackageReference Include="NModbus4.NetCore" Version="2.0.1" />
<PackageReference Include="Polly" Version="8.4.1" /> <PackageReference Include="Polly" Version="8.4.1" />
<PackageReference Include="Prism.Unity" Version="8.1.97" /> <PackageReference Include="Prism.Unity" Version="8.1.97" />
<PackageReference Include="SharpPromise" Version="1.7.0" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.67" /> <PackageReference Include="SqlSugarCore" Version="5.1.4.67" />
<PackageReference Include="SuperSimpleTcp" Version="3.0.10" /> <PackageReference Include="SuperSimpleTcp" Version="3.0.10" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" /> <PackageReference Include="System.Drawing.Common" Version="7.0.0" />

View File

@ -19,15 +19,15 @@ namespace DM_Weight.Finger
public class FingerprintUtil public class FingerprintUtil
{ {
private readonly ILog logger = LogManager.GetLogger(typeof(FingerprintUtil)); private static ILog logger = LogManager.GetLogger(typeof(FingerprintUtil));
public zkemkeeper.CZKEMClass axCZKEM1= new zkemkeeper.CZKEMClass(); public static zkemkeeper.CZKEMClass axCZKEM1= new zkemkeeper.CZKEMClass();
public bool bIsConnected = false; public static bool bIsConnected = false;
private string fingerIp = ConfigurationManager.AppSettings["fingerIp"].ToString(); private static string fingerIp = ConfigurationManager.AppSettings["fingerIp"].ToString();
private int fingerPort = 4370; private static int fingerPort = 4370;
private int machineNumber = Convert.ToInt32(ConfigurationManager.AppSettings["machineNumber"].ToString()); private static int machineNumber = Convert.ToInt32(ConfigurationManager.AppSettings["machineNumber"].ToString());
private int machineType = Convert.ToInt32(ConfigurationManager.AppSettings["machineType"].ToString()); private static int machineType = Convert.ToInt32(ConfigurationManager.AppSettings["machineType"].ToString());
private readonly IEventAggregator _eventAggregator; private static IEventAggregator _eventAggregator;
public FingerprintUtil(IEventAggregator eventAggregator) public FingerprintUtil(IEventAggregator eventAggregator)
{ {
_eventAggregator = eventAggregator; _eventAggregator = eventAggregator;
@ -38,7 +38,7 @@ namespace DM_Weight.Finger
//}); //});
} }
public void ConnectionMain() public static void ConnectionMain()
{ {
try try
{ {
@ -49,13 +49,15 @@ namespace DM_Weight.Finger
{ {
if (axCZKEM1.RegEvent(machineNumber, 9)) if (axCZKEM1.RegEvent(machineNumber, 9))
{ {
this.axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx); axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx);
//this.axCZKEM1.OnEnrollFinger += new zkemkeeper._IZKEMEvents_OnEnrollFingerEventHandler(axCZKEM1_OnEnrollFinger); //this.axCZKEM1.OnEnrollFinger += new zkemkeeper._IZKEMEvents_OnEnrollFingerEventHandler(axCZKEM1_OnEnrollFinger);
this.axCZKEM1.OnEnrollFingerEx += new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx); axCZKEM1.OnEnrollFingerEx += new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx);
} }
} }
logger.Info($"连接指纹机2");
_eventAggregator.GetEvent<FingerprintEvent>().Publish(new FingerprintMsg() _eventAggregator.GetEvent<FingerprintEvent>().Publish(new FingerprintMsg()
{ {
Message = "CONNECT", Message = "CONNECT",
@ -70,13 +72,13 @@ namespace DM_Weight.Finger
/// <summary> /// <summary>
/// 用于退出登录重连指纹机 /// 用于退出登录重连指纹机
/// </summary> /// </summary>
public void FingerDisconnect() public static void FingerDisconnect()
{ {
try try
{ {
axCZKEM1.Disconnect(); axCZKEM1.Disconnect();
this.axCZKEM1.OnAttTransactionEx -= new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx); axCZKEM1.OnAttTransactionEx -= new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx);
this.axCZKEM1.OnEnrollFingerEx -= new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx); axCZKEM1.OnEnrollFingerEx -= new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx);
ConnectionMain(); ConnectionMain();
} }
catch (Exception ex) catch (Exception ex)
@ -87,7 +89,7 @@ namespace DM_Weight.Finger
} }
//If your fingerprint(or your card) passes the verification,this event will be triggered //If your fingerprint(or your card) passes the verification,this event will be triggered
private void axCZKEM1_OnAttTransactionEx(string sEnrollNumber, int iIsInValid, int iAttState, int iVerifyMethod, int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int iWorkCode) private static void axCZKEM1_OnAttTransactionEx(string sEnrollNumber, int iIsInValid, int iAttState, int iVerifyMethod, int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int iWorkCode)
{ {
FingerprintMsg message = new FingerprintMsg() FingerprintMsg message = new FingerprintMsg()
{ {
@ -100,7 +102,7 @@ namespace DM_Weight.Finger
} }
//When you are enrolling your finger,this event will be triggered. //When you are enrolling your finger,this event will be triggered.
private void axCZKEM1_OnEnrollFinger(int iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength) private static void axCZKEM1_OnEnrollFinger(int iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength)
{ {
FingerprintMsg message = new FingerprintMsg() FingerprintMsg message = new FingerprintMsg()
{ {
@ -117,7 +119,7 @@ namespace DM_Weight.Finger
_eventAggregator.GetEvent<FingerprintEvent>().Publish(message); _eventAggregator.GetEvent<FingerprintEvent>().Publish(message);
} }
private void axCZKEM1_OnEnrollFingerEx(string iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength) private static void axCZKEM1_OnEnrollFingerEx(string iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength)
{ {
FingerprintMsg message = new FingerprintMsg() FingerprintMsg message = new FingerprintMsg()
{ {

View File

@ -0,0 +1,56 @@
using Common.Logging;
using Mina.Core.Future;
using Mina.Filter.Codec;
using Mina.Transport.Socket;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Port
{
public class FingerHelper
{
private readonly ILog logger = LogManager.GetLogger(typeof(SocketHelper));
AsyncSocketConnector acceptor = new AsyncSocketConnector();
IConnectFuture iConnectFuture;
string ip = ConfigurationManager.AppSettings["fingerIp"].ToString();
public FingerHelper()
{
acceptor.ExceptionCaught += (o, e) => logger.Error(e.Exception);
//acceptor.FilterChain.AddLast("logger", new LoggingFilter());
acceptor.FilterChain.AddLast("encoding", new ProtocolCodecFilter(new MyMinaCodecFactory()));
acceptor.SessionIdle += (o, e) => logger.Info("IDLE " + e.Session.GetIdleCount(e.IdleStatus));
acceptor.MessageReceived += (o, e) =>
{
logger.Info("MessageReceived>>>>>>>>>>>>>>>>");
};
acceptor.SessionClosed += (o, e) =>
{
logger.Info("SessionClosed");
Task.Delay(50).Wait();
SocketConnect();
};
this.SocketConnect();
}
public void SocketConnect()
{
iConnectFuture = acceptor.Connect(new IPEndPoint(IPAddress.Parse(ip), 4370)).Await();
Console.WriteLine(iConnectFuture.Connected.ToString());
}
public void SendMessage(MyBaseMessage baseMessage)
{
iConnectFuture.Session.Write(baseMessage);
}
}
}

View File

@ -1,4 +1,5 @@
using DM_Weight.msg; using DM_Weight.Finger;
using DM_Weight.msg;
using DM_Weight.ViewModels; using DM_Weight.ViewModels;
using log4net; using log4net;
using log4net.Repository.Hierarchy; using log4net.Repository.Hierarchy;
@ -30,11 +31,14 @@ namespace DM_Weight.Port
private readonly ILog logger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel)); private readonly ILog logger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel));
string ip = ConfigurationManager.AppSettings["modbusIp"].ToString(); string ip = ConfigurationManager.AppSettings["modbusIp"].ToString();
int port = Convert.ToInt32(ConfigurationManager.AppSettings["modbusPort"]); int port = Convert.ToInt32(ConfigurationManager.AppSettings["modbusPort"]);
private static object _lock = new object();
public static bool BoxOperate { get; set; } public static bool BoxOperate { get; set; }
private ModbusHelper() private ModbusHelper()
{ {
logger.Info("ModbusHelper"); logger.Info("ModbusHelper");
socket = KeepALiveSocket.MakeKeepALiveSocket(ip, port); socket = KeepALiveSocket.MakeKeepALiveSocket(ip, port);
//socket = CreateSocket(); //socket = CreateSocket();
client = new TcpClient(); client = new TcpClient();
client.Client = socket; client.Client = socket;
@ -43,11 +47,14 @@ namespace DM_Weight.Port
} }
public static ModbusHelper GetInstance() public static ModbusHelper GetInstance()
{ {
if (instance == null) lock (_lock)
{ {
instance = new ModbusHelper(); if (instance == null)
{
instance = new ModbusHelper();
}
return instance;
} }
return instance;
} }
private void SetModusIpMaster() private void SetModusIpMaster()
{ {
@ -102,74 +109,82 @@ namespace DM_Weight.Port
// } // }
// return flags; // return flags;
// }); // });
bool successFlag = true; lock (_lock)
bool[] bools = new bool[18];
int iCount = 0;
do
{ {
try bool successFlag = true;
bool[] bools = new bool[18];
int iCount = 0;
do
{ {
bool[] flags = new bool[18]; try
if (master == null)
{ {
bool[] flags = new bool[18];
if (master == null)
{
this.SetModusIpMaster();
}
var result = master.ReadInputRegisters(1, 0x0033, 2);
var r1 = Convert.ToString(((int)result[0] >> 14) | ((int)result[1] << 2), 2).PadLeft(18, '0');
var r2 = r1.ToCharArray();
logger.Info("r2=>" + string.Join(", ", r2));
//var r2=new char[18] { '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' };
for (int i = 0; i < 18; i++)
{
bools[i] = r2[17 - i] == '1' ? true : false;
}
logger.Info($"获取所有箱子门状态返回:{string.Join(',', bools)};");
successFlag = true;
}
catch (Exception exception)
{
if (iCount >= 3)
break;
iCount++;
successFlag = false;
this.Dispose();
//Debug.WriteLine($"获取所有箱子门状态出错,第{retryCount}次重试", exception);
logger.Info($"获取所有箱子门状态出错,第{iCount}次重试,异常信息{exception}");
Thread.Sleep(500);
this.SetModusIpMaster(); this.SetModusIpMaster();
BoxOperate = false;
FingerprintUtil.FingerDisconnect();
} }
var result = master.ReadInputRegisters(1, 0x0033, 2); } while (!successFlag);
var r1 = Convert.ToString(((int)result[0] >> 14) | ((int)result[1] << 2), 2).PadLeft(18, '0'); return bools;
var r2 = r1.ToCharArray(); }
logger.Info("r2=>" + string.Join(", ", r2));
//var r2=new char[18] { '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' };
for (int i = 0; i < 18; i++)
{
bools[i] = r2[17 - i] == '1' ? true : false;
}
logger.Info($"获取所有箱子门状态返回:{string.Join(',', bools)};");
successFlag = true;
}
catch (Exception exception)
{
if (iCount >= 3)
break;
iCount++;
successFlag = false;
this.Dispose();
//Debug.WriteLine($"获取所有箱子门状态出错,第{retryCount}次重试", exception);
logger.Info($"获取所有箱子门状态出错,第{iCount}次重试,异常信息{exception}");
Thread.Sleep(500);
this.SetModusIpMaster();
BoxOperate = false;
}
} while (!successFlag);
return bools;
} }
public bool OpenBoxDoor(int boxNum) public bool OpenBoxDoor(int boxNum)
{ {
BoxOperate = true; lock (_lock)
//if (ConfigurationManager.AppSettings["test"]!=null&& ConfigurationManager.AppSettings["test"].ToString()=="Y")
//{
// return true;
//}
bool bFlag = false;
Thread.Sleep(50);
Policy.Handle<Exception>().Retry(3, ((exception, retryCount) =>
{ {
this.Dispose(); BoxOperate = true;
//Debug.WriteLine($"打开箱子出错,第{retryCount}次重试", exception); //if (ConfigurationManager.AppSettings["test"]!=null&& ConfigurationManager.AppSettings["test"].ToString()=="Y")
logger.Info($"打开箱子出错,第{retryCount}次重试,异常信息{exception}"); //{
//SpeakAsync("药箱连接失败,正在尝试重新打开"); // return true;
Thread.Sleep(500); //}
this.SetModusIpMaster(); bool bFlag = false;
//return TimeSpan.FromSeconds (1); Thread.Sleep(50);
})).Execute(() => Policy.Handle<Exception>().Retry(3, ((exception, retryCount) =>
{ {
logger.Info($"正在打开{boxNum}号药箱"); this.Dispose();
master.WriteSingleRegister(1, (ushort)boxNum, 0); //Debug.WriteLine($"打开箱子出错,第{retryCount}次重试", exception);
logger.Info($"开门指令已发送{(ushort)boxNum}"); logger.Info($"打开箱子出错,第{retryCount}次重试,异常信息{exception}");
SpeakAsync("药箱已打开,请及时关闭"); //SpeakAsync("药箱连接失败,正在尝试重新打开");
//Console.WriteLine($"开门指令已发送{(ushort)boxNum}"); Thread.Sleep(500);
bFlag = true; this.SetModusIpMaster();
}); //return TimeSpan.FromSeconds (1);
return bFlag; })).Execute(() =>
{
logger.Info($"正在打开{boxNum}号药箱");
master.WriteSingleRegister(1, (ushort)boxNum, 20);
logger.Info($"开门指令已发送{(ushort)boxNum}");
SpeakAsync("请及时关闭药箱");
//Console.WriteLine($"开门指令已发送{(ushort)boxNum}");
bFlag = true;
FingerprintUtil.FingerDisconnect();
});
return bFlag;
}
} }
private void Dispose() private void Dispose()
{ {
@ -181,6 +196,7 @@ namespace DM_Weight.Port
private static SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(); private static SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
public static void SpeakAsync(string textinfo) public static void SpeakAsync(string textinfo)
{ {
speechSynthesizer.Rate = 2;
speechSynthesizer.SpeakAsync(textinfo); speechSynthesizer.SpeakAsync(textinfo);
} }

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Port
{
public class MyBaseMessage
{
public int addr { get; set; } = 1;
public short lockNo { get; set; }
public short delay { get; set; } = 20;
public int functionCode { get; set; } = 6;
public MyBaseMessage() { }
public MyBaseMessage(short lockNo, int addr = 1, short delay = 20, int functionCode = 6)
{
this.addr = addr;
this.lockNo = lockNo;
this.delay = delay;
this.functionCode = functionCode;
}
}
}

View File

@ -0,0 +1,19 @@
using Mina.Filter.Codec.Demux;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Port
{
public class MyMinaCodecFactory : DemuxingProtocolCodecFactory
{
public MyMinaCodecFactory()
{
AddMessageEncoder(new MyMinaEncoder());
AddMessageDecoder(new MyMinaDecoder());
}
}
}

View File

@ -0,0 +1,49 @@
using log4net;
using Mina.Core.Buffer;
using Mina.Core.Session;
using Mina.Filter.Codec;
using Mina.Filter.Codec.Demux;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Port
{
internal class MyMinaDecoder : IMessageDecoder
{
private readonly ILog logger = LogManager.GetLogger(typeof(SocketHelper));
public MessageDecoderResult Decodable(IoSession session, IoBuffer input)
{
logger.Info("Decodable");
return MessageDecoderResult.OK;
}
public MessageDecoderResult Decode(IoSession session, IoBuffer input, IProtocolDecoderOutput output)
{
logger.Info("Decode");
int length = input.Remaining;
byte functionCode = input.Get(7);
if (functionCode == 4)
{
int a = input.Get(length - 2);
int b = input.Get(length - 1);
Console.WriteLine("a");
Console.WriteLine(a);
Console.WriteLine("b");
Console.WriteLine(b);
var r = Convert.ToString((a >> 14) | (b << 2), 2).PadLeft(18, '0').ToCharArray();
bool f = r.Any(c => c == '1');
output.Write(f);
}
input.Position = length;
return MessageDecoderResult.OK;
}
public void FinishDecode(IoSession session, IProtocolDecoderOutput output)
{
}
}
}

View File

@ -0,0 +1,61 @@
using Mina.Core.Buffer;
using Mina.Core.Session;
using Mina.Filter.Codec;
using Mina.Filter.Codec.Demux;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Port
{
public class MyMinaEncoder : IMessageEncoder<MyBaseMessage>
{
private short accumulate = 0;
public void Encode(IoSession session, MyBaseMessage message, IProtocolEncoderOutput output)
{
IoBuffer input = IoBuffer.Allocate(12);
input.AutoExpand = true;
input.PutInt16(accumulate);
input.PutInt16(0);
input.PutInt16(6);
input.Put((byte)message.addr);
// 功能码
input.Put((byte)message.functionCode);
// 锁号
input.PutInt16(message.lockNo);
// 开锁时间
input.PutInt16(message.delay);
input.Flip();
accumulate += 1;
session.Write(input);
}
public void Encode(IoSession session, object message, IProtocolEncoderOutput output)
{
IoBuffer input = IoBuffer.Allocate(12);
input.AutoExpand = true;
if (message is MyBaseMessage)
{
var m = message as MyBaseMessage;
input.PutInt16(accumulate);
input.PutInt16(0);
input.PutInt16(6);
input.Put((byte)m.addr);
// 功能码
input.Put((byte)m.functionCode);
// 锁号
input.PutInt16(m.lockNo);
// 开锁时间
input.PutInt16(m.delay);
input.Flip();
accumulate += 1;
}
session.Write(input);
}
}
}

View File

@ -0,0 +1,63 @@
using DM_Weight.ViewModels;
using log4net;
using Mina.Core.Future;
using Mina.Filter.Codec;
using Mina.Filter.Logging;
using Mina.Transport.Socket;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DM_Weight.Port
{
public class SocketHelper
{
private readonly ILog logger = LogManager.GetLogger(typeof(SocketHelper));
AsyncSocketConnector acceptor = new AsyncSocketConnector();
IConnectFuture iConnectFuture;
public bool OpenStatus=false;
string ip = ConfigurationManager.AppSettings["modbusIp"].ToString();
int port =Convert.ToInt32(ConfigurationManager.AppSettings["modbusPort"]);
public SocketHelper()
{
acceptor.ExceptionCaught += (o, e) => logger.Error(e.Exception);
//acceptor.FilterChain.AddLast("logger", new LoggingFilter());
acceptor.FilterChain.AddLast("encoding", new ProtocolCodecFilter(new MyMinaCodecFactory()));
acceptor.SessionIdle += (o, e) => logger.Info("IDLE " + e.Session.GetIdleCount(e.IdleStatus));
acceptor.MessageReceived += (o, e) =>
{
OpenStatus = (bool)e.Message;
logger.Info("MessageReceived>>>>>>>>>>>>>>>>" + OpenStatus);
};
acceptor.SessionClosed += (o, e) =>
{
logger.Info("SessionClosed");
Task.Delay(50).Wait();
SocketConnect();
};
this.SocketConnect();
}
public void SocketConnect()
{
iConnectFuture = acceptor.Connect(new IPEndPoint(IPAddress.Parse(ip), port)).Await();
logger.Info(iConnectFuture.Connected.ToString());
}
public void SendMessage(MyBaseMessage baseMessage)
{
iConnectFuture.Session.Write(baseMessage);
}
}
}

View File

@ -231,11 +231,13 @@ namespace DM_Weight.ViewModels
} }
IEventAggregator _eventAggregator; IEventAggregator _eventAggregator;
private PortUtil _portUtil; //private PortUtil _portUtil;
public CheckOrderNewWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator) SocketHelper _socketHelper;
public CheckOrderNewWindowViewModel(IEventAggregator eventAggregator, SocketHelper socketHelper)
{ {
_portUtil = portUtil; //_portUtil = portUtil;
_eventAggregator = eventAggregator; _eventAggregator = eventAggregator;
_socketHelper = socketHelper;
} }
#region #region
@ -831,9 +833,9 @@ namespace DM_Weight.ViewModels
// Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); // Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); });
// return; // return;
//} //}
if (ModbusHelper.BoxOperate) if (_socketHelper.OpenStatus)
{ {
Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); ModbusHelper.SpeakAsync("请关闭药箱后再打开");
return; return;
} }
DrawerNo = Convert.ToInt32(strDrawerNo); DrawerNo = Convert.ToInt32(strDrawerNo);
@ -854,27 +856,62 @@ namespace DM_Weight.ViewModels
ModbusHelper.SpeakAsync($"正在打开{DrawerNo + 1}号药箱"); ModbusHelper.SpeakAsync($"正在打开{DrawerNo + 1}号药箱");
//记录开药箱日志 //记录开药箱日志
SqlSugarHelper.Db.Insertable(machineRecord).ExecuteCommand(); SqlSugarHelper.Db.Insertable(machineRecord).ExecuteCommand();
ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo);
Task.Factory.StartNew(async () => _socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(DrawerNo - 1) });
_socketHelper.OpenStatus = true;
int i = 10;
new PromiseUtil<int>().taskAsyncLoop(500, 0, async (options, next, stop) =>
{ {
bool loop = true; i--;
while (loop) if (_socketHelper.OpenStatus)
{ {
await Task.Delay(5000);
bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); //bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
bool state = Array.TrueForAll(boolsl, b => b == false); _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 });
if (state)
//ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}");
//bool state = Array.TrueForAll(boolsl, b => b == false);
if (_socketHelper.OpenStatus)
{ {
loop = false; if (i == 0)
ModbusHelper.BoxOperate = false; {
ModbusHelper.SpeakAsync("请及时关闭药箱");
i = 10;
}
next();
} }
else else
{ {
ModbusHelper.BoxOperate = true; stop();
ModbusHelper.SpeakAsync("药箱已打开,请及时关闭");
} }
} }
else
{
stop();
}
}); });
//ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo);
//Task.Factory.StartNew(async () =>
//{
// bool loop = true;
// while (loop)
// {
// await Task.Delay(5000);
// bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
// bool state = Array.TrueForAll(boolsl, b => b == false);
// if (state)
// {
// loop = false;
// ModbusHelper.BoxOperate = false;
// }
// else
// {
// ModbusHelper.BoxOperate = true;
// ModbusHelper.SpeakAsync("药箱已打开,请及时关闭");
// }
// }
//});
} }
} }

View File

@ -154,8 +154,8 @@ namespace DM_Weight.ViewModels
} }
private void SelectChildNavigate(PremissionDm SelectedChildMenu) private void SelectChildNavigate(PremissionDm SelectedChildMenu)
{ {
if (!_portUtil.Operate) //if (!_portUtil.Operate)
{ //{
if (SelectedChildMenu != null) if (SelectedChildMenu != null)
{ {
if (SelectedChildMenu.PremissionPath.Equals("TakeRecordWindow")) if (SelectedChildMenu.PremissionPath.Equals("TakeRecordWindow"))
@ -233,7 +233,7 @@ namespace DM_Weight.ViewModels
} }
} }
} }
} //}
} }
public PremissionDm? SelectedMenu public PremissionDm? SelectedMenu
@ -290,7 +290,7 @@ namespace DM_Weight.ViewModels
//bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState(); //bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState();
//bool allTrue = Array.TrueForAll(boolArrs, b => b); //bool allTrue = Array.TrueForAll(boolArrs, b => b);
//false是关着,true是开着 //false是关着,true是开着
if (!ModbusHelper.BoxOperate) if (!_socketHelper.OpenStatus)
{ {
logger.Info($"用户【{Operator?.Nickname}】退出登录"); logger.Info($"用户【{Operator?.Nickname}】退出登录");
Operator = null; Operator = null;
@ -309,10 +309,10 @@ namespace DM_Weight.ViewModels
{ {
//SelectedMenu.Children = SelectedMenu.Children; //SelectedMenu.Children = SelectedMenu.Children;
//SelectedChildMenu = SelectedMenu.Children[0]; //SelectedChildMenu = SelectedMenu.Children[0];
if (!_portUtil.Operate) //if (!_portUtil.Operate)
{ //{
_regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath); _regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
} //}
} }
} }
#region #region
@ -344,13 +344,15 @@ namespace DM_Weight.ViewModels
//private CHKFunction _chkFunction; //private CHKFunction _chkFunction;
IEventAggregator _eventAggregator; IEventAggregator _eventAggregator;
//private ModbusHelper _modbusHelper; //private ModbusHelper _modbusHelper;
public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IUnityContainer container, IDialogService dialogService, IEventAggregator eventAggregator) SocketHelper _socketHelper;
public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IUnityContainer container, IDialogService dialogService, IEventAggregator eventAggregator, SocketHelper socketHelper)
{ {
_portUtil = portUtil; _portUtil = portUtil;
_regionManager = iRegionManager; _regionManager = iRegionManager;
_dialogService = dialogService; _dialogService = dialogService;
_container = container; _container = container;
this._eventAggregator = eventAggregator; this._eventAggregator = eventAggregator;
_socketHelper = socketHelper;
//_chkFunction = cHKFunction; //_chkFunction = cHKFunction;
//_modbusHelper = modbusHelper; //_modbusHelper = modbusHelper;
} }
@ -528,7 +530,7 @@ namespace DM_Weight.ViewModels
{ {
_eventAggregator.GetEvent<LoginOutEvent>().Subscribe(SetLoginOut); _eventAggregator.GetEvent<LoginOutEvent>().Subscribe(SetLoginOut);
_portUtil.dateTime = DateTime.Now; //_portUtil.dateTime = DateTime.Now;
//取出user //取出user
UserList = navigationContext.Parameters.GetValue<UserList>("operator"); UserList = navigationContext.Parameters.GetValue<UserList>("operator");
Operator = UserList; Operator = UserList;

View File

@ -62,7 +62,7 @@ namespace DM_Weight.ViewModels
} }
private HkcChangeShifts listHkcChangeShifts=new HkcChangeShifts(); private HkcChangeShifts listHkcChangeShifts=new HkcChangeShifts();
private FingerprintUtil _fingerprintUtil; //private FingerprintUtil _fingerprintUtil;
private PortUtil _portUtil; private PortUtil _portUtil;
@ -114,16 +114,17 @@ namespace DM_Weight.ViewModels
// _regionManager = regionManager; // _regionManager = regionManager;
// _eventAggregator = eventAggregator; // _eventAggregator = eventAggregator;
//} //}
public LoginWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, PortUtil portUtil, FingerprintUtil fingerprintUtil) public LoginWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, PortUtil portUtil)
{ {
_fingerprintUtil = fingerprintUtil; //_fingerprintUtil = fingerprintUtil;
_portUtil = portUtil; _portUtil = portUtil;
_regionManager = regionManager; _regionManager = regionManager;
_eventAggregator = eventAggregator; _eventAggregator = eventAggregator;
FingerMsg = _fingerprintUtil.bIsConnected; //FingerMsg = !_fingerprintUtil.bIsConnected;
FingerMsg = !FingerprintUtil.bIsConnected;
_eventAggregator.GetEvent<FingerprintEvent>().Subscribe(LoginEvent); _eventAggregator.GetEvent<FingerprintEvent>().Subscribe(LoginEvent);
logger.Info($"LoginWindowViewModel;FingerMsg{FingerMsg}"); logger.Info($"LoginWindowViewModel;FingerMsg{FingerprintUtil.bIsConnected}");
_fingerprintUtil.FingerDisconnect(); //_fingerprintUtil.FingerDisconnect();
} }
private DelegateCommand? _loginCommand; private DelegateCommand? _loginCommand;

View File

@ -62,17 +62,17 @@ namespace DM_Weight.ViewModels
// this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2); // this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
// _screenUtil = screenUtil; // _screenUtil = screenUtil;
//} //}
//private FingerprintUtil _fingerprintUtil; private FingerprintUtil _fingerprintUtil;
IRegionManager _regionManager; IRegionManager _regionManager;
IUnityContainer _container; IUnityContainer _container;
//private CHKFunction _cHKFunction; //private CHKFunction _cHKFunction;
private readonly ILog logger = LogManager.GetLogger(typeof(PortUtil)); private readonly ILog logger = LogManager.GetLogger(typeof(PortUtil));
public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator) public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator, FingerprintUtil fingerprintUtil)
{ {
//_portUtil = portUtil; //_portUtil = portUtil;
this.eventAggregator = eventAggregator; this.eventAggregator = eventAggregator;
this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2); this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
//_fingerprintUtil = fingerprintUtil; _fingerprintUtil = fingerprintUtil;
_regionManager = regionManager; _regionManager = regionManager;
_container = container; _container = container;
//_cHKFunction = cHKFunction; //_cHKFunction = cHKFunction;
@ -81,9 +81,9 @@ namespace DM_Weight.ViewModels
//{ //{
_container.RegisterType<object, LoginWindow>("LoginWindow"); _container.RegisterType<object, LoginWindow>("LoginWindow");
_regionManager.RegisterViewWithRegion("MainRegion", "LoginWindow"); _regionManager.RegisterViewWithRegion("MainRegion", "LoginWindow");
//})); //}));
} }

View File

@ -22,7 +22,7 @@ using System.Windows.Media;
namespace DM_Weight.ViewModels namespace DM_Weight.ViewModels
{ {
public class OpenBoxNewWindowViewModel : BindableBase, INavigationAware, IRegionMemberLifetime public class OpenBoxNewWindowViewModel : BindableBase, IRegionMemberLifetime//, INavigationAware
{ {
//定时查询药箱状态 //定时查询药箱状态
//System.Timers.Timer StateTimer = new System.Timers.Timer(5000); //System.Timers.Timer StateTimer = new System.Timers.Timer(5000);
@ -112,9 +112,11 @@ namespace DM_Weight.ViewModels
//public static int iNumber = 1; //public static int iNumber = 1;
//private PortUtil _portUtil; //private PortUtil _portUtil;
IEventAggregator _eventAggregator; IEventAggregator _eventAggregator;
public OpenBoxNewWindowViewModel(IEventAggregator eventAggregator) SocketHelper _socketHelper;
public OpenBoxNewWindowViewModel(IEventAggregator eventAggregator, SocketHelper socketHelper)
{ {
_eventAggregator = eventAggregator; _eventAggregator = eventAggregator;
_socketHelper = socketHelper;
} }
#region #region
private Brush _button1Color = Brushes.White; private Brush _button1Color = Brushes.White;
@ -621,9 +623,9 @@ namespace DM_Weight.ViewModels
//bool[] bools = ModbusHelper.GetInstance().GetAllBoxState(); //bool[] bools = ModbusHelper.GetInstance().GetAllBoxState();
//bool allFalse = Array.TrueForAll(bools, b => b == false); //bool allFalse = Array.TrueForAll(bools, b => b == false);
//if (!allFalse) //if (!allFalse)
if (ModbusHelper.BoxOperate) if (_socketHelper.OpenStatus)
{ {
Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); ModbusHelper.SpeakAsync("请关闭药箱后再打开");
return; return;
} }
iList = SqlSugarHelper.Db.Queryable<ChannelList>().Where(cl => cl.MachineId == "DM5" && cl.DrawerType == this.DrawerType && cl.DrawerNo == DrawerNo) iList = SqlSugarHelper.Db.Queryable<ChannelList>().Where(cl => cl.MachineId == "DM5" && cl.DrawerType == this.DrawerType && cl.DrawerNo == DrawerNo)
@ -667,29 +669,63 @@ namespace DM_Weight.ViewModels
ModbusHelper.SpeakAsync($"正在打开{DrawerNo}号药箱"); ModbusHelper.SpeakAsync($"正在打开{DrawerNo}号药箱");
} }
//ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1); //ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1);
ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1); _socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(DrawerNo - 1) });
_socketHelper.OpenStatus = true;
Task.Factory.StartNew(async() => int i = 10;
new PromiseUtil<int>().taskAsyncLoop(500, 0, async (options, next, stop) =>
{ {
bool loop = true; i--;
while (loop) if (_socketHelper.OpenStatus)
{ {
await Task.Delay(5000);
bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); //bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
bool state = Array.TrueForAll(boolsl, b => b == false); _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 });
if(state)
//ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}");
//bool state = Array.TrueForAll(boolsl, b => b == false);
if (_socketHelper.OpenStatus)
{ {
loop = false; if (i == 0)
ModbusHelper.BoxOperate = false; {
ModbusHelper.SpeakAsync("请及时关闭药箱");
i = 10;
}
next();
} }
else else
{ {
ModbusHelper.BoxOperate = true; stop();
ModbusHelper.SpeakAsync("药箱已打开,请及时关闭");
} }
} }
else
{
stop();
}
}); });
//Task.Factory.StartNew(async() =>
//{
// int i = 0;
// while (_socketHelper.OpenStatus)
// {
// await Task.Delay(5000);
// //bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
// _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 });
// //bool state = Array.TrueForAll(boolsl, b => b == false);
// if(_socketHelper.OpenStatus&&i==0)
// {
// ModbusHelper.SpeakAsync("请及时关闭药箱");
// }
// i++;
// if(i==5)
// {
// i = 0;
// }
// }
//});
//StateTimer.Start(); //StateTimer.Start();
SelfStatus = 0; SelfStatus = 0;
@ -714,29 +750,29 @@ namespace DM_Weight.ViewModels
// //Console.Beep(800, 1100); // //Console.Beep(800, 1100);
// } // }
//} //}
void DoMyPrismEvent(DeviceMsg msg) //void DoMyPrismEvent(DeviceMsg msg)
{ //{
switch (msg.EventType) // switch (msg.EventType)
{ // {
case EventType.DRAWERCLOSE: // case EventType.DRAWERCLOSE:
SelfEnable = false; // SelfEnable = false;
break; // break;
} // }
} //}
public void OnNavigatedTo(NavigationContext navigationContext) //public void OnNavigatedTo(NavigationContext navigationContext)
{ //{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent); // _eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
RequestData(); // RequestData();
} //}
public bool IsNavigationTarget(NavigationContext navigationContext) //public bool IsNavigationTarget(NavigationContext navigationContext)
{ //{
return true; // return true;
} //}
public void OnNavigatedFrom(NavigationContext navigationContext) //public void OnNavigatedFrom(NavigationContext navigationContext)
{ //{
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent); // _eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
} //}
} }
} }

View File

@ -105,11 +105,13 @@ namespace DM_Weight.ViewModels
private PortUtil _portUtil; private PortUtil _portUtil;
IEventAggregator _eventAggregator; IEventAggregator _eventAggregator;
public SettingBoxWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator) SocketHelper _socketHelper;
public SettingBoxWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator, SocketHelper socketHelper)
{ {
_portUtil = portUtil; _portUtil = portUtil;
_eventAggregator = eventAggregator; _eventAggregator = eventAggregator;
_socketHelper = socketHelper;
BindUserList(); BindUserList();
} }
private void BindUserList() private void BindUserList()
@ -201,7 +203,7 @@ namespace DM_Weight.ViewModels
//bool[] bools = ModbusHelper.GetInstance().GetAllBoxState(); //bool[] bools = ModbusHelper.GetInstance().GetAllBoxState();
//bool allFalse = Array.TrueForAll(bools, b => b == false); //bool allFalse = Array.TrueForAll(bools, b => b == false);
//if (!allFalse) //if (!allFalse)
if (ModbusHelper.BoxOperate) if (_socketHelper.OpenStatus)
{ {
Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); });
return; return;
@ -221,32 +223,69 @@ namespace DM_Weight.ViewModels
Type = 55, Type = 55,
InvoiceId = $"打开{DrawerNo}号药箱", InvoiceId = $"打开{DrawerNo}号药箱",
}).ExecuteCommand(); }).ExecuteCommand();
ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1);
//if (bFlag) _socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(DrawerNo - 1) });
_socketHelper.OpenStatus = true;
int i = 10;
new PromiseUtil<int>().taskAsyncLoop(500, 0, async (options, next, stop) =>
{ {
IsEnable = true; i--;
Status = 0; if (_socketHelper.OpenStatus)
}
Task.Factory.StartNew(async () =>
{
bool loop = true;
while (loop)
{ {
await Task.Delay(5000);
bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); //bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
bool state = Array.TrueForAll(boolsl, b => b == false); _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 });
if (state)
//ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}");
//bool state = Array.TrueForAll(boolsl, b => b == false);
if (_socketHelper.OpenStatus)
{ {
loop = false; IsEnable = true;
ModbusHelper.BoxOperate = false; Status = 0;
if (i == 0)
{
ModbusHelper.SpeakAsync("请及时关闭药箱");
i = 10;
}
next();
} }
else else
{ {
ModbusHelper.BoxOperate = true; stop();
ModbusHelper.SpeakAsync("药箱已打开,请及时关闭");
} }
} }
else
{
stop();
}
}); });
//ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1);
////if (bFlag)
//{
// IsEnable = true;
// Status = 0;
//}
//Task.Factory.StartNew(async () =>
//{
// bool loop = true;
// while (loop)
// {
// await Task.Delay(5000);
// bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
// bool state = Array.TrueForAll(boolsl, b => b == false);
// if (state)
// {
// loop = false;
// ModbusHelper.BoxOperate = false;
// }
// else
// {
// ModbusHelper.BoxOperate = true;
// ModbusHelper.SpeakAsync("药箱已打开,请及时关闭");
// }
// }
//});
} }
}); });
} }

View File

@ -33,12 +33,13 @@ namespace DM_Weight.Views
int autoExit = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0"); int autoExit = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0");
System.Timers.Timer idleTimer;//= new System.Timers.Timer(60000); System.Timers.Timer idleTimer;//= new System.Timers.Timer(60000);
IEventAggregator _eventAggregator; IEventAggregator _eventAggregator;
public HomeWindow(IEventAggregator eventAggregator) SocketHelper _socketHelper;
public HomeWindow(IEventAggregator eventAggregator, SocketHelper socketHelper)
{ {
InitializeComponent(); InitializeComponent();
if (autoExit > 0) if (autoExit > 0)
{ {
idleTimer = new System.Timers.Timer(autoExit*1000); idleTimer = new System.Timers.Timer(autoExit * 1000);
idleTimer.Elapsed += OnTimerElapsed; idleTimer.Elapsed += OnTimerElapsed;
this.MouseDown += OnUserActivity; this.MouseDown += OnUserActivity;
this.MouseMove += OnUserActivity; this.MouseMove += OnUserActivity;
@ -46,6 +47,7 @@ namespace DM_Weight.Views
idleTimer.Start(); idleTimer.Start();
_eventAggregator = eventAggregator; _eventAggregator = eventAggregator;
} }
_socketHelper = socketHelper;
} }
private void OnUserActivity(object sender, EventArgs e) private void OnUserActivity(object sender, EventArgs e)
{ {
@ -57,8 +59,8 @@ namespace DM_Weight.Views
// 串口无人操作 // 串口无人操作
//bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState(); //bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState();
//bool allTrue = Array.TrueForAll(boolArrs, b => b == false); //bool allTrue = Array.TrueForAll(boolArrs, b => b == false);
logger.Info($"进入自动退出定时方法{ModbusHelper.BoxOperate}"); logger.Info($"进入自动退出定时方法{_socketHelper.OpenStatus}");
if (ModbusHelper.BoxOperate && idleTimer.Enabled) if (_socketHelper.OpenStatus && idleTimer.Enabled)
{ {
idleTimer.Stop(); idleTimer.Stop();
//无人操作,自动退出 //无人操作,自动退出

View File

@ -0,0 +1,40 @@
using SharpPromise;
using System;
using System.Threading.Tasks;
namespace DM_Weight.util
{
public class PromiseUtil<T>
{
public int _delay { get; set; }
public T? _data { get; set; }
public async Task taskAsyncLoop(int delay, T data, Action<PromiseUtil<T>, Action, Action> action)
{
_data = data;
_delay = 0;
while (_delay >= 0)
{
await new Promise(async (Action onResolve, Action onReject) =>
{
await Task.Delay(_delay);
try
{
await Task.Run(() => action(this, onResolve, onReject));
} catch (Exception ex)
{
onReject();
}
}).Then(() =>
{
_delay = delay;
}).Catch((Exception e) =>
{
_delay = -1;
});
}
}
}
}