項目中遇到如下情況:
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();
}
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);
}
}
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;
}
}