CodeSys en RaspberryPi 3 modelo B para propósitos reales + MS SQL. Cálculo del metraje de los productos producidos en la onduladora.

Tabla de contenido

  1. Cálculo del metraje y área de producción (algunas matrices)





  2. Gastos





  3. Volcado de datos con PyODBC





  4. Carga de datos utilizando MsSQL Library SL





Cálculo del metraje y área de producción (algunas matrices)

La matriz del metraje de productos manufacturados por perfiles y formatos es una matriz bidimensional A 6 * 6, que se subdivide en una matriz bidimensional B p * f, donde p = 5 es el perfil de ondulación, f = 5 es el formato, y unidimensional Z p es la suma de los metros producidos por perfiles de corrugación y Z f   - la suma de los metros producidos por formatos. En consecuencia, la matriz Zp es una matriz unidimensional de 5 elementos, es la suma de las columnas de la matriz A, Zf es una matriz unidimensional de 5 elementos, es la suma de las filas de la matriz A. productos.





También se necesitaron 2 matrices unidimensionales más: Sp - el área de productos fabricados por perfiles y Sf - el área de productos fabricados por formatos y una matriz constante F - una matriz unidimensional de 5 elementos - una lista de formatos de materias primas.





¡Ocúpate del relleno! Ahora comienza el álgebra.





La suma de formatos y perfiles se calcula sumando las filas y columnas, respectivamente, de la matriz original A.





 El cálculo de áreas por formato es muy sencillo, simplemente multiplicamos 2 matrices A y F





o





Área por perfiles de ondulación:





Listado de bloques de funciones
FUNCTION_BLOCK Format_math
VAR_INPUT
    EN:BOOL;
    imp:BOOL;
END_VAR
VAR_INPUT RETAIN
    f:INT := 1;
    p:INT := 1;
END_VAR
VAR_INPUT
    l_roll:REAL;
    k_imp:INT;
    res:BOOL;
    res_month:BOOL;
END_VAR
VAR_OUTPUT
    //  [f,p], f=6 -   , p=6 -   
    length_f:ARRAY[1..6, 1..6] OF REAL;
    wS_f:ARRAY [1..5] OF WORD;
    wS_p:ARRAY [1..5] OF WORD;
END_VAR
VAR_OUTPUT RETAIN
    S_f:ARRAY [1..5] OF REAL;
    S_p:ARRAY [1..5] OF REAL;
END_VAR
VAR_OUTPUT
    S_f_month:ARRAY [1..5] OF REAL;
    S_p_month:ARRAY [1..5] OF REAL;
END_VAR
VAR
    imp_old:BOOL;
    f_b: ARRAY [1..5] OF BOOL;
    p_b: ARRAY [1..5] OF BOOL;
    length_f_old:ARRAY[1..6, 1..6] OF REAL;
    i:BYTE;
    j: BYTE;
    k:REAL;
END_VAR
BEGIN
  k:=l_roll/(k_imp*1000);
  IF EN AND not imp AND imp_old THEN
      length_f[f,p]:=length_f[f,p]+k;
      //length_p[p]:=length_p[p]+(l_roll/(k_imp*1000));
  END_IF
  FOR i:=1 TO 5 DO 
      length_f[i,6]:=0;
      length_f[6,i]:=0;
      FOR j:=1 TO 5 DO 
          length_f[i,6]:=length_f[i,6]+length_f[i,j];
          length_f[6,i]:=length_f[6,i]+length_f[j,i];
      END_FOR 
  END_FOR
  CASE f OF
          1: S_f[f]:=length_f[f,6]*1.050/1000;

          2: S_f[f]:=length_f[f,6]*1.250/1000;

          3: S_f[f]:=length_f[f,6]*1.400/1000;

          4: S_f[f]:=length_f[f,6]*1.575/1000;

          5: S_f[f]:=length_f[f,6]*1.600/1000;

  END_CASE

  FOR i:=1 TO 5 DO 
      S_p[i]:=length_f[1,i]*1.05/1000+length_f[2,i]*1.25/1000+length_f[3,i]*1.4/1000+length_f[4,i]*1.575/1000+length_f[5,i]*1.6/1000;
      wS_p[i]:=REAL_TO_WORD(S_p[i]*10);
      wS_f[i]:=REAL_TO_WORD(S_f[i]*10);
  END_FOR
  IF res THEN
      FOR i:=1 TO 6 DO 
          FOR j:=1 TO 6 DO 
              length_f_old[i,j]:=length_f[i,j];
              length_f[i,j]:=0;
          END_FOR 
      END_FOR
      FOR i:=1 TO 5 DO
          S_f_month[i]:=S_f_month[i]+S_f[i];
          S_f[i]:=0;
          S_p_month[i]:=S_p_month[i]+S_p[i];
          S_p[i]:=0;
      END_FOR
  END_IF

  IF res_month THEN
      FOR i:=1 TO 5 DO 
          S_f_month[i]:=0;
          S_p_month[i]:=0;
      END_FOR
  END_IF

  FOR i:=1 TO 5 DO f_b[i]:=0; END_FOR
  FOR i:=1 TO 5 DO p_b[i]:=0; END_FOR
  f_b[f]:=TRUE;
  p_b[p]:=TRUE;
  imp_old:=imp;
END

      
      







Gastos

  • RPI 3 modelo B por 4 mil rublos (en AliExpress 3 mil rublos). Era posible arreglárselas con un RPI más barato de cero (2 mil rublos), pero el marco del sistema inicialmente fue borroso por el TK inexistente (hagamos esto primero, y luego veremos si necesitamos algo más. .. luego ... y luego ...);





  • 24/5 AliExpress 300 . ( );





  • CODESYS Control for Raspberry Pi SL 50 . - RealTime 2 , ;





PyODBC

ODBC Raspberry

:





pi@raspberrypi:~ $ sudo apt-get install python3-dev unixodbc-dev git
pi@raspberrypi:~ $ git clone https://github.com/mkleehammer/pyodbc
pi@raspberrypi:~ $ cd pythodbc
pi@raspberrypi:~ $ import pyodbc
pi@raspberrypi:~ $ python3 setup.py
pi@raspberrypi:~ $ cd /home/pi/pyodbc
pi@raspberrypi:~ $ sudo python3 setup.py build
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install g++
pi@raspberrypi:~ $ sudo apt-get install unixodbc-dev
pi@raspberrypi:~ $ pip install pyodbc
pi@raspberrypi:~ $ odbcinst -j
pi@raspberrypi:~ $ cat /etc/odbcinst.ini
	[FreeTDS]
	Description=FreeTDS Driver v0.91
	Driver=/usr/lib/arm-linux-gnueabihf/odbc/libtdsodbc.so
	Setup=/usr/lib/arm-linux-gnueabihf/odbc/libtdsS.so
	fileusage=1
	dontdlclose=1
	UsageCount=1
pi@raspberrypi:~ $ cat /etc/odbc.ini
	Driver = FreeTDS
	Description = My Test Server
	Trace = No
	ServerName = mssql
	#Port = port
	instance = MSSQLSERVER #(whatever is the service u r runningcould be SQLEXPRESS)
	Database = database_name
	TDS_Version = 4.2
pi@raspberrypi:~ $ sudo nano /etc/freetds/freetds.conf
	[egServer70]
        host = ntmachine.domain.com
        port = 1433
        tds version = 7.0
	[mssql]
        host = server_ip_adress
        instance = MSSQLSERVER
        #Port = port 
        tds version = 4.2

      
      



.





pi@raspberrypi:~ $ sudo python3
	>>> server = '192.168.1.2'
	>>> port = '1433'
	>>> database = 'GA' 
	>>> username = 'plc' 
	>>> password = '123456' 
	>>> cnxn = pyodbc.connect('DRIVER={FreeTDS};SERVER='+server+';PORT='+port+';DATABASE='+database+';UID='+username+';PWD='+ password)
	>>> cursor = cnxn.cursor()
	>>> cursor.execute('select top 10 ID,Val,Date_Time from tbl_Val')
	#cursor.execute('INSERT INTO tbl_Val (ID, Val) VALUES (15, 20)')
	>>> rows=cursor.fetchall()
	>>> for row in rows: print(row.ID, row.Val)

      
      



/home/pi/pyodbc/ “query.py”. , .





import pyodbc
import sys

cnxn = pyodbc.connect('DRIVER={FreeTDS};SERVER='+sys.argv[1]+';PORT='+sys.argv[2]+
                      ';DATABASE='+sys.argv[3]+';UID='+sys.argv[4]+';PWD='
                      + sys.argv[5])
cursor = cnxn.cursor()

cursor.execute('INSERT INTO [Py_Tbl] ([ID], [Val]) VALUES ('+sys.argv[6]+','
               +sys.argv[7]+')')
cnxn.commit()
      
      



5 2 , :





  • IP ;





  • ( MSSQL 1433);





  • ;





  • ;





  • ;





  • ID ;





  • .





SQL_Insert





FUNCTION_BLOCK SQL_Insert
VAR_INPUT
	xExecuteScript: BOOL;	
	Server:STRING := '192.168.1.2';
	PORT:INT := 1433;
	DB_Name:STRING := 'GA';
	login:STRING := 'plc';
	password:STRING := '123456';	
	ID: INT;
	Val: REAL;

END_VAR
VAR	
pResult: POINTER TO SysProcess.SysTypes.RTS_IEC_RESULT;
	Text: string;
END_VAR
BEGIN
  IF xExecuteScript THEN
    text:='sudo python /home/pi/pyodbc/query.py ';
    text:=concat(text,Server);
    text:=concat(text,' ');
    text:=concat(text,INT_TO_STRING(Port));
    text:=concat(text,' ');
    text:=concat(text,DB_Name);
    text:=concat(text,' ');
    text:=concat(text,login);
    text:=concat(text,' ');
    text:=concat(text,password);
    text:=concat(text,' ');
    text:=concat(text,INT_TO_STRING(id));
    text:=concat(text,' ');
    text:=concat(text,REAL_TO_STRING(Val));
    SysProcess.SysProcessExecuteCommand(text,pResult);
    xExecuteScript:=FALSE;
  END_IF
END
      
      







query.py . :





pi@raspberrypi:~ $ sudo python /home/pi/pyodbc/query.py server port DB_name login pass id Value
      
      



DB_send , ID 10 integer Val 10 real.





FUNCTION_BLOCK DB_Send
VAR_INPUT
	id:ARRAY[1..10] OF INT;
	val:ARRAY[1..10] OF REAL;
	Time_send:TIME :=T#60S;
END_VAR
VAR
	SQL_Ins: SQL_Insert;
	TONInst: TON;
	i: int;
END_VAR
BEGIN
  TONInst(IN := NOT(TONInst.Q), PT:= Time_send);
	IF  TONinst.Q THEN
		FOR i:=1 TO 10 DO
			IF id[i]<>0 THEN
				sql_ins(xExecuteScript:=true, ID:=id[i], val:=val[i]);

			END_IF
		END_FOR
	END_IF
END
      
      







? DB_Send , , ID->Val SQL_Inset Python . pyodbc.connect cursor.execute SQL- INSERT… .





MsSQL Library SL

3S-Smart Software Solutions GmbH MsSQL Library SL – (200€) , MsSQL OPC-. TDS . - 2 , , , , 2 , , PyODBC.





:





  • SELECT





  • INSERT





  • UPDATE





  • DELETE





  • Execute Stored procedures





5 SQL IEC:





  • BOOL





  • DINT





  • REAL





  • STRING





  • DATETIME





4- :





  • fbMsSQL_compact





  • fbMsSQL para la comunicación de bases de datos





  • fbPing para verificar la disponibilidad de un host remoto





  • fbFIFOQuery para manejar más consultas SQL a lo largo del tiempo





Tiene 4 plantillas de renderización predeterminadas





  • credenciales de acceso





  • procedimiento de inicio de sesión





  • ventana de consulta





  • ventana de respuesta





Descargue e instale el paquete desde store.codesys.com. Después de instalar el paquete MsSQL Library SL en el directorio de destino .. \ CODESYS MsSQL SL Library \ V1.4.0.5 \ Examples \ Raspberry Pi, se descomprime un ejemplo ilustrativo del uso de la biblioteca.





La página para conectarse a la base de datos y mostrar datos.












All Articles