python通过ado连接wincc数据库

已锁定

gvren

  • 帖子

    2
  • 精华

    1
  • 被关注

    0

论坛等级:游民

注册时间:2009-05-06

普通 普通 如何晋级?

python通过ado连接wincc数据库

6457

11

2019-06-22 17:14:05

star star star

python通过ado连接wincc数据库

注意点:

1,python需要安装32位,64位测试没通过,具体原因不明

2,若使用Provider=WinCCOLEDBProvider.1需要安装WINCC连通性数据包

3,若直连SQL,使用Provider=SQLOLEDB.1需要安装msoledbsql_18.2.2.0_x64(微软官网有下载)

4,测试请先运行wincc


参考资料:

1,官方文档WinCC_ConnectivityPack_zh-CHS_zh-CHS

https://support.industry.siemens.com/cs/document/109746336/wincc-%E8%BF%9E%E9%80%9A%E6%80%A7%E8%BD%AF%E4%BB%B6%E5%8C%85-v7-4-sp1?dti=0&lc=zh-CN

2,ADO基础

https://www.runoob.com/ado/ado-tutorial.html


程序

import win32com.client
import traceback
import time


# 获取运行时的数据库和计算机名称
def getDatasourceNameRT():
   runTime = win32com.client.Dispatch(r'CCHMIRuntime.HMIRuntime')
   catalog = runTime.Tags("@DatasourceNameRT").Read()  # 获取数据库名称
   # dataSource = runTime.Tags("@LocalMachineName").Read()  # 获取计算机名称
   return catalog


# 获取变量记录的变量名
def getArchiveTagNames():
   tagNames = {}
   try:
       catalog = getDatasourceNameRT()
       conn = win32com.client.Dispatch(r'ADODB.Connection')
       # 因为数据库无账号密码(使用Windows NT集成安全设置),所以必须设定Integrated Security=SSPI; 连通性手册有说明
       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:
       # 获取数据库名
       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()


附件

python测试连接wincc数据库.txt


python通过ado连接wincc数据库 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC WinCC / Panel

共有30993条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。