| | |
| | | using System.Text; |
| | | using System.Threading; |
| | | using System.Threading.Tasks; |
| | | using static Bro.Common.Helper.EnumHelper; |
| | | |
| | | namespace Bro.Device.OmronFins |
| | | { |
| | | public class OmronFinsDriver : PLCBase, IMonitor |
| | | public class OmronFinsDriver : PLCBase |
| | | { |
| | | #region PLCBase |
| | | public override void Read(PLCOperationConfigBase config) |
| | |
| | | InitialOpClient(); |
| | | } |
| | | |
| | | byte[] data = frame.GetSendReadFrameBytes(item, CurrentSid); |
| | | byte[] data = opFrame.GetSendReadFrameBytes(item, CurrentSid); |
| | | //var stream = opClient.GetStream(); |
| | | opStream.Write(data, 0, data.Length); |
| | | |
| | | byte[] buffer = new byte[2048]; |
| | |
| | | |
| | | if (readSize > 0) |
| | | { |
| | | List<int> list = frame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); |
| | | List<int> list = opFrame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); |
| | | item.ITEM_VALUE = string.Join(",", list); |
| | | } |
| | | } |
| | |
| | | Stopwatch sw = new Stopwatch(); |
| | | sw.Start(); |
| | | |
| | | //NetworkStream stream = null; |
| | | lock (opClientLock) |
| | | { |
| | | do |
| | |
| | | { |
| | | InitialOpClient(); |
| | | |
| | | byte[] data = frame.GetSendWriteFrameBytes(item, CurrentSid); |
| | | byte[] data = opFrame.GetSendWriteFrameBytes(item, CurrentSid); |
| | | //stream = opClient.GetStream(); |
| | | opStream.Write(data, 0, data.Length); |
| | | |
| | | sw.Stop(); |
| | | if (sw.ElapsedMilliseconds > 10) |
| | | { |
| | | LogAsync(DateTime.Now, $"发送完成,耗时:{sw.ElapsedMilliseconds}"); |
| | | LogAsync(DateTime.Now, $"发送完成", $"发送耗时:{sw.ElapsedMilliseconds}"); |
| | | } |
| | | repeatTime = 0; |
| | | |
| | |
| | | } |
| | | else |
| | | { |
| | | LogAsync(DateTime.Now, "Send Exception:" + ex.GetExceptionMessage()); |
| | | LogAsync(DateTime.Now, "Send Exception", ex.GetExceptionMessage()); |
| | | } |
| | | } |
| | | } while (repeatTime > 0); |
| | |
| | | int bufferCount = opStream.Read(buffer, 0, buffer.Length); |
| | | if (bufferCount > 0) |
| | | { |
| | | frame.AnalyseReceivedItems(buffer.Take(bufferCount).ToArray(), item); |
| | | opFrame.AnalyseReceivedItems(buffer.Take(bufferCount).ToArray(), item); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogAsync(DateTime.Now, "写入反馈异常\r\n" + ex.GetExceptionMessage()); |
| | | LogAsync(DateTime.Now, "写入反馈异常", ex.GetExceptionMessage()); |
| | | } |
| | | } |
| | | else |
| | |
| | | int bufferCount = opStream.Read(buffer, 0, buffer.Length); |
| | | if (bufferCount > 0) |
| | | { |
| | | frame.AnalyseReceivedItems(buffer.Take(bufferCount).ToArray(), item); |
| | | opFrame.AnalyseReceivedItems(buffer.Take(bufferCount).ToArray(), item); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogAsync(DateTime.Now, "写入反馈异常\r\n" + ex.GetExceptionMessage()); |
| | | LogAsync(DateTime.Now, "写入反馈异常", ex.GetExceptionMessage()); |
| | | } |
| | | }); |
| | | } |
| | |
| | | |
| | | item.ADDRESS = "D" + address.ToString(); |
| | | item.ITEM_LENGTH = 1; |
| | | item.ITEM_VALUE_TYPE = 1; |
| | | item.ITEM_VALUE = writeValue.ToString(); |
| | | |
| | | //lock (opClient) |
| | |
| | | { |
| | | plcEP = new IPEndPoint(IPAddress.Parse(IConfig.PLCIpAddress), IConfig.PLCPort); |
| | | |
| | | frame = new FinsFrame(IConfig.DNA, IConfig.DA1, IConfig.DA2, IConfig.SNA, IConfig.SA1, IConfig.SA2, false); |
| | | scanFrame = new FinsFrame(IConfig.DNA, 0, IConfig.DA2, IConfig.SNA, 0, IConfig.SA2, false); |
| | | opFrame = new FinsFrame(IConfig.DNA, 0, IConfig.DA2, IConfig.SNA, 0, IConfig.SA2, false); |
| | | |
| | | oldValues = new List<int>(); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | FinsFrame frame = null; |
| | | FinsFrame scanFrame = null; |
| | | FinsFrame opFrame = null; |
| | | |
| | | static object opClientLock = new object(); |
| | | |
| | | TcpClient scanClient = new TcpClient(); |
| | | TcpClient opClient = new TcpClient(); |
| | | |
| | | NetworkStream scanStream = null; |
| | | TcpClient opClient = new TcpClient(); |
| | | NetworkStream opStream = null; |
| | | |
| | | IPEndPoint plcEP; |
| | |
| | | // } |
| | | //} |
| | | |
| | | byte serverNode = 0; |
| | | byte scanNode = 0; |
| | | byte opNode = 0; |
| | | |
| | | private void InitialScanClient() |
| | | { |
| | | if (scanClient == null || !scanClient.Connected) |
| | |
| | | scanClient.Client.Blocking = true; |
| | | scanClient.SendBufferSize = 0; |
| | | scanClient.ReceiveBufferSize = 0; |
| | | scanClient.ReceiveTimeout = scanClient.SendTimeout = 5000; |
| | | scanClient.Connect(plcEP); |
| | | |
| | | byte[] dataRequest = frame.GetTcpRequestFrame(1); |
| | | scanFrame = new FinsFrame(IConfig.DNA, serverNode, IConfig.DA2, IConfig.SNA, scanNode, IConfig.SA2, false); |
| | | |
| | | byte[] dataRequest = scanFrame.GetTcpRequestFrame(0); |
| | | scanStream = scanClient.GetStream(); |
| | | scanStream.Write(dataRequest, 0, dataRequest.Length); |
| | | byte[] dataRead = new byte[2048]; |
| | | scanStream.Read(dataRead, 0, dataRead.Length); |
| | | int readSize = scanStream.Read(dataRead, 0, dataRead.Length); |
| | | |
| | | if (readSize <= 0) |
| | | { |
| | | throw new ProcessException("PLC通信握手信号返回不可为空"); |
| | | } |
| | | |
| | | if (dataRead[15] != 0) |
| | | { |
| | | throw new ProcessException($"PLC通信握手信号返回异常:{dataRead[15]}"); |
| | | } |
| | | |
| | | serverNode = dataRead[23]; |
| | | scanNode = dataRead[19]; |
| | | |
| | | scanFrame = new FinsFrame(IConfig.DNA, serverNode, IConfig.DA2, IConfig.SNA, scanNode, IConfig.SA2, false); |
| | | } |
| | | } |
| | | |
| | |
| | | opClient.Client.Blocking = true; |
| | | opClient.Connect(plcEP); |
| | | |
| | | byte[] dataRequest = frame.GetTcpRequestFrame(2); |
| | | opFrame = new FinsFrame(IConfig.DNA, serverNode, IConfig.DA2, IConfig.SNA, opNode, IConfig.SA2, false); |
| | | byte[] dataRequest = opFrame.GetTcpRequestFrame(0); |
| | | opStream = opClient.GetStream(); |
| | | opStream.Write(dataRequest, 0, dataRequest.Length); |
| | | byte[] dataRead = new byte[2048]; |
| | | opStream.Read(dataRead, 0, dataRead.Length); |
| | | int readSize = opStream.Read(dataRead, 0, dataRead.Length); |
| | | |
| | | if (readSize <= 0) |
| | | { |
| | | throw new ProcessException("PLC通信握手信号返回不可为空"); |
| | | } |
| | | |
| | | if (dataRead[15] != 0) |
| | | { |
| | | throw new ProcessException($"PLC通信握手信号返回异常:{dataRead[15]}"); |
| | | } |
| | | |
| | | serverNode = dataRead[23]; |
| | | opNode = dataRead[19]; |
| | | opFrame = new FinsFrame(IConfig.DNA, serverNode, IConfig.DA2, IConfig.SNA, opNode, IConfig.SA2, false); |
| | | } |
| | | } |
| | | |
| | |
| | | PLC_ITEM item = new PLC_ITEM(); |
| | | item.ADDRESS = "D" + startAddress; |
| | | item.OP_TYPE = 1; |
| | | item.ITEM_VALUE_TYPE = 1; |
| | | item.ITEM_LENGTH = length; |
| | | |
| | | var data = frame.GetSendReadFrameBytes(item, CurrentSid); |
| | | var data = opFrame.GetSendReadFrameBytes(item, CurrentSid); |
| | | opStream.Write(data, 0, data.Length); |
| | | opStream.Flush(); |
| | | |
| | | byte[] buffer = new byte[2048]; |
| | | int readSize = opStream.Read(buffer, 0, buffer.Length); |
| | | |
| | | if (readSize > 0) |
| | | { |
| | | List<int> values = frame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); |
| | | List<int> values = opFrame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); |
| | | return values; |
| | | } |
| | | else |
| | |
| | | PLC_ITEM item = new PLC_ITEM(); |
| | | item.ADDRESS = "D" + startAddress; |
| | | item.OP_TYPE = 1; |
| | | item.ITEM_VALUE_TYPE = 1; |
| | | item.ITEM_LENGTH = length; |
| | | |
| | | if (scanBuffer == null) |
| | | { |
| | | scanBuffer = frame.GetSendReadFrameBytes(item, CurrentSid); |
| | | scanBuffer = scanFrame.GetSendReadFrameBytes(item, CurrentSid); |
| | | } |
| | | |
| | | //var stream = scanClient.GetStream(); |
| | | scanStream.Write(scanBuffer, 0, scanBuffer.Length); |
| | | |
| | | byte[] buffer = new byte[2048]; |
| | |
| | | |
| | | if (readSize > 0) |
| | | { |
| | | List<int> values = frame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); |
| | | List<int> values = scanFrame.AnalyseReceivedItems(buffer.Take(readSize).ToArray(), item); |
| | | return values; |
| | | } |
| | | else |
| | |
| | | return new List<int>(); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region Log |
| | | object logLock = new object(); |
| | | private async void LogAsync(DateTime dt, string info) |
| | | protected override void OnMethodInvoked(IAsyncResult ar) |
| | | { |
| | | await Task.Run(() => |
| | | MonitorSet monitorSet = ar.AsyncState as MonitorSet; |
| | | |
| | | ProcessResponse resValues = monitorSet.Response; |
| | | |
| | | if (resValues.ResultValue == (int)PLCReplyValue.IGNORE) |
| | | { |
| | | if (IConfig.IsEnabelLog) |
| | | return; |
| | | } |
| | | |
| | | if (monitorSet.ReplyDataAddress != -1 && resValues.DataList.Count > 0) |
| | | { |
| | | PLC_ITEM item = new PLC_ITEM(); |
| | | item.OP_TYPE = 2; |
| | | item.ITEM_LENGTH = resValues.DataList.Count; |
| | | item.ADDRESS = "D" + monitorSet.ReplyDataAddress.ToString(); |
| | | item.ITEM_VALUE = String.Join(",", resValues.DataList); |
| | | item.ITEM_VALUE_TYPE = (int)PLCItemType.Integer; |
| | | WriteItem(item, false); |
| | | } |
| | | |
| | | if (monitorSet.NoticeAddress != -1) |
| | | { |
| | | int repeatTime = 5; |
| | | |
| | | do |
| | | { |
| | | lock (logLock) |
| | | try |
| | | { |
| | | DirectoryInfo dir = new DirectoryInfo(IConfig.LogPath); |
| | | if (!dir.Exists) |
| | | this.WriteSingleAddress(monitorSet.NoticeAddress, resValues.ResultValue, false); |
| | | repeatTime = 0; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | repeatTime--; |
| | | |
| | | if (repeatTime <= 0) |
| | | { |
| | | dir.Create(); |
| | | } |
| | | |
| | | string filePath = Path.Combine(IConfig.LogPath, "PLC_" + DateTime.Now.ToString("yyyyMMdd") + ".txt"); |
| | | |
| | | using (StreamWriter writer = new StreamWriter(filePath, true)) |
| | | { |
| | | writer.WriteLine(dt.ToString("HH:mm:ss.fff")); |
| | | writer.WriteLine(info); |
| | | writer.WriteLine(); |
| | | |
| | | writer.Flush(); |
| | | writer.Close(); |
| | | new ProcessException("PLC反馈写入异常", ExceptionLevel.Info, ex); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | } while (repeatTime > 0); |
| | | } |
| | | } |
| | | |
| | | //private async void LogAsync(DateTime dt, IModbusFrame frame) |
| | | //{ |
| | | // await Task.Run(() => |
| | | // { |
| | | // if (IConfig.IsEnabelLog) |
| | | // { |
| | | // lock (logLock) |
| | | // { |
| | | // DirectoryInfo dir = new DirectoryInfo(IConfig.LogPath); |
| | | // if (!dir.Exists) |
| | | // { |
| | | // dir.Create(); |
| | | // } |
| | | |
| | | // string filePath = Path.Combine(IConfig.LogPath, "PLC_" + DateTime.Now.ToString("yyyyMMdd") + ".txt"); |
| | | |
| | | // using (StreamWriter writer = new StreamWriter(filePath, true)) |
| | | // { |
| | | // writer.WriteLine(dt.ToString("HH:mm:ss.fff")); |
| | | // writer.WriteLine(frame.GetFrameString()); |
| | | // writer.WriteLine(); |
| | | |
| | | // writer.Flush(); |
| | | // writer.Close(); |
| | | // } |
| | | // } |
| | | // } |
| | | // }); |
| | | //} |
| | | #endregion |
| | | } |
| | | } |