Ejemplo: Lectura de registro en la dirección 0x0001 desde un slave con la dirección 0x55 usando la uart 3
import pyb import ModBus uart = pyb.UART(3) uart.init(115200) instrument = ModBus.Instrument(uart,0x55,mode=ModBus.MODE_ASCII) print(instrument) while True: try: v = instrument.read_register(1) print("Register 1 value :"+str(v)) except Exception as e: print(e) pyb.delay(1000)
La clase Instrument necesita para ser creada, un objeto uart, que representa un puerto serie de la placa, la dirección del slave (0x55 en este ejemplo) y por ultimo el modo del protocolo modbus:
El objeto instrument se puede usar para leer y escribir registros a través del puerto serie en el slave definido usando el protocolo Modbus.
Métodos soportados:
Lee un bit del dispositivo slave Args: * registeraddress (int): La dirección del registro del slave. * functioncode (int): Código de función modbus. Puede ser 1 o 2. Returns: El valor del bit 0 o 1 (int). Raises: ValueError, TypeError, IOError
Escribe un bit en el dispositivo slave. Args: * registeraddress (int): La dirección del registro del slave. * value (int): 0 o 1 * functioncode (int): Código de función modbus. 5 o 15. Returns: None Raises: ValueError, TypeError, IOError
Lee un integer de uno de los registros de 16 bit del dispositivo slave, con la posibilidad de escalarlo. Args: * registeraddress (int): La dirección del registro del slave. * numberOfDecimals (int): Cantidad de decimales para la conversión del contenido. * functioncode (int): Código de función modbus. 3 o 4. * signed (bool): Interpretación del contenido con signo. Si un valor de 77.0 se almacena internamente en el registro como 770, se debe utilizar ``numberOfDecimals=1`` de este modo se dividirá el contenido por 10 antes de devolver el valor. De la misma forma, si se utiliza ``numberOfDecimals=2`` se dividirá por 100. Returns: El dato del registro en forma numérica (int o float). Raises: ValueError, TypeError, IOError
Escribe un integer de uno de los registros de 16 bit del dispositivo slave, con la posibilidad de escalarlo. Args: * registeraddress (int): La dirección del registro del slave. * value (int or float): Valor a escribir. * numberOfDecimals (int): Cantidad de decimales para la conversión del contenido. * functioncode (int): Código de función modbus. 6 o 16. * signed (bool): Interpretación del contenido con signo. Si un valor de 77.0 se almacena internamente en el registro como 770, se debe utilizar ``numberOfDecimals=1`` de este modo se multiplicara el contenido por 10 antes de enviar el valor al slave. Returns: None Raises: ValueError, TypeError, IOError
Lee integers en los registros de 16 bit del dispositivo slave Args: * registeraddress (int): La dirección de inicio de los registros a leer del slave. * numberOfRegisters (int): Numero de registros a leer. * functioncode (int): Código de función modbus. 3 o 4. Returns: Los valores de los registros en una list de integers. Raises: ValueError, TypeError, IOError
Escribe integers en los registros de 16-bit del dispositivo slave. Usa el código de función modbus 16. El número de registros a escribir esta dado por la cantidad de valores en la lista. Args: * registeraddress (int): La dirección de inicio de los registros a escribir en el slave. * values (list of int): Valores a escribir en los registros. Returns: None Raises: ValueError, TypeError, IOError
Ejemplo:
import pyb import ModBus uart = pyb.UART(3) uart.init(115200) led1 = pyb.LED(1) mappedRegs = {0x4000 : 0x0000 , 0x4001 : 0x0000} modbus = ModBus.Slave(uart,0x55,mappedRegs,mode=ModBus.MODE_ASCII) print(modbus) print(mappedRegs) while True: if modbus.receive(): print(mappedRegs) if mappedRegs[0x4000]==0: led1.off() else: led1.on()
En el modo slave, se necesita definir un diccionario donde se mapearán los supuestos registros del dispositivo slave. En este diccionario, las claves serán las direcciones de los registros, y los valores del diccionario, los valores de cada registro. En el ejemplo, se definen dos registros, uno en la dirección 0x4000 y otro en la dirección 0x4001 ambos con el valor 0. Se soportan comandos para leer y escribir registros, estos comandos modificarán los valores del diccionario.
Para crear el objeto Slave, se necesita un objeto uart, la dirección del slave, el diccionario con los registros definidos y la constante que indica si se utilizará Modbus en modo ascii o rtu.
El método “receive” se debe ejecutar constantemente para recibir por el puerto serie las tramas modbus, al recibirlas se modificará el estado del diccionario y se devolverá True, de lo contrario el método devolverá False.