Control & Automation

การประยุกต์ใช้งานโปรโตคอล TCP/IP และฟังก์ชั่น TCP Open ของ PLC

ศุภกรณ์ ธนฉายสวัสดิ์

supakorn.thanachayswat@schneider-electric.com

 

 

 

 

ทุกวันนี้อุปกรณ์ในท้องตลาด เช่น เครื่องอ่านบาร์โค้ด, เครื่องพิมพ์, แหล่งจ่ายไฟ หรือเครื่องมือวัดต่าง ๆ จะมีพอร์ตอีเทอร์เน็ต (Ethernet Port) ให้เชื่อมต่อกับเครื่องคอมพิวเตอร์หรือพีซี ซึ่ง PLC ก็มีความสามารถใช้งานพอร์ตนั้น ทำให้วิธีเชื่อมต่อเปลี่ยนไปจากเดิมมักใช้พอร์ตอนุกรม (Serial Port) RS232 ต่อกันแบบพอร์ตอนุกรมของ PLC หนึ่งพอร์ต ต่อได้เพียงอุปกรณ์เครื่องเดียว เป็นการใช้พอร์ตอีเทอร์เน็ตพอร์ตเดียว ต่อกับอุปกรณ์หลายเครื่อง ซึ่งจะช่วยลดต้นทุนการสร้างเครื่องจักร และได้เครื่องจักรที่ทำงานเร็วขึ้นด้วย

 

 

          บทความนี้จะสาธิตการทำงานกับพอร์ตอีเทอร์เน็ต โดยให้ PLC เป็นทั้งไคลเอนต์และเซิร์ฟเวอร์ เริ่มจากมันทำงานเป็นเซิร์ฟเวอร์รับคำสั่งจากพีซี แล้วทำงานเป็นไคลเอนต์ ส่งคำสั่งวัดค่าความต้านทานให้กับเครื่องดิจิตอลมัลติมิเตอร์ เมื่อเครื่องวัดค่าได้ และส่งมาให้ PLC แล้ว PLC จะส่งค่าไปให้พีซีอีกที บทความนี้จะใช้โมดูลสื่อสารของบริษัท Schneider Electric รุ่น TSX ETY5103, เครื่องดิจิตอลมัลติมิเตอร์ (Digital Multimeter: DMM) ของบริษัท Agilent รุ่น 34410A และพีซีที่ติดตั้งโปรแกรม Visual Basic 6 ทำงานร่วมกันตามวงจรข้างล่างนี้

 

 

 

          ส่วนโปรแกรม จะใช้ฟังก์ชั่นในไลบรารี่ TCP Open ซึ่งไม่ได้รวมอยู่ใน Standard Block Library ของโปรแกรม Unity Pro ผู้ใช้งานจะต้องติดตั้งเพิ่มเติม โดยใช้แผ่นโปรแกรม TLX CDTCP50M หลังจากติดตั้งแล้ว จะได้ฟังก์ชั่นพื้นฐาน (Elementary Function: EF) ซึ่งคล้ายกับฟังก์ชั่นของ Berkeley Socket API และฟังก์ชั่นบล็อกประยุกต์ (Derived Function Block: DFB) ดังนี้

 

 

 

          บทความจะใช้เฉพาะฟังก์ชั่นพื้นฐาน (EF) เท่านั้น รายละเอียดของฟังก์ชั่นที่ใช้งานในบทความ มีดังนี้

 

          ฟังก์ชั่นสร้างซ็อกเก็ตใหม่ตามโมดูลที่กำหนด

 

          FCT_SOCKET(Module_Number, Gest_Index, Management_Param, Socket_Number)

 

          พารามิเตอร์ Module_Number กำหนดโมดูลสื่อสารที่ต้องการใช้งาน, Gest_Index กำหนดอินเด็กซ์ชี้ตำแหน่งเวิร์ดแรกของอะเรย์ Management_Param ซึ่งอะเรย์นี้มีขนาด 4 เวิร์ดเป็นทั้งพารามิเตอร์และรายงานผล (Report) เมื่อทำฟังก์ชั่นเสร็จหมายเลขซ็อกเก็ต จะเก็บในตัวแปร Socket_Number ซึ่งจะถูกใช้กำหนดซ็อกเก็ตของฟังก์ชั่นอื่น ๆ ต่อไป

 

          ฟังก์ชั่นกำหนด IP Address และหมายเลขพอร์ตให้กับซ็อกเก็ตใหม่

 

          FCT_BIND(Module_Number, Socket_Number, Port_Number, Gest_Index, Management_Param)

 

          หมายเลขพอร์ตกำหนดจากพารามิเตอร์ Port_Number (ไม่ควรใช้หมายเลขที่ถูกสงวนไว้ เช่น 23 สำหรับ Telnet Port, 502 สำหรับ Schneider Automation Port) ส่วน IP Address กำหนดจาก IP Address ของโมดูล ดังภาพข้างล่างนี้

 

 

 

          ซึ่งโมดูลสื่อสาร TSX ETY5103 จะต้องเลือกพารามิเตอร์ Net Link เป็น Ethernet_2 ด้วย

 

 

 

          ฟังก์ชั่นให้ซ็อกเก็ตรอการร้องขอเพื่อเชื่อมต่อ (Await Connection Request) จากไคลเอนต์ 

                                         

          FCT_LISTEN(Module_Number, Socket_Number, Gest_Index, Management_Param)

 

          การร้องขอเชื่อมต่อจะเป็นคิว (Queue) บนซ็อกเก็ต จนกว่าจะทำฟังก์ชั่นยอมรับการร้องขอเชื่อมต่อ (Accept a Connection Request) การรับส่งข้อมูลจึงจะกระทำได้              

 

          FCT_ACCEPT(Module_Number, Socket_Number, Clie_Index, Gest_Index, Management_Param, Client_Address)

 

          เมื่อทำฟังก์ชั่นนี้แล้ว ข้อมูลของไคลเอนต์จะถูกเก็บในอะเรย์ Client_Address ดังนี้

 

 

 

          ถ้าต้องการรับหรือส่งข้อมูลกับไคลเอนต์ซ็อกเก็ตใด จะใช้ Client_Address[0] เป็นหมายเลขซ็อกเก็ต ส่วนพารามิเตอร์ Clie_Index ใช้กำหนดเวิร์ดแรกของอะเรย์ Client_Address

 

          สำหรับฟังก์ชั่นสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ จะเป็น

 

          FCT_CONNECT(Module_Number, Socket_Number, Serv_Index, Gest_Index, Server_Address, Management_Param)

 

          พารามิเตอร์ Serv_Index ใช้กำหนดเวิร์ดแรกของอะเรย์ Server_Address ซึ่งเป็นอะเรย์ขนาด 3 เวิร์ด ประกอบด้วย IP Address และหมายเลขพอร์ตของเซิร์ฟเวอร์ วิธีกำหนดค่าอะเรย์นี้ได้แสดงไว้ในโปรแกรมส่วน Client

            

          ฟังก์ชั่น FCT_SELECT ใช้ตรวจสอบอีเวนต์ที่เกิดขึ้นกับทุกซ็อกเก็ต (จะเห็นว่าฟังก์ชั่นนี้ไม่มีพารามิเตอร์ Socket_Number) เมื่อเกิดอีเวนต์แล้ว จึงจะทำฟังก์ชั่นสนองตอบอีเวนต์นั้น เช่น เมื่อมีการขอเชื่อมต่อ จะทำฟังก์ชั่น FCT_ACCEPT, มีข้อมูลจากอุปกรณ์อื่นส่งมาให้ซ็อกเก็ต จะทำฟังก์ชั่น FCT_RECEIVE หรือมีการปิดการเชื่อมต่อ (Close Connection) จะทำฟังก์ชั่น FCT_CLOSE เป็นต้น

 

          FCT_SELECT(Module_Number, Mask_Index, Gest_Index, Management_Param, Socket_Activity)

 

          Mask_Index ใช้ชี้ไปยังเวิร์ดแรกของอะเรย์ Socket_Activity ซึ่งเป็นอะเรย์ขนาด 2 เวิร์ด แต่ละบิตของเวิร์ดแรก Socket_Activity[0] จะถูกเซ็ต เมื่อมีอีเวนต์ที่เกิดจากเซิร์ฟเวอร์แต่ละตัว เช่นเดียวกัน แต่ละบิตของเวิร์ดที่สอง Socket_Activity[1] จะถูกเซ็ตเมื่อมีอีเวนต์ที่เกิดจากการทำงานของไคลเอนต์ เช่น ในบทความนี้ VB เป็นไคลเอนต์แรกหรือซ็อกเก็ตหมายเลข 17 ส่งข้อมูลมาให้ PLC เมื่อทำฟังก์ชั่น FCT_SELECT บิต Socket_Activity[1].0 จะถูกเซ็ต เป็นต้น  

             

          ฟังก์ชั่นรับข้อมูลที่ส่งมาให้ซ็อกเก็ต

 

          FCT_RECEIVE(Module_Number, Socket_Number, Pbuf_Index, Gest_Index, Management_Param, Received_Data)

ข้อมูลที่ได้จะเก็บในพารามิเตอร์เอาต์พุต Received_Data ซึ่งเป็นอะเรย์ของเลขจำนวนเต็ม เริ่มจากตำแหน่งแรกที่กำหนดโดย Pbuf_Index ข้อมูลต้องมีขนาดไม่เกิน 240 ไบต์ (ARRAY[0..119] OF INT)

             

          ฟังก์ชั่นส่งข้อมูลให้อุปกรณ์อื่น

 

          FCT_SEND(Module_Number, Socket_Number, Pbuf_Index, Gest_Index, Data_to_Send, Management_Param)

 

          พารามิเตอร์ Data_to_Send เป็นอะเรย์เก็บข้อมูลที่ต้องการส่ง ขนาดต้องไม่เกิน 240 ไบต์

               

          ฟังก์ชั่นปิดการเชื่อมต่อบนซ็อกเก็ต

 

          FCT_CLOSE(Module_Number, Socket_Number, Gest_Index, Management_Param)

 

          พารามิเตอร์ Socket_Number สามารถกำหนดว่าต้องการปิดการเชื่อมต่อทุกซ็อกเก็ต โดยกำหนดค่าพารามิเตอร์นี้เป็นศูนย์ หรือ ปิดซ็อกเก็ตเดียวเช่นในโปรแกรมของบทความนี้

 

          โปรแกรมมีการทำงานตาม Flow Chart ข้างล่างนี้

 

 

          โปรแกรมแบ่งเป็นสองส่วน ส่วน Server เป็นส่วนหลัก ทำงานร่วมกับ Visual Basic อีกส่วนคือ Client ทำงานร่วมกันกับ เครื่องดิจิตอลมัลติมิเตอร์ การทำงานของโปรแกรมส่วน Server เริ่มจาก เมื่อบิต Start_Connection ถูกเซ็ต โปรแกรมส่วน Server จะเซ็ตอัพซ็อกเก็ตเซิร์ฟเวอร์ ด้วยฟังก์ชั่น FCT_SOCKET, FCT_BIND และ FCT_LISTEN หลังจากนั้นโปรแกรมจะเซ็ตบิต Setup_Connection_DMM สั่งให้โปรแกรมส่วน Client เซ็ตอัพซ็อกเก็ตไคลเอนต์

 

 

          แล้วโปรแกรมจะกลับมาวนลูปตรวจสอบอีเวนต์ที่เกิดจากไคลเอนต์ เริ่มจากมีการขอเชื่อมต่อ, ส่งข้อมูลมาให้, ปิดการเชื่อมต่อ โดยการทำคำสั่ง Close (กดปุ่ม Disconnect บนโปรแกรม VB) หรือปิดโปรแกรม VB และในตอนท้ายของโปรแกรมส่วนนี้ จะตรวจสอบว่าการเชื่อมต่อถูกตัด (Broken Connection) เนื่องจากสาย LAN ของพีซีหลุดหรือไม่ ถ้าการเชื่อมต่อถูกตัด จะเซ็ตบิต Send_Alive

 

 

          เมื่อรันโปรแกรม Visual Basic และกดปุ่ม Connect จะเกิดอีเวนต์ขอเชื่อมต่อ ก็ทำฟังก์ชั่น FCT_ACCEPT

 

 

          หลังจากนั้น ถ้ากดปุ่ม Read บน VB โปรแกรมก็จะเริ่มส่งข้อมูลมาให้ PLC ถ้าข้อมูลที่รับตรงกับที่กำหนดไว้ใน VB โปรแกรมส่วน Server จะสั่งให้โปรแกรมส่วน Client ทำการวัดค่าความต้านทาน ด้วยการเซ็ตบิต Send_Trigger_DMM เมื่อได้ค่า ก็จะส่งค่าความต้านทานให้ VB แต่ถ้าบิต Send_Alive ถูกเซ็ต ก็จะลองส่งข้อมูลเพื่อทดสอบว่าการเชื่อมต่อถูกตัดหรือไม่แทน

 

 

          ถ้าข้อมูลที่รับ ไม่ตรงกับที่กำหนด (Received_Data_VB เท่ากับ Null) แสดงว่าบิต ArrBit_Socket_Activity[Client_Address[0] ] ถูกเซ็ตเนื่องจากการเชื่อมต่อถูกปิด สำหรับการตรวจสอบการเชื่อมต่อถูกตัดนั้น หลังทำฟังก์ชั่น FCT_SEND แล้ว จะตรวจสอบจากรายงานผลใน Management_Param[1]  (การตรวจสอบโดยวิธีนี้มีประสิทธิภาพมากกว่าการตรวจสอบด้วยออปชั่น Keep_Alive) เมื่อตรวจพบ ก็จะนำมาเป็นเงื่อนไขในการปิดซ็อกเก็ตไคลเอนต์ VB

 

 

          ส่วนโปรแกรม Client จะเซ็ตซ็อกเก็ตไคลเอนต์ เริ่มจากฟังก์ชั่น FCT_SOCKET, FCT_BIND และ FCT_CONNECT แล้วสั่งให้เครื่องดิจิตอลมัลติมิเตอร์ รีเซ็ต (Factory Reset)

 

 

          จึงเซ็ตบิต ReSelect_Socket_VB สั่งให้โปรแกรมส่วน Server เริ่มทำการตรวจสอบอีเวนต์ หลังจากนั้นโปรแกรมส่วน Client นี้จะรอ จนกว่าตัวแปร Send_Trigger_DMM ถูกเซ็ต มันจึงส่งคำสั่งวัดค่าความต้านทาน ไปให้เครื่องดิจิตอลมัลติมิเตอร์

 

 

          การอ่านค่าจาก DMM นั้น โปรแกรมจะไม่ทำฟังก์ชั่น FCT_RECEIVE ทันที แต่รอจนกว่าเกิดอีเวนต์ โดยทำฟังก์ชั่น FCT_SELECT ซ้ำ ๆ กัน จึงจะทำฟังก์ชั่น FCT_RECEIVE เพื่อป้องกันไม่ให้อ่านค่าเก่าซ้ำ

 

 

          เมื่อได้ค่าแล้ว จะเซ็ตบิต Send_Data_to_VB สั่งให้โปรแกรมส่วน Server ส่งค่าไปให้ Visual Basic และวนลูปรอการสั่งงานครั้งต่อไปจาก VB

              

          โปรแกรม Visual Basic สำหรับรับ - ส่งข้อมูลกับ PLC มีฟอร์มและคอนโทรล ดังนี้

 

 

          หลังจากรันโปรแกรมนี้ จะต้องสั่งให้ PLC รอรับการขอเชื่อมต่อจาก VB ก่อนที่จะกดปุ่ม Connect และ Read

 

 

          ค่าความต้านทานที่อ่านได้ปรากฏบนลาเบล lblResistance แทนที่ Resistance ? ค่าที่ได้จะอัพเดตทุก 0.2 วินาที

 

          ทดลองปิดการเชื่อมต่อโดยกดปุ่ม Disconnect หรือปิดโปรแกรม หรือถอดสาย LAN ออก ก่อนจะต่อกลับ รอ 10 วินาทีแล้วรันโปรแกรม Visual Basic นี้ใหม่ จะเห็นว่า PLC สามารถรีคอนเน็กต์และทำงานต่อได้ 

 

สงวนลิขสิทธิ์ ตามพระราชบัญญัติลิขสิทธิ์ พ.ศ. 2539 www.thailandindustry.com
Copyright (C) 2009 www.thailandindustry.com All rights reserved.

ขอสงวนสิทธิ์ ข้อมูล เนื้อหา บทความ และรูปภาพ (ในส่วนที่ทำขึ้นเอง) ทั้งหมดที่ปรากฎอยู่ในเว็บไซต์ www.thailandindustry.com ห้ามมิให้บุคคลใด คัดลอก หรือ ทำสำเนา หรือ ดัดแปลง ข้อความหรือบทความใดๆ ของเว็บไซต์ หากผู้ใดละเมิด ไม่ว่าการลอกเลียน หรือนำส่วนหนึ่งส่วนใดของบทความนี้ไปใช้ ดัดแปลง โดยไม่ได้รับอนุญาตเป็นลายลักษณ์อักษร จะถูกดำเนินคดี ตามที่กฏหมายบัญญัติไว้สูงสุด