using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PLCCommunication;
using PLCCommunication.PLCType.Omron;
using PLCCommunication.Common;
using System.ComponentModel.Composition;
using System.Net;
using PLCCommunication.Common.DataConvert;
namespace PLC
{
///
/// 欧姆龙FinsTCP通讯
///
[Export("OmronFinsTCP", typeof(PlcReadWriteBase))]
public class OmronFinsTCP : PlcReadWriteBase
{
private OmronFinsNet omronFinsNet = null;
///
/// 构造函数
///
///
///
///
///
public OmronFinsTCP(int pid, string pname, IPEndPoint iep, int timeout = 10) :
base(pid, pname, iep, timeout)
{
omronFinsNet = new OmronFinsNet();
omronFinsNet.IpAddress = iep.Address.ToString();
omronFinsNet.Port = iep.Port;
omronFinsNet.DA2 = 0x00;// PLC单元号,通常为0
omronFinsNet.ReadSplits = 999; //读取字长度,最长999,不能超过1000
omronFinsNet.ByteTransform.DataFormat = PLCCommunication.Common.DataFormat.CDAB;
omronFinsNet.ByteTransform.IsStringReverseByteWord = true;
omronFinsNet.ConnectTimeOut = 2000;
omronFinsNet.ReceiveTimeOut = 2000;
IsConnected = false;
}
///
/// 启动与PLC链接
///
///
public override bool Connect(ref string msg)
{
bool res = false;
try
{
if (!IsConnected)
{
JYResult connect = omronFinsNet.ConnectServer();
if (connect.IsSuccess)
{
IsConnected = connect.IsSuccess;
byte num1 = this.omronFinsNet.SA1;
byte num2 = this.omronFinsNet.DA1;
msg = $"{num1},{num2}";
return true;
}
}
else
{
return true;
}
}
catch (Exception ex)
{
msg = ex.Message;
}
return res;
}
///
/// 断开与PLC链接
///
///
public override bool Disconnect()
{
if (IsConnected)
{
JYResult connect = omronFinsNet.ConnectClose();
IsConnected = false;
return connect.IsSuccess;
}
else
{
return true;
}
}
///
/// 读取BOOl变量
///
///
///
public override bool ReadBool(string address)
{
JYResult result = omronFinsNet.ReadBool(address, 1);
if (result.IsSuccess)
return result.Content[0];
else
return false;
}
///
/// 读取16位整数
///
///
///
public override short ReadInt16(string address)
{
JYResult result = omronFinsNet.ReadInt16(address);
if (result.IsSuccess)
return result.Content;
else
return 0;
}
///
///
///
///
///
public override Task> ReadInt16Async(string address)
{
JYResult result = null;
try
{
if (IsConnected)
{
result = omronFinsNet.ReadInt16Async(address).Result;
}
}
catch (Exception ex)
{
}
return Task.FromResult(result);
}
///
/// 读取16位数组
///
///
///
///
public override short[] ReadArrInt16(string address, ushort length)
{
JYResult result = omronFinsNet.Read(address, length);
if (result.IsSuccess)
return ParseShortData(result.Content);
else
return null;
}
///
///
///
///
///
///
public override async Task> ReadArrInt16Async(string address, ushort length)
{
JYResult result = await omronFinsNet.ReadAsync(address, length).ConfigureAwait(false);
if (result.IsSuccess)
{
short[] parsedData = ParseShortData(result.Content);
return new JYResult { Content = parsedData, IsSuccess = true };
}
else
{
return new JYResult { IsSuccess = false, Message = result.Message };
}
}
///
/// 读取32位整数
///
///
///
public override int ReadInt32(string address)
{
JYResult result = omronFinsNet.ReadInt32(address);
if (result.IsSuccess)
return result.Content;
else
return 0;
}
///
/// 读取Float单精度小数
///
///
///
public override float ReadFloat(string address)
{
JYResult result = omronFinsNet.ReadFloat(address);
if (result.IsSuccess)
return result.Content;
else
return 0.0f;
}
///
/// 读取Float数组
///
///
///
///
public override float[] ReadArrFloat(string address, ushort length = 0)
{
JYResult result = omronFinsNet.Read(address, length);
if (result.IsSuccess)
return ParseFloatData(result.Content);
else
return null;
}
///
/// 读取有符号16位数组
///
///
///
///
private short[] ReadArrShort(string address, ushort length = 0)
{
JYResult result = omronFinsNet.Read(address, length);
if (result.IsSuccess)
return ParseShortData(result.Content);
else
return null;
}
///
/// 读取无符号16位数组
///
///
///
///
private ushort[] ReadArrUshort(string address, ushort length = 0)
{
JYResult result = omronFinsNet.Read(address, length);
if (result.IsSuccess)
return ParseUshortData(result.Content);
else
return null;
}
private int[] ReadArrInt32(string address, ushort length = 0)
{
JYResult result = omronFinsNet.Read(address, length);
if (result.IsSuccess)
return ParseInt32Data(result.Content);
else
return null;
}
///
///
///
///
///
public override async Task> ReadInt32Async(string address)
{
JYResult result = await omronFinsNet.ReadInt32Async(address).ConfigureAwait(false);
if (result.IsSuccess)
{
return new JYResult { Content = result.Content, IsSuccess = true };
}
else
{
return new JYResult { IsSuccess = false, Message = result.Message };
}
}
///
/// 异步读取浮点数组
///
///
///
///
public override async Task> ReadArrFloatAsync(string address, ushort length)
{
JYResult result = await omronFinsNet.ReadAsync(address, length).ConfigureAwait(false);
if (result.IsSuccess)
{
float[] floats = ParseFloatData(result.Content);
return new JYResult { Content = floats, IsSuccess = true };
}
else
{
return new JYResult { IsSuccess = false, Message = result.Message };
}
}
private short[] ParseShortData(byte[] content)
{
int count = content.Length / 2;
return Enumerable.Range(0, count)
.Select(i => (short)ShortLib.GetShortFromByteArray(content, i * 2))
.ToArray();
}
private ushort[] ParseUshortData(byte[] content)
{
int count = content.Length / 2;
return Enumerable.Range(0, count)
.Select(i => (ushort)UShortLib.GetUShortFromByteArray(content, i * 2))
.ToArray();
}
private int[] ParseInt32Data(byte[] content)
{
int count = content.Length / 2;
return Enumerable.Range(0, count)
.Select(i => (Int32)IntLib.GetIntFromByteArray(content, i * 4))
.ToArray();
}
private float[] ParseFloatData(byte[] content)
{
int count = content.Length / 4;
return Enumerable.Range(0, count)
.Select(i => (float)FloatLib.GetFloatFromByteArray(content, i * 4))
.ToArray();
}
///
/// 读取PLC数据
///
///
///
///
///
///
public override T ReadValue(string address, DataType type, ushort length = 0)
{
object obj = default(object);
try
{
switch (type)
{
case DataType.Bool:
obj = omronFinsNet.ReadBool(address);
break;
case DataType.Short:
obj = omronFinsNet.ReadInt16(address);
break;
case DataType.Int:
obj = omronFinsNet.ReadInt32(address);
break;
case DataType.Float:
obj = omronFinsNet.ReadFloat(address);
break;
case DataType.Double:
obj = omronFinsNet.ReadDouble(address);
break;
case DataType.String:
obj = omronFinsNet.ReadString(address, length);
break;
case DataType.ArrByte:
obj = omronFinsNet.Read(address, length);
break;
case DataType.ArrFloat:
//obj = ReadArrFloat(address, length);
obj = omronFinsNet.ReadFloat(address, length);
break;
case DataType.ArrShort:
obj = omronFinsNet.ReadInt16(address, length);
break;
case DataType.ArrUshort:
obj = omronFinsNet.ReadUInt16(address, length);
break;
case DataType.ArrInt:
obj = omronFinsNet.ReadUInt32(address, length);
break;
case DataType.ArrUint:
obj = omronFinsNet.ReadUInt32(address, length);
break;
default:
break;
}
return (T)obj;
}
catch (Exception)
{
return default(T);
}
}
///
///
///
///
///
///
public override bool WriteBool(string address, bool value)
{
bool[] data = new bool[1] { value };
JYResult result = omronFinsNet.Write(address, value);
return result.IsSuccess;
}
///
/// 写入16位整数
///
///
///
///
///
public override bool WriteInt16(string address, short value)
{
JYResult result = omronFinsNet.Write(address, value);
return result.IsSuccess;
}
///
/// 写入32位整数
///
///
///
///
public override bool WriteInt32(string address, int value)
{
JYResult result = omronFinsNet.Write(address, value);
return result.IsSuccess;
}
///
/// 写入浮点数
///
///
///
///
public override bool WriteFloat(string address, float value)
{
JYResult result = omronFinsNet.Write(address, value);
return result.IsSuccess;
}
///
/// 写入PLC数据
///
///
///
///
///
public override JYResult WriteValue(string address, object value, DataType type = DataType.Short)
{
JYResult result = new JYResult();
try
{
switch (type)
{
case DataType.Bool:
result = omronFinsNet.Write(address, Convert.ToBoolean(value));
break;
case DataType.Short:
result = omronFinsNet.Write(address, Convert.ToInt16(value));
break;
case DataType.Int:
result = omronFinsNet.Write(address, Convert.ToInt32(value));
break;
case DataType.Float:
result = omronFinsNet.Write(address, Convert.ToSingle(value));
break;
case DataType.Double:
result = omronFinsNet.Write(address, Convert.ToDouble(value));
break;
case DataType.String:
result = omronFinsNet.Write(address, value.ToString());
break;
case DataType.ArrShort:
result = omronFinsNet.Write(address, value as short[]);
break;
case DataType.ArrUshort:
result = omronFinsNet.Write(address, value as ushort[]);
break;
case DataType.ArrByte:
result = omronFinsNet.Write(address, value as byte[]);
break;
case DataType.ArrFloat:
result = omronFinsNet.Write(address, value as float[]);
break;
default:
break;
}
return result;
}
catch (Exception ex)
{
result.IsSuccess = false;
result.Message = ex.Message;
return result;
}
}
}
}