using HslCommunication;
using HslCommunication.Core;
using HslCommunication.Profinet.Siemens;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace RIZO.Infrastructure.Helper
{
///
/// 西门子S7-1500 PLC通信帮助类(简化版)
///
public class SiemensS7Helper : IDisposable
{
private SiemensS7Net _plc;
private bool _isConnected = false;
///
/// 连接状态
///
public bool IsConnected => _isConnected;
///
/// 构造函数
///
/// PLC IP地址
public SiemensS7Helper(string ip)
{
_plc = new SiemensS7Net(SiemensPLCS.S1500)
{
IpAddress = ip,
Port = 102
};
}
///
/// 连接PLC
///
public async Task ConnectAsync(CancellationToken cancellationToken = default)
{
int maxRetries = 3;
int retryDelayMs = 2000;
int attempt = 0;
while (attempt < maxRetries)
{
attempt++;
var result = await Task.Run(() => _plc.ConnectServer());
_isConnected = result.IsSuccess;
if (!_isConnected)
{
Console.WriteLine($"连接尝试 {attempt}/{maxRetries} 失败");
if (attempt < maxRetries)
{
Console.WriteLine($"{retryDelayMs / 1000}秒后重试...");
await Task.Delay(retryDelayMs, cancellationToken);
}
else
{
Console.WriteLine("无法建立PLC连接,请检查网络和设备状态");
_plc?.ConnectClose();
_plc = null;
return _isConnected;
}
}
}
return false;
}
///
/// 断开连接
///
public void Disconnect()
{
_plc?.ConnectClose();
_isConnected = false;
}
///
/// 读取字符串(重点)
///
/// 地址,如 "DB1.DB_STRING10"
/// 字符串长度
public async Task ReadStringAsync(string address, ushort length = 50)
{
if (!_isConnected) return null;
var result = await Task.Run(() => _plc.ReadString(address, length));
return result.IsSuccess ? result.Content : null;
}
///
/// 写入字符串(重点)
///
/// 地址
/// 字符串值
/// 字符串长度
public async Task WriteStringAsync(string address, string value, ushort length = 50)
{
if (!_isConnected) return false;
var result = await Task.Run(() => _plc.Write(address, value, length));
return result.IsSuccess;
}
///
/// 读取布尔值
///
public async Task ReadBoolAsync(string address)
{
if (!_isConnected) return null;
var result = await Task.Run(() => _plc.ReadBool(address));
return result.IsSuccess ? result.Content : (bool?)null;
}
///
/// 写入布尔值
///
public async Task WriteBoolAsync(string address, bool value)
{
if (!_isConnected) return false;
var result = await Task.Run(() => _plc.Write(address, value));
return result.IsSuccess;
}
///
/// 读取整数
///
public async Task ReadIntAsync(string address)
{
if (!_isConnected) return null;
var result = await Task.Run(() => _plc.ReadInt32(address));
return result.IsSuccess ? result.Content : (int?)null;
}
///
/// 写入整数
///
public async Task WriteIntAsync(string address, int value)
{
if (!_isConnected) return false;
var result = await Task.Run(() => _plc.Write(address, value));
return result.IsSuccess;
}
///
/// 读取浮点数
///
public async Task ReadFloatAsync(string address)
{
if (!_isConnected) return null;
var result = await Task.Run(() => _plc.ReadFloat(address));
return result.IsSuccess ? result.Content : (float?)null;
}
///
/// 写入浮点数
///
public async Task WriteFloatAsync(string address, float value)
{
if (!_isConnected) return false;
var result = await Task.Run(() => _plc.Write(address, value));
return result.IsSuccess;
}
///
/// 释放资源
///
public void Dispose()
{
Disconnect();
_plc?.Dispose();
}
}
}