python能和wincc一起用_python通过ado连接wincc数据库
python通過ado連接wincc數(shù)據(jù)庫(kù)
注意點(diǎn):
1,python需要安裝32位,64位測(cè)試沒通過,具體原因不明
2,若使用Provider=WinCCOLEDBProvider.1需要安裝WINCC連通性數(shù)據(jù)包
3,若直連SQL,使用Provider=SQLOLEDB.1需要安裝msoledbsql_18.2.2.0_x64(微軟官網(wǎng)有下載)
4,測(cè)試請(qǐng)先運(yùn)行wincc
參考資料:
1,官方文檔WinCC_ConnectivityPack_zh-CHS_zh-CHS
2,ADO基礎(chǔ)
程序
import win32com.client
import traceback
import time
# 獲取運(yùn)行時(shí)的數(shù)據(jù)庫(kù)和計(jì)算機(jī)名稱
def getDatasourceNameRT():
runTime = win32com.client.Dispatch(r'CCHMIRuntime.HMIRuntime')
catalog = runTime.Tags("@DatasourceNameRT").Read() # 獲取數(shù)據(jù)庫(kù)名稱
# dataSource = runTime.Tags("@LocalMachineName").Read() # 獲取計(jì)算機(jī)名稱
return catalog
# 獲取變量記錄的變量名
def getArchiveTagNames():
tagNames = {}
try:
catalog = getDatasourceNameRT()
conn = win32com.client.Dispatch(r'ADODB.Connection')
# 因?yàn)閿?shù)據(jù)庫(kù)無賬號(hào)密碼(使用Windows NT集成安全設(shè)置),所以必須設(shè)定Integrated Security=SSPI; 連通性手冊(cè)有說明
DSN = "Provider=SQLOLEDB.1;Data Source=37IK1BOAKVD0VE6WINCC;Initial Catalog={0};Integrated Security=SSPI;".format(
catalog)
# print(DSN)
conn.ConnectionString = DSN
conn.CursorLocation = 3
conn.Open()
oRs = win32com.client.Dispatch(r'ADODB.Recordset')
sSql = "SELECT [ValueID], [ValueName] FROM[{0}].[dbo].[Archive]".format(catalog)
# print(sSql)
oRs.Open(sSql, conn, 1, 1)
# print(oRs.RecordCount)
if not oRs.EOF:
oRs.MoveFirst()
while not oRs.EOF:
# for i in range(len(oRs.Fields)):
# print(oRs.Fields(i).Name, "=", oRs.Fields(i).Value)
tagNames[int(oRs.Fields(0).Value)] = oRs.Fields(1).Value
oRs.MoveNext()
oRs.Close()
conn.Close()
except:
traceback.print_exc()
finally:
return tagNames
# 獲取變量記錄的值
def getTagValue():
try:
# 獲取數(shù)據(jù)庫(kù)名
catalog = getDatasourceNameRT()
conn = win32com.client.Dispatch(r'ADODB.Connection')
DSN = "Provider=WinCCOLEDBProvider.1;Catalog={0};Data Source=.WinCC".format(catalog)
conn.ConnectionString = DSN
conn.CursorLocation = 3
conn.Open()
oRs = win32com.client.Dispatch(r'ADODB.Recordset')
# 獲取變量名稱
tagNames = getArchiveTagNames()
# 方法1:變量名稱
# s = ["'%s'" % name for name in list(tagNames.values())]
# tags = ";".join(s)
# sSql = "TAG:R, ({0}), 2019-1-6 00:00:00.000,2019-1-7 00:00:00.000".format(tags)
# 方法2:變量ID
sSql = "TAG:R, ('9';'14'), '2019-1-6 00:00:00.000','2019-1-7 00:00:00.000'"
print(sSql)
t0 = time.time()
oRs.Open(sSql, conn)
print(oRs.RecordCount, oRs.PageSize, oRs.PageCount, oRs.CacheSize)
i = 0
if not oRs.EOF:
oRs.MoveFirst()
while not oRs.EOF:
# 方法1
a = oRs.GetRows(100000)
for j in range(len(a[1])):
print(i * 100000 + j, a[1][j], tagNames[a[0][j]], a[3][j])
i += 1
# 方法2
# print(oRs.GetString())
# 方法3
# for i in range(len(oRs.Fields)):
# print(oRs.Fields(i).Name, "=", oRs.Fields(i).Value)
# oRs.MoveNext()
except:
traceback.print_exc()
finally:
print(time.time() - t0)
if __name__ == '__main__':
getTagValue()
附件
總結(jié)
以上是生活随笔為你收集整理的python能和wincc一起用_python通过ado连接wincc数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring mvc原理_Spring
- 下一篇: python基础案例教程_python基