C#上位机通过WebApi访问WinCC

发布于:2025-06-20 ⋅ 阅读:(28) ⋅ 点赞:(0)

在智能工厂架构中,WinCC作为SCADA一级,负责着与上级MES和下级PLC及其他现场组件的联系。与下层通信,WinCC支持S7、MC、Modbus TCP、OPC等多种接口和协议。对上层通信,WinCC从7.5 SP2开始支持REST Api这种Web接口方式。

图片

今天跟大家分享一下C#通过Rest Api访问WinCC。

一、组件安装

使用REST需要用到WinCC的两个数据包,在安装WinCC时选择数据包安装,勾选ConnectivityPack下的两个数据包,点击下一步。找到ConnectivityPack,将下面各个组件打勾,然后安装。

图片

安装之后,和WinCC一样需要进行单独授权,这里使用运行Sim_EKB_Install进行授权,如下图所示:

图片

最后检查服务是否开启,按win+R键,运行services.msc,启动服务。找到SIMATIC WinCC CCRestService并将其启动。如无法启动,需要先运行WinCC。

图片

二、创建项目

创建一个WinCC项目,添加一个西门子S7-1500驱动:

图片

然后在此驱动下添加4个变量:

图片

最后创建一个界面,绑定变量,运行结果如下:

图片

三、创建证书

启用REST需要证书,需要先签发一个证书。在系统搜索界面输入IIS,打开Internet Information Services (IIS)管理器,如果没有IIS,可以通过控制面板安装一下:

图片

双击服务器证书,找到创建自签名证书,创建一个证书,名称自定义即可,这个证书,后面会使用到:

图片

四、REST配置

首先打开计算机属性,找到启动,勾选 REST服务:

图片

选择REST设置,勾选 通过REST发送变量值,点击端口证书,选择我们刚刚创建的证书,后面的URL我们等下会使用到。

图片

五、REST权限

回到WinCC主界面,双击打开用户管理器。点击左上角用户管理器字样,在中间一栏最底端点击权限等级,添加一个新的权限——REST权限,这个名称可以自定义。

图片

在左侧用户管理器中右键单击Administrator-Group,添加一个新用户,我这里为admin,也可以取其他名称,然后在右侧设置一个密码,并在权限列表中勾选刚才新添加的权限。

图片

打开变量管理,在变量的右侧属性中找到读授权和写授权,将读写权限设置为刚才新建的Rest权限就可以了。

图片

以上设置完成后意味着我们的admin用户具备Rest权限,可以对相应变量进行读写操作,后面将使用该用户和密码进行数据访问。

六、API测试

接下来我们使用Apifox进行测试,我们首先进行权限设置,点击Auth,类型选择Basic Auth,UserName和Password输入我们前面设置的用户名和密码。

图片

1、单个变量读取,使用Get方法,URL格式如下:

https://{Host}:{Port}/WinCCRestService/tagManagement/Value/{VariableName}

我们读取TempOut变量,按照格式修改Url如下所示:

图片

我们可以看到,成功读取TempOut变量值为28.36946。

2、多个变量读取,使用Post方法,URL格式如下:

https://{Host}:{Port}/WinCCRestService/tagManagement/Values
在Body处以JSON格式输入要读取的变量名,格式如下:
{"variableNames" : ["Tag1", "Tag2"]}

图片

我们可以看到,成功读取TempIn和TempOut变量值。

当然,我们也可以通过REST进行变量写入和访问WinCC的归档,具体方法可以参考官方文档的说明,这里就不做过多阐述了。

七、代码实现

我们来通过C#编写代码实现,这里使用RestSharp库来实现。

1、我们先创建一个简单的窗体:

图片

2、这里编写一个读取多个变量的异步方法:

private string url = "https://DESKTOP-D1CLS40:34568/WinCCRestService/tagManagement/Values";
/// <summary>
/// 读取多个变量,返回字典
/// </summary>
/// <param name="varNames"></param>
/// <returns></returns>
private async Task<Dictionary<string, string>> ReadValueRestAsync(List<string> varNames)
{
    var client = new RestClient(url);
    client.Timeout = -1;
    var request = new RestRequest(Method.POST);
    client.Authenticator = new HttpBasicAuthenticator("admin", "123456");
    JObject body = new JObject();
    body.Add("variableNames", new JArray(varNames));
    request.AddParameter("application/json", body, ParameterType.RequestBody);
    var response = await client.ExecuteAsync(request);
    Dictionary<string, string> result = new Dictionary<string, string>();
    if (response.IsSuccessful)
    {
        JArray array = JArray.Parse(response.Content);
        foreach (var item in array)
        {
            result.Add(item["variableName"].ToString(), item["value"].ToString());
        }
    }
    return result;
}

    3、然后定时读取数据,更新仪表:

    private async void readTimer_Tick(object sender, EventArgs e)
    {
        var result = await ReadValueRestAsync(new List<string>() { "PressureIn", "PressureOut", "TempIn","TempOut" });
        if (result.Count > 0)
        {
            this.meter_PressureIn.Value = Convert.ToDouble(result["PressureIn"]);
            this.meter_PressureOut.Value = Convert.ToDouble(result["PressureOut"]);
            this.meter_TempIn.Value = Convert.ToDouble(result["TempIn"]);
            this.meter_TempOut.Value = Convert.ToDouble(result["TempOut"]);
        }
    }

      4、运行程序,结果如下所示:

      图片

      5、可以对比WinCC画面,数据一致,即实现访问WinCC:

      图片


      网站公告

      今日签到

      点亮在社区的每一天
      去签到