using S7.Net;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HKControl
{
internal class Siemens : CommunicationBase
{
Plc myPlc;
public bool IsConnected => myPlc is null ? false : myPlc.IsConnected;
private CpuType myCpuType;
private string MyIp;
private int Myport;
private bool IsStartConnect = false;
///
/// 打开连接
///
/// PLC CPU 类型
/// plc ip 地址
/// plc 端口号
/// PLC 机架号
/// PLC 插槽号
public void Connect(CpuType cpuType, string ip, int port = 102, short rack = 0, short solt = 0)
{
try
{
myCpuType = cpuType;
MyIp = ip;
Myport = port;
myPlc = new Plc(cpuType, ip, port, rack, solt);
while (!myPlc.IsConnected)
{
myPlc.Open();
if (!myPlc.IsConnected) Thread.Sleep(3000);
}
if (myPlc.IsConnected)
{
IsStartConnect = false;
ConnectOk?.Invoke();
HKLog.HKLogImport.WriteInfo($"设备{ip}连接成功");
//Debug.WriteLine($"设备{ip}连接成功");
}
}
catch (Exception ex)
{
HKLog.HKLogImport.WriteInfo($"设备连接出错:{ip}");
Thread.Sleep(3000);
Connect(cpuType, ip, port);
//Debug.WriteLine(ex.ToString());
}
}
private void ExceptionDis()
{
if (IsStartConnect)
{
myPlc?.Close();
myPlc = null;
Connect(myCpuType, MyIp, Myport);
}
IsStartConnect = true;
}
///
/// 断开和PLC的连接
///
public void Disconnect()
{
myPlc?.Close();
}
public TResult Read(string address)
{
try
{
if (!IsConnected)
{
ExceptionDis();
return default;
}
return (TResult)myPlc?.Read(address);
}
catch (Exception ex)
{
ExceptionDis();
return default;
}
}
public bool[] ReadBools(int address, int count)
{
if (!IsConnected) return default;
var res = Read(DataType.Memory, 0, address, VarType.Bit, count);
if (res != null && res is bool[] bools) return bools;
return default;
}
public ushort[] ReadMW(int address, int count)
{
if (!IsConnected) return default;
var res = Read(DataType.Memory, 0, address, VarType.Word, count);
if (res != null && res is ushort[] ReturnValue) return ReturnValue;
return default;
}
public float[] ReadMD(int address, int count)
{
if (!IsConnected) return default;
var res = Read(DataType.Memory, 0, address, VarType.Real, count);
if (res != null && res is float[] ReturnValue) return ReturnValue;
return default;
}
private object Read(DataType dataType, int db, int address, VarType varType, int count)
{
try
{
if (!IsConnected) return default;
return myPlc?.Read(dataType, db, address, varType, count);
}
catch (Exception ex)
{
ExceptionDis();
return default;
}
}
public void Write(string address, TValue value)
{
try
{
myPlc?.Write(address, value);
}
catch (Exception ex)
{
ExceptionDis();
}
}
public ReadT ReadStruct(int db, int startAddress = 0)
{
if (!IsConnected) return default;
return (ReadT)myPlc.ReadStruct(typeof(ReadT), db, startAddress);
}
public void WriteStruct(object structValue, int db, int startAddress = 0)
{
myPlc?.WriteStruct(structValue, db, startAddress);
}
public int ReadClass(object sourceClass, int db, int startAddress = 0)
{
if (!IsConnected) return -1;
return myPlc.ReadClass(sourceClass, db, startAddress);
}
public TResult ReadClass(int db, int startAddress = 0) where TResult : class
{
if (!IsConnected) return default;
return myPlc.ReadClass(db, startAddress);
}
public void WriteClass(object sourceClass, int db, int startAddress = 0)
{
myPlc?.WriteClass(sourceClass, db, startAddress);
}
}
}