C#上位机通过WebApi访问WinCC

在智能工厂架构中,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:

相关推荐
2201_753169477 分钟前
implement用法
java·开发语言
Mazeltov&&Iliua2 小时前
JAVA 基础知识(一)
java·开发语言
TomCode先生3 小时前
C# 基础知识总结(带详细文字说明)
开发语言·c#
是紫焅呢3 小时前
F接口基础.go
开发语言·后端·青少年编程·golang·visual studio code
虾球xz3 小时前
CppCon 2017 学习:folly::Function A Non-copyable Alternative to std::function
开发语言·c++·学习
程序员弘羽3 小时前
extern关键字:C/C++跨文件编程利器
c语言·开发语言·c++
听忆.3 小时前
Java修改接口 校验一个或多个字段不可重复(自定义注解)
java·开发语言·数据库
xcs194053 小时前
java 基础方法 list分页
java·开发语言
华子w9089258593 小时前
基于 Python Django 框架的在线租房管理系统设计与实现
开发语言·python·django