예제 #1
0
    def sendReqState(self, *largs):
        ''' Peticion de estados y eventos '''
        # Generacion del paquete, lo guardamos por si hay que retransmitir

        if self.state == States.HALTED or not self.transport.connected:
            log.msg('Deteniendo consulta')
            return
        # Hay un paquete que enviar
        if self._to_send_buffer:
            self.state = States.COMMAND_QUEUED
            pkg = self._to_send_buffer.pop(0)
            pkg['SEQ'] = self.seq
            log.msg('Comando: %s' % pkg)
            self.transport.write(pkg.octet_str())

            self.next_seq()
            reactor.callLater(self.co.poll_delay,
                              self.sendReqState)  #@UndefinedVariable
            log.msg('Envio del comando')
            return

        # TODO: Tomar de la confguracion del SCADA
        self.tries = 0
        self.current_pkg = Paquete.crear_estados_y_eventos(
            0x01, self.uc.id_UC, self.seq)
        # Enviamos el paquete al medio
        self.transport.write(self.current_pkg.octet_str())
        # Cambio de estado
        self.scada_state = States.STATE_REQ_SENT
        # Preparamos el temeout
        log.msg('Poll ---> %.2d%.2d' % (self.co.id_CO, self.uc.id_UC))
        self.timeout_defer = reactor.callLater(
            self.co.t_out, self.timeoutElapsed)  #@UndefinedVariable
예제 #2
0
파일: scada.py 프로젝트: D3f0/txscada
 def sendReqState(self, *largs):
     ''' Peticion de estados y eventos '''
     # Generacion del paquete, lo guardamos por si hay que retransmitir
     
     if self.state == States.HALTED or not self.transport.connected:
         log.msg('Deteniendo consulta')
         return
     # Hay un paquete que enviar
     if self._to_send_buffer:
         self.state = States.COMMAND_QUEUED
         pkg = self._to_send_buffer.pop(0)
         pkg['SEQ'] = self.seq
         log.msg('Comando: %s' % pkg )
         self.transport.write( pkg.octet_str() )
         
         self.next_seq()
         reactor.callLater( self.co.poll_delay, self.sendReqState ) #@UndefinedVariable
         log.msg('Envio del comando')
         return
     
     # TODO: Tomar de la confguracion del SCADA
     self.tries = 0
     self.current_pkg = Paquete.crear_estados_y_eventos(0x01, 
                                                        self.uc.id_UC,
                                                        self.seq)
     # Enviamos el paquete al medio
     self.transport.write(self.current_pkg.octet_str())
     # Cambio de estado
     self.scada_state = States.STATE_REQ_SENT
     # Preparamos el temeout
     log.msg('Poll ---> %.2d%.2d' % (self.co.id_CO, self.uc.id_UC))
     self.timeout_defer = reactor.callLater(self.co.t_out, self.timeoutElapsed) #@UndefinedVariable
예제 #3
0
    def work(self):
        ''' El hilo del concentrador '''
        print "Inciando concentrador", self.concentrador,
        print " microcontroladores 485 nros:", map(
            lambda c: c.id_UC, self.concentrador.uc_set.all())

        if not self._connect():
            print "No se pudo conectar con %s:%s" % self.direccion()
            return

        # Seteamos el timeout
        self.socket.settimeout(1)
        # El automata se encarga de validar la integridad de los pauqetes
        automata = UCNetPacketDetector()
        while True:
            if GLOBAL_INTERRUPT_FLAG:
                return
            if not self.concentrador.uc_set.all().count():
                print "Sin controladores que pollear"
                return

            data = None
            tiempo_inicial = time.time()

            for uc in self.concentrador.uc_set.all():
                print "Poll UC ", uc.id_UC
                p = Paquete.crear_estados_y_eventos(0x01, uc.id_UC,
                                                    self.seq_num)
                print p
                try:
                    self.socket.send(p.octet_str())
                except SocketError, e:
                    print "Error en envio: %s" % e
                    return

                try:
                    data = self.socket.recv(255)
                except SocketError, e:
                    print "Error en recepcion %s" % e
                else:
                    # Si recibimos datos probamos armar el paquete
                    automata.feed(data)

                    # Con lo que sale del automata armamos un paquete
                    r = Paquete(lista_enteros=automata.get_pkg())
                    p.evaluar_respuesta(r)

                    print r
                    self.avanzar_seq_num()
예제 #4
0
파일: scada.py 프로젝트: D3f0/txscada
 def work(self):
     ''' El hilo del concentrador '''
     print "Inciando concentrador", self.concentrador,
     print " microcontroladores 485 nros:", map(lambda c: c.id_UC, self.concentrador.uc_set.all())
     
     if not self._connect():
         print "No se pudo conectar con %s:%s" % self.direccion()
         return
     
     # Seteamos el timeout
     self.socket.settimeout(1)
     # El automata se encarga de validar la integridad de los pauqetes
     automata = UCNetPacketDetector()
     while True:
         if GLOBAL_INTERRUPT_FLAG:
             return
         if not self.concentrador.uc_set.all().count():
             print "Sin controladores que pollear"
             return
         
         data = None
         tiempo_inicial = time.time()
         
         for uc in self.concentrador.uc_set.all():
             print "Poll UC ", uc.id_UC
             p = Paquete.crear_estados_y_eventos(0x01, uc.id_UC, self.seq_num)
             print p
             try:
                 self.socket.send(p.octet_str())
             except SocketError, e:
                 print "Error en envio: %s" % e
                 return
                 
             try:
                 data = self.socket.recv(255)
             except SocketError, e:
                 print "Error en recepcion %s" % e
             else:
                 # Si recibimos datos probamos armar el paquete
                 automata.feed(data)
             
                 # Con lo que sale del automata armamos un paquete
                 r = Paquete(lista_enteros = automata.get_pkg())
                 p.evaluar_respuesta(r)
                 
             
                 print r
                 self.avanzar_seq_num()
예제 #5
0
 def on_pushSendReqEv_pressed(self):
     pkg = Paquete.crear_estados_y_eventos(self.origen, self.destino,
                                           self.secuencia)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())
예제 #6
0
파일: mainwin.py 프로젝트: D3f0/txscada
 def on_pushSendReqEv_pressed(self):
     pkg = Paquete.crear_estados_y_eventos(self.origen, self.destino, 
                                             self.secuencia)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())