Browse Source

update Omron Driver

pull/17/head
Gavin 9 years ago
parent
commit
df77a73169
  1. 52
      SCADA/Program/OmronPlcDriver/OmronUdpReader.cs
  2. BIN
      SCADA/dll/OmronPlcDriver.dll

52
SCADA/Program/OmronPlcDriver/OmronUdpReader.cs

@ -10,14 +10,17 @@ using System.Timers;
namespace OmronPlcDriver namespace OmronPlcDriver
{ {
[Description("Omron(CS/CJ) UDP协议")] [Description("Omron(CS/CJ) UDP协议")]
public sealed class OmronUdpReader : IPLCDriver, IMultiReadWrite public sealed class OmronCsCjUDPReader : IPLCDriver, IMultiReadWrite //IPLCDriver : IDriver, IReaderWriter IDriver : IDisposable
{ {
#region #region
/****************************************/ /****************************************/
//更新人:新增_pdu,可以根据实际情况进行采集 //更新人: zjf
//更新内容:新增_pdu,可以根据实际情况进行采集
//更新日期:20171205 //更新日期:20171205
//更新原因:根据现场进行参数调整以提供采集响应速度 //更新原因:根据现场进行参数调整以提高采集响应速度或者减小网络压力
/***************************************/ /***************************************/
/// <summary> /// <summary>
/// PDU的值 /// PDU的值
@ -75,7 +78,7 @@ namespace OmronPlcDriver
dv.Bit = byte.Parse(address.Substring(index + 1)); dv.Bit = byte.Parse(address.Substring(index + 1));
} }
else else
dv.Start = int.Parse(address.Substring(index + 1)); dv.Start = int.Parse(address.Substring(1));
} }
break; break;
case 'H'://HR区 case 'H'://HR区
@ -151,8 +154,10 @@ namespace OmronPlcDriver
if (!string.IsNullOrEmpty(value)) if (!string.IsNullOrEmpty(value))
{ {
int index = value.IndexOf(':'); int index = value.IndexOf(':');
_ip = value.Substring(0, index - 1);//ip地址 _ip = value.Substring(0, index);//ip地址
_port = int.Parse(value.Substring(index + 1));//端口号 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; } 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; _id = id;
_name = name; _name = name;
@ -216,8 +221,10 @@ namespace OmronPlcDriver
if (!string.IsNullOrEmpty(servername)) if (!string.IsNullOrEmpty(servername))
{ {
int index = servername.IndexOf(':'); int index = servername.IndexOf(':');
_ip = servername.Substring(0, index - 1);//ip地址 _ip = servername.Substring(0, index);//ip地址
_port = int.Parse(servername.Substring(index + 1));//端口号 int index0 = servername.IndexOf(',');
_port = int.Parse(servername.Substring(index + 1, index0 - index - 1));//端口号
_pdu = int.Parse(servername.Substring(index0 + 1));//pdu
} }
_timeout = timeOut; _timeout = timeOut;
byte.TryParse(spare1, out _plcNodeId); byte.TryParse(spare1, out _plcNodeId);
@ -237,11 +244,15 @@ namespace OmronPlcDriver
//IPAddress ip = IPAddress.Parse(_ip); //IPAddress ip = IPAddress.Parse(_ip);
// ---------------------------------------------------------------- // ----------------------------------------------------------------
// Connect synchronous client // 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.SendTimeout = _timeout;
udpSynCl.ReceiveTimeout = _timeout; udpSynCl.ReceiveTimeout = _timeout;
udpSynCl.NoDelay = true;
udpSynCl.Connect(_ip, _port); udpSynCl.Connect(_ip, _port);
//if (OnConnect != null)
//{
// OnConnect(this,new ConnectRequestEventArgs(Name + ServerName +"连接打开"));
//}
return true; return true;
} }
catch (SocketException error) catch (SocketException error)
@ -262,6 +273,8 @@ namespace OmronPlcDriver
/// <returns></returns> /// <returns></returns>
private byte[] CreateReadHeader(byte pcnode, int startAddress, ushort length, byte function, byte plcnode = 0) 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]; byte[] data = new byte[18];
data[0] = 0x80; data[0] = 0x80;
data[1] = 0; data[1] = 0;
@ -358,11 +371,15 @@ namespace OmronPlcDriver
} }
// ------------------------------------------------------------ // ------------------------------------------------------------
// Read response data // 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); Array.Copy(udpSynClBuffer, 14, data, 0, data.Length);
} }
else
{
return null;
}
return data; return data;
} }
catch (SocketException) catch (SocketException)
@ -412,7 +429,7 @@ namespace OmronPlcDriver
public IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0f, bool active = false) 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); _grps.Add(grp);
return grp; return grp;
} }
@ -656,7 +673,7 @@ namespace OmronPlcDriver
public int Limit public int Limit
{ {
get { return 60; } get { return 960; }
} }
public ItemData<Storage>[] ReadMultiple(DeviceAddress[] addrsArr) public ItemData<Storage>[] 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._id = id;
this._name = name; this._name = name;
@ -694,7 +711,6 @@ namespace OmronPlcDriver
byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据 byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据
if (rcvBytes == null || rcvBytes.Length == 0) if (rcvBytes == null || rcvBytes.Length == 0)
{ {
//_plcReader.Connect();
continue; continue;
} }
else else

BIN
SCADA/dll/OmronPlcDriver.dll

Binary file not shown.
Loading…
Cancel
Save