Home Solution(ถาม-ตอบ) ตัวอย่างโปรเจ็คC#สร้างSCADAด้วยCOPC DLL: ตรวจจับเมื่อOPC Serverไม่มีการเปลี่ยนแปลง

EDA International ตัวแทนจำหน่ายเป็นทางการ ICONICS, PRElectronics, M-System, Graphon, ABB

ซอร์ฟแวร์ตรวจสอบ/บริหารงานอุตสาหกรรม วิศวกรรม SCADA/HMI (ICONICS GENESIS32/64), Report Solution, Cloud, อุปกรณ์วัดคุม แสดงผล เทอร์มินัล อุปกรณ์ป้องกันทางอิเล็คทรอนิกส์ 

ตัวอย่างโปรเจ็คC#สร้างSCADAด้วยCOPC DLL: ตรวจจับเมื่อOPC Serverไม่มีการเปลี่ยนแปลง

ตัวอย่างโปรเจ็คVisual Studio Express 2010เขียนด้วยภาษาC# ใช้COPC DLL ตรวจสอบว่าOPC Serverที่ติดต่ออยู่นั้นไม่เกิดการเปลี่ยนแปลงใด ๆ ซึ่งอาจเกิดความขัดข้องหรือหลุดไปแล้ว ถ้านิ่งเกินระยะเวลาที่กำหนดให้ Reconnect หรือทำสิ่งอื่นเพิ่มเติมเช่นเปลี่ยนไปติดต่อOPC Serverสำรอง

VDO/บทความที่ควรชมก่อน :

ไฟล์ที่ต้องใช้(ถ้ายังไม่มี)

โค้ดทั้งหมด

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using cpcUnlimited;

namespace TestCOPCDLL2010
{

public partial class Form1 : Form
    {
        copcClass copc1;
        int n1;

        public Form1()
        {
            InitializeComponent();
            copc1 = new copcClass();
            copc1.datChange += new __copcClass_datChangeEventHandler(copc1_datChange);
            copc1.tagAmount = 2;                //กำหนดจำนวน OPC tagที่ต้องการติดต่อ
            copc1.UpdateRate = 1000;            //กำหนดUpdate rateเป็นmsec
            copc1.nodeName = "192.168.1.2";   //กำหนดIP Address เอาไว้ใช้กรณีติดต่อRemote OPC Server
            copc1.svrName = "ICONICS.IconicsOPCUAServer.V5"; //ชื่อOPC Server
            copc1.setItm(0, @"Simulation Examples.Functions.Random1");   //ชื่อOPC tagตัวแรก
            copc1.setItm(1, @"_System._ActiveTagCount");                 //ชื่อOPC Tagตัวที่สอง
            try
            {
                copc1.connectng();  //ติดต่อOPC Server
            }
            catch
            {
            }
        }

void copc1_datChange(int tagIndex)
        {
            n1 = 0;
        }

private void timer1_Tick(object sender, EventArgs e)
        {

            n1 = n1 + 1;
            label3.Text = n1.ToString();

            if (n1 > 5)
            {
                reconnect();
            }

            label1.Text = "" + copc1.tgVal(0);            //แสดงค่าOPC tagตัวแรกในLabel1
        }

private void reconnect()
        {
            try
            {

                copc1.connectng();
            }
            catch
            {
            }

        }

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{

try
{
copc1.disconnec();
}
catch
{
}

}

 

    }
}

ส่วนสำคัญ

ในโค้ดมีการบวกเพิ่มตัวแปร n1 ในSubของTimer ดังนั้นทุก ๆ รอบบของTimer ค่าของn1จะถูกบวกเพิ่ม แต่ถ้าค่าของOPC tagมีการอัพเดทค่าของn1ก็จะถูกรีเซ็ตให้เป็น 0 ที่Sub copc1_datChange แต่ถ้าไม่มีการเปลี่ยนแปลงของOPC Serverเลยค่าn1จะถูกบวกเพิ่มไปเรื่อย ๆ เนื่องจากcopc1_datChangeไม่มีการทำงาน(Subนี้จะทำงานเมื่อมีการเปลี่ยนแปลงของtagทั้งหลายที่COPCติดต่ออยู่) จนในที่สุดเกินค่าที่เรากำหนดเช่นในตัวอย่างคือ5 ก็สั่งให้Reconnect ดังโค้ดที่อยู่ในTimerดังนี้

n1 = n1 + 1;
label3.Text = n1.ToString();

if (n1 > 5)
{
reconnect();
}

 

โค้ดในSubชื่อ reconnectจะสั่งให้พยายามติดต่อOPC Serverใหม่

private void reconnect()
{
    try
       {

          copc1.connectng();
       }
    catch
       {
       }
}

การทำงานเช่นนี้จะช่วยให้มีการติดต่อOPC Serverใหม่เมื่อเกิดหลุดเนื่องจากความขัดข้องเช่นระบบเครือข่ายล่มทำให้OPC Serverในระบบเครือข่ายติดต่อไม่ได้เป็นต้น ซึ่งสสามารถปรับปรุงการทำงานตามต้องการเช่นถ้าn1เพิ่มเกินกว่าที่กำหนดก็ให้เปลี่ยนชื่อOPC ServerไปยังOPC Serverสำรองก่อนconnectใหม่ก็ได้ ทั้งนี้เราควรใช้OPC tagที่มีการเปลี่ยนแปลงอยู่ตลอดในCOPCDLLด้วยเช่นสัญญาณเวลาในกลุ่ม _SystemของICONICS OPC UA/Kepwareเป็นต้น

 

image

 

COPC DLL เป็นActiveX Controlเพื่อเป็นตัวอ่านเขียนข้อมูลกับOPC ServerสามารถทำงานบนC#, VB, VB.Net, Excel และSCADAที่ใช้ActiveXได้ ไม่จำกัดจำนวนIO tagราคาเพียง8,500บาท (เวอร์ชั่นDemoใช้งานได้30วัน)

 

สิ่งที่น่าสนใจ

PR Temp Transmitter 5331A  2-Wire, RTD, TC, Ohm, or mV input

Extremely high measurement accuracy

1.5 kVAC galvanic isolation, Programmable sensor error value