jueves, 14 de julio de 2022

lunes, 8 de noviembre de 2021

Linux - error con avrdude con libusb

El problema surgio al ejecutar  avrdude  -v

avrdude: symbol lookup error: /lib/x86_64-linux-gnu/libhidapi-libusb.so.0: undefined symbol: libusb_handle_events_completed

solucionamos de la siguiente manera, en la consola

export LD_LIBRARY_PATH="/lib/x86_64-linux-gnu/"


domingo, 7 de febrero de 2021

PLC M340 - Problemas con el FBD ADD - suma numeros reales

El inconveniente surgió cuando al corregir el valor del contador, el mismo sufría un desplazamiento, se atrasaba o se adelantaba. 

Tenemos un caudalimetro de gas, el cual produce un pulso cada tantas vueltas indicando un cambio en el primer decimal.

Observamos que justo en la foto esta por cambiar el primer decimal y a la vez el caudalimetro produciría un pulso, el cual va un pin de entrada de una ER.

 
 
En la imagen tenemos varios FBD, donde  ADD esta seteado de la siguiente manera:

VOL_CONS_CALENTADOR = VOL_CONS_CALENTADOR + 0,1  por cada pulso.

Al simular observamos lo siguiente:

 

Vemos que al simular un par de pulsos la suma paso a tener varios decimales, en la siguiente imagen vamos a poder apreciar el desplazamiento que ocurre.

La solución fue la siguiente, tomando en cuenta de no modificar el tipo de dato esperado en el scada.

AUX = AUX + 1.0  por cada pulso.

VOL_CONS_CALENTADOR = AUX / 10.0

En la simulación observamos que los decimales extras ya no estan "presentes", al dar 23 pulsos.



lunes, 25 de mayo de 2020

PLC M580 en modo STOP PLCDiagCom

Comparto la siguiente experiencia con un PLC M580 por algún motivo paso a modo STOP, al no tener el software UnityPro y su proyecto encontré una solución en el siguiente link. https://www.se.com/es/es/faqs/FA150522/ .
Donde use VirtualBox para poder correr la aplicación, el cual usa modbus y codigos de funciones de Schneider Electric (code 90), podemos observar mas en las siguientes capturas de pantalla. https://www.tenable.com/plugins/nessus/97436


lunes, 18 de mayo de 2020

Gambas3 cliente MODBUS RTU - Fase en desarrollo

' Gambas class file

Public ADU[254] As Integer
Public Nregistros As Integer
Public Nbytes As Integer
Public BYTES[1024] As Integer

' Conectar al puerto serie

Public Sub Button2_Click()

  SerialPort1.PortName = TextBox1.Text
  SerialPort1.Speed = TextBox2.Text  
  SerialPort1.Open()  
  
  TextBox6.text = "Puerto : " & SerialPort1.PortName & " Configuracion : " &  
  SerialPort1.Speed & "," & SerialPort1.Parity & "," & SerialPort1.DataBits & "," & SerialPort1.StopBits
  
  Button1.Enabled = True
  Button4.Enabled = True
  Button2.Enabled = False

End

' Desconectar del puerto serie
Public Sub Button4_Click()

  SerialPort1.Close()
  TextArea1.text = TextArea1.text & SerialPort1.Status
  
  Button4.Enabled = False
  Button2.Enabled = True
End

' Salir de la aplicacion

Public Sub Button3_Click()
  SerialPort1.Close()
  Quit
End

Public Sub Button5_Click()
  TextArea3.Clear()
  TextArea1.Clear()
End

' Envio de la consulta modbus
Public Sub Button1_Click()
  Dim DireccionHI As Integer
  Dim DireccionLO As Integer
  Dim DatoHI As Integer
  Dim DatoLO As Integer
  Dim ID As Integer
  Dim Funcion As Integer  
  Dim CRCLO, CRCHI, i As Integer
  Dim CRC As String
   
  Nbytes = 0
  TextArea2.text = TextArea2.text & "\n"
   
  'ID
  ADU[0] = TextBox3.text
  
  'Funcion
  ADU[1] = ComboBox1.Index + 1
  
  'Direccion HI
  ADU[2] = 0
  
  'Direccion LO
  ADU[3] = SpinBox1.Text
  
  'Numero de registros/DATO HI
  If ((ComboBox1.Index + 1) = 5) Or ((ComboBox1.Index + 1) = 6) Then
    ADU[4] = TextBox5.Text
  Else
    ADU[4] = 0
  Endif
  
  'Numero de registros/DATO LO
  If ((ComboBox1.Index + 1) = 5) Or ((ComboBox1.Index + 1) = 6) Then
     ADU[5] = TextBox4.Text
  Else  
     ADU[5] = SpinBox2.Text
  Endif
  
  Nregistros = SpinBox2.Text
  
  CRC = Hex(CRC16(5))
  
  If Len(CRC) < 4 Then
    ADU[6] = HEX_DEC(Right$(CRC, 2))
    ADU[7] = HEX_DEC(Left$(CRC, 1))    
  Else
    ADU[6] = HEX_DEC(Right$(CRC, 2))
    ADU[7] = HEX_DEC(Left$(CRC, 2))    
  Endif
  
  For i = 0 To 1
    TextArea1.Text = TextArea1.text & i & ":" & ADU[i] & "  "    
  Next
  TextArea1.Text = TextArea1.text & "\n"
  
  For i = 2 To 7
    TextArea3.Text = TextArea3.text & i & ":" & ADU[i] & "  "    
  Next
  TextArea3.Text = TextArea3.text & "\n"
  
    
  For i = 0 To 7
    Write #SerialPort1, Chr$(ADU[i])
  Next
End


Function CRC16(n As Integer) As Integer
  Dim i, pos As Integer 
  Dim CRC As Integer
  CRC = 65535 
  
  For pos = 0 To n
    CRC = CRC Xor ADU[pos]    
    For i = 0 To 7
      If ((CRC And 1) <> 0) Then
        CRC = Lsr(CRC, 1)
        CRC = CRC Xor 40961
      Else
        CRC = Lsr(CRC, 1)  
      Endif    
    Next
  Next
  
 Return CRC
End

Function HEX_DEC(aux As String) As Integer
  Dim a, b, c, l As Integer
  Dim d As String
  c = 0

  l = Len(aux)
  For a = 1 To l
    d = Mid$(aux, a, 1)
    Select Case d
      Case "A"
        b = 10
      Case "B"
        b = 11
      Case "C"
        b = 12
      Case "D"
        b = 13
      Case "E"
        b = 14
      Case "F"
        b = 15
      Case Else
        b = CInt(d)
    End Select   
   
    c = c + (b * 16 ^ (l - a))    
   
  Next    
  Return c
End

'Recepcion de datos seriales 
Public Sub SerialPort1_Read()
  Dim DATO_BYTE As String
      
  Read #SerialPort1, DATO_BYTE, 1  
    
  TextArea2.text = TextArea2.text & Nbytes & ":" & Hex(Asc(DATO_BYTE)) & "  "   
  
  Nbytes = Nbytes + 1
   
 End


Public Sub Button6_Click()
  TextArea2.Clear()

End

Public Sub Form_Open()

  Nbytes = 0
  
End

Public Sub Button7_Click()

  TextArea2.text = TextArea2.text & "\n"

End

 
 

miércoles, 6 de mayo de 2020

App Inventor Arduino MLX90614 - Prueba

#include <Wire.h>;
#include <Adafruit_MLX90614.h>;
 
Adafruit_MLX90614 mlx = Adafruit_MLX90614();

String inputString = "";       
bool stringComplete = false; 

//-----------------------------------------------
//                 CONFIGURACION
//-----------------------------------------------
void setup() {

  inputString.reserve(32);
  Serial.begin(9600); 
  mlx.begin();  
}

//-----------------------------------------------
//                  MAIN
//-----------------------------------------------
void loop() {  
  
  if (stringComplete) {
    if(inputString.substring(0,2)=="MT"){
      
     Serial.print(mlx.readAmbientTempC()); 
     Serial.print("/"); 
     Serial.print(mlx.readObjectTempC());
  } 

    
    inputString = "";
    stringComplete = false;
  }  
}

//-----------------------------------------------
void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
//----------------------------------------------- 
 
 

lunes, 23 de marzo de 2020

Sistema de observacion de seguridad

Programa creado con App Inventor para facilitar hacer observaciones al personal durante la realizacion de alguna tarea, fase a prueba.

Link de descarga:
sos.apk

lunes, 22 de julio de 2019

Planilla de recorrida Wartsila 18V50 SG v0.1

Planillas creadas para realizar la ronda de operaciones, estado en prueba.

Planilla de recorrida Lectura del fuelle

viernes, 7 de diciembre de 2018

pymodbus TCP cliente mysql tabla - ejemplo

Enscript Output
 Crear primero la BD llamada MODBUS_SCADA

 CREATE TABLE  ReadCoils (
     idReadCoils INT NOT NULL AUTO_INCREMENT,
     CO1    CHARACTER,
     CO2    CHARACTER,
     CO3    CHARACTER,
     CO4    CHARACTER,    
     CO5    CHARACTER,
     CO6    CHARACTER,
     CO7    CHARACTER,
     CO8    CHARACTER, 
     PRIMARY KEY (idReadCoils)
 ) ENGINE=InnoDB;

 CREATE TABLE ReadDiscreteInput (
     idReadDiscreteInput INT NOT NULL AUTO_INCREMENT,
     DI1    CHARACTER,
     DI2    CHARACTER,
     DI3    CHARACTER,
     DI4    CHARACTER,    
     DI5    CHARACTER,
     DI6    CHARACTER,
     DI7    CHARACTER,
     DI8    CHARACTER, 
     PRIMARY KEY (idReadDiscreteInput)
 ) ENGINE=InnoDB;

 CREATE TABLE ReadHoldingRegisters (
     idReadHoldingRegisters INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     HR1    INT,
     HR2    INT,
     HR3    INT,
     HR4    INT,
     HR5    INT,
     HR6    INT,
     HR7    INT,
     HR8    INT
 ) ENGINE=InnoDB;

 CREATE TABLE ReadInputRegisters (
     idReadInputRegisters INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     IR1    INT,
     IR2    INT,
     IR3    INT,
     IR4    INT,
     IR5    INT,
     IR6    INT,
     IR7    INT,
     IR8    INT
 ) ENGINE=InnoDB;





Generated by GNU Enscript 1.6.5.90.

pymodbus TCP cliente mysql - ejemplo

Enscript Output
import os
import MySQLdb
from pymodbus.client.sync import ModbusTcpClient

cliente = ModbusTcpClient('127.0.0.1','5020')
#---------------------------------------------------------------------------# 
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

Dispositivo = 1
#---------------------------------------------------------------------------#
def CONSULTA_SQL(COMANDO, DISPOSITIVO, a, b, c, d, e, f, g, h): 
  coneccion = MySQLdb.connect("localhost","root","holanena69","MODBUS_SCADA")
  BD = coneccion.cursor()

  if COMANDO == 1:
    BD.execute("""INSERT INTO ReadCoils (CO1, CO2, CO3, CO4, CO5, CO6, CO7, CO8) VALUES (%c, %c, %c, %c, %c, %c, %c, %c)""",(a, b, c, d, e, f, g, h))

  elif COMANDO == 2:
    BD.execute("""INSERT INTO ReadDiscreteInput (DI1, DI2, DI3, DI4, DI5, DI6, DI7, DI8) VALUES (%c, %c, %c, %c, %c, %c, %c, %c)""",(a, b, c, d, e, f, g, h))

  elif COMANDO == 3:
    BD.execute("""INSERT INTO ReadHoldingRegisters (HR1, HR2, HR3, HR4, HR5, HR6, HR7, HR8) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)""",(a, b, c, d, e, f, g, h))

  elif COMANDO == 4:  
    BD.execute("""INSERT INTO  ReadInputRegisters (IR1, IR2, IR3, IR4, IR5, IR6, IR7, IR8) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)""",(a, b, c, d, e, f, g, h))

  coneccion.commit() 

  BD.close()
  coneccion.close()

#---------------------------------------------------------------------------#    
os.system('clear')

print "Read Coils"
request = cliente.read_coils(0x0,0x8,unit=Dispositivo)
print request.bits[0]
print request.bits[1]
print request.bits[2]
print request.bits[3]
print request.bits[4]
print request.bits[5]
print request.bits[6]
print request.bits[7]

CONSULTA_SQL(1,0,request.bits[0], request.bits[1], request.bits[2], request.bits[3], request.bits[4], request.bits[5], request.bits[6], request.bits[7])


print "Read Discrete Input"
request = cliente.read_discrete_inputs(0x0,0x8,unit=Dispositivo)
print request.bits[0]
print request.bits[1]
print request.bits[2]
print request.bits[3]
print request.bits[4]
print request.bits[5]
print request.bits[6]
print request.bits[7]
CONSULTA_SQL(2,0,request.bits[0], request.bits[1], request.bits[2], request.bits[3], request.bits[4], request.bits[5], request.bits[6], request.bits[7])


print "Read Holding Registers"
request = cliente.read_holding_registers(0x0,0x7,unit=Dispositivo)
print request.registers
print type(request.registers[0])

CONSULTA_SQL(3,0,request.registers[0], request.registers[1], request.registers[2], request.registers[3], request.registers[4], request.registers[5], request.registers[6], 9)



print "Read Input Registers"
request = cliente.read_input_registers(0x0,0x7,unit=Dispositivo)
print request.registers
CONSULTA_SQL(4,0,request.registers[0], request.registers[1], request.registers[2], request.registers[3], request.registers[4], request.registers[5], request.registers[6], 9)



cliente.close()






Generated by GNU Enscript 1.6.5.90.

martes, 27 de noviembre de 2018

pymodbus TCP cliente - ejemplo

Enscript Output
import os
from pymodbus.client.sync import ModbusTcpClient

cliente = ModbusTcpClient('127.0.0.1','5020')
#---------------------------------------------------------------------------# 
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

#---------------------------------------------------------------------------# 
os.system('clear')

print "Read Coils"
request = cliente.read_coils(0x0,0x8,unit=1)
print request.bits[0]
print request.bits[1]
print request.bits[2]
print request.bits[3]
print request.bits[4]
print request.bits[5]
print request.bits[6]
print request.bits[7]


print "Read Discrete Input"
request = cliente.read_discrete_inputs(0x0,0x8,unit=1)
print request.bits[0]
print request.bits[1]
print request.bits[2]
print request.bits[3]
print request.bits[4]
print request.bits[5]
print request.bits[6]
print request.bits[7]


print "Read Holding Registers"
request = cliente.read_holding_registers(0x0,0x7,unit=1)
print request.registers


print "Read Input Registers"
request = cliente.read_input_registers(0x0,0x7,unit=1)
print request.registers

cliente.close()


Generated by GNU Enscript 1.6.5.90.

pymodbus TCP server - ejemplo

Enscript Output
#!/usr/bin/env python

#---------------------------------------------------------------------------# 
import os
from pymodbus.server.async import StartTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer

#---------------------------------------------------------------------------# 

import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

os.system('clear')
#---------------------------------------------------------------------------# 
# di - entradas discretas
# co - coils 
# hr - holding registros
# ir - input registros

hr01 = 100
hr02 = 110
hr03 = 120
hr04 = 130
hr05 = 140
hr06 = 150
hr07 = 160
hr08 = 170

ir01 = 100
ir02 = 110
ir03 = 120
ir04 = 130
ir05 = 140
ir06 = 150
ir07 = 160
ir08 = 170

Reg_DI = [1,0,1,1,1,1,1,0,1]
Reg_CO = [1,0,1,0,1,0,1,0,1]
Reg_HR = [hr01, hr02, hr03, hr04, hr05, hr06, hr07, hr08]
Reg_IR = [ir01, ir02, ir03, ir04, ir05, ir06, ir07, ir08]


store = ModbusSlaveContext(
        di=ModbusSequentialDataBlock(0, Reg_DI),
        co=ModbusSequentialDataBlock(0, Reg_CO),
        hr=ModbusSequentialDataBlock(0, Reg_HR),
        ir=ModbusSequentialDataBlock(0, Reg_IR))

context = ModbusServerContext(slaves=store, single=True)

#---------------------------------------------------------------------------# 
identity = ModbusDeviceIdentification()
identity.VendorName  = 'Pymodbus TCP'
identity.VendorUrl   = 'http://www.chispolinux.blogspot.com'
identity.ProductName = 'Simulador de dispositivos by JMQ'
identity.MajorMinorRevision = '1.0'

#---------------------------------------------------------------------------# 
StartTcpServer(context, identity=identity, address=("localhost", 5020))



Generated by GNU Enscript 1.6.5.90.

domingo, 18 de noviembre de 2018

Pymodbus rtu cliente serie

Enscript Output
import os
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
#---------------------------------------------------------------------------# 
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

#---------------------------------------------------------------------------# 
cliente = ModbusClient(method='rtu', port='/dev/ttyUSB0', timeout=1, stopbits = 1, bytesize = 8,  parity='N', baudrate= 9600)
cliente.connect()

os.system('clear')

print "Read Coils"
request = cliente.read_coils(0x0,0x8,unit=1)
print request.bits[0]
print request.bits[1]
print request.bits[2]

print "Read Discrete Input"
request = cliente.read_discrete_inputs(0x0,0x8,unit=1)
print request

print "Read Holding Registers"
request = cliente.read_holding_registers(0x0,0x7,unit=1)
print request.registers


print "Read Input Registers"
request = cliente.read_input_registers(0x0,0x7,unit=1)
print request.registers

Generated by GNU Enscript 1.6.5.90.

Pymodbus rtu maestro serie

Enscript Output
#!/usr/bin/env python

#---------------------------------------------------------------------------# 
from pymodbus.server.async import StartSerialServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer

#---------------------------------------------------------------------------# 
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

#---------------------------------------------------------------------------# 
# di - entradas discretas
# co - coils 
# hr - holding registros
# ir - input registros

hr01 = 100
hr02 = 110
hr03 = 120
hr04 = 130
hr05 = 140
hr06 = 150
hr07 = 160
hr08 = 170

ir01 = 100
ir02 = 110
ir03 = 120
ir04 = 130
ir05 = 140
ir06 = 150
ir07 = 160
ir08 = 170

Reg_DI = [1,0,1,1,1,1,1,0,1]
Reg_CO = [1,0,1,1,1,1,1,0,1]
Reg_HR = [hr01, hr02, hr03, hr04, hr05, hr06, hr07, hr08]
Reg_IR = [ir01, ir02, ir03, ir04, ir05, ir06, ir07, ir08]


store = ModbusSlaveContext(
        di=ModbusSequentialDataBlock(0, Reg_DI),
        co=ModbusSequentialDataBlock(0, Reg_CO),
        hr=ModbusSequentialDataBlock(0, Reg_HR),
        ir=ModbusSequentialDataBlock(0, Reg_IR))

esclavos = {
            0x01: store,
            0x02: store,
            0x03: store,
            0x04: store,
            0x05: store,
            0x06: store,
            0x07: store,
            0x08: store,
           }

context = ModbusServerContext(slaves=esclavos, single=False)

#---------------------------------------------------------------------------# 
identity = ModbusDeviceIdentification()
identity.VendorName  = 'Pymodbus SERIE'
identity.VendorUrl   = 'http://www.chispolinux.blogspot.com'
identity.ProductName = 'Simulador de dispositivos by JMQ'
identity.MajorMinorRevision = '1.0'

#---------------------------------------------------------------------------# 
StartSerialServer(context, identity=identity, port='/dev/ttyUSB1', baudrate='9600', framer=ModbusRtuFramer)




Generated by GNU Enscript 1.6.5.90.

martes, 13 de noviembre de 2018

CVM 96 Python MODBUS

Enscript Output
import os
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
#---------------------------------------------------------------------------# 
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

#---------------------------------------------------------------------------# 
client = ModbusClient(method='rtu', port='/dev/ttyUSB0', timeout=1, stopbits = 1, bytesize = 8,  parity='N', baudrate= 9600)
client.connect()

os.system('clear')

request = client.read_input_registers(0x0,0x1E,unit=1)
print request.registers

print "V1    :", request.registers[0], request.registers[1]
print "A1    :", request.registers[2], request.registers[3]
print "KW1   :", request.registers[4], request.registers[5]
print "Kvar1 :", request.registers[6], request.registers[7]
print "PF1   :", request.registers[8], request.registers[9]
print ""
print "V2    :", request.registers[10], request.registers[11]
print "A2    :", request.registers[12], request.registers[13]
print "KW2   :", request.registers[14], request.registers[15]
print "Kvar2 :", request.registers[16], request.registers[17]
print "PF2   :", request.registers[18], request.registers[19]
print ""
print "V3    :", request.registers[20], request.registers[21]
print "A3    :", request.registers[22], request.registers[23]
print "KW3   :", request.registers[24], request.registers[25]
print "Kvar3 :", request.registers[26], request.registers[27]
print "PF3   :", request.registers[28], request.registers[29]






Generated by GNU Enscript 1.6.5.90.

IRC

#freenode->#usljujuy

Seguidores

Eventos n_n

Tira Ecol Nano,Bilo y Luca