Advertisement
Guest User

Modbus

a guest
Aug 26th, 2011
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.82 KB | None | 0 0
  1. # Modbus.py
  2. # Implementacion de funciones modbus sobre TCP/IP Usando Sockets
  3.  
  4. import sys
  5. import socket
  6. import array
  7. from struct import *
  8. import time
  9. from PyQt4 import QtCore, QtGui
  10. from PyQt4.QtCore import *
  11. import ConfigParser
  12.  
  13. class Modbus(QObject):
  14.     debug_mode = False
  15.  
  16.     def __init__(self,parent = None):
  17.         QObject.__init__(self,parent)
  18.         self.parent = parent
  19.        
  20.         self.s = socket.socket()
  21.        
  22.         self.config = ConfigParser.ConfigParser()
  23.         self.config.readfp(open('main.conf'))
  24.         self.conectar()
  25.  
  26.     def conectar(self):
  27.         try:
  28.             self.s = socket.socket()
  29.  
  30.             self.s.settimeout(4)
  31.             print "connect("+str(self.config.get('Modbus', 'IP'))+","+str(self.config.get('Modbus', 'PORT'))
  32.             self.s.connect((str(self.config.get('Modbus', 'IP')), int(self.config.get('Modbus', 'PORT'))))
  33.             print "Done"
  34.             """
  35.            self.client = ModbusClient(str("192.168.0.201"),8000) """
  36.  
  37.         except socket.error, e: ## Entra en un loop de reintentos hasta que se comunica
  38.             if self.criticalMessage(e) == 1:
  39.                 print("Aborte")
  40.             else:
  41.                 self.conectar()
  42.  
  43.     def getInt32Bits(self, dir = 0,  var = 1):
  44.         try:
  45.             mensaje ="\x00\x00\x00\x00\x00\x06\x01\x03"+pack('!h',dir )+pack('!h',int(var) )
  46.             self.s.send(mensaje)
  47.             time.sleep(1)
  48.             respuesta=""
  49.             MSGLEN = (11)
  50.             while len(respuesta) < MSGLEN:
  51.                 chunk = self.s.recv(MSGLEN-len(respuesta))
  52.                 respuesta = respuesta + chunk
  53.  
  54.         except socket.error, e: ## Entra en un loop de reintentos hasta que se comunica
  55.             if self.criticalMessage(e) == 1:
  56.                 print "Aborte"
  57.             else:
  58.                 self.getInt32Bits(dir,var)
  59.  
  60.         if(self.debug_mode==True):
  61.             print "Modbus.py - getInt32Bits("+str(dir)+")"
  62.             print "TX: "+str(repr(mensaje))
  63.             print "RX: "+str(repr(respuesta))
  64.         return unpack('!h', respuesta[9]+respuesta[10])[0]
  65.  
  66.     def getInt32BitsArray(self, dir = 0,  var = 1):  # IMPLEMENTAR, Arreglar!
  67.         try:
  68.             CountA = 0
  69.             original = array.array('f')
  70.             mensaje ="\x00\x00\x00\x00\x00\x06\x01\x03"+pack('!h',dir)+pack('!h',var)
  71.             self.s.send(mensaje)
  72.            
  73.             respuesta = self.s.recv(9+var*2)
  74.    
  75.             print repr(respuesta)
  76.             while CountA<=(var-1)*2:
  77.                 original.append(unpack('!h', respuesta[9+CountA]+respuesta[10+CountA])[0])
  78.                 CountA = CountA + 2
  79.  
  80.        
  81.         except socket.error,  e:
  82.             if self.criticalMessage(e) == 1:
  83.                 print "Aborte"
  84.             else:
  85.                 self.getInt32Bits(dir,var)
  86.         return original
  87.  
  88.     def setInt32Bits(self, dir = 0,  var =0):
  89.         #print ("setInt32Bits")
  90.         mensaje ="\x00\x00\x00\x00\x00\x06\x01\x06"+pack('!h',dir)+pack('!h',var)
  91.         try:
  92.             self.s.send(mensaje)
  93.         except socket.error, e:
  94.             print "Error"
  95.             return "Error"
  96.    
  97.         #respuesta = self.s.recv(11)
  98.         respuesta=""
  99.         MSGLEN = (12)
  100.         while len(respuesta) < MSGLEN:
  101.             chunk = self.s.recv(MSGLEN-len(respuesta))
  102.             if chunk == '':
  103.                 raise RuntimeError, "conexion interrumpida"
  104.             respuesta = respuesta + chunk
  105.  
  106.         if(self.debug_mode==True):
  107.             print "Modbus.py - setInt32Bits("+str(dir)+","+str(var)+")"
  108.             print "TX: "+str(repr(mensaje))
  109.             print "RX: "+str(repr(respuesta))
  110.  
  111.     def setInt32BitsArray(self, dir = 0,  var =0):
  112.         #print ("setInt32BitsArray")
  113.         mensaje = "\x00\x00\x00\x00"+pack('!h',7+len(var)*2)+"\x01\x10"+pack('!h',dir)+pack('!h',len(var))+pack('B',len(var)*2)
  114.         for countA in range(len(var)):
  115.             mensaje = mensaje + pack('!h',var[countA])
  116.         self.s.send(mensaje)
  117.  
  118.     def cerrar(self):
  119.         self.s.close()
  120.    
  121.     def setText(self, dir = 0,  var =0):
  122.  
  123.         cadena =  self.netorderString(var)
  124.         print (7+len(cadena))
  125.         mensaje = "\x00\x00\x00\x00"+pack('!h',7+len(cadena))+"\x01\x10"+pack('!h',dir)+pack('!h',len(cadena)/2)+pack('B',len(cadena))+cadena
  126.         self.s.send(mensaje)
  127.  
  128.         print repr(mensaje)
  129.    
  130.     def netorderString(self, original):
  131.         original = array.array('c', original)
  132.         countA = 0
  133.         if (len(original.tostring())%2 != 0):
  134.             original.append(" ")
  135.        
  136.         while countA <= len(original.tostring())-1:
  137.             var = original[countA]
  138.             original[countA] = original[countA+1]
  139.             original[countA+1] = var
  140.             #print countA
  141.             #print str(original)
  142.             countA = countA + 2
  143.  
  144.         return original.tostring()
  145.  
  146.     def criticalMessage(self,message):    
  147.         reply = QtGui.QMessageBox.critical(None, "MODBUS ERROR",
  148.                 "Error de comunicacion:\n"+str(message),
  149.                 QtGui.QMessageBox.Abort | QtGui.QMessageBox.Retry )
  150.         if reply == QtGui.QMessageBox.Abort:
  151.             return 1    #Retorno Abortar
  152.         else:
  153.             return 0    #Retorno Reintentar
  154.  
  155. #mo = Modbus()
  156.  
  157. #mo.setInt32BitsArray(115, (2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 16, 17, 18, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 16, 17, 18, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18))
  158. #while (True):
  159. #    print str(mo.getInt32Bits(297)) + str(mo.getInt32Bits(298)) + str(mo.getInt32Bits(299))
  160. #while True:
  161. #    print mo.getInt32BitsArray(297, 3)
  162. #    time.sleep(0.5)
  163. #mo.cerrar()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement