Skip to content
Snippets Groups Projects
Armoire5.py 5.19 KiB
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 22 16:40:33 2020

@author: chevrier6
"""
from bitManip import *
from easymodbus.modbusClient import ModbusClient
from easymodbus.modbusClient import convert_registers_to_float


class AutomateException(Exception):
    def __init__(self, message):
        self.message = message


class Armoire5():
    # ici les adresse des mesure commence  a ZERO (pas UN comme en java)

    def __init__(self):
        self.nbCharge = 7  # de 0 a 6
        self.ipAdresse = "100.75.155.115"
        self.adresseMesure = 2
        self.adresseTOR = 32000
        self.adresseMesureSecteur1 = 7  # attention  vraie adresse ()
        self.adresseMesureSecteur2 = 8  # attention  vraie adresse

        self.debutAdrCharge = 9
        self.debutAdrSource = 0

    def okCharge(self, i):
        return 0 <= i <= self.nb - 1

    def resetAll(self):
        self.writeTOR(0)

    def resetSource(self):
        for i in range(self.nbCharge):
            self.setSource1(i)

    def resetCharge(self):
        for i in range(self.nbCharge):
            self.unsetCharge(i)

    def setCharge(self, charge: int):
        if not self.okCharge(charge):
            raise AutomateException("numero charge pas compris entre 0 et 6")
        val = self.readTOR()
        val = setBit(val, charge + self.debutAdrCharge)
        self.writeTOR(val)

    def unsetCharge(self, charge):
        if not self.okCharge(charge):
            raise AutomateException("numero charge pas compris entre 0 et 6")
        val = self.readTOR()
        val = clearBit(val, charge + self.debutAdrCharge)
        self.writeTOR(val)

    def toggleCharge(self, charge):
        if not self.okCharge(charge):
            raise AutomateException("numero charge pas compris entre 0 et 6")
        val = self.readTOR()
        val = toggleBit(val, charge + self.debutAdrCharge)
        self.writeTOR(val)

    def setSource1(self, charge):
        if not self.okCharge(charge):
            raise AutomateException("numero charge pas compris entre 0 et 6")
        val = self.readTOR()
        val = clearBit(val, charge + self.debutAdrSource)
        self.writeTOR(val)

    def setSource2(self, charge):
        if not self.okCharge(charge):
            raise AutomateException("numero charge pas compris entre 0 et 6")
        val = self.readTOR()
        val = setBit(val, charge + self.debutAdrSource)
        self.writeTOR(val)

    def togglesource(self, charge):
        if not self.okCharge(charge):
            raise AutomateException("numero charge pas compris entre 0 et 6")
        val = self.readTOR()
        val = toggleBit(val, charge + self.debutAdrSource)
        self.writeTOR(val)

    ################################

    def writeTOR(self, val):
        modbusclient = ModbusClient(self.ipAdresse, 502)
        modbusclient.connect()
        modbusclient.write_single_register(self.adresseTOR, val)
        modbusclient.close()
        # some tempo to wait measure to stabilize
        from time import sleep
        sleep(2.)

    def readTOR(self):
        modbusclient = ModbusClient(self.ipAdresse, 502)
        modbusclient.connect()
        inputRegisters = modbusclient.read_inputregisters(self.adresseTOR, 1)
        modbusclient.close()
        return (int)(inputRegisters[0])

    ###############################################
    def readSecteur1(self):
        addr = self.adresseMesure + (self.adresseMesureSecteur1) * 8
        return self.lireValeurAdresse(addr + 2), self.lireValeurAdresse(addr), self.lireValeurAdresse(
            addr + 4), self.lireValeurAdresse(addr + 6)

    def readSecteur2(self):
        addr = self.adresseMesure + (self.adresseMesureSecteur2) * 8
        return self.lireValeurAdresse(addr + 2), self.lireValeurAdresse(addr), self.lireValeurAdresse(
            addr + 4), self.lireValeurAdresse(addr + 6)

    def readMesureCourant(self, source: int):
        if not self.okCharge(source):
            raise AutomateException("numero charge pas compris entre 0 et 6")
        return self.lireValeur(source, 0)

    def readMesureTension(self, source: int):
        if not self.okCharge(source):
            raise AutomateException("numero charge pas compris entre 0 et 6")
        return self.lireValeur(source, 2)

    def readMesurePactive(self, source: int):
        if not self.okCharge(source):
            raise AutomateException("numero charge pas compris entre 0 et 6")
        return self.lireValeur(source, 4)

    def readMesurePreactive(self, source: int):
        if not self.okCharge(source):
            raise AutomateException("numero charge pas compris entre 0 et 6")
        return self.lireValeur(source, 6)

    def readMesure(self, source):
        return self.readMesureTension(source), self.readMesureCourant(source), self.readMesurePactive(
            source), self.readMesurePreactive(source)

    def lireValeur(self, source, offset):

        addr = self.adresseMesure + (source) * 8 + offset
        return self.lireValeurAdresse(addr)

    def lireValeurAdresse(self, addr):

        modbusclient = ModbusClient(self.ipAdresse, 502)
        modbusclient.connect()
        data = modbusclient.read_holdingregisters(addr, 2)
        modbusclient.close()
        res = convert_registers_to_float(data)

        return res[0]