顯示具有 生產製造 標籤的文章。 顯示所有文章
顯示具有 生產製造 標籤的文章。 顯示所有文章

2024年3月14日 星期四

TI LM Flash Programmer 的生產工具

最近遇到60GHz 雷達產品的生產時, 應用到TI的一塊開發版

圖一: 開發版

圖二:LM Flash Programmer configuration

圖三:Flash utility

應用的方式是利用開發版配合LM Flash Programmer將產品的flash 洗掉, 再上產線做重新燒錄FW及測試的動作!

2024年2月23日 星期五

雷達產品測試站別規劃

一個產品的產出在生產流程上, 脫離不了從 繪製PCB線路圖 -- Layout Gerber --製作PCB板 --SMT 打件 -- PCBA 測試 --組裝 --成品測試 --包裝出貨
在生產測試的環節中
PCBA測試規劃有
F1站--量測板端輸入電壓電流, 各LDO分壓電壓點, Download產品FW, 測試板子功能, 寫入產品序號
產測工程師需要完成治具(輔助生產的流程)的製作以及產測程式的撰寫
接線前
接線後

測試程式畫面測試規劃

測試程式畫面測試規格
成品測試
F4站--燒錄產品FW, 測試客戶端功能


2024年1月4日 星期四

CPU SN software lock

C#開發軟體利用每台PC或是NB的唯一CPU序號特點來做為控管測試軟體的一種軟體鎖.
1. 專案請先加入參考 System.Management
2. 透過 ManagementObjectSearcher 查詢CPU serial number.
private void button2_Click(object sender, EventArgs e)
{
      // 透過 ManagementObjectSearcher 類別用類似 SQL 的語法查詢
      ManagementObjectSearcher wmiSearcher
        = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");
      int i = 0;
       // 使用 ManagementObjectSearcher 的 Get 方法取得所有集合
      foreach (ManagementObject obj in wmiSearcher.Get())
      {
          // 取得CPU 序號
           //Console.WriteLine("CPU{0} ID:\t{1}", i++, obj["ProcessorId"].ToString());
           CommonData.WriteMessage(CommonData.richtextbox, "CPU{0} ID:\t{1}-"+                                         (i++).ToString()+" - ", obj["ProcessorId"].ToString(), Color.Blue, Color.Green);
      }
}
執行畫面


2023年10月29日 星期日

Arduino Mega2560 Test Fixture Application

Purpose:

1. 兩個按鍵作為進出平台的開關 另一按鍵為平台上另一上下動作的開關
2. 完成所有動作後按任一進出按鍵就進行退出動作在退出時 蜂鳴器要發聲
3. 完成進入動作 COUNTER 要記數加一次為了控制頂針壓合次數
4. 手動跟程式控制同時可以動作

1. Two buttons serve as switches for entering and exiting the platform. The other button serves as another switch for up and down movements on the platform.
2. After completing all actions, press any entry or exit button to exit. The buzzer will sound when exiting.
3. After completing the entry action COUNTER, the count needs to be added once in order to control the number of times the ejection pin is pressed.
4. Manual and program control can be performed at the same time

Architecture:

零件配置:
1. Arduino Mega2560 控制板

2. 8 Port Relay board
3. 3 個 push button
4. 3個氣壓控制閥
5. 1個蜂鳴器
6. 次數記數器
7. 4個氣壓缸
8. ACto12VDC變壓器
YouTube Demo;
Mega2560 Code:
#include <Arduino_FreeRTOS.h>
//---------------structure ----------------------------------------
//--------- Flag structure --------------------------------------
typedef struct _vFlag
{
  uint8_t LEDFlag=1;
  uint8_t BTFlag = 0;
  uint8_t ServoFlag = 0;
  uint8_t CloseFlag=0;
  uint8_t InFlag=0;
  uint8_t OutFlag=0;
  uint8_t UpFlag=0;
  uint8_t Up1Flag=0;
  uint8_t Up2Flag=0;
  uint8_t Buzzer_Flag=0;
 
} vFlag;
vFlag *flag_Ptr;
vFlag flag;
//----------uart--------------
#define LINE_BUFFER_LENGTH 64
//--------- uart structure --------------------------------------
typedef struct _vUart
{
  char c;
  int lineIndex = 0;
  int line1Index = 0;
  int BTlineIndex = 0;
  bool lineIsComment;
  bool lineSemiColon;
  char line[128];
  char BTline[20];
  String inputString;
  String BTinputString;
  String S1inputString;
  int V[16];
  char ctemp[30];
  char I2C_Data[80];
  int DC_Spped = 50;
  float Voltage[16];
  int Buffer[128];
  int StartCnt = 0;
  int ReadCnt = 0;
  int sensorValue = 0;
} vUart;
vUart *Uart_Ptr;
vUart Uart;
//------------------------------------------------
const uint8_t LED_PIN = 13;
const uint8_t F_PIN = 12;
int buzzerPin=11;
//----relay--------
uint8_t DIO_1 = 22;
uint8_t DIO_2 = 24;
uint8_t DIO_3 = 26;
uint8_t DIO_4 = 28;
uint8_t DIO_5 = 30;
uint8_t DIO_6 = 32;
uint8_t DIO_7 = 34;
uint8_t DIO_8 = 36;
//---------治具定義------------------------------------------
uint8_t In1_B_Pin = 47;  
uint8_t In2_B_Pin = 49;
uint8_t Up_B_Pin = 51;

uint8_t In_S_Pin = 23;
uint8_t Out_S_Pin = 25;
uint8_t UpDown1_S_Pin = 27;
uint8_t UpDown2_S_Pin = 29;
//----relay--------
uint8_t InOut_V_Pin = 22;
uint8_t UpDown1_V_Pin = 24;
uint8_t UpDown2_V_Pin = 26;

uint8_t SPK_O_Pin = 28;  //30預留 12V relay
//uint8_t Count_O_Pin = 30;
uint8_t Count_O_Pin = 32;
//----------------------------------------------------
uint8_t DUTPin = 23;
uint8_t Sensor1Pin = 23;
uint8_t Sensor2Pin = 25;
uint8_t Sensor3Pin = 27;
uint8_t Sensor4Pin = 29;
//-------------------------------------------
char ctemp[20];
//------------------------------
TaskHandle_t hled;
TaskHandle_t huart0;
//------------------------------------------------------------------------------
void initial()
{
  Serial.println(F("Create Task"));
  //----------------------------------------------------------------------
  // create UART task
  xTaskCreate(vUARTTask, "UART Task", configMINIMAL_STACK_SIZE, NULL, 1, &huart0);
  // Check the results
  // create blink task
  xTaskCreate(vLEDFlashTask, "LED Task", configMINIMAL_STACK_SIZE, NULL, 2, &hled);
 
  //-------------------------------------------------------------------

}
void setup()
{
  Uart.inputString.reserve(60);
  initial();
  Serial.begin(9600);
  Serial.setTimeout(2000);
  Serial.println(F("init"));
  //-------------------------------------
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW); // Turn LED off.
  //---------------IO setting-----------------
  pinMode(DIO_1, INPUT);
  pinMode(DIO_2, INPUT);
  pinMode(DIO_3, INPUT);
  pinMode(DIO_4, INPUT);
  pinMode(DIO_5, INPUT);
  pinMode(DIO_6, INPUT);
  pinMode(DIO_7, INPUT);
  pinMode(DIO_8, INPUT);
  pinMode(Sensor1Pin,INPUT_PULLUP); //23
  pinMode(Sensor2Pin,INPUT_PULLUP); //25
  pinMode(Sensor3Pin,INPUT_PULLUP); //27
  pinMode(Sensor4Pin,INPUT_PULLUP); //29
  //----治具 ----------------
  pinMode(In_S_Pin,INPUT_PULLUP); //23
  pinMode(Out_S_Pin,INPUT_PULLUP); //25
  pinMode(UpDown1_S_Pin,INPUT_PULLUP); //27
  pinMode(UpDown2_S_Pin,INPUT_PULLUP); //29
  pinMode(In1_B_Pin,INPUT_PULLUP); //47
  pinMode(In2_B_Pin,INPUT_PULLUP); //49
  pinMode(Up_B_Pin,INPUT_PULLUP); //51
  //----relay--------
  pinMode(InOut_V_Pin, INPUT);   //22
  pinMode(UpDown1_V_Pin, INPUT); //24
  pinMode(UpDown2_V_Pin, INPUT); //26
  pinMode(SPK_O_Pin, INPUT);     //28 //30預留 12V relay
  pinMode(Count_O_Pin, INPUT);   //32
 // start FreeRTOS
  Serial.println("Systom On!");
  vTaskStartScheduler();
  //if the scheduler start the code don't came here
  Serial.println(F("Die"));
  while (1)
    ;
}
//------------------------------------------------------------------------------
void loop()
{
 
}
//------------------------------------------------------------------------------
// high priority for blinking LED
void vLEDFlashTask(void *pvParameters)
{
  (void)pvParameters;

  pinMode(LED_PIN, OUTPUT);
  for (;;)
  {
    digitalWrite(LED_PIN, HIGH);                    // Turn LED on.
    vTaskDelay((150L * configTICK_RATE_HZ) / 1000L); // Sleep for 50 milliseconds.
    digitalWrite(LED_PIN, LOW);                      // Turn LED off.
    vTaskDelay((150L * configTICK_RATE_HZ) / 1000L); // Sleep for 150 milliseconds.
  }
}
//------------------------------------------------------------------------------
void vUARTTask(void *pvParameters)
{
  Uart.lineIsComment = false;
  Uart.lineSemiColon = false;

  while(1)
  {
//---------Fixture -------------------------
    vFixtureTask();   
while (Serial.available() > 0)
    {
      Uart.c = Serial.read();

      if ((Uart.c == '\n') || (Uart.c == '\r'))
      { // End of line reached
        if (Uart.lineIndex > 0)
        { // Line is complete. Then execute!
          Uart.line[Uart.lineIndex] = '\0'; // Terminate string
          //Serial.println( F("Debug") );
          //Serial.println( Uart.inputString );
          processCommand(Uart.line); // do something with the command
          //傳輸給藍芽
         
          Uart.lineIndex = 0;
          Uart.inputString = "";
        }
        else
        {
          // Empty or comment line. Skip block.
        }
        Uart.lineIsComment = false;
        Uart.lineSemiColon = false;
        Serial.println(F("ok>"));
      }
      else
      {
        //Serial.println( c );
        if ((Uart.lineIsComment) || (Uart.lineSemiColon))
        {
          if (Uart.c == ')')
            Uart.lineIsComment = false; // End of comment. Resume line.
        }
        else
        {
          if (Uart.c == '/')
          { // Block delete not supported. Ignore character.
          }
          else if (Uart.c == '~')
          { // Enable comments flag and ignore all characters until ')' or EOL.
            Uart.lineIsComment = true;
          }
          else if (Uart.c == ';')
          {
            Uart.lineSemiColon = true;
          }
          else if (Uart.lineIndex >= LINE_BUFFER_LENGTH - 1)
          {
            Serial.println("ERROR - lineBuffer overflow");
            Uart.lineIsComment = false;
            Uart.lineSemiColon = false;
          }
          else if (Uart.c >= 'a' && Uart.c <= 'z')
          { // Upcase lowercase
            Uart.line[Uart.lineIndex] = Uart.c - 'a' + 'A';
            Uart.lineIndex = Uart.lineIndex + 1;
            Uart.inputString += (char)(Uart.c - 'a' + 'A');
          }
          else
          {
            Uart.line[Uart.lineIndex] = Uart.c;
            Uart.lineIndex = Uart.lineIndex + 1;
            Uart.inputString += Uart.c;
          }
        }
      }
    } //while (Serial.available() > 0)
  }
}
//------------------------------------------------------------------------------
//----reset-----------
void (*resetFunc)(void) = 0;
//---------------------------------------------------------
void processCommand(char *data)
{

  int len, xlen, ylen, zlen, alen;
  int tempDIO;
  String stemp;
  unsigned int i, j, Comma;

  int val, maxv, minv;
  unsigned long duration;
  float Vpp;

  len = Uart.inputString.length();

  //-------------RESET---------------
  if (strstr(data, "VER") != NULL)
  {
    //Serial.println(F("W_ATE_Board_20201021"));
    Serial.println(F("Mega_SERIAL_20230723"));
  }
  if (strstr(data, "RESET") != NULL)
  {
    Serial.println(F("Reset"));
    resetFunc();
  }
  //===-----------------DIO port 1----------------
  if (strstr(data, "DIO1") != NULL)
  {
    //-DIO11_LOW
    if (data[3] == '1')
    {
      for (int i = 0; i < len; i++)
      {
        if (data[i] == '_')
        {
          //Serial.println("test");
          //Serial.println(i);
          xlen = i;
        }
        //ctemp[i-4]=data[i];
      }
      for (int i = 4; i < xlen; i++)
      {
        ctemp[i - 4] = data[i];
      }
      ctemp[xlen - 4] = '\0';
      tempDIO = atoi(ctemp);
      //Serial.println(tempDIO);
      for (int i = (xlen + 1); i < len; i++)
      {
        ctemp[i - (xlen + 1)] = data[i];
      }
      ctemp[len - (xlen + 1)] = '\0';

      tempDIO = tempDIO * 2 + 20;
      pinMode(tempDIO, OUTPUT);
      //if(strstr(ctemp, "ON") != NULL)
      //if(strcmp(ctemp, "ON")==0)
      //if (strcmp(Uart.ctemp, "LOW") == 0)
      if (strstr(ctemp, "LOW") != NULL)
      {
        digitalWrite(tempDIO, LOW);
      }
      else if (strstr(ctemp, "ON") != NULL)
      {
        digitalWrite(tempDIO, LOW);
      }
      else if (strstr(ctemp, "HIGH") != NULL)
      {
        digitalWrite(tempDIO, HIGH);
      }
      else if (strstr(ctemp, "OFF") != NULL)
      {
        digitalWrite(tempDIO, HIGH);
      }
    }
  }
  //------fixture --------
  if(strstr(data, "IN") != NULL )
  {
     if( (digitalRead(Out_S_Pin) == LOW) && flag.Up1Flag==0 && flag.Up2Flag==0)
     {
       flag.InFlag=3;
       pinMode(InOut_V_Pin , OUTPUT);
       digitalWrite(InOut_V_Pin , HIGH);    //in進
     }
     else
     {
       Serial.println(F("PLS OUT Fixture first!!"));
     }
  }
 
  if(strstr(data, "OUT") != NULL)
  {
     if( (digitalRead(In_S_Pin) == LOW) && flag.Up1Flag==0 && flag.Up2Flag==0)
     {
       flag.InFlag=5;
       pinMode(InOut_V_Pin , OUTPUT);
       digitalWrite(InOut_V_Pin , LOW); //出
     }
     else
     {
      Serial.println(F("PLS IN Fixture first!!"));
     }
  }
 
  if(strstr(data, "UP1") != NULL)
  {
     //if((flag.InFlag==2 || flag.InFlag==3) && flag.Up1Flag==1 && flag.Up2Flag==0 )
     if((flag.InFlag==2 || flag.InFlag==3) && (digitalRead(UpDown1_S_Pin ) == LOW) && flag.Up2Flag==0 )
     {
      pinMode(UpDown1_V_Pin , OUTPUT);
      digitalWrite(UpDown1_V_Pin , HIGH); //UP1
      flag.Up1Flag=0;
     }
     else
     {
      Serial.println(F("PLS DWON1 Fixture first!!"));
     }
  }

  if(strstr(data, "DOWN1") != NULL)
  {
     if((flag.InFlag==2 || flag.InFlag==3) && flag.Up1Flag==0 && flag.Up2Flag==0 )
     {
      pinMode(UpDown1_V_Pin , OUTPUT);
      digitalWrite(UpDown1_V_Pin , LOW); //UP1
      flag.Up1Flag=1;
     }
     else
     {
      Serial.println(F("PLS UP1 Fixture first!!"));
     }
  }

  if(strstr(data, "UP2") != NULL)
  {
     if((flag.InFlag==2 || flag.InFlag==3) && flag.Up1Flag==1 )
     {
       //Serial.println("flag.InFlag"+String(flag.InFlag));
       //Serial.println("flag.Up1Flag"+String(flag.Up1Flag));
       //Serial.println("flag.Up2Flag"+String(flag.Up2Flag));
       
       if((digitalRead(UpDown2_S_Pin) == LOW))
       {
         pinMode(UpDown2_V_Pin , OUTPUT);
         digitalWrite(UpDown2_V_Pin , HIGH); //UP1
         flag.Up2Flag=0;
       }
       
     }
     else
     {
       Serial.println(F("PLS DWON2 Fixture first!!"));
     }
  }

  if(strstr(data, "DOWN2") != NULL)
  {
     //Serial.println("flag.InFlag"+String(flag.InFlag));
     //Serial.println("flag.Up1Flag"+String(flag.Up1Flag));
     //Serial.println("flag.Up2Flag"+String(flag.Up2Flag));
     
     if((flag.InFlag==2 || flag.InFlag==3) && flag.Up1Flag==1 && flag.Up2Flag==0 )
     {
       pinMode(UpDown2_V_Pin , OUTPUT);
       digitalWrite(UpDown2_V_Pin , LOW); //UP1
       flag.Up2Flag=1;
       pinMode(Count_O_Pin , OUTPUT);
       digitalWrite(Count_O_Pin  , LOW);  
       delay(500);
       digitalWrite(Count_O_Pin  , HIGH);
     }
     else
     {
       Serial.println(F("PLS UP2 Fixture first!!"));
     }
  }
  //-----------fixture end---------------------------------------------
}
//------ vFixtureTask start --------------------------------
void vFixtureTask()
{
 
  if( (digitalRead(In1_B_Pin) == LOW && digitalRead(In2_B_Pin) == LOW ) && (flag.InFlag==5 || flag.InFlag==1 || flag.InFlag==9) )
  {
    flag.InFlag=1;
    pinMode(InOut_V_Pin , OUTPUT);
    digitalWrite(InOut_V_Pin  , HIGH);   //In 因為氣壓跟之前反接 所以 HIGH進

    if(digitalRead(In_S_Pin) == LOW)  
    {
      flag.InFlag=2;
      //Serial.println(flag.InFlag);
      //Serial.println(F("ok>"));
    }
  }

  if( (digitalRead(In_S_Pin) == LOW ) && ( flag.InFlag==2 ) )
  {
    pinMode(UpDown1_V_Pin, OUTPUT);
    digitalWrite(UpDown1_V_Pin , LOW);   //DOWN
    if(digitalRead(UpDown1_S_Pin) == LOW)  
    {
      flag.Up1Flag = 1;  //1在下面 0在上面
      //Serial.println(F("UpDown1_S_Pin"));
      //Serial.println(F("ok>"));
      pinMode(UpDown2_V_Pin, OUTPUT);
      digitalWrite(UpDown2_V_Pin , LOW);   //DOWN
      if(digitalRead(UpDown2_S_Pin) == LOW)  
      {
        flag.Up2Flag = 1;
        //Serial.println(F("UpDown2_S_Pin"));
        //Serial.println(F("ok>"));
        pinMode(Count_O_Pin , OUTPUT);
        digitalWrite(Count_O_Pin  , LOW);  
        delay(1000);
        flag.InFlag = 3;
        //Serial.println(flag.InFlag);
        //Serial.println(F("ok>"));
        digitalWrite(Count_O_Pin  , HIGH);
        //flag.OutFlag = 0;          
      }
    }
  }
  //if( (digitalRead(In1_B_Pin) == HIGH || digitalRead(In2_B_Pin) == HIGH ) && (flag.InFlag==0 || flag.InFlag==1 ) )
  if( (digitalRead(In1_B_Pin) == HIGH || digitalRead(In2_B_Pin) == HIGH ) && ( flag.InFlag == 1 ) )
  {
    //flag.InFlag=8;
    //Serial.println(flag.InFlag);
    //Serial.println(F("ok>"));
   
    pinMode(SPK_O_Pin , OUTPUT);
    digitalWrite(SPK_O_Pin , LOW);   //SPK
   

    pinMode(UpDown2_V_Pin, OUTPUT);
    digitalWrite(UpDown2_V_Pin, HIGH);   //上
    delay(300);
    pinMode(UpDown1_V_Pin, OUTPUT);
    digitalWrite(UpDown1_V_Pin , HIGH);   //上
    delay(300);
    pinMode(InOut_V_Pin , OUTPUT);
    digitalWrite(InOut_V_Pin  , LOW);   //出
   
    digitalWrite(SPK_O_Pin , HIGH);   //SPK

    if(digitalRead(Out_S_Pin) == LOW)  
    {
      digitalWrite(SPK_O_Pin , HIGH);   //SPK
      flag.InFlag=9;
      flag.Up1Flag = 0;
      flag.Up2Flag = 0;
    }
  }

  if( (digitalRead(In1_B_Pin) == LOW || digitalRead(In2_B_Pin) == LOW ) && (digitalRead(In_S_Pin) == LOW && flag.InFlag==0) )
  {
    //Serial.println(F("Out_S_Pin"));
    //Serial.println(F("ok>"));
    flag.InFlag=5;
    pinMode(InOut_V_Pin , OUTPUT);
    digitalWrite(InOut_V_Pin  , LOW);   //出
  }

  //if( (digitalRead(In1_B_Pin) == LOW || digitalRead(In2_B_Pin) == LOW ) && (flag.InFlag==2 || flag.InFlag==3) )
  if( (digitalRead(In1_B_Pin) == LOW || digitalRead(In2_B_Pin) == LOW ) && (flag.InFlag==3) )
  {
    flag.InFlag=1;
  }

  if( (digitalRead(Up_B_Pin ) == LOW ) && flag.Up2Flag == 1  && flag.Up1Flag == 1)
  {
    pinMode(UpDown2_V_Pin, OUTPUT);
    digitalWrite(UpDown2_V_Pin, HIGH);   //上
    delay(300);
    flag.Up2Flag=0;
  }
  else if( (digitalRead(Up_B_Pin ) == LOW )  && flag.Up2Flag == 0 && flag.Up1Flag == 1)
  {
    pinMode(UpDown2_V_Pin, OUTPUT);
    digitalWrite(UpDown2_V_Pin, LOW);   //下
    if(digitalRead(UpDown2_S_Pin) == LOW)  
    {
        flag.Up2Flag=1;
    }
  }
}
//-------------------------------------------



2023年10月27日 星期五

Electrical Safety Compliance Automatic Test System

Purpose:

(Automation for Electrical Safety & Compliance Testing)

安規綜合分析儀7440-自動測試架構, 適合工廠端量產測試實現量化生產減少人工插拔的自動化生產流程, 安排在組裝後走流線測試更顯效益!

Electrical Safety Compliance Analyzer 7440 Automatic Test Architecture, It is suitable for factory-side mass production testing to achieve quantitative production and reduce the automated production process of manual plugging and unplugging. It is more efficient to arrange streamline testing after assembly!

Finished product picture

Detailed architecture

Portion architecture


Fundamental:

(一)儀器介紹

EXTECH7440是台灣華儀公司生產的, 具有交直流耐壓測試, 絕緣電阻測試, 接地電阻測試四功能合一的安規分析儀, 可以程控設置, 並配有RS232和GPIB接口, 可實現自動測試.
EXTECH7440 is produced by Taiwan Extech Electronics Ltd.,Co. Company. It is a safety analyzer with four functions in one: AC and DC withstand voltage testing, insulation resistance testing, and grounding resistance testing. It can be programmed and set up, and is equipped with RS232 and GPIB interfaces to enable automatic testing.

Hipot and Gound Test (耐壓、接地測試)
1. 交流耐壓測試(AC, AC Hipot):適合吃插座電的器具
2. 直流耐壓測試(DC, DC Hipot):適合電池或電容等吃直流電的
3. 絕緣阻抗測試(IR, Insulation Resistance):適合不能太高壓但想知道絕緣能力的,或已經測完高壓想再測絕緣的
4. 接地阻抗測試(GB, Ground Bond):適合測試接地較大的金屬件
5. 接地導通測試(Ground Continuity):適合測試接地較小或細的金屬件
6. 洩漏電流測試(Touch Current):適合人體會時常接觸到的部件,如醫療器材

FRONT PANEL OF MODEL 7440

之前相關文章連結(Links to previous related articles) :

2023年10月13日 星期五

KEYENCE-AI智能條碼讀取器

新的生產設備KEYENCE-AI智能條碼讀取器-SR Series



拍攝環境可以依照現場去做調校

操作軟體功能強大!

提供c sharp的sample code




跟傳統手持式的barcode scanner 有不一樣的用法!!

2023年5月5日 星期五

C# use windows API for Auto testing mehtod

 最近自動測試案子遇到廠商沒有sample code可用, 只得用最原始的暗黑技術來做:

1. 執行廠商可用的執行程式

2. 利用C#呼叫API模擬類似"按鍵精靈"的作法去點擊廠商的程式

以上做法可以解決沒有sample code可以包進自己的測試程式裡.

下面介紹所利用到的windows API

先將廠商程式開啟

hyper = new Process();

hyper.StartInfo.FileName = "c:\\ISP Programmer_V1.5.10\\ISPProgrammer.exe";

hyper.Start();

if (hyper != null){

    hyper.WaitForExit(2000);

    HyperWindow = FindWindow(null, "ISP Programmer_V1.5.10");

    if (HyperWindow != IntPtr.Zero) {

       EnumChildWindows(HyperWindow, new CallBack(delegate (IntPtr hwnd, int lParam) {

             listWnd.Add(hwnd);

             GetWindowText(hwnd, title, title.Capacity);

             GetClassName(hwnd, className, className.Capacity);

              return true;

              }), 0);

       SendMessage(listWnd1[8], BM_CLICK, 0, 0);     //發送點擊按鈕的消息

       }

}

在利用FindWinsow找到開啟的程式

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]

public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

在用EnumChildWindows去找程式上component的handle依據各個handle用Sendmessage去做觸發或讀取的功能

[DllImport("user32.dll", EntryPoint = "SendMessage")]

 public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

public const int BM_CLICK = 0xF5;





2023年3月16日 星期四

可編程交流電源供應器61502之C#應用

PROGRAMMABLE AC POWER SOURCE MODEL 61502 From C# GUI Application

61502 可提供強大的使用功能,如電網干擾模擬,可編程輸出阻抗,QUAN方位的測量功能,合成波形與IEC標準測試軟件。因擁有以上特點使得61500系列適合應用于一般商業產品,電力電子,航空電子設備,軍事與IEC標準測試的開發和運用,并且從實驗桌上測試到大量生產單位皆可適用。
61502 提供用戶不同容量的單相輸出產品,從 500VA到4000VA。不論是在研發設計,產品驗證或量產測試等
61502系列產品使用的脈寬調變技術,使其能輸出多達6倍最大額定電流峰值的能力,使得61502系列成為測試浪涌電流的最佳選擇。
不僅提供純交流電壓應用,AC+DC模式還擴展功能提供直流偏移電壓的應用。61502系列運用先進的數字訊號處理技術(DSP),能夠提供高精度和瞬時電壓波形測量,如電壓均方根值,電流均方根值,實功率,功率因子,電流波峰因子以及量測多達40次的電流諧波成份。

因應上述測試需求規劃測試GUI
圖一: 測試設定畫面
圖二:測試主畫面


2023年1月11日 星期三

工廠製造生產專有名詞的中英文對照

SMT(Surface Mounted Technology):表面安裝技術

PTH (Pin Through the Hole):通孔安裝

THT (Through Hole Component) :通孔插裝元件

SMB (Surface Mount Printed Circuit Board):表面安裝PCB板

SMC (Surface Mount Component):表面安裝元件

SMD (Surface Mount Device):表面安裝器件

SMA (Surface Mount Assembly):表面安裝組件

Component:元件

Device:器件

Assembly:組件

CTE(coefficient of thermal expansion):熱膨脹係數

In-circuit test:在線測試

Lead configuration:引腳外形

Placement equipment:貼裝設備

Reflow soldering:回流焊接

Repair:修理

Rework:返工

Solderability:可焊性

Soldermask:阻焊

Yield:產出率

Packaging density:裝配密度

Chip:片狀元件

melf:圓柱形元件

PCB(Printed circuit board):印刷電路板

DIP:雙列直插

SIP:單列直插

SOT(Small Outline Transistor):小外形晶體管

SOIC(Small outline IC):小外形集成電路,

SOP(Small outline Package):小外型封裝

PLCC(Plastic Leaded Chip Carrier):塑型有引腳芯片載體

LCCC(Leadless Ceramic Chip Carrier):無引腳陶瓷芯片載體

QFP (Quad Flat Package):多引腳方形扁平封裝

BGA( Ball grid array)球柵列陣

CSP(Chip Scale Package):芯片規模的封裝

Bare Chip:裸芯片Accuracy:精度

ATE(Automated test equipment):自動測試設備

AOI(Automatic optical inspection):自動光學檢查

Circuit tester:電路測試機

CTE(Coefficient of the thermal expansion):溫度膨脹係數

Cold solder joint:冷焊錫點

Component density:元件密度

Copper foil:銅箔

Copper mirror test:銅鏡測試

Cure:烘焙固化

Cycle rate:循環速率

Aerosol:氣溶劑
Angle of attack:迎角
Anisotropic adhesive:各異向性膠
Annular ring:環狀圈
Application specific integrated circuit :ASIC特殊應用集成電路
Array:列陣Artwork:佈線圖
Automated test equipment:ATE自動測試設備
Bond lift-off:焊接升離
Bonding agent:粘合劑
CAD/CAM system:計算機輔助設計與製造系統
Capillary action:毛細管作用
Chip on board :COB板面芯片
Circuit tester:電路測試機Cladding:覆蓋層
Cold cleaning:冷清洗
Cold solder joint:冷焊錫點
Conductive epoxy:導電性環氧樹脂
QFD:品質機能展開
PMT:產品成熟度測試
ORT:持續性壽命測試
FMEA:失效模式與效應分析