MCU VS PLC ทางเดียวกัน แต่คนละเลน

Started by 108engineering, November 20, 2013, 07:39:55 AM

Previous topic - Next topic

boe

Quote from: 108engineering on November 29, 2013, 08:35:20 PM
       สวัสดีคุณ boe ด้วยครับกับมาอีกครั้ง ราคานี้ผมยังไม่ได้วางจำหน่ายเลยครับ แต่ผมทดลองแล้วใช้ได้ครับ ตอนนี้เทส หนักเลยคืบหน้าอย่างไร ผมแจ้งให้ทราบอีกทีครับ ผมคิดว่าน่าจะ  3,900 พร้อมสาย Link usb232 และ คู่มือการใช้งาน PLC + HMI เบื้องต้น ขอดูว่าเพื่อน ๆ คนไหนสนใจ และมีความต้องการ ขนาดไหนนะครับ  ตอนนี้ยังไม่ได้วางจำหน่ายครับ ยังไม่มีเงินทุน :-[ หรือจะลอง Pre Order กันดูมั๊ยครับ  ;)แต่เรื่องค้าขาย เอาไว้อีกส่วนดีกว่าครับ เจ้าของกระทู้เค้าจัดระเบียบกระทู้ไว้ดีแล้วครับมีส่วนค้าขายให้ เดี๊ยวผมไปเปิดกระทู้ใหม่อีกทีนะครับ ใน VDO ด้านล่างผม Review ให้พร้อมโจทย์ที่เพื่อนสมาชิก ถามหามาด้วยครับลองไปดูกันครับ ส่วน FB มันก็เขียนด้วย Text Base ครับ ผมอยากนำเสนอ ด้วย Ladder กันก่อน เพราะผมเข้าใจว่า Text Base ใน PLC หรือ FB (Function Block) นั้น คงเป็นเรื่อง ธรรมดาไปแล้วในบอร์ดนี้นะครับ ขอบคุณที่แนะนำวิธีการนำเสนอครับ เดี๊ยวสักระยะ ถ้าเพื่อน ๆ ยังสนใจกันอยู่จะจัดให้นะครับ
         
ที่ผมเขียนน่ะ หมายถึง PLC ของ siemens S7-300 น่ะครับ (ท่านเจ้าของกระทู้อาจจะยังไม่เข้าใจ)
ซึ่งมีวิธีเขียนแตกต่างจาก Mitsubishi มากๆ เพราะการเขียนส่วนใหญ่อิง FB หรือ Function Block ที่เราสร้างขึ้นมาเอง
ซึ่งสอดคล้องกับ DBหรือ Data Block ที่เราสร้างขึ้นมาครับ
Data Block ก็คือชุดตัวแปรต่างๆ ที่เราใช้งานร่วม กับ Function block นั้นๆ
ส่วนโปรแกรมทั่วไปที่เราสร้างทั้งหมด จะต้อง run อยู่บน OB1 เท่านั้น(เปรียบเหมือน main() บนภาษา C)
ว่าไปก็เป็นโครงสร้างคล้ายกับ C ที่เราๆเขียนนั่นแหละครับ
อาจจะทำให้เจ้าของกระทู้กระจ่างขึ้น

ส่วน บอร์ดราคา 3900 บาทผมมองว่าอาจจะแพงไปเพราะราคาเทียบ PLC (มือสอง) 2-3000 บาทก็น่าจะซื้อได้แล้ว สาย Link board ก็น่าจะเป็นแค่ DB9 ธรรมดาเองครับ

ไม่มีความยากจน ในหมู่คนขยัน

azumikittyth

ความรู้เยอะเลย ขอบคุณค่ะ  8)
สุดยอดของเซิฟ Ragnarok Online Class 3 เปิดให้มันส์กันแล้วกับเซิฟแร็คเถื่อนจุติฟรีอันดับหนึ่งของไทย Class3 RO Juti

108engineering

 :o :o งานเข้ายาวเลยครับ ต้องขอโทษเพื่อสมาชิกที่ติด ตามและขอบคุณที่ตามให้กำลังใจดี ๆ เข้ามาด้วยครับ  :)

หลังจากที่เราเห็นตัวอย่าง การใช้งาน State Machine กันมาแล้ว ซึ่งเป็นวิธีการจัดการโปรแกรมที่ ง่าย และสามารถใช้งานได้จริง แบบไม่ซับซ้อนมากนะครับ ในตัวอย่างก่อนหน้าที่ผมทิ้งท้ายไว้ เรื่องของ Timer / Counter ใน MCU นั้น จะใช้การนับจาก Clock Pulse ที่ได้จาก X'tal อาจมีจัดการ คูณ ความถี่ หาร ความถี่ที่เข้ามา เพื่อให้ได้ฐานเวลาที่ต้องการ  หรือ PLL  และ Counter ก็จะมีการ Set เพื่อสลับ Clock Pulse จาก X'tal มาเป็น Clock Pulse หรือ สัญญาณ จากภายนอก ให้สามารถนับได้ ดังนั้น Timer และ Counter จึงจำเป็นต้องเลือกใช้จะซ้ำกันไม่ได้ครับ

ในวงจรไฟฟ้า เราได้เรียนรู้ Relay กันแล้วนะครับ การทำงานคือ ถ้าเราจ่ายไฟ ให้กับ Coil จะส่งผลให้ หน้าสัมผัส ทำการเปลี่ยนสถานะ On/ Off ตามการต่อ NO หรือ NC ทันทีที่เราจ่าย ไฟให้ Coil แต่ถ้า เป็น Timer  เมื่อเราจ่ายไฟให้กับ Coil หน้าสัมผัสของ Timer ทำการเปลี่ยนสถานะก็ต่อเมื่อ จ่ายไฟให้ Coil นานเท่ากับเวลาที่ตั้งไว้ ครับ หน้าสัมผัสถึงจะเปลี่ยนสถานะ โดยสามารถตั้งเวลาได้ ส่วนใหญ่ จะมีหน่วย หรือ Unit ให้ครับ เช่น 1 Sec คือ ค่า เราตั้ง 10 ก็จะมีค่า Timer เป็น 10 Sec หรือ ถ้า Unit เป็น 100 mS. เราตั้งเป็น 10 ก็จะมีค่าเป็น 1 Sec ดังนี้ เราสามารถนำคุณสมบัติของ Timer มาใช้งาน ใน PLC ได้โดยง่าย และสามารถใช้ได้ หลายตัวครับ


เพื่อความเข้าใจผมจะยกตัวอย่าง โจทย์ ง่าย ๆ ครับ ถ้าเรากด ปุ่ม X0 นานกว่า 3 Sec ให้ Lamp1 On  และถ้าปล่อย ก็ให้ Lamp1 Off  ครับ

MCU (ใช้ State  Machine )
int varDelayX0;
int State;
void  isr_timer (void)  interrupt 1    // Interval 10mS.
{   
   // Reload
   // To Do
   switch(State)
   {
                              case 0:      if (X0 == 0)       // PB  Press           
                                               {
                                                         varDelayX0 =0;   // Initial Counter Time
                                                         State = 1;   // Change State to 1
                                                }
                                                break;
                                case 1:       if (X0 == 0)       // PB  Press           
                                               {
                                                         varDelayX0 = varDelayX0 + 1;
                                                         if (verDelayX0 == 300) // 10mS x 1000 = 10000mS. 3 Sec.
                                                         {
                                                                      LAMP1 = 1;          // LAMP ON  <-- Latch Output
                                                                      State = 2;            // Change State to 2
                                                                      varDelayX0 = 0;   // Reset Set Counter Time
                                                          }
                                                }
                                                else         //PB Release
                                                {
                                                           LAMP1 =0;            // LAMP OFF                                                           
                                                           State = 0;             // Change  State to 0
                                                           varDelayX0 = 0;    //Reset Counter Time
                                                 }
                                                 break;
                            case 2:       if (X0 == 1)       // PB  Release         
                                              {
                                                           LAMP1 =0;            // LAMP OFF                                                           
                                                           State = 0;             // Change  State to 0
                                                           varDelayX0 = 0;    //Reset Counter Time
                                              }
                                              break;
   
                }

}

PLC
|        X0
|------| |-----------------------------(T0 K30)------|      Timer Unit 100 mS.
|        T0                                                          |
|------| |---------------------------------(Y0)-------|       LAMP1

ช่วงนี้ งานเข้า เยอะครับ จะพยายามเข้ามา Update กันนะครับ

ขอบคุณทุกท่านที่ติดตาม และเป็นกำลังใจให้ครับ   
:D :D :D :D :D 
..............................................
http://www.108engineering.com
Engineering Knowledge Sharing



unseen

Quote from: 108engineering on April 09, 2014, 12:44:56 AM
:o :o งานเข้ายาวเลยครับ ต้องขอโทษเพื่อสมาชิกที่ติด ตามและขอบคุณที่ตามให้กำลังใจดี ๆ เข้ามาด้วยครับ  :)

หลังจากที่เราเห็นตัวอย่าง การใช้งาน State Machine กันมาแล้ว ...


ดีครับ มีอะไรก็เขียนๆให้ข้อมูลไว้ ผิดสิ่งใดก็แก้ไข เห็นที่นี่ มีคนเก่งๆเยอะ คอยทำให้ข้อมูลมันถูกต้องถูกเวลาเอง
ถือเป็นการพัฒนาฝีมือการให้ข้อมูล
แต่ขอฝากไว้หน่อยช่วยปรับการวาง Code ตัวอย่างซักนิด จะได้ดูง่ายขึ้น ไม่ต้องเล็งมาก
ลองใช้ Insert Code และ indent เข้าช่วยสักหน่อย ก็พอจะอ่านได้ง่ายขึ้นมากกว่าเดิม
ลองดูตัวอย่างนะ


// MCU (ใช้ State  Machine )

int varDelayX0;
int State;

void isr_timer(void) interrupt 1        // Interval 10mS.
{
    // Reload
    // To Do
    switch (State) {
    case 0:
        if (X0 == 0)            // PB  Press           
        {
            varDelayX0 = 0;     // Initial Counter Time
            State = 1;          // Change State to 1
        }
        break;
    case 1:
        if (X0 == 0)            // PB  Press           
        {
            varDelayX0 = varDelayX0 + 1;
            if (verDelayX0 == 300)      // 10mS x 1000 = 10000mS. 3 Sec.
            {
                LAMP1 = 1;      // LAMP ON  <-- Latch Output
                State = 2;      // Change State to 2
                varDelayX0 = 0; // Reset Set Counter Time
            }
        } else                  //PB Release
        {
            LAMP1 = 0;          // LAMP OFF                                                           
            State = 0;          // Change  State to 0
            varDelayX0 = 0;     //Reset Counter Time
        }
        break;
    case 2:
        if (X0 == 1)            // PB  Release         
        {
            LAMP1 = 0;          // LAMP OFF                                                           
            State = 0;          // Change  State to 0
            varDelayX0 = 0;     //Reset Counter Time
        }
        break;
    }
}


แม้ความสวยงามไม่ใช่สาระสำคัญมากนัก แต่ก็ทำให้น่ามองมากขึ้นครับ...

108engineering

 ;D ;D  ครับ ขอบคุณ คุณ unseen ที่แนะนำ ครับต้องขอโทษด้วยครับ ผมไม่เคยใช้ เดี๋ยว จะลองดูนะครับ  :D


ขอบคุณทุกท่านที่ติดตาม และเป็นกำลังใจให้ครับ   
   
..............................................
http://www.108engineering.com
Engineering Knowledge Sharing

suriya22

ได้ความรู้ดีครับ กระทู้นี้  :)
รับพัฒนาระบบอัตโนมัติ uC, รับพัฒนาระบบเกี่ยวกับ RFID SMART CARD(NFC,Mifare, Felica,Type B)
สนใจติดต่อ คุณสุริยา suriya22@gmail.com 086-7627224

108engineering

 ;D ;D สวัสดีทุกท่านที่ติดตามเรามาครับ ขอบคุณทุกคำแนะนำ และติชมด้วยครับ
Counter สำหรับวงจรไฟฟ้า ก็จะสืบทอดคุณสมบัติของ Relay มาเหมือนกันครับ แต่จะ เปลี่ยนสถานะของ Contact ก็ต่อเมื่อมีการ On Coil และมีการ On ขาสัญญาณ เข้ามาครบตามจำนวนที่ตั้งไว้ครับ หน้าสัมผัสของ Counter ถึงจะทำงาน และจะหยุดทำงาน เมื่อมีการกด Reset ให้กับขา Counter



มาถึง Counter กันบ้างครั้ง Counter ก็คือ ฟังก์ชันในการนับครับ โดยทั่วไปมีหลาย เงื่อนไขด้วยกันครับ
แบ่งตามการนับ
    นับขึ้น     นับลง
แบ่งตามเงื่อนไขสัญญาณ
    ขอบขาขึ้น ขอบขาลง (X2  X4  นับทั้งขอบขาขึ้น ขอบขาลง)
แบ่งตามความถี่
    สัญญาณความถี่ต่ำ หรือ พัลล์ที่เข้ามาต่อเวลา มีจำนวนน้อย
    สัญญาณความถี่สูง หรือ พัลล์ที่เข้ามาต่อเวลา มีจำนวนมาก
แบ่งตามรูปแบบสัญญาณ
    สัญญาณ พัลล์ และ ทิศทาง เช่น ถ้า bit1 On สัญญาณที่เข้ามานับขึ้น หรือ bit1 Off สัญญาณที่เข้ามานับลง
    AB Phase เป็นการรับค่า พัลล์จาก Encoder เพื่อให้รับรู้ว่า ตอนนี้ Encoder หนุนไป ด้าน CW หรือ CCW
การประยุคก์
    ใช้ Timer ร่วมกับ Counter เพื่อ นับสัญญาณที่อยู่ภายในเวลา ในงานวัดความเร็วรอบ เป็นต้น

จะเห็นได้ว่า การใช้งาน Counter นั้นมีหลากหลายมากครับ ซึ่งใน MCU และ ใน PLC ก็ทำได้ เหมือน ๆ กัน แต่ใน PLC นั้นจะทำดีเพราะออกแบบ แยกฟังก์ชันสำหรับ Counter นี้มาโดยเฉพาะ ให้เราเลือกใช้งานกันได้ง่าย ๆ ครับรวมถึงการระบุ สเปคของการวัดสัญญาณให้ด้วยในส่วนของคำสั่ง รูปแบบ และความสามารถในการรับความถี่ ให้เราได้เลือกใช้งานกันครับ
ส่วน MCU นั้น เราจะต้องมาเขียนเองครับ ผมจะลองยกตัวอย่าง ง่าย ๆ อีกตัวนะครับ
สมมุติ  เรามี PB1 ให้เป็น X0   และ Lamp ให้เป็น Y0 
โจทย์คือ ต้องการ กดปุ่ม 3 ครั้ง  แล้วให้ Lamp  หรือ Y0 On  และให้ X1 เป็น ปุ่ม RESET ครับเมื่อกดให้ Y0 ดับ และ Reset Counter

ในการเขียน MCU เราก็จะใช้ ลักษณะของ  BackGround ForeGround เหมือนเดิมครับ
Quote
// MCU (ใช้ State  Machine )
int varDelayX0;
int varDelayX1;
int varCntX0;
int State;

void isr_timer(void) interrupt 1        // Interval 10mS.
{
    // Reload
    // To Do
    switch (State)
   {
        case 0:
                           if (X0 == 0)            // PB  Press           
                           {
                                    varDelayX0 = 0;     // Initial  Time
                                    State = 1;              // Change State to 1
                           }
                           if (X1 == 0)            // PB  Reset Press
                           {
                                     varDelayX1 = 0;     // Initial  Time
                                     State = 10;
                           }
                           break;
        case 1:
                           if (X0 == 0)            // PB  Press           
                           {
                                     varDelayX0 = varDelayX0 + 1;
                                     if (verDelayX0 >= 30)      // 10mS x 30 = 300mS.   Debounce
                                     {
                                               varCntX0 = varCntX0 +1;      // Counter UP
                                               if (varCntX0 == 3)
                                               {
                                                           Y0 = 1;                   //  LAMP ON
                                                          State = 2;               
                                               }
                                               else
                                               {
                                                          State = 2;
                                               }
                                      }   
                          }
                          else                  //PB Release    Bounce
                         {                                   
                                       State = 0;          // Change  State to 0
                          }
                         break;
      case 2:
                        if (X0 == 1)            // PB  Release         
                        {                                                           
                                      State = 0;          // Change  State to 0
                                      varDelayX0 = 0;     //Reset Counter Time
                        }
                        break;
      case 10:
                        if (X1 == 0)            // PB  Press           
                        {
                                     varDelayX1 = varDelayX1 + 1;
                                     if (verDelayX1 >= 30)      // 10mS x 30 = 300mS.   Debounce
                                     {
                                                Y0 = 0;           // LAMP OFF
                                                varCntX0 = 0; // Clear Counter
                                                State =0;
                                      }
                        }
                        else                  //PB Release    Bounce
                         {                                   
                                       State = 0;          // Change  State to 0
                          }
                         break;

        }
}

ยาวพอสมควร ในที่นี้ State แรก เราเชคว่า ปุ่ม X0  หรือ  X1 โดนกด เพราะ ผมเขียน if ไม่มี else ดังนั้น State 10 Reset จะสำคัญกว่า
ส่วนการเขียน ใน MCU เราต้องทำการ Debounce เองนะครับ ไม่งั้น กด 1 ครั้ง นับได้หลายพันครับ เร็วมาก ครับในส่วนนี้ PLC มีการกรองความถี่ ของสัญญาณ Input ไว้ให้แล้วครับดังนี้นเราจะเขียนได้ง่ายโดยไม่ต้องกังวลเรื่องของ Bounce ครับ

ส่วนใน PLC

|        X0
|------|||------------------(C0 K3)----|  // ขอบขาขึ้น X0 นับ 1 ครั้ง
|        C0                                        |
|------| |---------------------(Y0)-----|  // ครบ 3 ครั้ง Contact  C0 On
|        X1                                        |
|------| |--------------------(RST C0)-|  // กด X1 Reset Counter Contact จะ Reset ด้วย

8) 8) 8) 8) 8) 8) 8) 8)

เป็นไงกันบ้างครับ ถึงตอนนี้แล้ว ลองดูการบ้านกันดีมั๊ยครับ ผมจะตั้งโจทย์ทิ้งไว้ให้นะครับ

         

สัญญาณไฟ คนข้ามถนน ครับ

มีปุ่ม สำหรับกด ข้ามถนน  สองฝั่งครับ ให้เป็น X0  และ X1
มีไฟ แสดงผล เพื่อให้คนข้ามทราบครับ  ไฟแดง ห้ามข้าม Y0  ไฟเขียว ข้ามถนนได้ Y1
มีไฟ สำหรับแจ้งสัญญาณให้กับรถ ครับ ไฟแดง ไฟเหลือง ไฟเขียว  ให้เป็น Y10 Y11 Y12 ตามลำดับครับ (ไฟ ทำงานพร้อมกัน ทั้งซ้าย ขวา)

การทำงาน
    ในสถาวะปรกติ ให้ไฟแจ้งสัญญาณรถ เป็นเขียว และแจ้งคนข้าม เป็นแดง คือให้รถผ่านได้คนห้ามข้าม
    เมื่อมีการกดสัญญาณจากคน (ปุ่มเป็น กดติดปล่อยดับครับ) หนี่งครั้ง โปรแกรมจะเริ่มนับเวลา จนถึง 30 วินาที ให้แสดงไฟสัญญาณรถ  เปลี่ยนจาก เขียว เป็นเหลือง  และอีก 15 วินาที หลังจากนั้น เปลี่ยนจาก เหลือง เป็นแดง แล้วนับเวลาหลังจากแดงแล้ว 10  วินาที ไฟแจ้งสัญญาณ คนข้ามเปลี่ยนจาก แดง เป็นเขียว นับเวลาไปอีก 40 วินาที  ให้ไฟ ที่แจ้งสัญญาณคนข้าม เปลี่ยนเป็น  เขียวกระพริบ ทุก ๆ 1 วินาที 10 ครั้ง แล้ว จึงเปลี่ยนสัญณาณ ไฟคนข้ามเป็นสีแดง และไฟแจ้งสัญญาณรถ เป็นสีเขียว



ขอบคุณทุกท่านที่ติดตาม และเป็นกำลังใจให้ครับ   
   
..............................................
http://www.108engineering.com
Engineering Knowledge Sharing

suriya22

ชอบๆครับ ตอนนี้กำลังศึกษา PLC อยู่ครับ กำลังรออ่านต่อครับ ขอบคุณครับ
รับพัฒนาระบบอัตโนมัติ uC, รับพัฒนาระบบเกี่ยวกับ RFID SMART CARD(NFC,Mifare, Felica,Type B)
สนใจติดต่อ คุณสุริยา suriya22@gmail.com 086-7627224