如何從一台OPC Server訪問多個PLC


項目中遇到如下情況:

1. 整條生產線由多個PLC分別控制,但是所有PLC在同一個局域網內。PLC采用西門子的S7-200 Smart

2. 客戶希望在操作工站的電腦(跟PLC在同一個局域網內)上提供一個上位機軟件,用來讀取/寫入各個PLC的變量

3. 上位機軟件通過OPC DA跟各個PLC進行通信

4. OPC Server采用西門子提供的PC Access Smart軟件

5. 最終遇到的問題是如何在一個上位機軟件上訪問多個PLC?

 

關於PC Access Smart,參考如下鏈接

http://www.ad.siemens.com.cn/productportal/Prods/s7-200-smart-portal/200SmartTop/SmartSMS/017.html

通過研究該軟件隨機附帶的VB程序,終於發現竅門。

1. 在操作工站電腦上安裝PC Access Smart之后,后台會有一個OPCDAAutomation的程序在運行,該程序即為OPC Server

2. 上位機軟件首先連接該OPC Server,其中,OPC Server的名字固定為S7200SMART.OPCServer

3. 在指定Tag名稱時,要按照如下格式2:192.168.2.17:0201:0201,I4.2,BOOL,R

 

4. OPC Server解析Tag名稱時,會去連接指定的PLC,訪問指定的變量地址

代碼如下:

private void btnConnect_Click(object sender, EventArgs e)
        {

            if (txtOPCServerName.Text.Trim() == "")
            {

                MessageBox.Show("OPC server name cannot be empty!");

                return;

            }

            try
            {

                _helper.GetOPCServers(txtOPCServerName.Text.Trim());

                txtOPCServerName.ReadOnly = true;

                btnRead.Enabled = true;

                btnWrite.Enabled = true;


            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);

            }
        }
View Code
private void btnRead_Click(object sender, EventArgs e)
        {

            if (txtOPCTagName.Text.Trim() == "")
            {

                MessageBox.Show("OPC tag name cannot be empty!");

                return;

            }

            txtReadWriteValue.Text = _helper.ReadValue(txtOPCTagName.Text).ToString();

        }
View Code
        public void GetOPCServers(string svrName)
        {

            IPHostEntry IPHost = Dns.GetHostEntry(Environment.MachineName);

            try
            {
               
                KepServer = new OPCServer();

                object serverList = KepServer.GetOPCServers(IPHost.HostName.ToString());

                int i = 0;

                foreach (string serverName in (Array)serverList)
                {

                    serverNames.Add(serverName);

                }

                ConnectServer(svrName);

            }

            catch (Exception ex)
            {

                throw new Exception("Connect Error:" + ex.Message);

            }

        }
View Code
public object ReadValue(string tagName)
        {

            GetTagValue(tagName);

            Thread.Sleep(500);

            object ItemValues; object qualities; object timeStamps;

            try
            {

               KepItem.Read(1, out ItemValues, out qualities, out timeStamps);

                return ItemValues;

            }

            catch
            {

                return null;

            }

        }
View Code

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM