如何從一台OPC Server訪問多個PLC
- 2021 年 10 月 26 日
- 筆記
- Multiple PLCs, OPC Server, PC Access Smart, 多個PLC, 西門子S7-200 Smart
項目中遇到如下情況:
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,參考如下鏈接
//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