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

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

Previous topic - Next topic

x-glove

กำลังมันเลยทีเดียว รออ่านอยู่ระครับ

boe

Quote from: 108engineering on April 10, 2014, 10:15:09 PM
;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

ภาษาซีที่เขียนมันทำงานได้จริงหรือคับ ไม่ต้องแก้ดีเบาว์เลยหรอคับ
ไม่มีความยากจน ในหมู่คนขยัน

boe

 counter ตอนผมเขียนภาษา c จริงๆ ผมว่ามันยุ่งกว่านี้น่ะ
ไม่ว่าเรื่องการ scan  7 segment scan switch ที่กดตั้งค่า การอ่าน input counter ให้ทัน (interupt) การเปรียบเทียบค่า การจำค่าทีตั้งตอนไฟดับ etc.
หรือเขียนเป็นแค่แนวทางคับ
ไม่มีความยากจน ในหมู่คนขยัน


boe

ส่วน PLC มันออกแบบมางานนี้โดยเฉพาะอยู่แล้ว
PLC กับ MCU มันเลยเป็นคนล่ะทางแล้วล่ะคับผมว่า
แต่ล่ะอันมันก็มีความโดดเด่นของมันเองการวางแผนการเขียนโปรแกรมก็ต่างกันสิ้นเชิงแล้วคับ ต้องเลือกใช้ให้ถูกงานมากกว่าคับ จึงจะใช้ประสิทธิภาพมันเต็มที่
ไม่มีความยากจน ในหมู่คนขยัน

108engineering

 ;D ;D ;D  สวัสดีทุก ๆ ท่าน ครับ ขอบคุณสำหรับการติดตาม แลกเปลี่ยนความคิดเห็นครับ และให้กำลังใจกันมาจากทุก ๆ ท่านนะครับ

วันนี้ เรามาดู การเขียนโปรแกรม PLC และการ Simulate  Program PLC Mitsubishi สำหรับควบคุม ไฟจราจร กันครับ

วันนี้ มาส่งการบ้านนะครับ :D   ต้องขอโทษด้วยนะครับ เสียงใน VDO. ออกมา เหมือนอยู่ท่ามกลาง สายฝน กันเลยที่เดียวครับ :-[

ขอบคุณ suriya22 สำหรับการติดตามครับ  คุณ x-glove ดูจะเมามันเอามากนะครับ  และ คุณ boe ที่ร่วมแสดงความคิดเห็นครับ ส่วน โค้ด ผมไม่ค่อยได้เขียนนานแล้วครับ พอเป็นแนวทาง และใน  Code  C ผม มี Debounce  นะครับ ถ้าท่านใดได้ลอง โค้ด แจ้งผล กลับมาด้วยครับ ผิดพลาดยังไงต้องขออภัย ณ. ที่นี้ ด้วยครับ

http://www.youtube.com/v/nZ-Lg-CD52Y&feature=youtu.be

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

boe

ว่าแต่นี่ใช่การโปรโมทเว็ปรึเปล่าครับ แค่สงสัยอ่ะคับ
ยอดขาย cd เดือนนึงไม่ใช่น้อยเลยน่ะคับ
ไม่มีความยากจน ในหมู่คนขยัน

108engineering

      สวัสดี เพื่อน ๆ ที่ติดตามอ่าน โพสของ 108engineering อีกครั้งครับ  ;) ;)   ขอบคุณ คุณ boe ด้วยนะครับที่ติดตามผมในทุก ๆ Post  ขอบคุณกำลังใจดี ๆ ใน Inbox และ หน้า webboard นี้ด้วยนะครับ
       
         หลังจากที่ได้เรียนรู้ แนวทางการเขียนโปรแกรม และการใช้งาน PLC  ไประดับหนึ่งแล้วนะครับวันนี้ ผมจะกล่าวถึงโครงสร้าง
ของ PLC และ MCU พอให้เพื่อน ๆ ได้เห็นภาพรวม เพื่อที่จะเป็นแนวทางในการศึกษาใช้งาน และ นำเอาการจัดการโครงสร้างของทั้ง PLC
และ MCU มาเป็นข้อมูลจะได้ใช้งานได้ง่ายขึ้นนะครับ    ;D
         ในแง่ของ Hardware  MCU นั้น นอกจากตัว Chip แล้วเราจะนึกถึง บอร์ดทดลอง หรือ Development Board เป็น บอร์ตที่ออกแบบมา
สำหรับทดลอง MCU ตัวนั้น ๆ โดยเฉพาะ ทำให้เรา ไม่ต้องเสียเวลา ต่อวงจรเพิ่มเติมก็ทำให้เราสามารถที่จะใช้ MCU นั้นได้ทันที ซึ่งในบ้านเรา
หลาย ๆ ค่ายก็ทำออกมาบ้าง นำเข้ามาบ้าง  เพราะ Chip MCU นั้นจำเป็นจะต้องมีวงจรภายนอกประกอบ ยกตัวอย่าง เช่น  X'Tal สำหรับสร้างจังหวะ
ในการประมวลผล R  Pull Up  หรือวงจร IC ต่าง ๆ ที่จะเข้ามาต่อพวง เพื่อเติมเต็มความสามารถของ MCU เช่น RS232  USB LAN ต่าง ๆ
ดังนั้น  การเริ่มต้น ศึกษา MCU ส่วนใหญ่เราก็จะเริ่มต้นกันที่ เลือกตัว MCU ที่เราสนใจ แล้ว ก็หาเลือก Development Board ที่ มีฟังก์ชันในการทดลอง
ครบ หรือตรงกับความต้องการของโปรเจคเรา หาข้อมูลในการศึกษาได้ง่าย ก็จัดซื้อจัดหา มาเพื่อทดลองเขียนโปรแกรม
   Development Board นั้น ออกแบบมาเพื่อวัตถุประสงค์สำหรับการเรียนรู้ และ ต้นทุนต่ำ สามารถศึกษาเรียนรู้ได้โดยทั่วไป ดังนั้น การ
ออกแบบจึงไม่ได้ คำนึงถึง เกรด ของอุปกรณ์ที่จะใช้ หรือ วงจร ที่เลือกใช้ในการออกแบบ  ว่าจะต้อง มีมาตรฐาน หรือข้อกำหนด
ที่จะนำไปใช้รวมถึง เงื่อนไขการทดสอบ เพื่อนำไปใช้งานจริง ดังนั้น Development Board นั้น จึงเหมาะสำหรับบาง โปรเจคเท่านั้น
ส่วนการพัฒนาสำหรับนักพัฒนา ที่จะสร้างสรรค์ ผลิตภัณฑ์ หรือสินค้า ต่าง ๆ  นั้น หลังจากขั้นตอนของการเขียนโปรแกรม ทดลองด้วย
Development Board แล้วนั้น ก็จะออกแบบวงจรให้เหมาะสมกับ ผลิตภัณฑ์ อีกที ซึ่งในช่วงแรกอาจจะมีต้นทุนที่สูง แต่ถ้าผลิตในจำนวน
เยอะ ก็เฉลี่ยแล้วถูกกว่า PLC แน่นอนครับ      :o

          จากที่กล่าวมาข้างต้นทำให้เราเห็นได้ว่า MCU นั้น ส่วนใหญ่ ที่เราเจอ จะมาพร้อมกับ Development Board แน่นอนถ้าพูดถึง
ต้นทุนและ ขอบข่ายของ Development Board ส่วนใหญ่เราจะทำการทดลองกันในระดับ Low Voltage  เป็น TTL  หลอดไฟ LED  ปุ่มกด ไมโครสวิสต์  และ IC
เบอร์ ต่าง ๆ ที่แต่ละบอร์ต ได้ออกแบบมาแข่งขันกัน ในต้นทุนที่เหมาะสมกับราคา และแข่งขันได้ จนกลายเป็นทางเลือกให้เรา ได้เลือกใช้งาน ได้หลากหลายขึ้น
แตกต่างจาก PLC ที่ออกแบบมาภายใต้มาตรฐานของ อุตสาหกรรม เพื่อรองรับอุปกรณ์ ต่อพวงอื่น ภายใต้มาตรฐานอุตสาหกรรม ซึ่งจะทำให้ PLC
มีราคาสูงขึ้นตามไปด้วยครับ     8)

         ในแง่ของ Software MCU นั้น บริษัท ที่จำหน่าย บอร์ด ก็จะมี โปรแกรมตัวอย่าง รวมถึง Dvier  หรือ Boot Loader หรือ .H (Include File)
มาประกอบเพื่อให้เรา สามารถใช้งาน บอร์ด ได้ง่าย ในเบื้องต้น และเนื่องด้วย Hardware ของ MCU อย่างเช่น IO หรือ Part UART นั้นมีความสามารถ
ที่จะ Config ให้สามารถใช้งานได้หลาย ๆ ฟังก์ชันในตำแหน่ง เดียวกัน เช่น จะกำหนด เป็น Input ก็ได้ หรือ Output ก็ได้ หรือใช้เป็น
ขาที่ใช้ในการสื่อสารก็ได้  ผลก็คือ Driver หรือ การกำหนด โครงสร้างของ ของโปรแกรม ให้ตรงตาม Hardware นั้น เราก็ต้องทำความเข้าใจ
ถึงโครงสร้าง Hardware  และเมื่อเรา เขียนโปรแกรมทดลองในบอร์ต แล้วจะนำไปสร้างวงจร เราเองก็ต้องถ่ายทอด โครงสร้างเหล่านี้ให้ตรง
กับโปรแกรมที่เราออกแบบไว้ด้วยถึงจะใช้งานโปรแกรมได้โดยไม่ต้องเปลี่ยน Driver หรือ Config ในโปรแกรมเราใหม่ และผมเข้าใจว่า ประเด็น
ของการ ทำ Config หรือ Driver นี้แหละที่ทำให้ มือใหม่ พลาดกันบ่อยครั้ง  เพราะเวลาเราทำการทดลองใน Development Board นั้น Drive
หรือ Boot Loader หรือ Include File ต่าง ๆ ผูกสร้างมาโดยผู้ผลิต ที่เข้าใจถึงโครงสร้างเป็นอย่างดี และ แนบมากับบอร์ตให้เราได้ใช้งานกัน
แล้วทำให้เราใช้งานกันได้ง่าย โดยข้ามผ่านการศึกษาเรียนรู้ โครงสร้างของ Hardware กับตัว Config หรือ Include ไฟล์ ต่างๆ ในเชิงลึก
ซึ่ง เข้าใจว่า จะอธิบาย กันให้เข้าใจก็ ยากอยู่พอสมควร เช่น ความสัมพันธ์ของ Register บางตัว กับขา ใช้งานบางขาของ MCU เพื่อให้ตรงกับ
บอร์ต ที่ออกแบบมา และเมื่อก็จะเกิดปัญหาขึ้น เช่น เราเคยทดลองใช้คำสั่งนี้ ฟังก์ชันนี้ มันได้ แต่ทำไมตอนนี้ มันใช้ไม่ได้ มีอะไรผิดพลาดไป
ถ้าไรไม่เข้าใจ เรื่อง Config การ Initial Register หรือการ เขียน Driver สำหรับ แต่ละ Hardware เหล่านี้ เราก็จะไม่สามารถวิเคราะห์หาสาเหตุ
ของปัญหาที่แท้จริง และก็ไม่สามารถที่จะแก้ปัญหาเหล่านั้นได้ครับ     :)

          ในส่วน PLC เนื่องด้วย Hardware ค่อนข้างจะกำหนด ตายตัว และมี Register ภายในสำหรับการเข้าถึงแบบตายตัว ดังนั้น Softwear
ของ PLC จะเข้าถึงได้ไม่ยากนัก และมีรูปแบบการเข้าถึงที่คล้าย ๆ กัน ส่วนการกำหนด Config เพื่อให้สอดคล้องกับการเปลี่ยนแปลงของ Hardware นั้น
PLC จะมี โปรแกรมเป็นลักษณะของ หน้าต่างเฉพาะ เพื่อให้สามารถ ปรับแต่ง Config ของ Hardware ที่เปลี่ยนแปลงไปให้ ตัวโปรแกรมหลัก สามารถ
เข้าถึง Regsiter ที่เพิ่มขึ้นได้  เสมือนกับการเปลี่ยนแปลง หรือแก้ไข Boot Loader  , Driver  หรือ Include File  นั่นเองครับ  ดังนั้นโดยส่วนใหญ่งาน MCU
จึงต้องศึกษา คู่กับ งานเขียนโปรแกรมบน PC  (PC Base) ควบคู่ไปด้วยเพื่อ การปรับ Config หรือ    Setting บางอย่างให้เหมาะกับแต่ละระบบ เมื่อเรานำ
MCU  ไปใช้งานครับ      :D

         ส่วนสำคัญที่จะกล่าวถึงคือ ในเมื่อ Hardware ของแต่ละ Developer นั้นไม่เหมือนกัน ดังนั้น แนวทางการศึกษา และการต่อยอด จึงทำได้ยาก
โครงสร้างของการออกแบบ Hardware และ Software หรือ ไดรเวอร์ จึงแยกกันออกไปของแต่ละ บอร์ต มีความแตกต่างกัน ดังนั้นเมื่อเรา
จะศึกษา ต่อยอด หรือศึกษาเพิ่มเติม แน่นอน เราแทบจะเริ่มต้นทำความเข้าใจเกี่ยวกับ Hardware กันใหม่เลยทีเดียว ปัญหาดังกล่าวเป็น
โจทย์สำคัญ ที่ทำให้เกิดเจ้า Arduino ขึ้นมา จะเห็นได้ว่า โครงสร้างในการทำ Hardware จะเปลี่ยนไป จากเป็น Single Board  ก็ถูกออกแบบ
ให้เป็น Multi Board เพื่อตอบสนองงานของ Developer ได้เป็นอย่างดี และ ทำการกำหนด Hardware ที่ตายตัว เพื่อง่ายต่อ การสร้าง Driver
หรือ โปรแกรมตัวอย่าง และ Function บางอย่างได้ เพราะ Hardware ที่ถูกกำหนด ตายตัว ถึงแม้จะ สร้างความลำบากที่จะไม่สามารถ ดัดแปลง
หรือ แก้ไขเพิ่มเติมเปลี่ยนแปลงได้ตามใจ เหมือน Development Board เมื่อก่อน แต่แน่นอนสิ่งที่ตามมาคือ โปรแกรมได้ง่ายขึ้น มีตัวอย่างที่
สามารถนำมาศึกษา ต่อยอด ใช้งานได้ง่ายขึ้นเยอะ ประกอบกับการหาข้อมูล ในเมื่อ Hardware ไม่แตกต่าง ตัวอย่างโปรแกรม หรือ Config Driver ต่าง ๆ
ก็สามารถหาได้ง่ายขึ้น นับว่าเป็นการก้าวหน้าไปอีกขึ้นสำหรับการศึกษา MCU ครับ   ::)

        ในครั้งต่อไป จะพาไปดูถึงข้อได้เปรียบเสียเปรียบในการจัดการ หน่วยความจำ ระหว่า MCU  และ PLC รวมถึงรูปแบบที่สอดคล้อง เพื่อนำเป็นเป็นตัวอย่าง
ศึกษา และพัฒนาปรับปรุงการออกแบบ และเขียนโปรแกรมของเราได้ครับ    

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

suriya22

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