Files
1257B_DB/PLC/PlcLibrary/SiemensS7.cs
T
2026-08-06 09:23:30 +08:00

265 lines
9.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Linq;
using System.Threading.Tasks;
using PLCCommunication;
using PLCCommunication.PLCType.Siemens;
using PLCCommunication.Common;
using System.ComponentModel.Composition;
using System.Net;
using PLCCommunication.Common.DataConvert;
namespace PLC
{
/// <summary>
/// 西门子S7协议通讯(S7-1200/S7-300/S7-400/S7-200SMART)
/// </summary>
[Export("SiemensS7", typeof(PlcReadWriteBase))]
public class SiemensS7 : PlcReadWriteBase
{
private SiemensS7Net siemensS7Net = null;
public SiemensS7(int pid, string pname, IPEndPoint iep, int timeout = 10)
: base(pid, pname, iep, timeout)
{
siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200);
siemensS7Net.IpAddress = iep.Address.ToString();
siemensS7Net.Port = iep.Port;
siemensS7Net.ByteTransform.DataFormat = DataFormat.CDAB;
siemensS7Net.ConnectTimeOut = 2000;
siemensS7Net.ReceiveTimeOut = 2000;
IsConnected = false;
}
public override bool Connect(ref string msg)
{
try
{
if (!IsConnected)
{
JYResult connect = siemensS7Net.ConnectServer();
if (connect.IsSuccess)
{
IsConnected = true;
msg = "连接成功";
return true;
}
msg = connect.Message;
}
}
catch (Exception ex)
{
msg = ex.Message;
}
return false;
}
public override bool Disconnect()
{
if (IsConnected)
{
siemensS7Net.ConnectClose();
IsConnected = false;
}
return true;
}
public override bool ReadBool(string address)
{
JYResult<bool> result = siemensS7Net.ReadBool(address);
return result.IsSuccess ? result.Content : false;
}
public override short ReadInt16(string address)
{
JYResult<short> result = siemensS7Net.ReadInt16(address);
return result.IsSuccess ? result.Content : (short)0;
}
public override async Task<JYResult<short>> ReadInt16Async(string address)
{
return await siemensS7Net.ReadInt16Async(address);
}
public override short[] ReadArrInt16(string address, ushort length)
{
JYResult<short[]> result = siemensS7Net.ReadInt16(address, length);
return result.IsSuccess ? result.Content : null;
}
public override async Task<JYResult<short[]>> ReadArrInt16Async(string address, ushort length)
{
return await siemensS7Net.ReadInt16Async(address, length);
}
public override int ReadInt32(string address)
{
JYResult<int> result = siemensS7Net.ReadInt32(address);
return result.IsSuccess ? result.Content : 0;
}
public override float ReadFloat(string address)
{
JYResult<float> result = siemensS7Net.ReadFloat(address);
return result.IsSuccess ? result.Content : 0.0f;
}
public override float[] ReadArrFloat(string address, ushort length = 0)
{
JYResult<float[]> result = siemensS7Net.ReadFloat(address, length);
return result.IsSuccess ? result.Content : null;
}
public override async Task<JYResult<int>> ReadInt32Async(string address)
{
return await siemensS7Net.ReadInt32Async(address);
}
public override async Task<JYResult<float[]>> ReadArrFloatAsync(string address, ushort length)
{
return await siemensS7Net.ReadFloatAsync(address, length);
}
/// <summary>
/// 统一读取
/// </summary>
public override T ReadValue<T>(string address, DataType type, ushort length = 0)
{
object obj = null;
try
{
switch (type)
{
case DataType.Bool:
obj = siemensS7Net.ReadBool(address).Content;
break;
case DataType.Short:
obj = siemensS7Net.ReadInt16(address).Content;
break;
case DataType.Int:
obj = siemensS7Net.ReadInt32(address).Content;
break;
case DataType.Float:
obj = siemensS7Net.ReadFloat(address).Content;
break;
case DataType.Double:
obj = siemensS7Net.ReadDouble(address).Content;
break;
case DataType.String:
obj = siemensS7Net.ReadString(address, length).Content;
break;
case DataType.ArrByte:
obj = ReadArrByteFromPlc(address, length);
break;
case DataType.ArrFloat:
obj = siemensS7Net.ReadFloat(address, length).Content;
break;
case DataType.ArrShort:
obj = siemensS7Net.ReadInt16(address, length).Content;
break;
case DataType.ArrUshort:
obj = siemensS7Net.ReadUInt16(address, length).Content;
break;
case DataType.ArrInt:
obj = siemensS7Net.ReadInt32(address, length).Content;
break;
case DataType.ArrUint:
obj = siemensS7Net.ReadUInt32(address, length).Content;
break;
}
return (T)obj;
}
catch
{
return default;
}
}
private byte[] ReadArrByteFromPlc(string address, ushort length)
{
short[] shorts = ReadArrInt16(address, length);
if (shorts == null) return null;
byte[] bytes = new byte[shorts.Length * 2];
Buffer.BlockCopy(shorts, 0, bytes, 0, bytes.Length);
return bytes;
}
public override bool WriteBool(string address, bool value)
{
JYResult result = siemensS7Net.Write(address, value);
return result.IsSuccess;
}
public override bool WriteInt16(string address, short value)
{
JYResult result = siemensS7Net.Write(address, value);
return result.IsSuccess;
}
public override bool WriteInt32(string address, int value)
{
JYResult result = siemensS7Net.Write(address, value);
return result.IsSuccess;
}
public override bool WriteFloat(string address, float value)
{
JYResult result = siemensS7Net.Write(address, value);
return result.IsSuccess;
}
public override JYResult WriteValue(string address, object value, DataType type = DataType.Short)
{
JYResult result = new JYResult();
try
{
switch (type)
{
case DataType.Bool:
result = siemensS7Net.Write(address, (bool)value);
break;
case DataType.Short:
result = siemensS7Net.Write(address, (short)value);
break;
case DataType.Int:
result = siemensS7Net.Write(address, (int)value);
break;
case DataType.Float:
result = siemensS7Net.Write(address, (float)value);
break;
case DataType.Double:
result = siemensS7Net.Write(address, (double)value);
break;
case DataType.String:
result = siemensS7Net.Write(address, value.ToString());
break;
case DataType.ArrShort:
result = siemensS7Net.Write(address, (short[])value);
break;
case DataType.ArrUshort:
result = siemensS7Net.Write(address, (ushort[])value);
break;
case DataType.ArrByte:
result = siemensS7Net.Write(address, (byte[])value);
break;
case DataType.ArrFloat:
result = siemensS7Net.Write(address, (float[])value);
break;
}
return result;
}
catch (Exception ex)
{
result.IsSuccess = false;
result.Message = ex.Message;
return result;
}
}
}
}