using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using PLCCommunication;
using HslCommunication.Profinet.Siemens;
using HslCommunication;
using PLCCommunication.Common;
using HslCommunication.Profinet.Delta;
namespace PLCCommunication.Impl
{
///
/// PLC通信服务 SiemensS7 smart200 实现
///
internal class DeltaCommunicationService : IPLCCommunicationService
{
private DeltaTcpNet deltaTcpNet = null;
///
/// 是否已连接
///
public bool isConnected { get; private set; }
public DeltaCommunicationService()
{
deltaTcpNet = new DeltaTcpNet();
deltaTcpNet.Series = DeltaSeries.AS;
deltaTcpNet.ConnectTimeOut = 3000;
}
#region 同步
///
/// 连接PLC(长连接)
///
///
///
public PLCResult Connection(string address, int port = 0)
{
deltaTcpNet.IpAddress = address;
if (port > 0)
{
deltaTcpNet.Port = port;
}
var operateResult = deltaTcpNet.ConnectServer();
var result = ConvertResult(operateResult);
if (result.IsSuccess)
{
isConnected = true;
}
return result;
}
///
/// 关闭连接PLC(长连接)
///
public PLCResult ColseConnection()
{
var operateResult = deltaTcpNet.ConnectClose();
var result = ConvertResult(operateResult);
if (result.IsSuccess)
{
isConnected = false;
}
return result;
}
///
/// 读取指定地址的byte[]值
///
///
///
public PLCResult ReadBytes(string address, ushort length)
{
var operateResult = deltaTcpNet.Read(address, length);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的bool值
///
///
///
public PLCResult ReadBool(string address)
{
var operateResult = deltaTcpNet.ReadBool(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的byte值
///
///
///
public PLCResult ReadByte(string address)
{
throw new NotImplementedException();
}
///
/// 读取指定地址的Int16值
///
///
///
public PLCResult ReadInt16(string address)
{
var operateResult = deltaTcpNet.ReadInt16(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的Int32值
///
///
///
public PLCResult ReadInt32(string address)
{
var operateResult = deltaTcpNet.ReadInt32(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的long值
///
///
///
public PLCResult ReadLong(string address)
{
var operateResult = deltaTcpNet.ReadInt64(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的Float值
///
///
public PLCResult ReadFloat(string address)
{
var operateResult = deltaTcpNet.ReadFloat(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的double值
///
///
public PLCResult ReadDouble(string address)
{
var operateResult = deltaTcpNet.ReadDouble(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入bool值
///
/// 写入地址
///
public PLCResult Write(string address, bool value)
{
var operateResult = deltaTcpNet.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入byte值
///
/// 写入地址
///
public PLCResult Write(string address, byte value)
{
var operateResult = deltaTcpNet.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入Int16值
///
/// 写入地址
///
public PLCResult Write(string address, Int16 value)
{
var operateResult = deltaTcpNet.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入Int32值
///
/// 写入地址
///
public PLCResult Write(string address, Int32 value)
{
var operateResult = deltaTcpNet.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入float值
///
/// 写入地址
///
public PLCResult Write(string address, float value)
{
var operateResult = deltaTcpNet.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入double值
///
/// 写入地址
///
public PLCResult Write(string address, double value)
{
var operateResult = deltaTcpNet.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入long值
///
/// 写入地址
///
public PLCResult Write(string address, long value)
{
var operateResult = deltaTcpNet.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
#endregion
#region 异步
///
/// 连接PLC(长连接)
///
///
///
public async Task ConnectionAsync(string address, int port = 0)
{
deltaTcpNet.IpAddress = address;
if (port > 0)
{
deltaTcpNet.Port = port;
}
var operateResult = await deltaTcpNet.ConnectServerAsync();
var result = ConvertResult(operateResult);
if (operateResult.IsSuccess)
{
isConnected = true;
}
return result;
}
///
/// 关闭连接PLC(长连接)
///
public async Task ColseConnectionAsyn()
{
var operateResult = await deltaTcpNet.ConnectCloseAsync();
var result = ConvertResult(operateResult);
if (operateResult.IsSuccess)
{
isConnected = false;
}
return result;
}
///
/// 读取指定地址的byte[]值
///
///
///
public async Task> ReadBytesAsync(string address, ushort length)
{
var operateResult = await deltaTcpNet.ReadAsync(address, length);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的bool值
///
///
///
public async Task> ReadBoolAsync(string address)
{
var operateResult = await deltaTcpNet.ReadBoolAsync(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的byte值
///
///
///
public async Task> ReadByteAsync(string address)
{
throw new NotImplementedException();
}
///
/// 读取指定地址的Int16值
///
///
///
public async Task> ReadInt16Async(string address)
{
var operateResult = await deltaTcpNet.ReadInt16Async(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的Int32值
///
///
///
public async Task> ReadInt32Async(string address)
{
var operateResult = await deltaTcpNet.ReadInt32Async(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的long值
///
///
///
public async Task> ReadLongAsync(string address)
{
var operateResult = await deltaTcpNet.ReadInt64Async(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的Float值
///
///
public async Task> ReadFloatAsync(string address)
{
var operateResult = await deltaTcpNet.ReadFloatAsync(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 读取指定地址的double值
///
///
public async Task> ReadDoubleAsync(string address)
{
var operateResult = await deltaTcpNet.ReadDoubleAsync(address);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入bool值
///
/// 写入地址
///
public async Task WriteAsync(string address, bool value)
{
var operateResult = await deltaTcpNet.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入byte值
///
/// 写入地址
///
public async Task WriteAsync(string address, byte value)
{
var operateResult = await deltaTcpNet.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入Int16值
///
/// 写入地址
///
public async Task WriteAsync(string address, Int16 value)
{
var operateResult = await deltaTcpNet.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入Int32值
///
/// 写入地址
///
public async Task WriteAsync(string address, Int32 value)
{
var operateResult = await deltaTcpNet.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入float值
///
/// 写入地址
///
public async Task WriteAsync(string address, float value)
{
var operateResult = await deltaTcpNet.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入double值
///
/// 写入地址
///
public async Task WriteAsync(string address, double value)
{
var operateResult = await deltaTcpNet.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
///
/// 写入long值
///
/// 写入地址
///
public async Task WriteAsync(string address, long value)
{
var operateResult = await deltaTcpNet.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
#endregion
///
/// 转换 result (将框架结果结构转换成当前程序结果结构)
///
///
///
private PLCResult ConvertResult(OperateResult result)
{
var retResult = ModelTools.PubClone.Trans(result);
return retResult;
}
///
/// 转换 result (将框架结果结构转换成当前程序结果结构)
///
///
///
private PLCResult ConvertResult(OperateResult result)
{
var retResult = ModelTools.PubClone, PLCResult>.Trans(result);
retResult.Content = result.Content;
return retResult;
}
}
}