如何解决如何访问5xxxx Modbus地址
| 我正在尝试使用nmodbus访问Socomec Diris A40上的诸如50526之类的地址。与其他示例不同,我看到它们以3或4开头,这些地址都以5开头。50544、50550、50556只是插入了一些。 据我目前的了解,第一个数字代表Modbus功能,实际上并不涉及实际地址,即30000个地址使用功能04,40000个地址使用功能03(?)。我已经看到省略了第一个数字,其余的用作地址。如果我用50000个地址尝试此操作,我会获得一些成功,但不是所有值都成功,并且结果似乎不正确。 MODPOLL返回与我的代码相同的结果。 我真的可以帮忙!如果有人可以建议我如何访问这些5xxxx寄存器,我将非常感谢。 方法代码: public static void ModbusSerialRtuMasterReadRegisters()
{
using (SerialPort port = new SerialPort(\"COM1\"))
{
// configure serial port
port.BaudRate = 9600;
port.DataBits = 8;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
try
{
port.Open();
Console.WriteLine(\"port \" + port.PortName + \" open: \" + port.IsOpen + \"\\n\");
}
catch(Exception ex)
{
Console.WriteLine(\"Unable to open port: \" + ex);
}
// create modbus master
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
byte slaveId = 1;
ushort startAddress = 1;
ushort numRegisters = 5;
ushort[] registers = new ushort[numRegisters];;
// read registers
try
{
registers = master.ReadHoldingRegisters(slaveId,startAddress,numRegisters);
for (int i = 0; i < numRegisters; i++)
Console.WriteLine(\"Register {0}={1}\",startAddress + i,registers[i]);
}
catch (Modbus.SlaveException se)
{
Console.WriteLine(\"Could not find register... \\n \\n\" + se);
}
try
{
port.Close();
Console.WriteLine(\"\\nport \" + port.PortName + \" open: \" + port.IsOpen + \"\\n\");
}
catch (Exception ex)
{
Console.WriteLine(\"Unable to close port: \" + ex);
}
}
解决方法
尝试从5xxxx地址中减去40001或40000(地址以1或0开头)。
,地址为5xxxx的寄存器为保持寄存器。 (40001至5xxxx范围)
因此,要找到Modbus寄存器地址,应从40001中减去其地址。
例如50512-40001 = 10511(290F H)
祝好运
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。