Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I'm working on a c# project Which have to comunicate with PLC by TCP Modbus. I'm using Nmodbus Library and it works fine. The problem is when I try to read/write Registry over 12000. I get this exception:

  Exception 'Modbus.SlaveException'  Function Code: 131

This is the part of the code which generates the exception:

private TcpClient tcpClient;
     private ModbusIpMaster master;
     private void connect(){
    // connect to Modbus TCP Server
    string ipAddress = "192.168.77.7"; //Input WISE IP
    int tcpPort = 502;
    tcpClient = new TcpClient(ipAddress, tcpPort);
    // create Modbus TCP Master by the tcp client
    master = ModbusIpMaster.CreateIp(tcpClient);
    // rewrite the value of AO ch0 (40020~40021) by float
    byte slaveID = 1;
   // ushort rewriteAddress = 20;
   // ushort[] rewriteValue = new ushort[2] { 0, 0 };
   // float[] floatData = new float[1] { 223.456F };
   // Buffer.BlockCopy(floatData, 0, rewriteValue, 0, 4);
    Random random = new Random();
    // read the holding register 12001~12005 
    // write the holding register 301~305
    ushort startAddress = 12000;
    ushort numOfPoints = 5;
    master.Transport.ReadTimeout = 1000;
    while (!_shouldStop1)
            ushort[] register = master.ReadHoldingRegisters(slaveID, startAddress, numOfPoints);
            for (int index = 0; index <register.Length; index++)
                Console.WriteLine(string.Format("AO[{0}] = {1}", index,register[index]));
            for (ushort index = 0; index < 4; index++)
                master.WriteSingleRegister(slaveID, (ushort)(301 + index),(ushort) data[index]);
        catch (Exception ex)
            Console.WriteLine(ex.Message);

Any suggestion will be appreciated. Thanks, Federico.

This is the line which causes the exception: ushort[] register = master.ReadHoldingRegisters(slaveID, startAddress, numOfPoints); where startAddress=12001 and numOfPoints=5. If I try to read addresses lower than 12000 it works fine. – Federico Pinciaroli Mar 30, 2017 at 14:30 Can you get more detail from the Exception (Try e.Message or e.ToString()). "Code 131" just means "Exception in ReadHoldingRegisters". Or check if you can read above 12000 indirectly, i.e. can you set startAddress to 11999 and still read 5 points? – g t Mar 31, 2017 at 5:56 The e.Message content change startig from different addresses. For startAddress=11999 the message is Exception Code: 2 - The data address received in the query is not an allowable address for the server (or slave). More specifically, the combination of reference number and transfer length is invalid. For a controller with 100 registers, the PDU........ while for startAddress=12001 is Exception Code: 4 - An unrecoverable error occurred while the server (or slave) was attempting to perform the requested action. – Federico Pinciaroli Mar 31, 2017 at 9:31 Could it be that you are reading floats? These require 32-bits, i.e. 2 registers. If you pass in 5 for numOfPoints, it can only read two-and-a-half registers and returns an error? Maybe try 4 or 6 instead? – g t Mar 31, 2017 at 9:46

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.