โดยปกติแล้วการสื่อสารในรูปแบบ ASCII มักจะใช้ในการสื่อสารแบบ serial เป็นหลัก แต่บางกรณีเราก็พบว่าบางอุปกรณ์ใช้การสื่อสารแบบ ASCII บนระบบ Ethernet เช่นกัน
ในบทความนี้จะเป็นการสอนการรับส่งข้อมูลแบบ ASCII บนระบบ Ethernet (TCP) ด้วยการใช้คำสั่ง TSEND_C และ TRCV_C ซึ่งเป็นคำสั่งใหม่ที่รวมการสร้าง connection ไว้ใน block เดียว โดยเราจะจำลองอุปกรณ์ฝั่ง server ด้วยการลงโปรแกรม SocketTest ลงบน Computer นั่นเอง
1. สร้าง Data block เพื่อเป็นที่เก็บข้อมูลสำหรับการส่ง กรณีนี้สร้างเป็น Array of Char
2. สร้าง Data block เพื่อเป็นที่เก็บข้อมูลสำหรับการรับเข้ามา กรณีนี้สร้างเป็น Array of Char
1. ให้วางคำสั่ง TRCV_C มาที่โปรแกรมของเรา ในกรณีนี้เราสร้าง Function block ชื่อว่า Test_Send_Receive เอาไว้เพื่อความเป็นระเบียบ ดังนั้นจึงเอา TRCV_C ไปไว้ในนี้ (สังเกตว่าเราใช้รูปแบบ Multi instance DB ดูเรื่องการใช้งาน Instance DB แบบต่างๆใน FB เพื่อประสิทธิภาพสูงสุด)
2. ตั้งค่าให้กับ block TRCV_C โดยเลือก Partner เป็นแบบ Unspecified เพราะเราต้องการส่งข้อมูลหาอุปกรณ์อื่นทั่วๆไป
3. ในส่วนของ Connection data ให้เรา drop down ลงมาแล้วเลือก <new>
ผลที่ได้ก็คือ โปรแกรมจะสร้าง Data block เพื่อผูกค่า parameter ในการรับข้อมูลให้ทันที
4. จากนั้นทำการใส่ข้อมูลที่เหลือให้ครบ เช่น IP address ของ PC ที่เราต้องการไปสื่อสารด้วย, port ต่างๆที่ต้องการใช้ของทั้งสองฝั่ง (ใช้ port อะไรก็ได้ที่ว่างอยู่) และในกรณีนี้เราเลือกให้ PLC เป็นคน Active connection เพื่อสร้างการเชื่อมต่อ จึงเลือก Active connection establishment ที่ฝั่ง PLC
5. ใส่ parameter ที่ block TRCV_C ให้ครบ
• CONT = true เพราะเราต้องการใช้เชื่อมต่อตลอดเวลา
• ADHOC = true หมายความว่าให้รับข้อมูลทันที แม้ว่าข้อมูลที่รับมาจะมีขนาดไม่เท่ากับจำนวน array ที่ตั้งเอาไว้ตรงขา DATA ก็ตาม ถ้าหากเราตั้ง ADHOC = false นั้น ขนาดของข้อมูลที่รับได้ต้องมีจำนวนเท่ากับ array ที่มาใช้รับตรงขา DATA เท่านั้นจึงจะรับได้ ไม่เช่นนั้นจะไม่เกิดการรับใดๆ
• DATA ให้ browse ไปหา array ที่เราได้สร้างมาเพื่อใช้รับข้อมูล
6. ลาก Test_Send_Receive function block มาวางที่ Main และทำการ download โปรแกรมลง PLC
ต่อไปเราจะทำการทดสอบการรับค่าที่ส่งมาจาก Computer ด้วยโปรแกรม SocketTest ซึ่งเป็นโปรแกรมฟรีที่ใช้ทดสอบการรับส่งค่าผ่านทาง TCP/IP ได้เลย เนื่องจากกรณีนี้เราถือว่าเรากำลังใช้ SocketTest แทนอุปกรณ์ในการวัดค่าต่างซึ่งจะถือว่าเป็นอุปกรณ์ Server เราจึงตั้งค่าในส่วนของ Server จากนั้นใส่ IP และ Port ของฝั่ง Computer เองแล้วกด Start Listening เพื่อรอรับการเชื่อมต่อจากฝั่ง PLC
ในขณะที่ฝั่ง Computer กำลังรอรับการเชื่อมต่อจากฝั่ง PLC สังเกตว่าเราจะยังไม่สามารถพิมพ์ข้อความอะไรได้ จนกว่าจะมีการเชื่อมต่อเกิดขึ้น
ซึ่งการเชื่อมต่อจากฝั่ง PLC เกิดขึ้นได้นั้น ก็เพราะเราตั้งค่าขา CONT เป็น true ไว้ตลอดนั่นเอง
เมื่อการเชื่อมต่อสำเร็จ จะเห็นว่าที่ฝั่ง SocketTest จะขึ้นว่ามี New Client หมายเลข IP 192.168.0.99 มาเชื่อมต่อกับมันแล้ว และสังเกตว่าช่อง Message จะสามารถพิมพ์ข้อความได้แล้วด้วย
ให้ทำการ Trig ขา EN_R ให้เป็น true เพื่อเริ่มทำการรับข้อมูลจากฝั่ง SocketTest
ให้พิมพ์ข้อความอะไรก็ได้ไปช่อง Message แล้วกด Send
เราก็จะสามารถรับข้อมูลได้แล้ว และจะนำข้อมูลไปเก็บที่ Data block ที่เราได้สร้างไว้เพื่อเก็บข้อความนั่นเอง สังเกตว่าเราสร้าง array ของการเก็บเอาไว้จำนวน 100 ตัว แต่ข้อมูลที่รับมามีเพียง 11 ตัวก็ยังสามารถรับข้อมูลได้ เพราะเราตั้ง ADHOC ที่ TRCV_C เป็น true เอาไว้นั่นเอง
เหตุผลที่เราทำการรับข้อมูลมาเป็น Array of Char ก็เพราะว่าส่วนใหญ่แล้ว อุปกรณ์ที่ส่งค่าแบบนี้มันจะมีข้อมูลที่เราต้องการจริงๆอยู่เพียงส่วนใดส่วนหนึ่งของข้อความที่รับได้เท่านั้น เช่นมีทั้งข้อความและตัวเลขปนกันอยู่ ด้วยการใช้งานแบบ array เราสามารถเลือกดึงข้อมูลเพียงส่วนใดส่วนหนึ่งออกมาได้ง่ายขึ้น (เช่นคำสั่ง MOVE_BLK) แล้วนำไปเก็บไว้ใน array ที่สร้างมาเพื่อเก็บเฉพาะข้อมูลที่ต้องการจริงๆอีกที แล้วจึงแปลงไปเป็นตัวเลข หรือ String ตามรูปแบบข้อมูลที่ได้มา
1. ให้วางคำสั่ง TSEND_C มาที่โปรแกรมของเรา ในกรณีนี้เราสร้าง Function block ชื่อว่า Test_Send_Receive เอาไว้เพื่อความเป็นระเบียบ ดังนั้นจึงเอา TSEND_C ไปไว้ในนี้
2. ตั้งค่าให้กับ block TSEND_C โดยเลือก Partner เป็นแบบ Unspecified เพราะเราต้องการส่งข้อมูลหาอุปกรณ์อื่นทั่วๆไป
3. ในส่วนของ Connection data นั้น เราไม่ต้องสร้างใหม่ แต่ให้ใช้ DB ตัวเดียวกันกับที่สร้างเอาไว้ตอนทำ TRCV_C ได้เลย เพราะเราต้องการไปคุยกับอุปกรณ์ Computer ตัวเดียวกัน
จากนั้นทำการใส่ข้อมูลที่เหลือให้ครบ เช่น IP address ของ PC ที่เราต้องการไปสื่อสารด้วย, port ต่างๆที่ต้องการใช้ของทั้งสองฝั่ง (ใช้ port อะไรก็ได้ที่ว่างอยู่) และในกรณีนี้เราเลือกให้ PLC เป็นคน Active connection เพื่อสร้างการเชื่อมต่อ จึงเลือก Active connection establishment ที่ฝั่ง PLC
4. ใส่ parameter ที่ block TRCV_C ให้ครบ แล้วทำการ download โปรแกรมลง PLC
• CONT = true เพราะเราต้องการใช้เชื่อมต่อตลอดเวลา
• DATA ให้ browse ไปหา array ที่เราได้สร้างมาเพื่อใช้ส่งข้อมูล
ต่อไปเราจะทำการทดสอบการส่งค่าจาก PLC ไปยัง Computer ที่ได้ลงโปรแกรม SocketTest เอาไว้ ซึ่งตั้งค่าเหมือนกับการใช้ TRCV_C ในขั้นตอนก่อนหน้าทุกประการ เพราะเราถือว่าเรากำลังใช้ SocketTest แทนอุปกรณ์ในการวัดค่าต่าง ซึ่งจะถือว่าเป็นอุปกรณ์ Server เราจึงตั้งค่าในส่วนของ Server จากนั้นใส่ IP และ Port ของฝั่ง Computer เองแล้วกด Start Listening เพื่อรอรับการเชื่อมต่อจากฝั่ง PLC
ในขณะที่ฝั่ง Computer กำลังรอรับการเชื่อมต่อจากฝั่ง PLC สังเกตว่าเราจะยังไม่สามารถพิมพ์ข้อความอะไรได้ จนกว่าจะมีการเชื่อมต่อเกิดขึ้น
เมื่อการเชื่อมต่อสำเร็จ จะเห็นว่าที่ฝั่ง SocketTest จะขึ้นว่ามี New Client หมายเลข IP 192.168.0.99 มาเชื่อมต่อกับมันแล้ว และสังเกตว่าช่อง Message จะสามารถพิมพ์ข้อความได้แล้วด้วย (แต่คราวนี้เราไม่ได้พิมพ์อะไรเพราะต้องการทดสอบการส่งจาก PLC ไปหา Computer)
ให้เราทำการใส่ค่าที่ต้องการส่งออกจาก PLC ในส่วนของ Data block ที่เราได้สร้างเอาไว้สำหรับที่ใช้ส่งค่าออก
ให้ทำการ trig ที่ขา REQ เพื่อเริ่มส่งค่า
จะเห็นว่าค่าสามารถส่งออกไปยัง SocketTest ได้แล้ว
ขอให้เข้าใจว่าในกรณีนี้เราใช้ SocketTest ติดตั้งใน Computer เพื่อแทนการทำงานของอุปกรณ์อื่นๆ ซึ่งเรากำหนด port 4545 ขึ้นมาลอยๆเท่านั้น ในการใช้งานกับอุปกรณ์จริงๆเราต้องตรวจสอบด้วยว่าอุปกรณ์เหล่านั้นใช้ port อะไรในการสื่อสารผ่านทาง Ethernet แล้วกำหนด port ให้ตรงกับอุปกรณ์นั้นๆด้วย
แต่หากเราใช้ Connection data คนละตัวกันนั้น จะสามารถทำงานได้ทีละคำสั่งเท่านั้น เช่นหาก TRCV_C ทำการเชื่อมต่ออยู่ TSEND_C จะไม่สามารถทำการเชื่อมต่อได้เพราะมีการเชื่อมต่ออยู่แล้ว ทำให้ต้องรอจะกว่า TRCV_C จะ disconnect ออกไป คำสั่ง TSEND_C จึงสามารถทำ connection ได้เป็นต้น
จากตัวอย่างที่เราใช้ใน TRCV_C นั้น เราสามารถทำการ on ขา EN_R เอาไว้ตลอดได้หากต้องการทำการรับค่าตลอดเวลา แต่หากเราต้องการรับค่าแบบครั้งต่อครั้ง ให้เราทำการ trig ที่ขา EN_R ทีละครั้ง
![]() |
![]() |
![]() |
INDUSTRIAL ELECTRICAL CO., LTD.
© 2014 Copyright by ie.co.th . All Rights Reserved. |
GOOGLE MAP |
SITE MAP |
|