def handleBcl(self, d): #log.msg("BCL") self.buffer.append(d) pkg = Paquete(self.buffer) if pkg.cs_ok(): self.packageRecieved(pkg) else: self.checksumError(pkg) self.state = States.WAIT_SOF
def handleBcl(self, d): #log.msg("BCL") self.buffer.append(d) pkg = Paquete( self.buffer ) if pkg.cs_ok(): self.packageRecieved( pkg ) else: self.checksumError( pkg ) self.state = States.WAIT_SOF
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()
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
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
def on_pushLeerEE_pressed(self): pagina = self.spinPagina.value() direccion = self.spinDireccion.value() cantidad = self.spinCantidad.value() pkg = Paquete.crear_lectura_eeprom(self.origen, self.destino, self.secuencia, pagina, direccion, cantidad) self.entrada_hexa() self.line_envio.setText(pkg.hex_dump())
def on_pushEnviarAppString_pressed(self): lista = [ int(x, 16) for x in str(self.lineAppString.text()).split() if len(x) ] pkg = Paquete.crear_paquete_custom(self.origen, self.destino, self.secuencia, lista) self.entrada_hexa() self.line_envio.setText(pkg.hex_dump())
def on_pushControl_pressed(self): puerto = self.spinPuerto.value() bit = self.spinBit.value() estado = self.radioBitUno.isChecked() and 1 or 0 indirecto = self.checkIndirecto.isChecked() pkg = Paquete.crear_control(self.origen, self.destino, self.secuencia, puerto, bit, estado, es_comando_indirecto = indirecto) self.entrada_hexa() self.line_envio.setText(pkg.hex_dump())
def on_pushControl_pressed(self): puerto = self.spinPuerto.value() bit = self.spinBit.value() estado = self.radioBitUno.isChecked() and 1 or 0 indirecto = self.checkIndirecto.isChecked() pkg = Paquete.crear_control(self.origen, self.destino, self.secuencia, puerto, bit, estado, es_comando_indirecto=indirecto) self.entrada_hexa() self.line_envio.setText(pkg.hex_dump())
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()
def on_pushPuestaEnHora_pressed(self): #QtGui.QMessageBox.information(self, 'hola', 'Hola') pkg = Paquete.crear_puesta_en_hora(self.origen, self.destino, self.secuencia) self.entrada_hexa() self.line_envio.setText(pkg.hex_dump())
def on_pushSendReqMorEv_pressed(self): pkg = Paquete.crear_mas_eventos(self.origen, self.destino, self.secuencia) self.entrada_hexa() self.line_envio.setText(pkg.hex_dump())
0x0C, # PORTA 0xfe, # PORTB 0xac, # PORTC 2, # Cantidad de AI (Analog Input) 0x03, # AI0H 0xFF, # AI0L 0x02, # AI1H 0x00, # AI1L 0, # Cantidad de evntos (por ahora sin eventos, poruqe son de 7 bytes ] datos[1] = len(datos) + 2 # Preagregamos el checksum datos += make_cs_bigendian(datos) # Concatenamos el checksum logger.info(' '.join([('%.2x' % i).upper() for i in datos])) datos_cadena = ''.join([chr(i) for i in datos]) assert len(datos) == len(datos_cadena), "Error en la conversion de cadena" while 1: trama = sock_con.recv(255) sock_con.send(datos_cadena) q = Paquete.from_octet_stream(trama) logger.info(q) return 0 if __name__ == '__main__': try: main() # Cuando recibe una interrupcion de teclado except KeyboardInterrupt: TERMINAR = True print "Saliendo del programa"
0xfe, # PORTB 0xac, # PORTC 2, # Cantidad de AI (Analog Input) 0x03, # AI0H 0xFF, # AI0L 0x02, # AI1H 0x00, # AI1L 0, # Cantidad de evntos (por ahora sin eventos, poruqe son de 7 bytes ] datos[1] = len(datos) + 2 # Preagregamos el checksum datos += make_cs_bigendian(datos) # Concatenamos el checksum logger.info(' '.join( [('%.2x' % i).upper() for i in datos])) datos_cadena = ''.join([chr(i) for i in datos]) assert len(datos) == len(datos_cadena), "Error en la conversion de cadena" while 1: trama = sock_con.recv(255); sock_con.send(datos_cadena) q = Paquete.from_octet_stream(trama) logger.info(q) return 0 if __name__ == '__main__': try: main() # Cuando recibe una interrupcion de teclado except KeyboardInterrupt: TERMINAR = True print "Saliendo del programa"
def on_pushEnviarAppString_pressed(self): lista = [ int(x, 16) for x in str(self.lineAppString.text()).split() if len(x)] pkg = Paquete.crear_paquete_custom(self.origen, self.destino, self.secuencia, lista) self.entrada_hexa() self.line_envio.setText(pkg.hex_dump())