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:

相关推荐
张人玉16 小时前
WPF 控件速查 PDF 笔记(可直接落地版)(带图片)
大数据·microsoft·ui·c#·wpf
java1234_小锋16 小时前
PyTorch2 Python深度学习 - 初识PyTorch2,实现一个简单的线性神经网络
开发语言·python·深度学习·pytorch2
胡萝卜3.016 小时前
C++面向对象继承全面解析:不能被继承的类、多继承、菱形虚拟继承与设计模式实践
开发语言·c++·人工智能·stl·继承·菱形继承·组合vs继承
Violet_YSWY16 小时前
将axios、async、Promise联系在一起讲一下&讲一下.then 与其关系
开发语言·前端·javascript
luoganttcc16 小时前
用Python的trimesh库计算3DTiles体积的具体代码示例
开发语言·python·3d
我爱画页面16 小时前
vue3封装table组件及属性介绍
开发语言·javascript·ecmascript
逻极16 小时前
Next.js vs Vue.js:2025年全栈战场,谁主沉浮?
开发语言·javascript·vue.js·reactjs
葛小白117 小时前
Winform控件:Combobox
前端·ui·c#·combobox
Python私教17 小时前
C 语言进制转换全景指南
c语言·开发语言·arm开发
caimo17 小时前
Java无法访问网址出现Timeout但是浏览器和Postman可以
java·开发语言·postman