189 lines
5.4 KiB
C#
Raw Normal View History

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