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; namespace PLCCommunication.Impl { /// /// PLC通信服务 SiemensS7 smart200 实现 /// internal class SiemensCommunicationService : IPLCCommunicationService { private SiemensS7Net siemensS7Net = null; /// /// 是否已连接 /// public bool isConnected { get; private set; } public SiemensCommunicationService() { siemensS7Net = new SiemensS7Net(SiemensPLCS.S200Smart); siemensS7Net.ConnectTimeOut = 3000; } #region 同步 /// /// 连接PLC(长连接) /// /// /// public PLCResult Connection(string address, int port = 0) { siemensS7Net.IpAddress = address; if (port > 0) { siemensS7Net.Port = port; } var operateResult = siemensS7Net.ConnectServer(); var result = ConvertResult(operateResult); if (result.IsSuccess) { isConnected = true; } return result; } /// /// 关闭连接PLC(长连接) /// public PLCResult ColseConnection() { var operateResult = siemensS7Net.ConnectClose(); var result = ConvertResult(operateResult); if (result.IsSuccess) { isConnected = false; } return result; } /// /// 读取指定地址的byte[]值 /// /// /// public PLCResult ReadBytes(string address, ushort length) { var operateResult = siemensS7Net.Read(address, length); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的bool值 /// /// /// public PLCResult ReadBool(string address) { var operateResult = siemensS7Net.ReadBool(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的byte值 /// /// /// public PLCResult ReadByte(string address) { var operateResult = siemensS7Net.ReadByte(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的Int16值 /// /// /// public PLCResult ReadInt16(string address) { var operateResult = siemensS7Net.ReadInt16(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的Int32值 /// /// /// public PLCResult ReadInt32(string address) { var operateResult = siemensS7Net.ReadInt32(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的long值 /// /// /// public PLCResult ReadLong(string address) { var operateResult = siemensS7Net.ReadInt64(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的Float值 /// /// public PLCResult ReadFloat(string address) { var operateResult = siemensS7Net.ReadFloat(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的double值 /// /// public PLCResult ReadDouble(string address) { var operateResult = siemensS7Net.ReadDouble(address); var result = ConvertResult(operateResult); return result; } /// /// 写入bool值 /// /// 写入地址 /// public PLCResult Write(string address, bool value) { var operateResult = siemensS7Net.Write(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入byte值 /// /// 写入地址 /// public PLCResult Write(string address, byte value) { var operateResult = siemensS7Net.Write(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入Int16值 /// /// 写入地址 /// public PLCResult Write(string address, Int16 value) { var operateResult = siemensS7Net.Write(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入Int32值 /// /// 写入地址 /// public PLCResult Write(string address, Int32 value) { var operateResult = siemensS7Net.Write(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入float值 /// /// 写入地址 /// public PLCResult Write(string address, float value) { var operateResult = siemensS7Net.Write(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入double值 /// /// 写入地址 /// public PLCResult Write(string address, double value) { var operateResult = siemensS7Net.Write(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入long值 /// /// 写入地址 /// public PLCResult Write(string address, long value) { var operateResult = siemensS7Net.Write(address, value); var result = ConvertResult(operateResult); return result; } #endregion #region 异步 /// /// 连接PLC(长连接) /// /// /// public async Task ConnectionAsync(string address, int port = 0) { siemensS7Net.IpAddress = address; if (port > 0) { siemensS7Net.Port = port; } var operateResult = await siemensS7Net.ConnectServerAsync(); var result = ConvertResult(operateResult); if (operateResult.IsSuccess) { isConnected = true; } return result; } /// /// 关闭连接PLC(长连接) /// public async Task ColseConnectionAsyn() { var operateResult = await siemensS7Net.ConnectCloseAsync(); var result = ConvertResult(operateResult); if (operateResult.IsSuccess) { isConnected = false; } return result; } /// /// 读取指定地址的byte[]值 /// /// /// public async Task> ReadBytesAsync(string address, ushort length) { var operateResult = await siemensS7Net.ReadAsync(address, length); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的bool值 /// /// /// public async Task> ReadBoolAsync(string address) { var operateResult = await siemensS7Net.ReadBoolAsync(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的byte值 /// /// /// public async Task> ReadByteAsync(string address) { var operateResult = await siemensS7Net.ReadByteAsync(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的Int16值 /// /// /// public async Task> ReadInt16Async(string address) { var operateResult = await siemensS7Net.ReadInt16Async(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的Int32值 /// /// /// public async Task> ReadInt32Async(string address) { var operateResult = await siemensS7Net.ReadInt32Async(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的long值 /// /// /// public async Task> ReadLongAsync(string address) { var operateResult = await siemensS7Net.ReadInt64Async(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的Float值 /// /// public async Task> ReadFloatAsync(string address) { var operateResult = await siemensS7Net.ReadFloatAsync(address); var result = ConvertResult(operateResult); return result; } /// /// 读取指定地址的double值 /// /// public async Task> ReadDoubleAsync(string address) { var operateResult = await siemensS7Net.ReadDoubleAsync(address); var result = ConvertResult(operateResult); return result; } /// /// 写入bool值 /// /// 写入地址 /// public async Task WriteAsync(string address, bool value) { var operateResult = await siemensS7Net.WriteAsync(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入byte值 /// /// 写入地址 /// public async Task WriteAsync(string address, byte value) { var operateResult = await siemensS7Net.WriteAsync(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入Int16值 /// /// 写入地址 /// public async Task WriteAsync(string address, Int16 value) { var operateResult = await siemensS7Net.WriteAsync(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入Int32值 /// /// 写入地址 /// public async Task WriteAsync(string address, Int32 value) { var operateResult = await siemensS7Net.WriteAsync(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入float值 /// /// 写入地址 /// public async Task WriteAsync(string address, float value) { var operateResult = await siemensS7Net.WriteAsync(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入double值 /// /// 写入地址 /// public async Task WriteAsync(string address, double value) { var operateResult = await siemensS7Net.WriteAsync(address, value); var result = ConvertResult(operateResult); return result; } /// /// 写入long值 /// /// 写入地址 /// public async Task WriteAsync(string address, long value) { var operateResult = await siemensS7Net.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; } } }