Sunday, November 10, 2019

faster CSV grapher for nRF24L01

//import io.inventit.processing.android.serial.*;

import processing.serial.*;
import static javax.swing.JOptionPane.*;
//import processing.net.*;
//Client ennodaClient;
Serial envazhi;
int nikazhmadhippu1, nikazhmadhippu2, nikazhmadhippu3;
int z=10;

int[] akalavu;
int[] meiyalavu;
int[] uyiralavu;
int ullpiri;
int i,d,p;
//int value=20;

void setup()
{
 
 
 
 //  fill(180, 0, 0);
 // for (d=0; d<1080; d++){
 // text ("rajaguru", 600, d); }
 
  //text ("rajaguru", 600, 800);
 
 
  fullScreen();
  //size(1000, 550);
  frameRate(60);
   
  strokeWeight(1);
  smooth(); // or noSmooth();
  akalavu = new int[200];
  meiyalavu = new int[200];
  uyiralavu = new int[200];
  String portName = Serial.list()[0];
  envazhi = new Serial(this, portName, 230400);

 // text("STOP",1855,30);
 
 
 
}

void draw()
{
 
  fill(0, 0, 180);
  if (d<300)
   {
    background(255);
    //textSize(5+d);
    textSize(20);
    text ("rajaguru", 1920-d, 600);
    d+=5;
   }
  fill(255,255, 255);
 
 
  //text("STOP",1855,20);
  //fill(20);
  line(1850,10, 1900, 50);
  line(1900,10, 1850, 50);
  line(1900,10, 1900, 50);
  line(1900,50, 1850, 50);
  line(1850,10, 1850, 50);
  line(1850,10, 1900, 10);
 
  textSize(12);
 
 
 
  String ull = envazhi.readStringUntil('\n');

  if(ull != null)
  {
     
   int[] ullpiri = int(split(ull, ","));
 
   nikazhmadhippu1 = abs(int(ullpiri[0]));
   nikazhmadhippu2 = abs(int(ullpiri[1]));
   nikazhmadhippu3 = abs(int(ullpiri[2]));
   background(255);
   int lowest = min(ullpiri);
   int highest = max(ullpiri);
   p++;
   println( p);
 
   
   {
 
     for(int i = 1; i < 200; i++)
        {
       
          akalavu[i-1] = akalavu[i]; //shifting every value to previous array-element ANDDDDDDDDD storing 200 subsequent values in  200 array-elements
          meiyalavu[i-1] = meiyalavu[i];
          uyiralavu[i-1] = uyiralavu[i];
        }
       
             
       // print(lowest);
       // print(",");
       // println(highest);
      //  println();
       
   akalavu[200-1] = int (map(nikazhmadhippu1, lowest, highest, 20, 500)) ;
   meiyalavu[200-1] = int( map(nikazhmadhippu2, lowest, highest, 400, 1000));
   uyiralavu[200-1] = int( map(nikazhmadhippu3, lowest, highest, 20, 600));

  }
 
    {     
     beginShape();
      strokeWeight(2);
      stroke(0, 0, 250); //(rgb) colored lines, blue for z-axis
      {
       int j=1;
       int i=1;
      // int d=0;
      //plotting allllllllllllllllll 100 array-elements in x-y graph here.       
      // variable-i gives 100 numbers of array-elements which are plotted on the y-axis; variable-j gives the x-axis position.
      // variable z helps to increase or decrease the x-axis-gap between 2 successive inputs.
       for (i=1, j=1; i<199 && j <(z*200); i++, j= j+z)
        {   
         
  //if (d<10800){
 // for (d=0; d<10800; d+=10){
 // text ("rajaguru", 600, d/10); }}
         
           if (akalavu[i-1]>0){
         curveVertex(j, akalavu[i-1]); //as the loop runs, on every loop a single vertex-point is fixed in the display-window-matrix and....on next loop another vertex-point is fixed. and those 2 points get linked by a curve.
                 
           }
         
        }                             //this logic of curve-fitting between 2 successive points continues till the end of THIS "for" loop, resulting in the curve-plot.
     
      }
     endShape();   
    }

    //x-axis
   
      {     
      beginShape();
      strokeWeight(2);
      stroke(0, 250, 0); //green for x-axis
       {
       int j=1;
       int i=1;
     
       for (i=1, j=1; i<199 && j <(z*200); i++, j= j+z)
        {           
          if (uyiralavu[i-1]>0){
          curveVertex(j, uyiralavu[i-1]); //as the loop runs, on every loop a single vertex-point is fixed in the display-window-matrix and....on next loop another vertex-point is fixed. and those 2 points get linked by a curve.
         
         
         }
        }                           
   
       }
      endShape();   
      }
   
    //y-axis 
   
      {     
      beginShape();
      strokeWeight(2);
      stroke(250, 0, 0); //red for y-axis
       {
       int j=1;
       int i=1;
   
       for (i=1, j=1; i<199 && j <(z*200); i++, j= j+z)
        {                                             
         if (meiyalavu[i-1]>0){
         curveVertex(j, meiyalavu[i-1]);
         }
        }                           
     
       }
      endShape();   
      }
 
  }
 
 nEram();
  framerate();
 //name();

}

//void name() {
 // PImage padam1, padam2, padam3, padam4, padam5, padam6, padam7;
  //fill(80, 80, 200);
 // text ("rajaguru", 1550, 100);
  //fill(255, 255, 255);
  //padam2 = loadImage("enperu.png");
  //image(padam2, 1000, 0, 129, 29);
 // padam1 = loadImage("tamilsource.png");
 // image(padam1, 10, 5, 50, 50);
  //padam3 = loadImage ("rate.png");
 // image(padam3, 215, 15, 325, 28);
  //padam4 = loadImage ("count.png");
  //image(padam4, 248, 43, 292, 25);
  //padam5 = loadImage ("duration.png");
  //image(padam5, 200, 68, 340, 28);
  //padam6 = loadImage ("time.png");
  //image(padam6, 333, 93, 207, 26);
  //padam7 = loadImage ("axes.png");
  //image(padam7, 70, 5, 108, 115);
 
  //image(padam2, 0, 230, 100, 20);
//}

void nEram(){
  textSize(15);
  fill(180, 0, 0);
 // int maNi = hour();
 // int nimidam = minute();
 // int nodi = second();

  //text (maNi, 550,110);
  //text (": "+ nimidam, 570, 110);
  //text ( " : " + nodi, 590, 110);
  //text ("hrs", 620,110);
  //text (System.nanoTime(), 620,110);
  //text (System.currentTimeMillis(), 620,110);
  fill(0, 0, 180);
  text (nikazhmadhippu1, 80, 33,10);
  //text ("rajaguru", 980,20);
  fill(180, 0, 0);
  text (nikazhmadhippu2, 120, 33, 10);
  fill(0, 180, 0); //green
  text (nikazhmadhippu3, 160, 33,10);
 
  fill(0, 0, 255);

}

void framerate(){
  text (frameRate, 545, 33);
 
  //text ("frame-eNNikkai / count:", 500, 55);
  //text ("Odum-nEram, nodiyil //running-duration, sec: ", 380, 40);
  text (frameCount, 630, 33);
  text (millis()/1000, 500, 33);
  fill(255, 255, 255);
}
void mouseClicked(){
  if ((mouseX>1850&&mouseX<1900)&&(mouseY>10&&mouseY<50))
     {
       //showMessageDialog(null, "do you want to close?!!!",
   // "Alert", ERROR_MESSAGE);
   
    int reply = showConfirmDialog(null, "want to close?!", "Usaaru / Alert",YES_NO_OPTION);
        if (reply == YES_OPTION)
        { exit();
          showMessageDialog(null, "bye!", "Seidhi / Message", ERROR_MESSAGE);
        }
       // else {
           //showMessageDialog(null, "do u want to close?!");
           //System.exit(0);
       // }
   
  //  if (keyPressed) {
   // if (key == 'y' || key == 'Y') {exit();}}
  }
}


  

nRF24L01_Rx

#include <SPI.h>

#include <RF24_config.h>
#include <RF24.h>
#include <printf.h>
#include <nRF24L01.h>

RF24 radio(7,8);
byte addresses[][6] = {"12"};

typedef struct
{
  int x, y, z;
}dataStruct;

 dataStruct data;

 void setup()
 {
   Serial.begin(230400);
   radio.begin();
   radio.openReadingPipe(0, addresses[0]);
   radio.startListening();
 }

 void loop()
 {
   if(radio.available())
   {
     radio.read(&data,sizeof(data));
   
     Serial.print(data.x);
     Serial.print(",");
     Serial.print(data.y);
     Serial.print(",");
     Serial.print(data.z);
     Serial.print(",");
     Serial.println();
   }
 }

adxl345_and_335_combined_tx_230400

#include <SPI.h>

#include <RF24_config.h>
#include <RF24.h>
#include <printf.h>
#include <nRF24L01.h>
#include <Wire.h>

RF24 radio(7,8);
byte addresses[][6] = {"12"};

#define DEVICE (0x53) // Device address as specified in data sheet

byte _buff[6];

char POWER_CTL = 0x2D;  //Power Control Register
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32; //X-Axis Data 0
char DATAX1 = 0x33; //X-Axis Data 1
char DATAY0 = 0x34; //Y-Axis Data 0
char DATAY1 = 0x35; //Y-Axis Data 1
char DATAZ0 = 0x36; //Z-Axis Data 0
char DATAZ1 = 0x37; //Z-Axis Data 1
int x,y,z;
const int buttonPin = 2;
int buttonState = 0; 

typedef struct
{
  int x, y, z;
}dataStruct;

 dataStruct data;

 void setup()
 {
   pinMode(buttonPin, INPUT);
   radio.begin();
   radio.openWritingPipe(addresses[0]);

    Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(230400);  // start serial for output. Ensure Serial Monitor at same rate
 // Serial.print("init");
 
  //Put the ADXL345 into +/- 4G range by writing the value 0x01 to the DATA_FORMAT register.
  writeTo(DATA_FORMAT, 00001000);
  //Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
  writeTo(POWER_CTL, 0x08);
 
 }
 void loop()
 {

   buttonState = digitalRead(buttonPin);
   //data.x = x;
   //data.y = y;
   //data.z = z;
   if (buttonState == HIGH) {
   readAccel(); // read the x/y/z tilt
 
 
   radio.write(&data,sizeof(data));
 
   delay(50);}
 
   else
   {
    data.x = analogRead(A0);
    data.y = analogRead(A1);
    data.z = analogRead(A2);
 
   radio.write(&data,sizeof(data));
 
   delay(50);}
 
 
 }
 void readAccel() {
  uint8_t howManyBytesToRead = 6;
  readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345

  // each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
  // thus we are converting both bytes in to one int
  int x = (((int)_buff[1]) << 8) | _buff[0]; 
  int y = (((int)_buff[3]) << 8) | _buff[2];
  int z = (((int)_buff[5]) << 8) | _buff[4];


  data.x = x;
   data.y = y;
   data.z = z;

 
 
 
   radio.write(&data,sizeof(data));
 
 
 // Serial.print("x: ");
  Serial.print( x );
  Serial.print(",");
  Serial.print( y );
  Serial.print(",");
  Serial.println( z );
}

void writeTo(byte address, byte val) {
  Wire.beginTransmission(DEVICE); // start transmission to device
  Wire.write(address);             // send register address
  Wire.write(val);                 // send value to write
  Wire.endTransmission();         // end transmission
}

// Reads num bytes starting from address register on device in to _buff array
void readFrom(byte address, int num, byte _buff[]) {
  Wire.beginTransmission(DEVICE); // start transmission to device
  Wire.write(address);             // sends address to read from
  Wire.endTransmission();         // end transmission

  Wire.beginTransmission(DEVICE); // start transmission to device
  Wire.requestFrom(DEVICE, num);    // request 6 bytes from device

  int i = 0;
  while(Wire.available())         // device may send less than requested (abnormal)
  {
    _buff[i] = Wire.read();    // receive a byte
    i++;
  }
  Wire.endTransmission();         // end transmission
}

Thursday, September 19, 2019

processing code to display CSV data

//import io.inventit.processing.android.serial.*;

import processing.serial.*;
import static javax.swing.JOptionPane.*;
//import processing.net.*;
//Client ennodaClient;
Serial envazhi;
int nikazhmadhippu1, nikazhmadhippu2, nikazhmadhippu3;
int z=10;
 
int[] akalavu;
int[] meiyalavu;
int[] uyiralavu;
int ullpiri;
int i,d,p;
//int value=20;

void setup()
{
   
   
   
 //  fill(180, 0, 0);
 // for (d=0; d<1080; d++){
 // text ("rajaguru", 600, d); }
  
  //text ("rajaguru", 600, 800);
   
  
  fullScreen();
  //size(1000, 550);
  frameRate(60);
    
  strokeWeight(1);
  smooth(); // or noSmooth();
  akalavu = new int[200];
  meiyalavu = new int[200];
  uyiralavu = new int[200];
  String portName = Serial.list()[1];
  envazhi = new Serial(this, portName, 230400);
 
 // text("STOP",1855,30);
  
  
  
}
 
void draw()
{
  
  fill(0, 0, 180);
  if (d<300)
   {
    background(255);
    //textSize(5+d);
    textSize(20);
    text ("rajaguru", 1920-d, 600); 
    d+=5; 
   } 
  fill(255,255, 255);
  
  
  //text("STOP",1855,20);
  //fill(20);
  line(1850,10, 1900, 50);
  line(1900,10, 1850, 50);
  line(1900,10, 1900, 50);
  line(1900,50, 1850, 50);
  line(1850,10, 1850, 50);
  line(1850,10, 1900, 10);
  
  textSize(12);
  
  
  
  String ull = envazhi.readStringUntil('\n');
 
  if(ull != null)
  {
      
   int[] ullpiri = int(split(ull, ","));
   
   nikazhmadhippu1 = abs(int(ullpiri[0]));
   nikazhmadhippu2 = abs(int(ullpiri[1]));
   nikazhmadhippu3 = abs(int(ullpiri[2]));
   background(255);
   int lowest = min(ullpiri);
   int highest = max(ullpiri);
   p++;
   println( p);
   
     
   {
   
     for(int i = 1; i < 200; i++) 
        {
         
          akalavu[i-1] = akalavu[i]; //shifting every value to previous array-element ANDDDDDDDDD storing 200 subsequent values in  200 array-elements
          meiyalavu[i-1] = meiyalavu[i];
          uyiralavu[i-1] = uyiralavu[i];
        }
        
               
       // print(lowest);
       // print(",");
       // println(highest);
      //  println();
        
   akalavu[200-1] = int (map(nikazhmadhippu1, lowest, highest, 20, 500)) ;
   meiyalavu[200-1] = int( map(nikazhmadhippu2, lowest, highest, 400, 1000));
   uyiralavu[200-1] = int( map(nikazhmadhippu3, lowest, highest, 20, 600));
 
  }
  
    {      
     beginShape();
      strokeWeight(2);
      stroke(0, 0, 250); //(rgb) colored lines, blue for z-axis
      {
       int j=1;
       int i=1;
      // int d=0;
      //plotting allllllllllllllllll 100 array-elements in x-y graph here.        
      // variable-i gives 100 numbers of array-elements which are plotted on the y-axis; variable-j gives the x-axis position.
      // variable z helps to increase or decrease the x-axis-gap between 2 successive inputs. 
       for (i=1, j=1; i<199 && j <(z*200); i++, j= j+z) 
        {    
           
  //if (d<10800){
 // for (d=0; d<10800; d+=10){
 // text ("rajaguru", 600, d/10); }}
          
           if (akalavu[i-1]>0){
         curveVertex(j, akalavu[i-1]); //as the loop runs, on every loop a single vertex-point is fixed in the display-window-matrix and....on next loop another vertex-point is fixed. and those 2 points get linked by a curve. 
                  
           }
           
        }                             //this logic of curve-fitting between 2 successive points continues till the end of THIS "for" loop, resulting in the curve-plot.
      
      }
     endShape();     
    } 
 
    //x-axis
    
      {      
      beginShape();
      strokeWeight(2);
      stroke(0, 250, 0); //green for x-axis
       {
       int j=1;
       int i=1;
      
       for (i=1, j=1; i<199 && j <(z*200); i++, j= j+z) 
        {            
          if (uyiralavu[i-1]>0){
          curveVertex(j, uyiralavu[i-1]); //as the loop runs, on every loop a single vertex-point is fixed in the display-window-matrix and....on next loop another vertex-point is fixed. and those 2 points get linked by a curve. 
          
          
         }
        }                             
    
       }
      endShape();     
      }
    
    //y-axis  
    
      {      
      beginShape();
      strokeWeight(2);
      stroke(250, 0, 0); //red for y-axis
       {
       int j=1;
       int i=1;
     
       for (i=1, j=1; i<199 && j <(z*200); i++, j= j+z) 
        {                                              
         if (meiyalavu[i-1]>0){
         curveVertex(j, meiyalavu[i-1]);
         }
        }                             
       
       }
      endShape();     
      }
   
  }
  
 nEram();
  framerate();
 //name();

}

//void name() {
 // PImage padam1, padam2, padam3, padam4, padam5, padam6, padam7;
  //fill(80, 80, 200);
 // text ("rajaguru", 1550, 100);
  //fill(255, 255, 255);
  //padam2 = loadImage("enperu.png");
  //image(padam2, 1000, 0, 129, 29);
 // padam1 = loadImage("tamilsource.png");
 // image(padam1, 10, 5, 50, 50);
  //padam3 = loadImage ("rate.png");
 // image(padam3, 215, 15, 325, 28);
  //padam4 = loadImage ("count.png");
  //image(padam4, 248, 43, 292, 25);
  //padam5 = loadImage ("duration.png");
  //image(padam5, 200, 68, 340, 28);
  //padam6 = loadImage ("time.png");
  //image(padam6, 333, 93, 207, 26);
  //padam7 = loadImage ("axes.png");
  //image(padam7, 70, 5, 108, 115);
  
  //image(padam2, 0, 230, 100, 20);
//}

void nEram(){
  textSize(15);
  fill(180, 0, 0);
 // int maNi = hour();
 // int nimidam = minute();
 // int nodi = second();
 
  //text (maNi, 550,110);
  //text (": "+ nimidam, 570, 110);
  //text ( " : " + nodi, 590, 110);
  //text ("hrs", 620,110);
  //text (System.nanoTime(), 620,110);
  //text (System.currentTimeMillis(), 620,110);
  fill(0, 0, 180);
  text (nikazhmadhippu1, 80, 33,10);
  //text ("rajaguru", 980,20);
  fill(180, 0, 0);
  text (nikazhmadhippu2, 120, 33, 10);
  fill(0, 180, 0); //green
  text (nikazhmadhippu3, 160, 33,10); 
  
  fill(0, 0, 255);

}

void framerate(){
  text (frameRate, 545, 33);
  
  //text ("frame-eNNikkai / count:", 500, 55);
  //text ("Odum-nEram, nodiyil //running-duration, sec: ", 380, 40);
  text (frameCount, 630, 33);
  text (millis()/1000, 500, 33);
  fill(255, 255, 255);
}
void mouseClicked(){
  if ((mouseX>1850&&mouseX<1900)&&(mouseY>10&&mouseY<50))
     { 
       //showMessageDialog(null, "do you want to close?!!!", 
   // "Alert", ERROR_MESSAGE);
    
    int reply = showConfirmDialog(null, "want to close?!", "Usaaru / Alert",YES_NO_OPTION);
        if (reply == YES_OPTION) 
        { exit();
          showMessageDialog(null, "bye!", "Seidhi / Message", ERROR_MESSAGE);
        }
       // else {
           //showMessageDialog(null, "do u want to close?!");
           //System.exit(0);
       // }
    
  //  if (keyPressed) {
   // if (key == 'y' || key == 'Y') {exit();}}
  }
}


  

Sunday, August 11, 2019

receiver code for nRF24L01

#include <SPI.h>

#include <RF24_config.h>
#include <RF24.h>
#include <printf.h>
#include <nRF24L01.h>

RF24 radio(7,8);
byte addresses[][6] = {"12"};

typedef struct
{
  int x, y, z;
}dataStruct;
 
 dataStruct data;

 void setup()
 {
   Serial.begin(115200);
   radio.begin();
   radio.openReadingPipe(0, addresses[0]);
   radio.startListening();
 }

 void loop()
 {
   if(radio.available())
   {
     radio.read(&data,sizeof(data));
     Serial.print(data.x);
     Serial.print(",");
     Serial.print(data.y);
     Serial.print(",");
     Serial.print(data.z);
     Serial.print(",");
     Serial.println();
   }
 }
  

transmitter code for nRF24L01

#include <SPI.h>

#include <RF24_config.h>
#include <RF24.h>
#include <printf.h>
#include <nRF24L01.h>

RF24 radio(7,8);
byte addresses[][6] = {"12"};

typedef struct
{
  int x, y, z;
}dataStruct;
 
 dataStruct data;

 void setup()
 {
   radio.begin();
   radio.openWritingPipe(addresses[0]);
 }
 void loop()
 {
   data.x = analogRead(A0);
   data.y = analogRead(A1);
   data.z = analogRead(A2);
 
   radio.write(&data,sizeof(data));
 
   delay(50);
 
 }

Tuesday, August 14, 2018

esp32 programming or flashing user programs...

as i was trying to upgrade an old project that had separate wifi-module (esp8266-esp01) and microcontroller(arduino-uno) to improve stability that is brought in by esp32, my first uploading experience was a failure. it reported a fatal error.....blah blah...

i was very much aware esp01 coding needs GPIO-0 GrouNDed (pulled to ground) to make it enter into flashing mode so that new program can be loaded onto it. i had covered this elsewhere. http://tech-steel.blogspot.com/2017/08/prototype-mould-oscillation-checker.html

it was not much hard to identify how to program esp32.
once the coding is complete and compiling is finished and when uploading starts as below....


step 1. press and hold ENable-chip button on ESP-WROOM-32
step 2. press and hold BOOT button
step 3. release EN-button (on this third step we can see the code getting flashed on to esp32-image below.)
step 4. release BOOT button.



Monday, July 23, 2018

dummy bar insertion in a 5 modules caster


this video shows how a solid dummybar in a 5 modules caster is inserted into the mould . there are 2 limit switches and 2 striker-rods and a striker plate to help insert and withdraw dummybar either manually or automatically. these limitswitches help us ensure the physical position of the dummybar while moving. apart from this, actual movement is tracked by rotary encoders that are fixed on motors.

open casting nozzle

in open casting, top nozzle fixed at the tundish wellblock has 22mm dia, while the bottom nozzles can be changed to get desired speed.

bottom nozzles have varying dias like 15.5mm, 17mm, 18mm, 19mm, 20mm and 22mm. first one is always used at the start of casting so that the start of casting is slower, while the largest dia nozzle is used to get the maximum flowrate and hence the maximum casting speed.

pic shows a bottom nozzle that has a dia of 17mm.


we can see the number 7 embosed on the nozzle itself so as to identify the dia of 17mm. 15.5mm dia nozzles will have 5 imprinted while 21mm dia nozzle will have 1 embosed and 19mm dia nozzle will have 9 imprinted.


in the above pic the cream-coloured part at the center that has the bore of 17mm dia is zirconia insert which has a very very good oxidation resistance at high temperatures, strength and erosion resistance. and the gray colored granules that surround the zirconia insert are made of alumina which also has good thermal properties but not as stable as zirconia against erosion.



the pic below shows the surface that will mate with similar surface of top nozzle. this is the surface that normally lies facing upwards while the side shown above normally stays facing mould.


pneumatic valves in a ladle shroud manipulator


this pic above shows a pneumatic valve that is fixed in a ladle shroud manipulator mechanism. arrow marks indicate the direction(downwards) in which the flow is unhindered and the direction (upward) in which flow can be regulated.

next pic shows another valve attached just above this valve but in reversed position. bottom valve regulates the flow into the cylinder (piston side, so that lifting speed of shroud manipulator is proper), while the valve at the top bleeds the Instrument Air from the piston side of the cylinder to lower the manipulator at a controlled speed. while lowering bottom valve does not offer any resistance to the downgoing airflow. the block knob at the side of the valve body helps to regulate the flowrate of the IAir going in or out to help regulate the speed of raising or lowering the manipulator.




LVDT or temposonic or linear sensor


this above pic shows linear variable displacement transducers that are used in tundish slidegate cylinder pistons to track the position of the piston (and hence the position of the rigidly attached slidegate middle plate).

it is these transducers ( temposonic) that give us the feedback about the overlapping of bores of top-middle-bottom slidegate plates of tundish.

the cylinders in which these temposonics are attached have a stroke length of 90mm while the bore dia of slidegate plates is 40mm. this stroke length of more than double the bore-dia ensures perfect safety of slidegate mechanism.

to my limited knowledge, these temposonics work based on magnetostriction method where a moving magnet causes changes in current flow indicating the position of the magnet (in turn that of the piston).

MOM valve damage

mould oscillation is achieved through electro-hydraulic means in modern casters.

in the casters at my present work, these oscillator can have a frequency range of 25-300 CPM (Cycles Per Minute). the total stroke the cylinder piston is 50mm while during normal casting the range required is 8mm to 15mm maximum.

it is an easy logic that the oscillation should start at exact middle of the entire stroke; and target stroke should be distributed equally to the up and down side of this offset position of the cylinder.

it shall further be noted this offset position can be changed but should lie at the right position so that whatever oscillation is achieved should stay in line with the radius of the machine. this is necessary to avoid any external stress that may be exerted on the tender, weak shell inside the mould that may easily rupture.

these pics show a damaged valve stand that drives the cylinder up and down.

the first pic shows the LVDT placed inside the actuator piston of the hydraulic cylinder on top portion of the entire mechanism in the top of the image. the hoses below carry mould (inlet&outlet) and spray water of zone-1. the bob like structure positioned at an angle in the mechanism is an oil accumulator that helps in fast response to compensate  for pressure drop inside valve or cylinder.


in the following image, cable that is from the LVDT (temposonic) is shown inside that round protection housing. the other two blocks of the mechanism just below that round housing show the actual valve (middleblock) and below that lies the moog controller block.


following closer image shows the same, but one can easily see the damaged valve block. this damaged was caused by excessive insertion of bottom-fed-dummybar. it travelled excessively up into the mould because of tracking failure from slipping withdrawal module motor-roll. the tracking is done using a rotary encoder attached to the motor.



it can be seen from the pics, the valve block has damaged along the ON-OFF valve connector on the left side while the right side ON-OFF valve stays intact. just above them at the middle lies one of the two pressure gauges that track the pressure built on the top side of the cylinder during oscillation. moog block makes this entire setup a SERVO VALVE whereby error tracking and correction in input command to the valve spool is done through inbuilt electronic circuitry to ensure the desired positions are achieved.