Back to Top

การสื่อสารกับอุปกรณ์ทั่วๆไปแบบ ASCII ทาง Ethernet

 |  Technical Information - Siemens

การสื่อสารกับอุปกรณ์ทั่วๆไปแบบ ASCII ทาง Ethernet

News & Articles

โดยปกติแล้วการสื่อสารในรูปแบบ ASCII มักจะใช้ในการสื่อสารแบบ serial เป็นหลัก แต่บางกรณีเราก็พบว่าบางอุปกรณ์ใช้การสื่อสารแบบ ASCII บนระบบ Ethernet เช่นกัน

ในบทความนี้จะเป็นการสอนการรับส่งข้อมูลแบบ ASCII บนระบบ Ethernet (TCP) ด้วยการใช้คำสั่ง TSEND_C และ TRCV_C ซึ่งเป็นคำสั่งใหม่ที่รวมการสร้าง connection ไว้ใน block เดียว โดยเราจะจำลองอุปกรณ์ฝั่ง server ด้วยการลงโปรแกรม SocketTest ลงบน Computer นั่นเอง

.


TCP_ASCII_01.png

เตรียมข้อมูลเพื่อใช้เก็บข้อมูลการรับ-ส่ง

1. สร้าง Data block เพื่อเป็นที่เก็บข้อมูลสำหรับการส่ง กรณีนี้สร้างเป็น Array of Char


TCP_ASCII_02

2. สร้าง Data block เพื่อเป็นที่เก็บข้อมูลสำหรับการรับเข้ามา กรณีนี้สร้างเป็น Array of Char


TCP_ASCII_03

การรับข้อมูล TRCV_C

1. ให้วางคำสั่ง TRCV_C มาที่โปรแกรมของเรา ในกรณีนี้เราสร้าง Function block ชื่อว่า Test_Send_Receive เอาไว้เพื่อความเป็นระเบียบ ดังนั้นจึงเอา TRCV_C ไปไว้ในนี้ (สังเกตว่าเราใช้รูปแบบ Multi instance DB ดูเรื่องการใช้งาน Instance DB แบบต่างๆใน FB เพื่อประสิทธิภาพสูงสุด)


TCP_ASCII_04TCP_ASCII_05

2. ตั้งค่าให้กับ block TRCV_C โดยเลือก Partner เป็นแบบ Unspecified เพราะเราต้องการส่งข้อมูลหาอุปกรณ์อื่นทั่วๆไป


TCP_ASCII_06

3. ในส่วนของ Connection data ให้เรา drop down ลงมาแล้วเลือก <new>


TCP_ASCII_07

ผลที่ได้ก็คือ โปรแกรมจะสร้าง Data block เพื่อผูกค่า parameter ในการรับข้อมูลให้ทันที

TCP_ASCII_08

4. จากนั้นทำการใส่ข้อมูลที่เหลือให้ครบ เช่น IP address ของ PC ที่เราต้องการไปสื่อสารด้วย, port ต่างๆที่ต้องการใช้ของทั้งสองฝั่ง (ใช้ port อะไรก็ได้ที่ว่างอยู่) และในกรณีนี้เราเลือกให้ PLC เป็นคน Active connection เพื่อสร้างการเชื่อมต่อ จึงเลือก Active connection establishment ที่ฝั่ง PLC


TCP_ASCII_09.png

5. ใส่ parameter ที่ block TRCV_C ให้ครบ


TCP_ASCII_10.png


• CONT = true เพราะเราต้องการใช้เชื่อมต่อตลอดเวลา
• ADHOC = true หมายความว่าให้รับข้อมูลทันที แม้ว่าข้อมูลที่รับมาจะมีขนาดไม่เท่ากับจำนวน array ที่ตั้งเอาไว้ตรงขา DATA ก็ตาม ถ้าหากเราตั้ง ADHOC = false นั้น ขนาดของข้อมูลที่รับได้ต้องมีจำนวนเท่ากับ array ที่มาใช้รับตรงขา DATA เท่านั้นจึงจะรับได้ ไม่เช่นนั้นจะไม่เกิดการรับใดๆ
• DATA ให้ browse ไปหา array ที่เราได้สร้างมาเพื่อใช้รับข้อมูล

6. ลาก Test_Send_Receive function block มาวางที่ Main  และทำการ download โปรแกรมลง PLC


TCP_ASCII_11

ต่อไปเราจะทำการทดสอบการรับค่าที่ส่งมาจาก Computer ด้วยโปรแกรม SocketTest ซึ่งเป็นโปรแกรมฟรีที่ใช้ทดสอบการรับส่งค่าผ่านทาง TCP/IP ได้เลย  เนื่องจากกรณีนี้เราถือว่าเรากำลังใช้ SocketTest แทนอุปกรณ์ในการวัดค่าต่างซึ่งจะถือว่าเป็นอุปกรณ์ Server เราจึงตั้งค่าในส่วนของ Server จากนั้นใส่ IP และ Port ของฝั่ง Computer เองแล้วกด Start Listening เพื่อรอรับการเชื่อมต่อจากฝั่ง PLC


TCP_ASCII_12

ในขณะที่ฝั่ง Computer กำลังรอรับการเชื่อมต่อจากฝั่ง PLC สังเกตว่าเราจะยังไม่สามารถพิมพ์ข้อความอะไรได้ จนกว่าจะมีการเชื่อมต่อเกิดขึ้น


TCP_ASCII_13

ซึ่งการเชื่อมต่อจากฝั่ง PLC เกิดขึ้นได้นั้น ก็เพราะเราตั้งค่าขา CONT เป็น true ไว้ตลอดนั่นเอง


TCP_ASCII_14

เมื่อการเชื่อมต่อสำเร็จ จะเห็นว่าที่ฝั่ง SocketTest จะขึ้นว่ามี New Client หมายเลข IP 192.168.0.99 มาเชื่อมต่อกับมันแล้ว  และสังเกตว่าช่อง Message จะสามารถพิมพ์ข้อความได้แล้วด้วย


TCP_ASCII_15

ให้ทำการ Trig ขา EN_R ให้เป็น true เพื่อเริ่มทำการรับข้อมูลจากฝั่ง SocketTest


TCP_ASCII_16

ให้พิมพ์ข้อความอะไรก็ได้ไปช่อง Message แล้วกด Send


TCP_ASCII_17

เราก็จะสามารถรับข้อมูลได้แล้ว และจะนำข้อมูลไปเก็บที่ Data block ที่เราได้สร้างไว้เพื่อเก็บข้อความนั่นเอง สังเกตว่าเราสร้าง array ของการเก็บเอาไว้จำนวน 100 ตัว แต่ข้อมูลที่รับมามีเพียง 11 ตัวก็ยังสามารถรับข้อมูลได้ เพราะเราตั้ง ADHOC ที่ TRCV_C เป็น true เอาไว้นั่นเอง


TCP_ASCII_18

เหตุผลที่เราทำการรับข้อมูลมาเป็น Array of Char ก็เพราะว่าส่วนใหญ่แล้ว อุปกรณ์ที่ส่งค่าแบบนี้มันจะมีข้อมูลที่เราต้องการจริงๆอยู่เพียงส่วนใดส่วนหนึ่งของข้อความที่รับได้เท่านั้น เช่นมีทั้งข้อความและตัวเลขปนกันอยู่  ด้วยการใช้งานแบบ array เราสามารถเลือกดึงข้อมูลเพียงส่วนใดส่วนหนึ่งออกมาได้ง่ายขึ้น (เช่นคำสั่ง MOVE_BLK) แล้วนำไปเก็บไว้ใน array ที่สร้างมาเพื่อเก็บเฉพาะข้อมูลที่ต้องการจริงๆอีกที แล้วจึงแปลงไปเป็นตัวเลข หรือ String ตามรูปแบบข้อมูลที่ได้มา

 

 


การส่งข้อมูล TSEND_C

1. ให้วางคำสั่ง TSEND_C มาที่โปรแกรมของเรา ในกรณีนี้เราสร้าง Function block ชื่อว่า Test_Send_Receive เอาไว้เพื่อความเป็นระเบียบ ดังนั้นจึงเอา TSEND_C ไปไว้ในนี้


TCP_ASCII_19

2. ตั้งค่าให้กับ block TSEND_C โดยเลือก Partner เป็นแบบ Unspecified เพราะเราต้องการส่งข้อมูลหาอุปกรณ์อื่นทั่วๆไป


TCP_ASCII_20

3. ในส่วนของ Connection data นั้น เราไม่ต้องสร้างใหม่ แต่ให้ใช้ DB ตัวเดียวกันกับที่สร้างเอาไว้ตอนทำ TRCV_C ได้เลย เพราะเราต้องการไปคุยกับอุปกรณ์ Computer ตัวเดียวกัน

จากนั้นทำการใส่ข้อมูลที่เหลือให้ครบ เช่น IP address ของ PC ที่เราต้องการไปสื่อสารด้วย, port ต่างๆที่ต้องการใช้ของทั้งสองฝั่ง (ใช้ port อะไรก็ได้ที่ว่างอยู่) และในกรณีนี้เราเลือกให้ PLC เป็นคน Active connection เพื่อสร้างการเชื่อมต่อ จึงเลือก Active connection establishment ที่ฝั่ง PLC


TCP_ASCII_21

 

4. ใส่ parameter ที่ block TRCV_C ให้ครบ แล้วทำการ download โปรแกรมลง PLC


TCP_ASCII_22


•  CONT = true เพราะเราต้องการใช้เชื่อมต่อตลอดเวลา
•  DATA ให้ browse ไปหา array ที่เราได้สร้างมาเพื่อใช้ส่งข้อมูล

ต่อไปเราจะทำการทดสอบการส่งค่าจาก PLC ไปยัง Computer ที่ได้ลงโปรแกรม SocketTest เอาไว้ ซึ่งตั้งค่าเหมือนกับการใช้ TRCV_C ในขั้นตอนก่อนหน้าทุกประการ เพราะเราถือว่าเรากำลังใช้ SocketTest แทนอุปกรณ์ในการวัดค่าต่าง ซึ่งจะถือว่าเป็นอุปกรณ์ Server เราจึงตั้งค่าในส่วนของ Server จากนั้นใส่ IP และ Port ของฝั่ง Computer เองแล้วกด Start Listening เพื่อรอรับการเชื่อมต่อจากฝั่ง PLC


TCP_ASCII_12

ในขณะที่ฝั่ง Computer กำลังรอรับการเชื่อมต่อจากฝั่ง PLC สังเกตว่าเราจะยังไม่สามารถพิมพ์ข้อความอะไรได้ จนกว่าจะมีการเชื่อมต่อเกิดขึ้น


TCP_ASCII_13

เมื่อการเชื่อมต่อสำเร็จ จะเห็นว่าที่ฝั่ง SocketTest จะขึ้นว่ามี New Client หมายเลข IP 192.168.0.99 มาเชื่อมต่อกับมันแล้ว  และสังเกตว่าช่อง Message จะสามารถพิมพ์ข้อความได้แล้วด้วย (แต่คราวนี้เราไม่ได้พิมพ์อะไรเพราะต้องการทดสอบการส่งจาก PLC ไปหา Computer)


TCP_ASCII_15

ให้เราทำการใส่ค่าที่ต้องการส่งออกจาก PLC ในส่วนของ Data block ที่เราได้สร้างเอาไว้สำหรับที่ใช้ส่งค่าออก


TCP_ASCII_23

ให้ทำการ trig ที่ขา REQ เพื่อเริ่มส่งค่า


TCP_ASCII_24

จะเห็นว่าค่าสามารถส่งออกไปยัง SocketTest ได้แล้ว


TCP_ASCII_25.png

 

ขอให้เข้าใจว่าในกรณีนี้เราใช้ SocketTest ติดตั้งใน Computer เพื่อแทนการทำงานของอุปกรณ์อื่นๆ ซึ่งเรากำหนด port 4545 ขึ้นมาลอยๆเท่านั้น ในการใช้งานกับอุปกรณ์จริงๆเราต้องตรวจสอบด้วยว่าอุปกรณ์เหล่านั้นใช้ port อะไรในการสื่อสารผ่านทาง Ethernet แล้วกำหนด port ให้ตรงกับอุปกรณ์นั้นๆด้วย

เพิ่มเติม

  • การที่เราใช้ Connection data สำหรับ TSEND_C และ TRCV_C โดยอ้างอิง Data block เดียวกันแบบที่เราทำนั้น ทำให้เราสามารถทำการรับ-ส่งข้อมูลได้พร้อมกัน
    TCP_ASCII_26.png


แต่หากเราใช้ Connection data คนละตัวกันนั้น จะสามารถทำงานได้ทีละคำสั่งเท่านั้น เช่นหาก TRCV_C ทำการเชื่อมต่ออยู่ TSEND_C จะไม่สามารถทำการเชื่อมต่อได้เพราะมีการเชื่อมต่ออยู่แล้ว ทำให้ต้องรอจะกว่า TRCV_C จะ disconnect ออกไป คำสั่ง TSEND_C จึงสามารถทำ connection ได้เป็นต้น
 
จากตัวอย่างที่เราใช้ใน TRCV_C นั้น เราสามารถทำการ on ขา EN_R เอาไว้ตลอดได้หากต้องการทำการรับค่าตลอดเวลา แต่หากเราต้องการรับค่าแบบครั้งต่อครั้ง ให้เราทำการ trig ที่ขา EN_R ทีละครั้ง

  • สภาวะเริ่มต้น ขา EN_R เป็น OFF
    TCP_ASCII_27
  • ต่อมาทำการ trig ขา EN_R ให้เป็นขอบขาขึ้น จะเห็นว่าขา BUSY เป็น TRUE แล้วเพื่อรอรับค่า
    TCP_ASCII_28
  • แม้ว่าขา EN_R จะเป็น OFF แล้ว ขา BUSY ก็จะ on ค้างเพื่อรอรับข้อมูลอยู่ หลังจากนี้หามีข้อมูลเข้ามา ก็ยังคงรับข้อมูลได้และนำข้อมูลไปเก็บยัง Data block ของขา DATA ตามปกติ
    TCP_ASCII_29

 

 

thx to siemens

click1 click2 click3

« Back
© Developed by CommerceLab