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。