diff --git a/Run/Driver/Cdy.Spider.ModbusDriver/ModbusIpDriver.cs b/Run/Driver/Cdy.Spider.ModbusDriver/ModbusIpDriver.cs index 8d2ca3ae..b57982e6 100644 --- a/Run/Driver/Cdy.Spider.ModbusDriver/ModbusIpDriver.cs +++ b/Run/Driver/Cdy.Spider.ModbusDriver/ModbusIpDriver.cs @@ -81,25 +81,32 @@ public override void Init() int clen=-1,cstart=-1, ilen=-1,istart=-1, irlen=-1,irstart=-1, hrlen=-1,hrstart=-1; - foreach(var vv in mCachTags) + foreach (var vv in mCachTags.OrderBy((val) => { + var ss = val.Key.Split(new char[] { ':' }); + int addr = 0; + if (ss.Length > 0 && int.TryParse(ss[1], out addr)) + return addr; + else return 0; + })) { var dtmp = vv.Key.ToLower().Split(new char[] { ':' }); ushort addr = ushort.Parse(dtmp[1]); - if (dtmp[0] ==("cs")) + if (dtmp[0] == ("cs")) { //Coil status - if(cstart == -1) + if (cstart == -1) { cstart = addr; clen = 1; } else { - if((addr - cstart + 1)>mData.PackageLen) + if ((addr - cstart + 1) > mData.PackageLen || addr < hrstart) { mCoilStatusPackage.Add((ushort)cstart, (ushort)clen); - cstart = -1; + cstart = addr; + clen = 1; } else { @@ -108,7 +115,7 @@ public override void Init() } if (!mCoilStatusTags.ContainsKey(addr)) { - mCoilStatusTags.Add(addr,vv.Value); + mCoilStatusTags.Add(addr, vv.Value); } } else if (dtmp[0] == ("is")) @@ -121,10 +128,11 @@ public override void Init() } else { - if ((addr - istart + 1) > mData.PackageLen) + if ((addr - istart + 1) > mData.PackageLen || addr < hrstart) { mInputStatusPackage.Add((ushort)istart, (ushort)ilen); - istart = -1; + istart = addr; + ilen = 1; } else { @@ -135,7 +143,7 @@ public override void Init() mInputStatusTags.Add(addr, vv.Value); } - else if(dtmp[0] == ("ir")) + else if (dtmp[0] == ("ir")) { ushort len = ushort.Parse(dtmp[2]); //Input registor @@ -147,21 +155,22 @@ public override void Init() } else { - if ((addr - irstart + len) > mData.PackageLen) + if ((addr - irstart + len) > mData.PackageLen || addr < hrstart) { mInputRegistorPackage.Add((ushort)irstart, (ushort)irlen); - irstart = -1; + irstart = addr; + irlen = len; } else { irlen = addr - irstart + len; } } - if(!mInputRegistorTags.ContainsKey(addr)) - mInputRegistorTags.Add(addr,new Tuple>(len,vv.Value)); + if (!mInputRegistorTags.ContainsKey(addr)) + mInputRegistorTags.Add(addr, new Tuple>(len, vv.Value)); } - else if(dtmp[0] == ("hr")) + else if (dtmp[0] == ("hr")) { //holding registor ushort len = ushort.Parse(dtmp[2]); @@ -173,22 +182,23 @@ public override void Init() } else { - if ((addr - hrstart + len) > mData.PackageLen) + if ((addr - hrstart + len) > mData.PackageLen || addr < hrstart) { mHoldtRegistorPackage.Add((ushort)hrstart, (ushort)hrlen); - hrstart = -1; + hrstart = addr; + hrlen = len; } else { hrlen = addr - hrstart + len; } } - if(!mHoldRegistorTags.ContainsKey(addr)) - mHoldRegistorTags.Add(addr, new Tuple>(len, vv.Value)); + if (!mHoldRegistorTags.ContainsKey(addr)) + mHoldRegistorTags.Add(addr, new Tuple>(len, vv.Value)); } } - if(cstart!=-1) + if (cstart != -1) { mCoilStatusPackage.Add((ushort)cstart, (ushort)clen); } @@ -208,6 +218,7 @@ public override void Init() mHoldtRegistorPackage.Add((ushort)hrstart, (ushort)hrlen); } + mComm.EnableTransparentRead(true); mMaster = Modbus.Device.ModbusIpMaster.CreateIp(mComm); } diff --git a/Run/Driver/Cdy.Spider.ModbusDriver/ModbusSeriseDriver.cs b/Run/Driver/Cdy.Spider.ModbusDriver/ModbusSeriseDriver.cs index 1d56010b..36d3445f 100644 --- a/Run/Driver/Cdy.Spider.ModbusDriver/ModbusSeriseDriver.cs +++ b/Run/Driver/Cdy.Spider.ModbusDriver/ModbusSeriseDriver.cs @@ -79,7 +79,13 @@ public override void Init() int clen = -1, cstart = -1, ilen = -1, istart = -1, irlen = -1, irstart = -1, hrlen = -1, hrstart = -1; - foreach (var vv in mCachTags) + foreach (var vv in mCachTags.OrderBy((val) => { + var ss = val.Key.Split(new char[] { ':' }); + int addr = 0; + if (ss.Length > 0 && int.TryParse(ss[1], out addr)) + return addr; + else return 0; + })) { var dtmp = vv.Key.ToLower().Split(new char[] { ':' }); ushort addr = ushort.Parse(dtmp[1]); @@ -94,10 +100,11 @@ public override void Init() } else { - if ((addr - cstart + 1) > mData.PackageLen) + if ((addr - cstart + 1) > mData.PackageLen || addr < hrstart) { mCoilStatusPackage.Add((ushort)cstart, (ushort)clen); - cstart = -1; + cstart = addr; + clen = 1; } else { @@ -119,10 +126,11 @@ public override void Init() } else { - if ((addr - istart + 1) > mData.PackageLen) + if ((addr - istart + 1) > mData.PackageLen || addr < hrstart) { mInputStatusPackage.Add((ushort)istart, (ushort)ilen); - istart = -1; + istart = addr; + ilen = 1; } else { @@ -145,17 +153,19 @@ public override void Init() } else { - if ((addr - irstart + len) > mData.PackageLen) + if ((addr - irstart + len) > mData.PackageLen || addr < hrstart) { mInputRegistorPackage.Add((ushort)irstart, (ushort)irlen); - irstart = -1; + irstart = addr; + irlen = len; } else { irlen = addr - irstart + len; } } - mInputRegistorTags.Add(addr, new Tuple>(len, vv.Value)); + if (!mInputRegistorTags.ContainsKey(addr)) + mInputRegistorTags.Add(addr, new Tuple>(len, vv.Value)); } else if (dtmp[0] == ("hr")) @@ -170,17 +180,19 @@ public override void Init() } else { - if ((addr - hrstart + len) > mData.PackageLen) + if ((addr - hrstart + len) > mData.PackageLen || addr < hrstart) { mHoldtRegistorPackage.Add((ushort)hrstart, (ushort)hrlen); - hrstart = -1; + hrstart = addr; + hrlen = len; } else { hrlen = addr - hrstart + len; } } - mHoldRegistorTags.Add(addr, new Tuple>(len, vv.Value)); + if (!mHoldRegistorTags.ContainsKey(addr)) + mHoldRegistorTags.Add(addr, new Tuple>(len, vv.Value)); } }