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

TIA V20版本:添加用户
在这里插入图片描述

添加角色,并充分授权,尤其是GraphQL的读写权限。
在这里插入图片描述
通过SIMATIC Runtime Manager启动wincc unifi工程。
在这里插入图片描述
打开浏览器,访问本地的https://localhost/graphql/,运行正常如图:
在这里插入图片描述

连接外网,打开https://studio.apollographql.com/sandbox/explorer工具,在线调试GraphQL接口:
在这里插入图片描述
打开查询指令窗口
在这里插入图片描述

第一步,请求login获取token:

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

在这里插入图片描述
获取token,后面需要添加到headers里:Authorization Bearer e68814f546ed1360cb533ed7ecf77ae0。
如图所示:
在这里插入图片描述
第二步:查询获取变量值Tag_2是变量名称。

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

在这里插入图片描述
第三步,写入一个值0:

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

在这里插入图片描述
第四步,订阅一个变量:

subscription subscription{
tagValues(names:["Tag_2"]){
value{
value
timestamp
quality{
quality
limit
subStatus
}
}
error{
description
}
}
}
}

在这里插入图片描述
GraphQL通过python客户端读取和写入变量:

from gql import gql, Client
from gql.transport.requests import RequestsHTTPTransporturl = '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客户端订阅变量:

import asyncio
from gql import Client, gql
from gql.transport.websockets import WebsocketsTransport
from websockets.exceptions import ConnectionClosedGRAPHQL_WS_URL = "wss://localhost:4000/graphql"
TAG_NAME = "Tag_2" 
AUTH_TOKEN = "1a64a7289995f7da6a9baa0cd5eb93db"headers = {'Authorization': 'Bearer ' + AUTH_TOKEN}subscription = gql("""subscription {tagValues(names: ["%s"]) {namevalue {value}notificationReason}}
""" % TAG_NAME)async def main():transport = WebsocketsTransport(GRAPHQL_WS_URL, init_payload=headers)counter = 0try:# Using `async with` on the client will start a connection on the transport# and provide a `session` variable to execute queries on this connectionasync with Client(transport=transport,fetch_schema_from_transport=True,) as session:async for result in session.subscribe(subscription):print(result)counter += 1if counter == 1000:print ("Closing connection from the client")          breakexcept ConnectionClosed:print ("Connection closed by the server")asyncio.run(main())

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源长期主义:浅谈DeepSeek技术主张与早期论文

开源、长期主义与DeepSeek的技术愿景 ©作者|格林 来源|神州问学 导入:Deepseek在早期就开源了许多优秀的指令模型与对话模型,并发布了多篇论文。以下,我们将基于Deepseek在早期发布的6篇论文,来梳理Deepseek公司的技术路径与…

TTS-Web-Vue系列:Vue3实现内嵌iframe文档显示功能

🖼️ 本文是TTS-Web-Vue系列的新篇章,重点介绍如何在Vue3项目中优雅地实现内嵌iframe功能,用于加载外部文档内容。通过Vue3的响应式系统和组件化设计,我们实现了一个功能完善、用户体验友好的文档嵌入方案,包括加载状态…

Elasticsearch索引设计与调优

一、分片策略设计 1.‌分片容量规划 单分片容量建议30GB(日志场景可放宽至100GB),避免超大分片引发查询延迟。分片总数计算公式:总数据量 / 30GB 1.2(20%余量应对未来增长)。主分片数创建后不可修改,副本分片数支持动态调整。2.‌分片分布优化 PUT logs-2025 { &qu…

Spring AI 集成 Mistral AI:构建高效多语言对话助手的实战指南

Spring AI 集成 Mistral AI:构建高效多语言对话助手的实战指南 前言 在人工智能应用开发领域,选择合适的大语言模型(LLM)与开发框架至关重要。Mistral AI 凭借其高效的多语言模型(如 Mistral-7B、Mixtral-8x7B 等&am…

从新手到高手:全面解析 AI 时代的「魔法咒语」——Prompt

引言:AI 时代的「语言炼金术」 在人工智能技术突飞猛进的今天,我们正在经历一场堪比工业革命的生产力变革。从聊天机器人到图像生成,从数据分析到自动化写作,AI 模型正在重塑人类与信息交互的方式。而在这一切背后,隐…

MySQL 8.0安装(压缩包方式)

MySQL 8.0安装(压缩包方式) 下载安装包并解压 下载 https://dev.mysql.com/downloads/mysql/可关注“后端码匠”回复“MySQL8”关键字获取 解压(我解压到D:\dev\mysql-8.4.5-winx64目录下) 创建mysql服务 注意,这步之前一定要保证自己电…

免费Ollama大模型集成系统——Golang

Ollama Free V2 Web 功能实现:界面交互与后端逻辑 一、Web 界面概述 Ollama Free V2 的 Web 界面提供了丰富的交互功能,包括模型选择、图片上传、历史记录查看等。界面使用 Bootstrap 进行布局,结合 JavaScript 实现动态交互。 二、前端界…

【AI】人工智能数据标注细分和商业机会

一、数据标注的常见方法 数据标注是为人工智能模型训练提供高质量标签的过程,根据数据类型(图像、文本、音频、视频等)的不同,标注方法也有所差异: 1. 图像标注 分类标注:为图像分配类别标签&#xff08…

lanqiaoOJ 652:一步之遥 ← 扩展欧几里得定理

【题目来源】 https://www.lanqiao.cn/problems/652/learning/ 【题目背景】 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 【题目描述】 从昏迷中醒来,小明发现自己被关在X星球的废矿车里。矿车停在平直的废弃…

HTTP / HTTPS 协议

目录 一、前言: 二、Fiddler 抓包工具: 三、http 协议: 1、http 请求: 1.(1)请求行: 1、(2) 请求头: 1、(3) 请求正文: 2、http 响应: 2、(1) 状态码&#x…

使用泛型加载保存数据

文章速览 泛型泛型概述定义优点 实例加载数据保存数据 一个赞,专属于你的足迹! 泛型 泛型概述 泛型(Generics)是 C# 中一种重要的编程特性,它允许程序员编写灵活且类型安全的代码。通过使用泛型,可以创建…

Redis内存淘汰策略和过期键删除策略有哪些?

Redis 提供 8 种内存淘汰策略,以下是详细解析及场景建议: 一、核心策略解析 noeviction (默认策略) 机制:内存满时拒绝新写入操作,返回错误优势:绝对数据安全场景:金融交易系统、医疗数据存储 allkeys-lr…

【C/C++】自定义类型:结构体

文章目录 前言自定义类型:结构体1.结构体类型的声明1.1 结构体回顾1.1.1 结构的声明 1.1.2 结构体变量的创建和初始化1.2 结构的特殊声明1.3 结构的自引用 2.结构体内存对齐2.1 对⻬规则2.2 为什么存在内存对齐?2.3 修改默认对⻬数 3. 结构体传参4.结构体…

PPO算法:一种先进的强化学习策略

什么是PPO算法? PPO(Proximal Policy Optimization)是一种增强学习算法,主要应用于解决连续控制任务。PPO算法在2017年由OpenAI提出,旨在解决传统策略梯度方法在连续控制任务中面临的挑战。PPO算法通过引入一个近似目…

OpenCV实现数字水印的相关函数和示例代码

OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 实现数字水印的相关函数 用OpenCV来实现数字水印功能,需要使用一些位操作函数,我们需要先了解一下这些函数。 1. bitwise_and函数 bitwise_and函数是OpenCV中的位运算函数之一&…

基于Python的计算机科学研究话题管理系统的设计与实现 - 爬虫

标题:基于Python的计算机科学研究话题管理系统的设计与实现 - 爬虫 内容:1.摘要 本文聚焦于基于Python的计算机科学研究话题管理系统的爬虫部分。背景是随着计算机科学研究的快速发展,相关话题数据海量且分散,人工管理效率低。目的是设计并实现一个能高…

告别手动解析!借助 CodeBuddy 快速开发网页源码提取工具

作为一名长期从事 Web 开发的程序员,我们在日常工作中,时不时会需要查看网页的源代码。这么做的目的通常是为了排查前端渲染的问题、分析接口返回的数据结构,或者就是单纯地想快速提取页面中的某些信息,比如文章链接、图片地址&am…

为什么要在 input() 后加 .strip()?

strip() 是 Python 字符串的一个方法,用于去除字符串开头和结尾的空白字符(包括空格、制表符 \t、换行符 \n 等)。 为什么要在 input() 后加 .strip()? 用户在输入时,可能会不小心在开头或结尾输入空格,例…

【日撸 Java 300行】Day 14(栈)

目录 Day 14:栈 一、栈的基本知识 二、栈的方法 1. 顺序表实现栈 2. 入栈 3. 出栈 三、代码及测试 拓展: 小结 Day 14:栈 Task: push 和 pop 均只能在栈顶操作.没有循环, 时间复杂度为 O(1). 一、栈的基本知识 详细的介…

dotnet core c#调用Linux c++导出函数

1.声明C++导出函数 platform_export.h // // Created by dev on 5/6/25. //#ifndef PLATFORM_EXPORT_H #define PLATFORM_EXPORT_H #if defined(_WIN32)#ifdef LIB_EXPORTS#define LIB_API __declspec(dllimport)#else#define LIB_API __declspec(dllimport)#endif #else#ifde…