西门子WinCC Unified PC的GraphQL使用手册

TIA V20版本:添加用户

添加角色,并充分授权,尤其是GraphQL的读写权限。

通过SIMATIC Runtime Manager启动wincc unifi工程。

打开浏览器,访问本地的https://localhost/graphql/,运行正常如图:

连接外网,打开https://studio.apollographql.com/sandbox/explorer工具,在线调试GraphQL接口:

打开查询指令窗口

第一步,请求login获取token:

bash 复制代码
mutation{
login(username:"wincc",password:"Wincc12345"){
token
user{
fullName
id
}
error{
code
description
}
}
}

获取token,后面需要添加到headers里:Authorization Bearer e68814f546ed1360cb533ed7ecf77ae0。

如图所示:

第二步:查询获取变量值Tag_2是变量名称。

bash 复制代码
query Query{
tagValues(names:["Tag_2"]){
name
value{
value
timestamp
quality{
quality
subStatus
}
}
error{
code
description
}
}
}

第三步,写入一个值0:

bash 复制代码
mutation exampleTagValueWrite {
writeTagValues(input:[
{
name:"Tag_2",
value: "0"
}
], quality:{quality: GOOD_NON_CASCADE}){
name
error{
code
description
}
}
}

第四步,订阅一个变量:

bash 复制代码
subscription subscription{
tagValues(names:["Tag_2"]){
value{
value
timestamp
quality{
quality
limit
subStatus
}
}
error{
description
}
}
}
}

GraphQL通过python客户端读取和写入变量:

python 复制代码
from gql import gql, Client
from gql.transport.requests import RequestsHTTPTransport
 
url = 'http://localhost:4000/graphql'
USERNAME = "wincc"
PASSWORD = "Wincc12345"
TAG_NAME = "Tag_2" 
transport = RequestsHTTPTransport(url=url,verify=False, retries=3)
client = Client(transport=transport, fetch_schema_from_transport=True)
 
query = '''
mutation{
login(username:"%s",password:"%s"){
token
user{
fullName
id
}
error{
code
description
}
}
}
'''
 
variable_values = {'Authorization': 'Bearer 2d263aa90155e66bb24f7a4604153ee7'}  # 如果有变量的话
result = client.execute(gql(query % (USERNAME, PASSWORD)), variable_values=variable_values)
token = result['login']['token']
headers={'Authorization': 'Bearer ' + token}
transport = RequestsHTTPTransport(url=url,headers=headers,verify=False, retries=3)
client = Client(transport=transport, fetch_schema_from_transport=True)

query = '''
mutation exampleTagValueWrite {
writeTagValues(input:[
{
name:"%s",
value: "0"
}
], quality:{quality: GOOD_NON_CASCADE}){
name
error{
code
description
}
}
}
'''
result = client.execute(gql(query))
print(result)
query = '''
query Query{
tagValues(names:["%s"]){
name
value{
value
timestamp
quality{
quality
subStatus
}
}
error{
code
description
}
}
}
'''
result = client.execute(gql(query % (TAG_NAME)))
print(result)

GraphQL通过python客户端订阅变量:

python 复制代码
import asyncio
from gql import Client, gql
from gql.transport.websockets import WebsocketsTransport
from websockets.exceptions import ConnectionClosed

GRAPHQL_WS_URL = "wss://localhost:4000/graphql"
TAG_NAME = "Tag_2" 
AUTH_TOKEN = "1a64a7289995f7da6a9baa0cd5eb93db"

headers = {'Authorization': 'Bearer ' + AUTH_TOKEN}

subscription = gql("""
  subscription {
    tagValues(names: ["%s"]) {
      name
      value {
        value
      }
      notificationReason
    }
  }
""" % TAG_NAME)

async def main():
    transport = WebsocketsTransport(GRAPHQL_WS_URL, init_payload=headers)
    
    counter = 0

    try:

      # Using `async with` on the client will start a connection on the transport
      # and provide a `session` variable to execute queries on this connection
      async with Client(
          transport=transport,
          fetch_schema_from_transport=True,
      ) as session:
          async for result in session.subscribe(subscription):
              print(result)
              
              counter += 1
              if counter == 1000:
                print ("Closing connection from the client")          
                break
                  
    except ConnectionClosed:
      print ("Connection closed by the server")

asyncio.run(main())

注意:python依赖库安装pip install gql。

相关推荐
gustt8 小时前
构建全栈AI应用:集成Ollama开源大模型
前端·后端·ollama
千寻girling8 小时前
《 MongoDB 教程 》—— 不可多得的 MongoDB
前端·后端·面试
Wiittch8 小时前
HashMap源码深度剖析
后端
啊阿狸不会拉杆8 小时前
《机器学习导论》第 9 章-决策树
人工智能·python·算法·决策树·机器学习·数据挖掘·剪枝
若水不如远方8 小时前
分布式一致性(三):共识的黎明——Quorum 机制与 Basic Paxos
分布式·后端·算法
三千星8 小时前
从Java到AI:我的转型之路 Ⅱ —— 手撸一个DeepSeek工具库
后端
喵手8 小时前
Python爬虫实战:城市停车收费标准自动化采集系统 - 让停车费透明化的技术实践(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·城市停车收费标准·采集城市停车收费数据·采集停车数据csv文件导出
beata8 小时前
Java基础-9:深入 Java 虚拟机(JVM):从底层源码到核心原理的全面解析
java·后端
无水先生8 小时前
python函数的参数管理(01)*args和**kwargs
开发语言·python
py小王子8 小时前
dy评论数据爬取实战:基于DrissionPage的自动化采集方案
大数据·开发语言·python·毕业设计