From df77a731694cec83b53dbff9c1138ee85b83f23c Mon Sep 17 00:00:00 2001 From: Gavin Date: Sat, 9 Dec 2017 10:17:08 +0800 Subject: [PATCH] update Omron Driver --- .../Program/OmronPlcDriver/OmronUdpReader.cs | 52 ++++++++++++------ SCADA/dll/OmronPlcDriver.dll | Bin 17408 -> 17920 bytes 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs b/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs index 7778e61..7d9a507 100644 --- a/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs +++ b/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs @@ -10,14 +10,17 @@ using System.Timers; namespace OmronPlcDriver { [Description("Omron(CS/CJ) UDP协议")] - public sealed class OmronUdpReader : IPLCDriver, IMultiReadWrite + public sealed class OmronCsCjUDPReader : IPLCDriver, IMultiReadWrite //IPLCDriver : IDriver, IReaderWriter IDriver : IDisposable { + + #region /****************************************/ - //更新人:新增_pdu,可以根据实际情况进行采集 + //更新人: zjf + //更新内容:新增_pdu,可以根据实际情况进行采集 //更新日期:20171205 - //更新原因:根据现场进行参数调整以提供采集响应速度 + //更新原因:根据现场进行参数调整以提高采集响应速度或者减小网络压力 /***************************************/ /// /// PDU的值 @@ -75,7 +78,7 @@ namespace OmronPlcDriver dv.Bit = byte.Parse(address.Substring(index + 1)); } else - dv.Start = int.Parse(address.Substring(index + 1)); + dv.Start = int.Parse(address.Substring(1)); } break; case 'H'://HR区 @@ -151,8 +154,10 @@ namespace OmronPlcDriver if (!string.IsNullOrEmpty(value)) { int index = value.IndexOf(':'); - _ip = value.Substring(0, index - 1);//ip地址 - _port = int.Parse(value.Substring(index + 1));//端口号 + _ip = value.Substring(0, index);//ip地址 + int index0 = value.Substring(index + 1).IndexOf(','); + _port = int.Parse(value.Substring(index + 1, index0 - index - 1));//端口号 + _pdu = int.Parse(value.Substring(index0 + 1));//pdu } } } @@ -208,7 +213,7 @@ namespace OmronPlcDriver get { return _server; } } - public OmronUdpReader(IDataServer server, short id, string name, string servername, int timeOut = 500, string spare1 = null, string spare2 = null) + public OmronCsCjUDPReader(IDataServer server, short id, string name, string servername, int timeOut = 500, string spare1 = null, string spare2 = null) { _id = id; _name = name; @@ -216,8 +221,10 @@ namespace OmronPlcDriver if (!string.IsNullOrEmpty(servername)) { int index = servername.IndexOf(':'); - _ip = servername.Substring(0, index - 1);//ip地址 - _port = int.Parse(servername.Substring(index + 1));//端口号 + _ip = servername.Substring(0, index);//ip地址 + int index0 = servername.IndexOf(','); + _port = int.Parse(servername.Substring(index + 1, index0 - index - 1));//端口号 + _pdu = int.Parse(servername.Substring(index0 + 1));//pdu } _timeout = timeOut; byte.TryParse(spare1, out _plcNodeId); @@ -237,11 +244,15 @@ namespace OmronPlcDriver //IPAddress ip = IPAddress.Parse(_ip); // ---------------------------------------------------------------- // Connect synchronous client - udpSynCl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp); + udpSynCl = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); udpSynCl.SendTimeout = _timeout; udpSynCl.ReceiveTimeout = _timeout; - udpSynCl.NoDelay = true; udpSynCl.Connect(_ip, _port); + + //if (OnConnect != null) + //{ + // OnConnect(this,new ConnectRequestEventArgs(Name + ServerName +"连接打开")); + //} return true; } catch (SocketException error) @@ -262,6 +273,8 @@ namespace OmronPlcDriver /// private byte[] CreateReadHeader(byte pcnode, int startAddress, ushort length, byte function, byte plcnode = 0) { + //80 00 00 14 00 00 00 FD 00 00 01 01 00 00 00 00 00 01 + //80 00 02 00 41 00 00 0B 00 00 01 01 82 00 64 00 00 14 byte[] data = new byte[18]; data[0] = 0x80; data[1] = 0; @@ -358,11 +371,15 @@ namespace OmronPlcDriver } // ------------------------------------------------------------ // Read response data - else + else if (function == 0x1) { - data = new byte[(write_data[16] * 256 + write_data[17]) * 2]; + data = new byte[(write_data[16] * 256 + write_data[17])]; Array.Copy(udpSynClBuffer, 14, data, 0, data.Length); } + else + { + return null; + } return data; } catch (SocketException) @@ -412,7 +429,7 @@ namespace OmronPlcDriver public IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0f, bool active = false) { - OmronUdpGroup grp = new OmronUdpGroup(id, name, updateRate, active, this); + OmronCsCjUDPGroup grp = new OmronCsCjUDPGroup(id, name, updateRate, active, this); _grps.Add(grp); return grp; } @@ -656,7 +673,7 @@ namespace OmronPlcDriver public int Limit { - get { return 60; } + get { return 960; } } public ItemData[] ReadMultiple(DeviceAddress[] addrsArr) @@ -670,9 +687,9 @@ namespace OmronPlcDriver } } - public sealed class OmronUdpGroup : PLCGroup + public sealed class OmronCsCjUDPGroup : PLCGroup { - public OmronUdpGroup(short id, string name, int updateRate, bool active, IPLCDriver plcReader) + public OmronCsCjUDPGroup(short id, string name, int updateRate, bool active, IPLCDriver plcReader) { this._id = id; this._name = name; @@ -694,7 +711,6 @@ namespace OmronPlcDriver byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据 if (rcvBytes == null || rcvBytes.Length == 0) { - //_plcReader.Connect(); continue; } else diff --git a/SCADA/dll/OmronPlcDriver.dll b/SCADA/dll/OmronPlcDriver.dll index c3ccb6e7b1913b1d79280401c3f6826cbff92e25..8de55984237fb7e7a9ab00773abd7027656c88ed 100644 GIT binary patch delta 4801 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 AV*mgE delta 4685 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 CM|zw9