我正在尝试使用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);
}
}
答案 0 :(得分:2)
尝试从5xxxx地址中减去40001或40000(地址以1或0开头)。
答案 1 :(得分:0)
具有5xxxx地址的寄存器正在保存寄存器。 (40001至5xxxx范围) 因此,要查找Modbus寄存器地址,应从40001中减去其地址。 例如50512 - 40001 = 10511(290F H)
祝你好运