J'automatise une machine industrielle basé sur Crossbar.io et Autobahn.ws
J'ai plusieurs fichiers indépendants connectés à Crossbar.io, un représentant le ventilateur, l'autre le contact 1, le troisième le lecteur de thermocouples...
Le problème c'est qu'ils doivent passer par le même canal de communication (i2c ou modbus).
Il arrive par moment que j'ai un accès simultané, ce qui pose problème.
Quelle est la meilleur solution pour résoudre ce problème (j'ai regarder asyncio.Lock(), mais cela fonctionne uniquement dans un fichier).
J'ai aussi fait une pile pour ordonner la communication, qui communique avec un push et un pull, mais ça alourdi beaucoup le code (exemple ci-dessous).
class PistonGazo(ApplicationSession):
""" Run piston gazo """
topic = "gazo.pistonGazo"
topicRun = "gazo.pistonGazo.run"
priorityRun = 5
cmdPiston = 'off'
def __init__(self, config):
ApplicationSession.__init__(self)
self.config = config
self.pistons = I2CBus(BUS, 0x21)
@asyncio.coroutine
def onJoin(self, details):
print('Session {} attached'.format(self.__class__.__name__))
try:
yield from self.register(self.runLoop, self.topicRun)
print("Procedure registered : {}".format(self.topicRun))
except Exception as e:
print('Could not register procedure: {}'.format(e))
try:
yield from self.register(self.startPiston, self.topic)
print("Procedure registered : {}".format(self.topic))
except Exception as e:
print('Could not register procedure: {}'.format(e))
while True:
# TODO: Add loop function hereo
self.addStack()
# delay of loop
yield from asyncio.sleep(DELAY_WHILE)
def startPiston(self, cmd):
self.cmdPiston = cmd
def addStack(self):
"""Put into loopStack for execution when all bus are free. Take placei"""
self.call("gazo.stack.add", self.topicRun, self.priorityRun)
def removeStack(self):
"""Send to loopStack that execution are finished and free the place """
self.call("gazo.stack.remove", self.topicRun)
def runLoop(self):
"""It's the main code that execute every time"""
if self.cmdPiston == 'on':
self.pistons.write(0x41, [0x01])
self.cmdPiston = ''
print('on')
elif self.cmdPiston == 'off':
self.pistons.write(0x41, [0x00])
self.cmdPiston = ''
print('off')
self.removeStack()
J'aurai préféré l'équivalent du Lock avec une pause dans le programme (avant la communication) tant que le périphérique est occupé.
Merci