nmodbus を使用して Socomec Diris A40 の 50526 などのアドレスにアクセスしようとしています。私が見た 3 または 4 で始まる他の例とは異なり、これらのアドレスはすべて 5 で始まります。
現時点で私が理解している限りでは、最初の数字は 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);
}
}