Skip to content
Snippets Groups Projects
Commit db034877 authored by ChevrierVincent's avatar ChevrierVincent
Browse files

maj partie armoire

parent 85fc3007
No related branches found
No related tags found
No related merge requests found
......@@ -2,6 +2,6 @@
Vous trouverez ici des exemples de codes utiles pour votre TP.
Les fichiers sont regroupés par séances de TP.
Les fichiers sont regroupés par séances de TP. Le séquencement pédagogique est cependant variable selon les possibilites qu'offrait l'emploi du temps de l'année en cours. Voir le fichier readme.md pour avoir la correspondance.
*V Chevrier A Lahmadi*
# -*- 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]
# -*- 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 Armoire6():
# 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.116"
self.adresseMesure=0
self.adresseTOR=32000
self.adresseMesureSecteur1=7 # attention vraie adresse ()
self.adresseMesureSecteur2=8 # attention vraie adresse
self.debutAdrCharge=0
self.debutAdrSource=7
def okCharge(self,i):
return 0 <= i <= nbCharge-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):
from time import sleep
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]
\ No newline at end of file
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 22 16:43:58 2020
@author: chevrier6
"""
######################
def mask16(v):
"same as setBit(v,0)"
b=1
for i in range(v):
b*=2
return b
# 4 next functions from https://wiki.python.org/moin/BitManipulation
# testBit() returns a nonzero result, 2**offset, if the bit at 'offset' is one.
def testBit(int_type, offset):
mask = 1 << offset
return(int_type & mask)
# setBit() returns an integer with the bit at 'offset' set to 1.
def setBit(int_type, offset):
mask = 1 << offset
return(int_type | mask)
# clearBit() returns an integer with the bit at 'offset' cleared.
def clearBit(int_type, offset):
mask = ~(1 << offset)
return(int_type & mask)
# toggleBit() returns an integer with the bit at 'offset' inverted, 0 -> 1 and 1 -> 0.
def toggleBit(int_type, offset):
mask = 1 << offset
return(int_type ^ mask)
\ No newline at end of file
# Une armoire c'est quoi ?
- c'est un appareil électrique commandable à distance
- il dispose de 7 charges différentes (numérotées de 0 à 6) et de deux source d'alimentation
(source1 et source2)
- chaque charge peut être en marche ou pas et soit sur source 1 soit sur source 2 indépendament des autres
- on peut connaitre des infos sur chaque charges (U,I,P,PR) et sur chaque source (i.e. le cumul des charges en marche sur la source concernée)
# Documentation code python de manipulation des armoires
## Prerequis logiciel
- utilisation de la librairie EasyModbus.py
- utilisation d'un code bitManip.py
## Code disponible
### Note
Actuellemnt seul le code pour l'armoire 6 est opérationnel
### Utilisation
- charger le fichier correspondant à l'armoire à utiliser (exemple Armoire6.py) et ses dépendances
**Méthodes**
* Constructeur *ArmoireX()* où X vaut 6
* actions générales
- **resetAll**: remet tout à l'état d'origine
- **resetSource** / **resetCharge**: remet la partie source/charge à l'état d'origine
* actions sur les charges
- **setCharge** / **unsetCharge** / **toggleCharge**(*n°charge*): met sur ON/OFF/état inverse la charge. *N°charge* doit être compris entre 0 et 6
* Actions sur les sources
- **setSource1** / **setSource2** / **togglesource**(*n°charge*): met sur l'alimentaion 1/l'alimentation 2/inverse la source. *N°charge* doit être compris entre 0 et 6
* Actions sur les sources
* lecture de valeurs (
retourne une liste de valeurs [U,I,PA,PR])
- **readSecteur1**: mesure pour la source 1
- **readSecteur2**: mesure pour la source 2
- **readMesure**(*n°charge*): mesure pour la charge paramètre (compris en 0 et 6)
\ No newline at end of file
# -*- coding: utf-8 -*-
"""
Seule Test est à utiliser
@author: chevrier6
"""
from Armoire5 import *
#
# a=Armoire6()
# a.resetAll()
# i=0
# a.setCharge(i)
# s=a.readMesure(i)
# print(s)
#
# def chenillard():
# a=Armoire6()
# for i in range(a.nbCharge):
# a.setCharge(i)
# s=a.readMesure(i)
# print(s)
def pprint(mesure):
output="U={:.2f} I={:.2f} PA={:.2f} PR={:.2f}"
return output.format(mesure[0],mesure[1],mesure[2],mesure[3])
def test(charge):
a=Armoire5()
a.resetAll()
print("charge ",charge)
a.setCharge(charge)
s=a.readMesure(charge)
print(pprint(s), "\nS1" ,pprint(a.readSecteur1()),"\nS2", pprint(a.readSecteur2()),"\n")
a.setSource2(charge)
s=a.readMesure(charge)
print(pprint(s), "\nS1" ,pprint(a.readSecteur1()),"\nS2", pprint(a.readSecteur2()),"\n")
a.unsetCharge(charge)
#
# def chenillard2():
# a=Armoire6()
# a.resetAll()
# for i in range(a.nbCharge):
# print("charge ",i)
# a.setCharge(i)
# s=a.readMesure(i)
# print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# a.setSource2(i)
# s=a.readMesure(i)
# print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# a.unsetCharge(i)
#
#
# def chenillard3():
# a=Armoire6()
# a.resetAll()
# for charge in range(a.nbCharge):
# print("charge ",charge)
# a.setCharge(charge)
# u,i,pa,pr=a.readMesure(charge)
# u1,i1,pa1,pr1=a.readSecteur1()
# u2,i2,pa2,pr2=a.readSecteur2()
# print((u,i,pa,pr), "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# print(u-u1,i-i1,pa-pa1,pr-pr1)
# print(u-u2,i-i2,pa-pa2,pr-pr2)
# a.setSource2(charge)
# u,i,pa,pr=a.readMesure(charge)
# u1,i1,pa1,pr1=a.readSecteur1()
# u2,i2,pa2,pr2=a.readSecteur2()
# print((u,i,pa,pr), "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# print(u-u1,i-i1,pa-pa1,pr-pr1)
# print(u-u2,i-i2,pa-pa2,pr-pr2)
# a.unsetCharge(charge)
#
# def chenillard2b():
# a=Armoire6()
# a.resetAll()
# for i in range(a.nbCharge):
# print("charge ",i)
# a.toggleCharge(i)
# s=a.readMesure(i)
# print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# a.setSource2(i)
# s=a.readMesure(i)
# print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# a.unsetCharge(i)
#chenillard2b()
\ No newline at end of file
# -*- coding: utf-8 -*-
"""
@author: chevrier6
"""
from Armoire6 import *
#
# a=Armoire6()
# a.resetAll()
# i=0
# a.setCharge(i)
# s=a.readMesure(i)
# print(s)
#
# def chenillard():
# a=Armoire6()
# for i in range(a.nbCharge):
# a.setCharge(i)
# s=a.readMesure(i)
# print(s)
def pprint(mesure):
output="U={:.2f} I={:.2f} PA={:.2f} PR={:.2f}"
return output.format(mesure[0],mesure[1],mesure[2],mesure[3])
def test(charge):
a=Armoire6()
a.resetAll()
print("charge ",charge)
a.setCharge(charge)
s=a.readMesure(charge)
print(pprint(s), "\nS1" ,pprint(a.readSecteur1()),"\nS2", pprint(a.readSecteur2()),"\n")
a.setSource2(charge)
s=a.readMesure(charge)
print(pprint(s), "\nS1" ,pprint(a.readSecteur1()),"\nS2", pprint(a.readSecteur2()),"\n")
a.unsetCharge(charge)
#
# def chenillard2():
# a=Armoire6()
# a.resetAll()
# for i in range(a.nbCharge):
# print("charge ",i)
# a.setCharge(i)
# s=a.readMesure(i)
# print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# a.setSource2(i)
# s=a.readMesure(i)
# print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# a.unsetCharge(i)
#
#
# def chenillard3():
# a=Armoire6()
# a.resetAll()
# for charge in range(a.nbCharge):
# print("charge ",charge)
# a.setCharge(charge)
# u,i,pa,pr=a.readMesure(charge)
# u1,i1,pa1,pr1=a.readSecteur1()
# u2,i2,pa2,pr2=a.readSecteur2()
# print((u,i,pa,pr), "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# print(u-u1,i-i1,pa-pa1,pr-pr1)
# print(u-u2,i-i2,pa-pa2,pr-pr2)
# a.setSource2(charge)
# u,i,pa,pr=a.readMesure(charge)
# u1,i1,pa1,pr1=a.readSecteur1()
# u2,i2,pa2,pr2=a.readSecteur2()
# print((u,i,pa,pr), "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# print(u-u1,i-i1,pa-pa1,pr-pr1)
# print(u-u2,i-i2,pa-pa2,pr-pr2)
# a.unsetCharge(charge)
#
# def chenillard2b():
# a=Armoire6()
# a.resetAll()
# for i in range(a.nbCharge):
# print("charge ",i)
# a.toggleCharge(i)
# s=a.readMesure(i)
# print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# a.setSource2(i)
# s=a.readMesure(i)
# print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
# a.unsetCharge(i)
#chenillard2b()
\ No newline at end of file
......@@ -7,7 +7,7 @@
- exemple du cours (exclusion mutuelle et sa solution avec sémaphore): exclumutPb et exclumutPbSemaphore
- exemple de syncrhonisation (pingpong et exJoinAlive)
## Code relatif au TP2 (répertoire TP2)
## Code relatif à l'accès aux armoires (dispositifs physiques) (répertoire TP2)
Vous trouverez:
- une documentation
......@@ -17,6 +17,6 @@ et les fichiers suivants (besoin du module easymodbus)
- bitManip utilitaire
- test5 et test6: code exemple d'utilisation des armoires
## Code relatif au TP3 (répertoire TP3)
## Code relatif au Web services (répertoire TP3)
Voir docu.md
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment