SIC-12/Framework/MECF.Framework.RT.EquipmentLibrary/HardwareUnits/MachineVision/HikVision/HikMV.cs

133 lines
3.9 KiB
C#

using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.OperationCenter;
using Aitex.Core.Util;
using MECF.Framework.Common.Communications;
using System;
using Aitex.Core.RT.SCCore;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.MachineVision.HikVision
{
public class HikMV : BaseDevice, IDevice, IConnection
{
private readonly HikMVConnection _connection;
private readonly object _locker = new();
private int _retryCount = 0;
private PeriodicJob _thread;
private const int _maxRetryCount = 50;
private readonly R_TRIG _trigConnErr = new();
public bool IsConnected => _connection is { IsConnected: true };
public string Address => _connection.Address;
public bool IsResponded { get; set; }
public bool IsProcessing { get; set; } = false;
public string RawMessage { get; set; } = "";
public double[] Data { get; set; }
public HikMV(string module, string scRoot, string name) : base(module, name, name, name)
{
var ip = SC.SafeGetStringValue($"{name}.IP", "127.0.0.1");
var port = SC.GetValue($"{name}.Port", 9000);
_connection = new HikMVConnection($"{ip}:{port}","\r\n");
}
public bool Initialize()
{
DATA.Subscribe($"{UniqueName}.{nameof(RawMessage)}", () => RawMessage);
OP.Subscribe($"{UniqueName}.Execute", (string cmd, object[] args) => Execute((string)args[0]));
if (!_connection.Connect())
{
_trigConnErr.CLK = true;
if(_trigConnErr.Q)
EV.PostAlarmLog(Module, $"{Name}({Address}) Connect Failed");
}
_thread = new PeriodicJob(100, OnTimer, $"{UniqueName} MonitorHandler", true);
return true;
}
private bool OnTimer()
{
var result = _connection.MonitorTimeout();
if (result != null)
{
RawMessage = $"{result.SendText.Replace("\r", "").Replace("\n", "")} no Response";
IsProcessing = false;
Disconnect();
}
if (!_connection.IsConnected)
{
if (_retryCount < _maxRetryCount)
{
_retryCount++;
}
else
{
_retryCount = 0;
lock (_locker)
{
if (!_connection.Connect())
{
// 连接失败
_trigConnErr.CLK = true;
if(_trigConnErr.Q)
EV.PostAlarmLog(Module, $"{Name}({Address}) Connect Failed");
}
else
{
// 连接成功
_trigConnErr.CLK = false;
}
}
}
}
return true;
}
public bool Execute(string command)
{
IsResponded = false;
IsProcessing = true;
RawMessage = "";
var handler = new HikMVHandler(this, command+"\r\n");
handler.AckTimeout = TimeSpan.FromSeconds(5.0);
_connection.Execute(handler);
return true;
}
public void Reset()
{
_trigConnErr.RST = true;
IsProcessing = false;
IsResponded = false;
RawMessage = "";
}
public void Terminate()
{
Disconnect();
_trigConnErr.RST = true;
}
public bool Connect()
{
return _connection.Connect();
}
public bool Disconnect()
{
return _connection.Disconnect();
}
}
}