Exemplo n.º 1
0
class LightController():
    """Class to control lights of a single controller"""

    toggle_time = config.toggle_time

    def __init__(self, host):
        self.client = ModbusClient(host=host, auto_open=True, auto_close=False)
        #self.client.debug(True)
        logger.info("Connecting to %s", self.client.host())

        status = self.check_status()
        if status & 1<<15:
            # Watchdog ellapsed, try to reset
            logger.info("Resetting watchdog")
            self.client.write_single_register(0x1121, 0xbecf)
            self.client.write_single_register(0x1121, 0xaffe)

        # Disable the watchdog, if enabled
        watchdog_timeout = self.client.read_holding_registers(0x1120)[0]
        if watchdog_timeout > 0:
            logger.debug("Watchdog timeout: %d", watchdog_timeout)
            logger.info("Disabling watchdog")
            self.client.write_single_register(0x1120, 0)

        (self.num_outputs, self.num_inputs) = self.client.read_holding_registers(0x1012, 2)
        logger.info("Number of outputs: %d", self.num_outputs)
        logger.info("Number of inputs: %d", self.num_inputs)
        self.client.close()
        # We use auto close for all subsequent calls after initialization
        self.client.auto_close(True)

    def check_status(self):
        """Read buscoupler status from the module"""
        buscoupler_status = self.client.read_holding_registers(0x100c)[0]
        if buscoupler_status & 1<<0:
            logger.error("Bus terminal error")
        if buscoupler_status & 1<<1:
            logger.error("Bus coupler configuration error")
        if buscoupler_status & 1<<15:
            logger.error("Fieldbus error, watchdog timer elapsed")
        return buscoupler_status

    def inputs(self):
        """Read input status from module"""
        inputs = self.client.read_discrete_inputs(0, self.num_inputs)
        logger.debug("Inputs: %s", "".join(map(lambda c: '1' if c else '0', inputs)))
        return inputs

    def outputs(self):
        """Read output status from module"""
        coils = self.client.read_coils(0, self.num_outputs)
        logger.debug("Outputs: %s", "".join(map(lambda c: '1' if c else '0', coils)))
        return coils

    def toggle(self, bit_addr):
        """Toggle a impulse relay connected to a single output"""
        logger.info("Toggling %d on %s", bit_addr, self.client.host())
        self.client.auto_close(False)
        self.client.write_single_coil(bit_addr, True)
        logger.debug("On %d", bit_addr)
        time.sleep(self.toggle_time)
        self.client.write_single_coil(bit_addr, False)
        logger.debug("Off %d", bit_addr)
        self.client.close()
        self.client.auto_close(True)
Exemplo n.º 2
0
from pyModbusTCP.client import ModbusClient
from pyModbusTCP.constants import MODBUS_RTU
from config.modbus import *
from time import sleep
    
### MODBUS INITIALIZATION
c = ModbusClient()
c.mode(MODBUS_RTU) # enable MODBUS_RTU mode
c.timeout(1)
c.debug(True)
c.auto_open(True)
c.auto_close(True)

reg_value={'dum':None} # DUMMY FOR RECORDING REGISTRY LISTS
### END MODBUS INITIALIZATION

### INTERNAL FUNCTIONS
def loc_id(loc):
    device=loc.split('.')
    modmap,conn_id = MODBUS_MAP[device[2]],CONNECTIONS[device[0]][device[1]]
    return modmap,conn_id # [slave_id,reg_values],[IP_addr,port,slave_id_modifier]

def reg_add(modmap,color):
    reg=[0x0,0x0,0x0]
    for cl in COLOR_LIST[color]:
        mapcol=modmap[1][cl] # [0xXXXX,0xXXXX,0xXXXX]
        for i in range(0,3):
            reg[i]+=mapcol[i]
    return reg

def open_comm(): # MODBUS AUTO-RECONNECT