การหา Downtime ของระบบผลิตด้วย GENESIS32 SCADA

image

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

ระบบSCADAโดยเฉพาะ GENESIS32 จะมีโมดูลที่ตรวจสอบ Alarm เรียกว่า AlarmWorX
ใน AlarmWorX นี้สามารถบันทึกข้อมูลต่าง ๆ ทั้งเมื่อเกิด Alarm และเมื่อเข้าสู่สภาวะปกติ การคำนวน Downtime ด้วย GENESIS32 ได้นั้น ผู้ออกแบบต้องเข้าใจและเรียนรู้การทำงานของระบบAlarm และการเก็บ Alarm ไว้ในฐานข้อมูลเสียก่อน ถ้าท่านได้ชม VDO และลองทดสอบการใช้งาน AlarmWorX และ AlarmWorX Logger มาแล้วก็สามารถอ่านบทความนี้ต่อไปได้ถึงการหา Downtime ออกมาครับ แต่ถ้ายัง ขอแนะนำให้อ่านและทดสอบ AlarmWorX และ AlarmWorX Logger เสียก่อนจาก VDO ต่อไปนี้

 

หลักการคำนวน Downtime

เนื่องจากข้อมูลของ AlarmWorX Logger ที่บันทึกในฐานข้อมูลจะมีเวลาที่เกิด Alarm และเวลาที่ Alarm เข้าสู่สภาวะปกติ (ActiveTime และ EventTime) เราสามารถนำสองค่านี้มาลบกันก็จะได้ระยะเวลาที่Alarmหนึ่ง ๆ เกิดขึ้นในแต่ละครั้ง เมื่อรวมเอาเวลาแต่ละครั้งมาทั้งหมดก็จะได้ Downtime ทั้งหมดของแต่ละวัน แต่ละเดือน แต่ละปี ฯลฯ เพื่อนำมาเป็นเครื่องมือบริหารจัดการการะบวนการผลิต

หลังจากเรียนรู้การทำงานของ AlarmWorX และ AlarmWorX Logger แล้วตามVDO ให้พิจารณาArea ของ Alarm ที่เราได้แบ่งไว้ จัดกลุ่มไว้ เราควรแบ่ง Area ให้ชัดว่า Alarm ใดเกิดขึ้นแล้วกระบวนการจะทำต่อไปไม่ได้ คือเมื่อเกิดAlarmนี้ จะทำให้กระบวนการหยุดลง ให้แยกAreaกับAlarmยิบย่อยที่ไม่ทำให้กระบวนการหยุดทำงาน เอาเฉพาะที่มีผลต่อการหยุดทำงานมาหาค่า Downtime ดังนั้นการแบ่ง Area นั้นสำคัญยิ่ง Alarmแต่ละตัวสามารถจัดเข้าไปไว้ในAreaหลาย ๆAreaได้ ดังนั้นเราไม่ต้องกังวลมากไปว่าจะต้องเอา Alarm ต่าง ๆ ไว้ใน Area ใดAreaหนึ่งเท่านั้น

image

รูปที่ 1 ตัวอย่าง Alarm ที่จัดอยู่ในหลาย Area

จากรูปที่ 1 Alarm สามารถอยู่ในหลาย Area ได้ ไม่ว่าจะ 3, 4,5,… Area หรือมากกว่านั้นก็ตาม (ซึ่งในความเป็นจริงอาจไม่มากเช่นนี้) ดังนั้นถ้า Alarm ตัวไหนมีผลให้เครื่องจักรหยุดหรือผลิตต่อไปไม่ได้ ให้จัดไว้ในAreaร่วมกันอีกหนึ่งAreaเช่น Downtime เป็นต้น (สร้างขึ้นมาเอง) นอกจากที่อยู่ใน Area ตามแผนกหรือตามไลน์การผลิตที่เราแบ่งไว้

ใน AlarmLogger Configurator ให้ตรวจดูว่าเราเก็บข้อมูลไว้ในฐานข้อมูลประเภทไหน เช่นถ้าเก็บไว้เป็น MS SQL หรือ MS Access เราเก็บในชื่อ ODBC อะไรเป็นต้น หรือจะดูชื่อ Server ชื่อ Database จริงก็ได้ และดูด้วยว่าเก็บใน Table ชื่ออะไร

image

รูปที่ 2 ตรงที่ระบุว่าเก็บใน ODBC ชื่ออะไร

image

รูปที่ 3 จุดที่ระบุว่าเก็บในตารางชื่ออะไร (ตารางนี้ AlarmWorX สร้างให้เอง)

จากรููปที่ 2 และ 3 เมื่อเรารู้ว่าเก็บข้อูมูลไว้ที่ODBCไหน ให้ดู Property ของ ODBC ใน Control Panel ว่าเก็บไว้ที่ไหน ซึ่งถ้าเป็น Windows 64 บิตอย่างเช่น Windows 7 64 เราต้องดููจาก C:\Windows\SysWOW64 ในโปรแกรม odbcad32.exe

image
รูปที่ 4 ODBC

เมื่อเราเลือกชื่อODBCแล้วคลิ้กปุ่ม Configure เข้าไปดูจะเห็นว่าต่อกับ Database อะไร เช่นรูปที่ 5 ต่อกับ MS SQL Server ในเครื่อง PC ปัจจุบัน ต่อกับ Database ชื่อ AWXLog

image

รูปที่ 5

เราลองเปิดดูข้อมูลนั้น เช่นถ้าเป็น MS SQL เราสามารุะเปิดด้วย SQL Management Studio ได้

image

รูปที่ 6 เปิดดูข้อมูล

ในตาราง AlarmLog มีคอลัมน์ต่าง ๆ เช่น

– Source คือชื่อของ Alarm แต่ละตัวที่เราสร้างไว้

– ActiveTime วันเวลาที่เกิด

– EventTime วันเวลาที่สิ้นสุด

– Area

– Message ข้อความแจ้งเตือนที่เรากำหนดไว้

ฯลฯ

(ซึ่งคอลัมน์เหล่านี้จะถูกสร้างขึ้นเมื่อมีการทำงานของAlarmLoggerในครั้งแรก ดังนั้นถ้าเราเพิ่งสร้างคอนฟิกขึ้นมาในAlarmLogger และยังไม่ได้Start คอมลัมน์พวกนี้ก็จะยังไม่มีนะครับ)

โปรดสังเกตุว่าถ้า ActiveTime เท่ากับ EventTime นั่นหมายถึงเพิ่งเกิดขึ้น แต่ถ้า ActiveTime น้อยกว่า EventTime นั่นหมายถึงเข้าสู่สภาวะปกติ ดังนั้นเราสามารถใช้ SQL Command คำนวน Downtime ได้ด้วยSQL Commandโดยใช้ฟังก์ชั่น DateDiff

คำสั่งหาค่า Downtime ออกมาแยกตาม Alarm (Source)

SELECT Source, SUM(DATEDIFF(ss, ActiveTime, EventTime)) AS Downtime
FROM AlarmLog
GROUP BY Source

คำสั่งหาค่า Downtime แยกตาม Area

SELECT     Area, SUM(DATEDIFF(ss, ActiveTime, EventTime)) AS Downtime
FROM         AlarmLog
GROUP BY Area

 

คำสั่งหาค่า Downtime แยกตาม Area และตามวันที่ เดือน ปี

SELECT     Area, DAY(ActiveTime) AS dt, MONTH(ActiveTime) AS mth, YEAR(ActiveTime) AS yr, SUM(DATEDIFF(ss, ActiveTime, EventTime)) AS downtime
FROM         AlarmLog
GROUP BY Area, DAY(ActiveTime), MONTH(ActiveTime), YEAR(ActiveTime) ORDER BY dt, mth, yr

 

จากตัวอย่างด้านบนเราจะได้ตัวอย่างผลลัพธ์ของคำสั่งล่าสุดดังรูป

image

รูปที่ 7

จากรูปที่ 7 จะเห็นว่าได้ค่า Downtime เป็นวินาทีแยกตาม Area และวันที่ เดือน ปี ซึ่งเราสามารถประยุกต์ใช้คำสั่งตามที่เราต้องการ เช่นถ้าแยกตาม Area เดือน ปี เท่านั้น ก็ตัดส่วนของวันที่(DAY(ActiveTime))ในคำสั่งออก และตัด dt ใน Order by ที่เป็นส่วนจัดเรียงข้อมูลออกด้วย

การเอาค่าคำสั่งดังกล่าวมาใช้ใน GENESIS32 สามารถทำได้โดยใช้ DataGrid ของ GENESIS32 ซึ่งยืดหยุ่นเพราะสามารถ Export เป็น CSV ไปใช้ใน MS Excel ได้

การเอาค่ามาแสดงใน Data Grid ให้เปิด GraphWorX32 จากนั้นเอา Data Grid ไปวาง

image

รูปที่ 8

เมื่อวางแล้วให้ดับเบิ้ลคลิ้กที่ Data Grid เพื่อเข้าไปกำหนดค่าการเชื่อมต่อ
ในแท็ป General ให้เลือก ADO
แล้วคลิ้ก Connection parameter
เลือก Data Provider เป็น MS SQL หรือ MS Access แล้วแต่ประเภทฐานข้อมูล ในที่นี้จากตัวอย่างเราเลือก MS SQL Server แล้วคลิ้กปุ่ม Build Connection String
กรอกชื่อ Server และเลือกฐานข้อมูล คลิ้ก Test Connection 
คลิ้ก OK, OK

image

รูปที่ 9

เมื่อกลับสู่หน้าต่าง Data Source Connection ให้คัดลอกเอาคำสั่ง SQL จาก SQL Management Studio หรือพิมพ์ขึ้นเอง ไปวางในช่อง Query แล้วคลิ้กปุ่ม Connect
แล้วคลิ้ก OK
เมื่อกลับมายังหน้าต่าง ICONICS Data Mining control properties ให้เอาเครื่องหมายถูกออกจาก Auto update every …จากนั้นทดสอบเข้าสู่โหมด Runtime เท่านี้ก็จะได้ Downtime แสดงบน SCADA

ถ้าดับเบิ้ลคลิ้กบน Data Grid จะพบทูลบาร์สามารถ Export สั่งพิมพฺ หรือ Refresh ข้อมูลได้

image

รูปที่ 10 Export ข้อมูลเป็น CSV ไปใช้ต่อใน MS Excel

 

ถ้าต้องการแสดงค่าเฉพาะบาง Area เช่น Area ชื่อ Downtime เพราะเกี่ยวข้องกับการหยุดของกระบวนการก็เอา Where Area = ‘Downtime’  เข้าไปเช่น

 

SELECT     Area, DAY(ActiveTime) AS dt, MONTH(ActiveTime) AS mth, YEAR(ActiveTime) AS yr, SUM(DATEDIFF(ss, ActiveTime, EventTime)) AS downtime
FROM         AlarmLog
WHERE     (Area = 'Downtime')
GROUP BY Area, DAY(ActiveTime), MONTH(ActiveTime), YEAR(ActiveTime)
ORDER BY dt, mth, yr

Advertisements
This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s