You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.6 KiB
C#

using HighWayIot.Log4net;
using HighWayIot.Plc.PlcEntity;
using HighWayIot.Plc.PlcHelper;
using HighWayIot.Repository.domain;
using HighWayIot.Repository.service;
using HighWayIot.Rfid;
using HighWayIot.Rfid.Entity;
using HighWayIot.TouchSocket;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
using Timer = System.Threading.Timer;
namespace HighWayIot.Winform.Business
{
/// <summary>
/// 工位RFID识别业务
/// </summary>
public class WorkStationBusiness
{
/// <summary>
/// 日志
/// </summary>
private LogHelper _logHelper = LogHelper.Instance;
/// <summary>
/// PLC
/// </summary>
private WorkStationHelper _workStationHelper = new WorkStationHelper();
/// <summary>
/// 读写器服务类
/// </summary>
private ZxReaderSettingService _readerService = ZxReaderSettingService.Instance;
/// <summary>
/// 读写器实体类
/// </summary>
private List<ZxReaderSettingEntity> _readerSetting;
/// <summary>
/// RFID数据分析
/// </summary>
private RfidDataAnalyse _RfidDataAnalyse = new RfidDataAnalyse();
/// <summary>
/// TCP客户端
/// </summary>
private TouchSocketTcpClient _touchSocketTcpClient = TouchSocketTcpClient.Instance;
/// <summary>
/// TCP客户端工厂
/// </summary>
private TCPClientFactory tcpClientFactory = new TCPClientFactory();
/// <summary>
/// 刷新器
/// </summary>
private Timer timer;
/// <summary>
/// 是否全部连接成功
/// </summary>
private bool IsAllConnected = false;
public WorkStationBusiness()
{
_readerSetting = _readerService.GetReaderInfos();
this.CreateAllRFIDClient();
_touchSocketTcpClient.GetMessageAction += tcpClientFactory.ReciveDataRoute;
timer = new Timer(new System.Threading.TimerCallback(SingalMonitor), null, 0, 1000);
}
/// <summary>
/// 创建所有RFID客户端
/// </summary>
public void CreateAllRFIDClient()
{
foreach (var setting in _readerSetting)
{
Task.Run(() =>
{
_touchSocketTcpClient.CreateTcpClient(setting.RfidIp, "20108");
_touchSocketTcpClient.Send(setting.RfidIp, _RfidDataAnalyse.SendBFH(5)).GetAwaiter().GetResult();
});
}
IsAllConnected = true;
}
/// <summary>
/// 自动监视 获取PLC信号
/// </summary>
/// <param name="o"></param>
public void SingalMonitor(object o)
{
bool[] singals = _workStationHelper.ReadStationSingal();
if(singals == null)
{
_logHelper.Error("工位监视PLC读取信号失败");
return;
}
for (int i = 1; i <= singals.Length; i++)
{
if (singals[i - 1] == true)
{
SendRFIDSingal(i);
}
}
}
/// <summary>
/// 向指定RFID读写器发送读信号
/// </summary>
public async void SendRFIDSingal(int no)
{
if (IsAllConnected == true)
{
ZxReaderSettingEntity setting = null;
try
{
setting = _readerSetting.FirstOrDefault(x => x.WorkstationNo == no.ToString());
}
catch (Exception ex)
{
LogHelper.Instance.Error($"[{no}] 工位读写器信息获取失败!", ex);
}
if (setting == null)
{
LogHelper.Instance.Error($"找不到第[{no}]个读写器");
return;
}
int i = 0;
bool result = false;
do
{
result = await _touchSocketTcpClient.Send(setting.RfidIp, _RfidDataAnalyse.Send02H(1000));
i++;
}
while (i < 3 && result == false);
if(result == false)
{
_logHelper.Error($"[{no}] 工位 [{setting.RfidIp}] 读写器指令发送失败!");
}
}
}
}
}