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(); } } }