ค้นหาบล็อกนี้

วันเสาร์ที่ 19 กุมภาพันธ์ พ.ศ. 2554

การแสดงผลสัญญาณ Analog to Digital ที่ Computer

การแสดงผลสัญญาณ Analog to Digital ที่ Computer
         ได้เลือกใช Microcontroller model dspic ส่วน software ที่แสดงผลได้ใช้ Visual c# ที่ค่อนข้างในการใช้งานเพราะจะคล้ายภาษา C,C++ แต่จะง่ายกว่า ในการติดต่อเป็นแบบ serial port เพื่อรับค่าจาก Microcontroller โดยเริ่มแรกเราจะมา setup ในส่วนของ Microcontroller ก่อนเพื่อทำการอ่านค่า Analog ทำการแปลงสัญญาณเป็น digital
          ขั้นตอนแรกเราต้องทำการ set ใน mode ของ Microcontroller ก่อนโดยจะ set ขา port ก่อนเมื่อ set ADC เสร็จแล้วทำการ Set การใช้งาน Serial port  หรือ uart ใน Microcontroller dspic นี้ โดย code program บ้างอั่นได้อ้างอิงจาก INEX code program สามารถศึกษาได้ดังนี้

#include // Header file for dsPIC30F2010

#include // Module function for 10 bit ADC
#include
#define NUMBER_OF_DIGITS 32
_FOSC(CSW_FSCM_OFF & XT_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & BORV_27 & PWRT_16 & MCLR_EN);
_FGS(CODE_PROT_OFF);
void convertint(unsigned int value);
void convert(char *p);
void sendUart();
void _ultoa(unsigned long value, char* string, unsigned char radix);
void _ltoa(long value_l, char * string_l, unsigned char radix_l);
int common;
void _ISR _FLTAInterrupt(void)

{
         IFS2bits.FLTAIF = 0;
}
void __attribute__((__interrupt__)) _U1TXInterrupt(void)
{
        IFS0bits.U1TXIF = 0;
        sendUart();
}
void _ISR _U1RXInterrupt(void)
{
        IFS0bits.U1RXIF = 0;
}
void _ISR _ADCInterrupt(void)
{
         IFS0bits.ADIF = 0;
}
void adc_init() // Set mode Analog to digital//
{
        ADCON1 = 0x8006;
        ADCON2 = 0x0404;
        ADCON3 = 0x0010;
        ADCHS = 0x0000;
        ADPCFG = 0xFFFE;
        ADCSSL = 0x0001;
}
void uart1_init() //Set mode Serial port//
{
       U1MODE = 0x8000;
       U1STA = 0x8480;
       U1BRG = 47;
       IEC0bits.U1TXIE = 1;
       IEC0bits.U1RXIE = 1;
       IPC2bits.U1TXIP = 5;
       IPC2bits.U1RXIP = 2;
}
void sendUart(){ //Sent data ADC ผ่านทาง Serial port//
      unsigned int bufUart;
      controlADC();
      bufUart = common;
      convertint(bufUart);
      while(BusyUART1());
      putsUART1((unsigned int *)"\r\n");
      while(BusyUART1());
}
void controlADC(){
      ADCON1bits.SAMP = 1;
      while(!ADCON1bits.SAMP);
      ConvertADC10();
      while(ADCON1bits.SAMP);
      common = ADCBUF0;
}
 void _ultoa(unsigned long value, char* string, unsigned char radix)
{
      unsigned char index; // Counter of digit
      char buffer[NUMBER_OF_DIGITS]; // Data buffer
      index = NUMBER_OF_DIGITS; // Load counter by digit count
     do
    {
             buffer[--index] = '0' + (value % radix); // Convert configuration by radix(10 or 16)
             if ( buffer[index] > '9') buffer[index] += 'A' - '9' - 1; // For base over 10(base 16)
             value /= radix; // Div by to calculate into next digit
     }     while (value != 0); // End for convert?
     do
    {
           *string++ = buffer[index++]; // Load convert value to string buffer
      } while ( index < NUMBER_OF_DIGITS ); // Over of digit count?
     *string = 0; // Place null for end string
}
void _ltoa(long value_l, char * string_l, unsigned char radix_l)
{
       if (value_l < 0 && radix_l == 10)
      {
              *string_l++ = '-';
              _ultoa(-value_l, string_l, radix_l);
       }
       else
      {
             _ultoa(value_l, string_l, radix_l);
       }
}
void convertint(unsigned int value)
{
       char buff[12];
      _ltoa(value,&buff[0],10);
      convert(&buff[0]);
}      
void convert(char *p)
{
       while(*p)
      {
              U1TXREG =*p;
              while(BusyUART1());
              p++;
      }
}
int main(void)
{
         adc_init();
         uart1_init();
         while(1);
}
         ต่อไปจะเป็นส่วนของ computer โดยใช้โปรแกรม Visual C# 2008 และ code program

 


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
namespace serial_c_2
{
       public partial class Form1 : Form
{
SerialPort _serialPort;
private delegate void SetTextDeleg(string text);
public Form1()
{
        InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
      _serialPort = new SerialPort("COM10", 9600, Parity.None, 8, StopBits.One);
      _serialPort.Handshake = Handshake.None;
      _serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
      _serialPort.ReadTimeout = 1000;
      _serialPort.WriteTimeout = 1000;
}
private void button1_Click(object sender, EventArgs e)
{
       try
       {
        if (!_serialPort.IsOpen)
         _serialPort.Open();
        _serialPort.Write("a");
        }
       catch (Exception ex)
      {
            MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
       }
}
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
         string data = _serialPort.ReadLine();
         this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data });
}
private void si_DataReceived(string data)
{
         textBox1.Text = data.Trim();
}
private void button2_Click(object sender, EventArgs e)
{
        try
        {
                  if (!_serialPort.IsOpen)
                 _serialPort.Open();
                _serialPort.Write("0");
                _serialPort.Close();
        }
        catch (Exception ex)
       {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
        }
}
private void button3_Click(object sender, EventArgs e)
{
        try
       {
                  _serialPort.Write(textBox2.Text );
        }
        catch (Exception ex)
       {
                    MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
        }
}
}
}
      เสร็จแล้วทำการ Run program

วันศุกร์ที่ 21 มกราคม พ.ศ. 2554

การติดต่อ serail port ระหว่าง PC(visual C#) กับ microcontroller (dsPic)

         การติดต่อผ่าน Serail port  ระหว่างComputer กับ Microcontroller หรือ PLC นี้เราสามารถที่จะนำไปประยุกต์ใช้ในงานอุตสาหกรรมทางด้านระบบ automatic ได้และเป็นที่นิยมมากในปัจจุบันเพราะง่ายในการกระทำในบทความนี้ใช้ Microcontroller ในการติดต่อเพราะว่าในโรงงานที่ผมทำงานไม่มี spare part ของอุปกรณ์ special block ของ PLC ที่ติดตอผ่าน serail port จึงหันมาใช้ Microcontroller แทน ในส่วนของ Computer ผมได้เลือกใช้ visual C# เพราะง่ายในการเขียน code และผมมีพื้นฐานภาษา C ในการเรียนที่ มหาลัย และ C และ C# ใกล้เคลียงกันในการเขียน
        ในส่วนแรกจะเป็นการเขียนที่  Computer ก่อนโดยใช้ visual studio เลือก visual C# ออกมาเพื่อใช้งานแล้วคลิกที่ toolbox เลือก textbox ตามรูป



แล้วคลิกที่ textbox ตรงลูกศรเลือก multiline เสร็จแล้วคลิก toolbox เพื่อเลือก  Botton โดยจะเลือกออกมา 3 Bottom คลิกที่ Bottom แล้วคลิกขวาเลือก properties คลิกที่ text แล้วตั้งชื่อ Botton แต่ละตัวตามรูป



คลิกที่ toolbox เลือก Serailport ขึ้นมาเพื่อใช้งาน แล้วดับเบิ้ลคลิกที่ Form เขียน code set ค่า serail port
เสร็จแล้วดับเบ้ลคลิกที่ Botton Connect แล้วเขียน code ตามรูป

ดับเบิ้ลคลิกที่ Botton Disconnect แล้วเขียน code

ในส่วนของ Microcontroller นั้นได้ใช้ dspic30f2010 ในการเขียนโปรแกรมเป็น CPU ขนาด 16 bits ได้ชื้อ borad ทดลอง Inex โดยการทดลองนี้เราได้จำลองว่าถ้ามีการติดต่อ serail port จะให้ขา RB0 ติด(On)ถ้ายกลองการเชื่อมต่อให้ขา RB0 ของ microcontroller ดับ(off) วงจรการเชื่อมต่อดูได้ตามรูป
code program ของ microcontroller ตามข้างล่าง

วันพฤหัสบดีที่ 16 ธันวาคม พ.ศ. 2553

การเขียน PLC Fx2NC เชื่อมต่อกับ FX2NC-4AD

                 เป็นการเชื่อมต่อระหว่าง PLC กับชุดแปลงสัญญาณ Analog เป็นสัญญาณ digital ซึ่งสัญญาณ Analog คื่อจะเป็นสัญญาณที่มีความต่อเนื่องเช่น กระแสไฟฟ้า แรงดันไฟฟ้า อุณหภูมิ เป็นต้น ส่วนสัญญาณ Digital จะเป็นสัญญาณที่ไม่ต่อเนื่องตัวอย่างเช่น สัญญาณของ PWM เป็นต้น
                 เรามาทำความรู้จักกับ Fx2N-4AD กันก่อนซึง Fx2N-4AD เป็นตัวแปลงสัญญาณ analog เป็นสัญญาณ digital ขนาด 12 bit Fx2N-4AD จะต้องต่อกับ PLC Mitsubishi model FX2NC-xxMT เท่านั้น xx หมายถึงจำนวน input กับ output ในตัวอย่างนี้ใช้ Fx2N-96MT หมายความว่าจำนวน input บวก output เท่ากับ 96 หน่วย ส่วน MT หมายถึง input output  เป็นแบบ transistor โดยลักษณะการแปลงสัญญาณจะมีให้เลือก 2 โหมดคือ สัญญาณแรงดันไฟฟ้า กับ สัญญาณกระแสไฟฟ้าในการทดลองนี้จะเป็นการทดลองแบบง่ายโดยการแปลงสัญญาณแรงดันไฟฟ้าเป็นสัญญาณ digital


การทดลองนี้จะใช้ในรูปแรกจะเห็นได้ว่าจะใช้ระดับแรงดันที่ -10V ถึง 10V เป็นการแปลง 12 bit หรือ 2 ยกกำลัง 12 เท่ากับ 4096 แล้วหารด้วย 2 เพราะว่าเราอ้างอิงแรงดันทั้งด้านบวกและด้านลบ คือ -2048 ถึง 2047 การทดลองนี้ได้ต่อวงจรตามรูปข้างล่าง




 รูปวงจรในการต่อทดลอง
เราจะมาศึกษาคำสั้งในการเชื่อมต่อ จะมีคำสั้งที่เขียนเพื่อ set ค่าใน Fx2N-4AD จะใช้คำสั้ง TO
ตัวอย่างการเขียนคื่อ --[TO K0 K0  H1600 K1] จะอธิบายไล่จากซ้ายไปขวา TO เป็นคำสั้งการเขียนไป
ยัง Hardware ภายนอก K0 คือของ spacial function block ที่ทำการเชื่อมต่อ K0 เป็นการต่อช่องที่ 1
ถัดมาจะเป็น K0 จะเป็น Buffer memory ของ spacial function block ที่ทำการเชื่อมต่อ เช่น K0 
ใน Fx2N-4AD จะเป็น buffer memory ที่ใช้ในการเลือกใช้ช่องที่ทำการต่อ CH ในการใช้งานใน Fx2N-4AD จะมีทั้งหมด 4 Ch ต่อมา H1600 จะเป็นการ Set ให้ Fx2N-4AD นี้ทำการอ่าน Ch1 - Ch4  ต่อมาจะเป็น K1 จะเป็นจำนวน word ในการเขียน 1 word เท่ากับ 16 bit นั้นเอง
                  คำสั้ง FROM เป็นคำสั้งในการอ่านจาก  spacial function block (Fx2N-4AD) คำสั้งนี้จะคล้ายคลึงกับคำสั้ง  TO
                  ต่อไปจะเป็นการเขียนโปรแกรมใน PLC โดยใช้ Software  GX deverloper


วันอังคารที่ 14 ธันวาคม พ.ศ. 2553

การเขียน PLC MITSUBISHI เบื่องต้น

การเขียน PLC MITSUBISHI เบื่องต้น

เปิดโปรแกรม GX deverloper ขึ้นมาดังรูปด้านล่าง คลิกเลือก Project แล้วคลิก New Project



<><>
<>
<><>
<>
เลือกรุ่น PLC ที่ต้องการใช้งาน
<><><> 
<><><>
เมือเลือกเสร็จเรียบร้อยจะได้หน้า Project  ดังรูป
การใช้ Input ของ PLC
       ใน PLC Mitsubishi นี้จะใช้ INPUT X ซึ้งจะขึ้นกับชนิดของรุ่นของ PLC เช่นถ้ารุ่น FX จะเป็น CPU ขนาด 8 bit จะนับ x0 ไปจนถึง x7 จะเริ่มที่ x20 ไปถึง x27 เป็นต้นหรือดูที่ตัวเครื่อง PLC
  ก็ได้จะไม่มี x8 หรือ x28 คือจะเลขฐาน 8 นั้นเอง ถ้าเป็นPLC รุ่น A หรือรุ่นใหม่อย่าง Q จะใช้ CPU 16 bitจะนับ Input เป็นเลขฐาน 16 ตัวอย่างเช่น X0 ไปถึง X0F  input ต่อไปคือ X10 ไล่ไปถึง X1F แล้วก็ X20 เป็นต้น 



การใช้งาน Output ของ PLC 

Output ที่ต่อใช้งานกับอุปกรณ์ภายในนอกจะใช้สัญลักณ์ Y ซึ่งการใช้งานต้องดูรุ่นของPLC
เช่น Y0 --> Y7 ต่อไปจะเป็น Y10 เป็นต้นในรุ่นของ Fx ซึ่ง CPU 8 bit
การใช้งาน Lelay ช่วย
รีเลย์ช่วยจะใช้สัญลักณ์ M การใช้งานจะนับเป็นเลขฐาน สิบ เป็นหลักและจะมีรีเลย์ช่วยพิเศษสามารถดูได้จากตารางข้างล่าง
<><>
<>
<><>
<>
การเขียนโปรแกรมเบื่องต้นโดยเริมการเขียนแบบง่ายเป็นการควบคุมมอเตอร์ Start แบบStar 
Run แบบ Delta ตามรูปด้านล่าง
<><>
<>
<><>
<>
ลักษณะการต่อเข้ากับอุปกรณ์ภายนอกจะอธิบายละเอียดในหัวข้อต่อไปนะครับ
ลักษณะการเขียนโปรแกรม PLC แบบง่ายๆ