diff --git a/SCADA/Program/DataService/CacheReader.cs b/SCADA/Program/DataService/CacheReader.cs index 45819d9..ac64220 100644 --- a/SCADA/Program/DataService/CacheReader.cs +++ b/SCADA/Program/DataService/CacheReader.cs @@ -503,7 +503,7 @@ namespace DataService public unsafe ItemData ReadBit(DeviceAddress address) { - return new ItemData((_cache[address.CacheIndex] & (1 << address.Bit)) != 0, 0, QUALITIES.QUALITY_GOOD); + return new ItemData((_cache[address.CacheIndex] & (1 << address.Bit.BitSwap())) != 0, 0, QUALITIES.QUALITY_GOOD); } public ItemData ReadInt16(DeviceAddress address) diff --git a/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs b/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs index febbb3e..c540f75 100644 --- a/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs +++ b/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs @@ -597,7 +597,7 @@ namespace ModbusDriver { while (addr.Start == next.Start) { - if ((tmp & (1 << next.Bit)) > 0) _changedList.Add(index); + if ((tmp & (1 << next.Bit.BitSwap())) > 0) _changedList.Add(index); if (++index < count) next = _items[index].Address; else diff --git a/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs b/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs index 7d9a507..e8a5e15 100644 --- a/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs +++ b/SCADA/Program/OmronPlcDriver/OmronUdpReader.cs @@ -23,7 +23,7 @@ namespace OmronPlcDriver //更新原因:根据现场进行参数调整以提高采集响应速度或者减小网络压力 /***************************************/ /// - /// PDU的值 + /// PDU的值,包大小上限 /// int _pdu; /// @@ -120,6 +120,7 @@ namespace OmronPlcDriver private int _timeout;//超时数据 private Socket udpSynCl; + //接受字符串 private byte[] udpSynClBuffer = new byte[1024]; short _id;//驱动id @@ -215,6 +216,7 @@ namespace OmronPlcDriver public OmronCsCjUDPReader(IDataServer server, short id, string name, string servername, int timeOut = 500, string spare1 = null, string spare2 = null) { + _id = id; _name = name; _server = server; @@ -229,6 +231,7 @@ namespace OmronPlcDriver _timeout = timeOut; byte.TryParse(spare1, out _plcNodeId); byte.TryParse(spare2, out _pcNodeId); + Console.WriteLine("id->" + _id.ToString() + " name->" + _name + " _server->" + _server + " _ip->" + _ip + " _port->" + _port + " _pdu->" + _pdu + " _timeout->" + _timeout + " plcNodeId->" + _plcNodeId + " pcNodeId->" + PcNodeId); } /// @@ -239,6 +242,8 @@ namespace OmronPlcDriver { try { + Console.WriteLine("开始连接"); + if (udpSynCl != null) udpSynCl.Close(); //IPAddress ip = IPAddress.Parse(_ip); @@ -267,7 +272,7 @@ namespace OmronPlcDriver /// /// 电脑节点号,设置和PLC节点不一致即可 /// 读取的起始地址 - /// 读取长度 + /// 读取长度,2个字节为一个单位 /// /// PLC节点号,可为0 /// @@ -373,7 +378,7 @@ namespace OmronPlcDriver // Read response data else if (function == 0x1) { - data = new byte[(write_data[16] * 256 + write_data[17])]; + data = new byte[(write_data[16] * 256 + write_data[17]) * 2]; Array.Copy(udpSynClBuffer, 14, data, 0, data.Length); } else @@ -492,18 +497,20 @@ namespace OmronPlcDriver internal void CallException(int id, byte function, byte exception) { if (udpSynCl == null) return; + Console.WriteLine("OmronReader错误->" + GetErrorString(exception)); if (exception == OmronCSCJ.excExceptionConnectionLost && IsClosed == false) { if (OnClose != null) OnClose(this, new ShutdownRequestEventArgs(GetErrorString(exception))); } + } /// /// 读取字节数组 /// /// 标签变量地址结构 - /// 长度 + /// 长度, /// public byte[] ReadBytes(DeviceAddress address, ushort size) { @@ -512,7 +519,7 @@ namespace OmronPlcDriver { len++; } - return WriteSyncData(CreateReadHeader(PcNodeId, address.Start, (ushort)(len / 2), (byte)address.DBNumber, (byte)address.Area)); + return WriteSyncData(CreateReadHeader(PcNodeId, address.Start, (ushort)(len), (byte)address.DBNumber, (byte)address.Area)); } /// /// 读取32位整数 @@ -704,18 +711,22 @@ namespace OmronPlcDriver protected override unsafe void Poll() { + //Console.WriteLine("开始遍历》》"); short[] cache = (short[])_cacheReader.Cache; int offset = 0; foreach (PDUArea area in _rangeList) { + //Console.WriteLine(">>读取:" + area.Start.DBNumber.ToString() + "@" + DateTime.Now.ToString()); byte[] rcvBytes = _plcReader.ReadBytes(area.Start, (ushort)area.Len);//从PLC读取数据 if (rcvBytes == null || rcvBytes.Length == 0) { + //Console.WriteLine(">>结果:" + area.Start.DBNumber.ToString() + "->失败"); continue; } else { - int len = rcvBytes.Length / 2; + //Console.WriteLine(">>结果:" + area.Start.DBNumber.ToString() + "->" + BitConverter.ToString(rcvBytes) + " at" + DateTime.Now.ToString()); + int len = area.Len;// rcvBytes.Length / 2; fixed (byte* p1 = rcvBytes) { short* prcv = (short*)p1; @@ -734,7 +745,8 @@ namespace OmronPlcDriver { while (addr.Start == next.Start) { - if ((tmp & (1 << next.Bit)) > 0) _changedList.Add(index); + if ((tmp & 1 << next.Bit.BitSwap()) > 0) + _changedList.Add(index); if (++index < count) next = _items[index].Address; else @@ -753,6 +765,7 @@ namespace OmronPlcDriver { if (addr.DataSize <= 2) { + if (prcv[iShort1] != cache[iShort]) _changedList.Add(index); } else diff --git a/SCADA/dll/DataService.dll b/SCADA/dll/DataService.dll index 9c34813..d916294 100644 Binary files a/SCADA/dll/DataService.dll and b/SCADA/dll/DataService.dll differ diff --git a/SCADA/dll/ModbusDriver.dll b/SCADA/dll/ModbusDriver.dll index bd926e1..a2c1311 100644 Binary files a/SCADA/dll/ModbusDriver.dll and b/SCADA/dll/ModbusDriver.dll differ diff --git a/SCADA/dll/OmronPlcDriver.dll b/SCADA/dll/OmronPlcDriver.dll index 8de5598..40ee386 100644 Binary files a/SCADA/dll/OmronPlcDriver.dll and b/SCADA/dll/OmronPlcDriver.dll differ