Browse Source

更新Modbus

dependabot/nuget/XCoderWpf/Microsoft.Data.SqlClient-4.0.5
大石头 3 years ago
parent
commit
7d9e4f2229
  1. 14
      XCoder/CrazyCoder.csproj
  2. 6
      XCoder/XNet/FrmModbusMaster.cs
  3. 26
      XCoder/XNet/FrmModbusSlave.cs

14
XCoder/CrazyCoder.csproj

@ -66,28 +66,28 @@
<Content Include="数据库命名规范.txt" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.Map" Version="2.1.2022.1004-beta1356" />
<PackageReference Include="NewLife.ModbusRTU" Version="1.4.2022.1001" />
<PackageReference Include="NewLife.Map" Version="2.2.2022.1101" />
<PackageReference Include="NewLife.ModbusRTU" Version="1.5.2022.1101" />
<PackageReference Include="System.Speech" Version="6.0.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
<PackageReference Include="Microsoft.VisualBasic" Version="10.3.0" />
<PackageReference Include="NewLife.Core">
<Version>10.0.2022.1017-beta0517</Version>
<Version>10.0.2022.1101</Version>
</PackageReference>
<PackageReference Include="NewLife.MQTT">
<Version>1.1.2022.1016-beta0137</Version>
<Version>1.1.2022.1101</Version>
</PackageReference>
<PackageReference Include="NewLife.Net">
<Version>4.2.2022.1001-beta1553</Version>
</PackageReference>
<PackageReference Include="NewLife.Redis">
<Version>5.0.2022.1017-beta1058</Version>
<Version>5.0.2022.1101</Version>
</PackageReference>
<PackageReference Include="NewLife.Stardust">
<Version>2.3.2022.1017-beta1058</Version>
<Version>2.4.2022.1101</Version>
</PackageReference>
<PackageReference Include="NewLife.XCode">
<Version>11.3.2022.1014-beta0128</Version>
<Version>11.3.2022.1101</Version>
</PackageReference>
<PackageReference Include="SSH.NET">
<Version>2020.0.2</Version>

6
XCoder/XNet/FrmModbusMaster.cs

@ -143,7 +143,8 @@ namespace XNet
// 读取线圈
if (code <= FunctionCodes.ReadDiscrete)
{
var data = _modbus.Read(code, host, address, count);
var rs = _modbus.Read(code, host, address, count);
var data = rs?.ReadBytes(1);
if (data != null && data.Length > 0)
{
// 按照寄存器遍历,每个8个线圈占1个字节
@ -177,7 +178,8 @@ namespace XNet
// 读取寄存器
else if (code <= FunctionCodes.ReadInput)
{
var data = _modbus.Read(code, host, address, count);
var rs = _modbus.Read(code, host, address, count);
var data = rs?.ReadBytes(1);
if (data != null && data.Length > 0)
{
// 按照寄存器遍历,每个寄存器2字节

26
XCoder/XNet/FrmModbusSlave.cs

@ -265,11 +265,12 @@ namespace XNet
var session = sender as NetSession;
if (session == null) return;
var msg = ModbusTcpMessage.Read(e.Packet);
var msg = ModbusIpMessage.Read(e.Packet);
if (msg == null) return;
session.Log?.Info("<= {0}", msg);
var addrMsg = msg.GetAddress();
var rs = msg.CreateReply();
switch (msg.Code)
{
@ -278,15 +279,16 @@ namespace XNet
if (_coils != null)
{
// 连续地址,其实地址有可能不是8的倍数
var regCount = msg.Payload.ReadBytes(0, 2).ToUInt16(0, false);
var addr = msg.Address - _coils[0].Address;
var regCount = msg.Payload.ReadBytes(2, 2).ToUInt16(0, false);
var addr = addrMsg - _coils[0].Address;
if (addr >= 0 && addr + regCount <= _coils.Count)
{
// 取出该段存储单元
var cs = _coils.Skip(addr).Take(regCount).ToList();
var count = (Int32)Math.Ceiling(regCount / 8.0);
// 遍历存储单元,把数据聚合成为字节数组返回
var bits = new Byte[count];
var bits = new Byte[1 + count];
bits[0] = (Byte)count;
for (var i = 0; i < count; i++)
{
var b = 0;
@ -298,7 +300,7 @@ namespace XNet
if (cs[i * 8 + j].Value > 0)
b |= 1 << j;
}
bits[i] = (Byte)b;
bits[1 + i] = (Byte)b;
}
rs.Payload = bits;
@ -310,11 +312,13 @@ namespace XNet
if (_regs != null)
{
// 连续地址
var regCount = msg.Payload.ReadBytes(0, 2).ToUInt16(0, false);
var addr = msg.Address - _regs[0].Address;
var regCount = msg.Payload.ReadBytes(2, 2).ToUInt16(0, false);
var addr = addrMsg - _regs[0].Address;
if (addr >= 0 && addr + regCount <= _regs.Count)
{
rs.Payload = _regs.Skip(addr).Take(regCount).SelectMany(e => e.GetData()).ToArray();
var buf = _regs.Skip(addr).Take(regCount).SelectMany(e => e.GetData()).ToArray();
rs.Payload = new Byte[] { (Byte)buf.Length };
rs.Payload.Append(buf);
}
}
break;
@ -327,8 +331,8 @@ namespace XNet
var regCount = 0;
for (var i = 0; i < 256 && i + 1 < msg.Payload.Total; i += 2)
{
var value = msg.Payload.ReadBytes(i, 2).ToUInt16(0, false);
var addr = msg.Address - _regs[0].Address;
var value = msg.Payload.ReadBytes(2 + i, 2).ToUInt16(0, false);
var addr = addrMsg - _regs[0].Address;
if (addr >= 0 && addr < _regs.Count)
{
var ru = _regs[addr];
@ -338,7 +342,7 @@ namespace XNet
}
Invoke(() => { dgv.Refresh(); });
{
var addr = msg.Address - _regs[0].Address;
var addr = addrMsg - _regs[0].Address;
rs.Payload = _regs.Skip(addr).Take(regCount).SelectMany(e => e.GetData()).ToArray();
}
}

Loading…
Cancel
Save