csharp
/// <summary>
/// 信号超时监控器 - 用于检测信号异常超时
/// </summary>
public class SignalTimeoutMonitor
{
private DateTime _startTime; // 开始计时的时间
private bool _isMonitoring = false; // 是否正在监控
private int _timeoutSeconds; // 超时时间(秒)
/// <summary>
/// 构造函数
/// </summary>
/// <param name="timeoutSeconds">超时时间(秒),默认5秒</param>
public SignalTimeoutMonitor(int timeoutSeconds = 5)
{
_timeoutSeconds = timeoutSeconds;
}
/// <summary>
/// 检查信号是否超时
/// </summary>
/// <param name="expectedSignal">期望的信号值(例如:true表示期望传感器到位)</param>
/// <param name="actualSignal">实际的信号值(例如:传感器实际状态)</param>
/// <returns>true=超时需要报警,false=正常</returns>
public bool CheckTimeout(bool expectedSignal, bool actualSignal)
{
// 情况1:信号已经相等(正常)
if (expectedSignal == actualSignal)
{
StopMonitoring(); // 停止监控
return false; // 不需要报警
}
// 情况2:信号不相等,需要开始或继续监控
if (!_isMonitoring)
{
// 第一次发现信号不相等,开始计时
StartMonitoring();
return false; // 刚开始,还不需要报警
}
// 情况3:正在监控中,检查是否超时
TimeSpan elapsedTime = DateTime.Now - _startTime;
if (elapsedTime.TotalSeconds >= _timeoutSeconds)
{
return true; // 超时了,需要报警!
}
return false; // 还没超时,继续等待
}
/// <summary>
/// 开始监控
/// </summary>
private void StartMonitoring()
{
_startTime = DateTime.Now;
_isMonitoring = true;
}
/// <summary>
/// 停止监控
/// </summary>
private void StopMonitoring()
{
_isMonitoring = false;
}
/// <summary>
/// 手动重置监控器
/// </summary>
public void Reset()
{
StopMonitoring();
}
/// <summary>
/// 获取已经等待的时间(秒)
/// </summary>
public double GetElapsedSeconds()
{
if (!_isMonitoring)
return 0;
return (DateTime.Now - _startTime).TotalSeconds;
}
}
//-----------------------在这里插入代码片下面是使用上述类的样例程序-------------------
csharp
// 创建监控器,超时时间5秒
SignalTimeoutMonitor cylinderMonitor = new SignalTimeoutMonitor(5);
// 在PLC扫描周期中不断调用(例如每100ms)
void CheckCylinderPosition()
{
bool cylinderExtendCommand = true; // 气缸伸出命令(已发出)
bool sensorDetected = ReadSensor(); // 读取传感器状态(实际值)
// 检查是否超时
bool isTimeout = cylinderMonitor.CheckTimeout(
expectedSignal: cylinderExtendCommand, // 期望:命令已发出=true
actualSignal: sensorDetected // 实际:传感器是否检测到
);
if (isTimeout)
{
// 超时报警
ShowAlarm("气缸伸出超时!传感器未检测到到位信号");
StopMachine(); // 停机
cylinderMonitor.Reset(); // 重置监控器
}
}
// 模拟读取传感器
bool ReadSensor()
{
// 这里读取PLC中的传感器状态
return PLC.ReadBool("DB1.DBX0.0");
}