es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo acceder a estos registros (Enron Modbus)?

Mientras utilizaba un ordenador OMNI Flow, me encontré con un problema que no puedo entender del todo. Estoy intentando acceder a un “número de punto flotante IEEE de 32 bits” utilizando NModbus.

Lo que hago para obtener un número es lo siguiente:
1. Leer 2 registros utilizando “ReadHoldingRegisters(byte slaveAddress, ushort StartAddress, ushort numberOfPoints)” con “numberOfPoints = 2”.
2. Convertir los 2 “ushorts” que leí en un “float” de la siguiente manera:

private static float ToFloat(ushort[] data)
{
    var bArray = new byte[4];
    BitConverter.GetBytes(data[0]).CopyTo(bArray, 2);
    BitConverter.GetBytes(data[1]).CopyTo(bArray, 0);
    return BitConverter.ToSingle(bArray, 0);
}
  1. Usar este “float” en mi código.

He probado este método y parece funcionar para la mayoría de los datos que leo, pero en este momento estoy teniendo problemas al leer puntos (obtengo valores inesperados pero no puedo concluir cuál es la causa) y me gustaría estar seguro de que no se debe a la dirección; los puntos están dispuestos de la siguiente manera:

Imagen de direcciones de los datos que quiero leer

Donde una dirección equivale a 32 bits de información, mientras que normalmente se utilizarían 2 registros diferentes. Mi dispositivo tiene un parámetro llamado “Modicon compatible con Modbus” que me ha llevado a investigar qué tipo de protocolo utiliza por defecto y resulta ser “Enron Modbus”.

Imagen de descripción del dispositivo

Según esta documentación (especialmente el cuadro inferior):

La dirección de inicio de la variable sigue aplicándose

¿Significa esto que si cambio al Modbus Modicon usual, accedería a 2 registros utilizando solo un punto? Por ejemplo, si quisiera leer los primeros dos puntos flotantes, tendría que leer 2 registros comenzando en la dirección 8080 y luego 2 registros más comenzando en la dirección 8081. Mientras que usualmente comenzaría en la dirección 8082 para mi segundo punto.

¿Cómo debo acceder a estos registros? Además, ¿hay un desplazamiento en la dirección aunque la documentación diga lo contrario? Si al utilizar NModbus, leo 2 registros utilizando el método “ReadMultipleRegisters”, ¿devolvería el valor correcto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Solución para acceder a números de punto flotante IEEE de 32 bits utilizando NModbus

    Para acceder a números de punto flotante IEEE de 32 bits utilizando NModbus, se pueden seguir los siguientes pasos:

    1. Leer 1 registro utilizando el método ReadHoldingRegisters(byte slaveAddress, ushort StartAddress, ushort numberOfPoints) con numberOfPoints = 1.
    2. Convertir el valor ushort obtenido de la lectura del registro único en un float de la siguiente manera:

    private static float ToFloat(ushort data)
    {
        var bArray = BitConverter.GetBytes(data);
        return BitConverter.ToSingle(bArray, 0);
    }
    
    1. Utilizar este valor float en el código.

    En cuanto a la dirección y los desplazamientos, dado que el dispositivo en cuestión utiliza Modbus de Enron, se aplica la dirección de inicio de la variable. Esto significa que si se desea leer dos números de punto flotante IEEE consecutivos de 32 bits, se deben leer 2 registros a partir de la dirección del primer número de punto flotante. No hay desplazamiento según la documentación.

    Para leer múltiples registros consecutivos utilizando el método ReadMultipleRegisters, se puede especificar el número de registros a leer (por ejemplo, 2 para dos números de punto flotante IEEE consecutivos de 32 bits) y la dirección de inicio del primer registro a leer. El método devolverá los valores de los registros especificados como una matriz de valores ushort que luego se pueden convertir a los valores float correspondientes utilizando el método ToFloat mencionado anteriormente.

    En general, para leer números de punto flotante IEEE de 32 bits a través de NModbus, se debe utilizar la lectura de registros individuales y el método de conversión ToFloat, o lecturas de registros consecutivos utilizando el método ReadMultipleRegisters con los parámetros adecuados.

Comments are closed.