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