我正嘗試使用nmodbus訪問Socomec Diris A40上的地址,如50526。不像其他的例子,我已經看到哪些開始3或4,這些地址都以5開頭。50544,50550,50556是幾個更多的IM插入。如何訪問5xxxx Modbus地址
據我瞭解,目前,第一個數字表示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);
}
}
我看到這個建議好了,但是不幸的是它不適合我。通過電子郵件發送製造商,顯然他們使用9xxxx尋址,即4 + 5,這將基於4xxxx + 5xxxx即時猜測,仍然在等待澄清,但仍然沒有運氣 - 地址9xxxx也不起作用(在Modbus測試儀)。 – marked 2011-05-26 15:00:44
他們在這裏解釋:「問題是我們的儀表在這個儀表上使用了非標準地址映射 通常,數據類型的地址範圍是Modbus 41001到41099--但我們的儀表地址已被映射到9xxxx範圍(4 + 5)。 我們的一個客戶正在與凱譜華OPC/Modbus驅動程序爲他的SCADA系統接口。 他們有成功的讀寫9xxxx地址 我自己,我採用MODBUS測試儀通過IP進行一些測試,並且它也能正常工作「 – marked 2011-05-26 15:08:42
詢問他們在任何具有已知地址的標籤上的單個MODBUS請求的十六進制轉儲。然後,由於MODBUS消息中的每個字節都可以解碼,所以可以進行逆向工程並找出需要的真正「魔術」地址。如果他們給你一些工作設備的通信日誌的嗅探轉儲,如果你之後的地址在其中,也可以實現相同的功能。 – avra 2011-05-27 09:37:54