利用hollias comm opcserver 與Python實現交互。代碼如下:
# -*- coding: utf-8 -*-
from sys import *
from getopt import *
#from os import * 造成f = open('test.txt', 'r') TypeError: an integer is required錯誤
import signal
import sys
import os
import types
import datetime
import re, time, csv
import Openopc
import Pyro
import pypyodbc
import random
print os.name
opc_class='Matrikon.OPC.Automation;Graybox.OPC.DAWrapper;HSCOPC.Automation;RSI.OPCAutomation;OPC.Automation'
client_name='OpenOPC'
opc_server='Hollysys.HOLLiASComm.1'
opc_host='127.0.0.1'
taglist=[]
f=open('test.txt','r')
f.seek(0)
for line in f:
print line,
line=line.rstrip('
')#去掉換行符
taglist.append(line)
f.close()
print taglist
class SigHandler:
def __init__(self):
self.signaled = 0
self.sn = None
def __call__(self, sn, sf):
self.sn = sn
self.signaled += 1
# Establish signal handler for keyboard interrupts
def signalhandle():
sh = SigHandler()
signal.signal(signal.SIGINT,sh)
if os.name == 'nt':
signal.signal(signal.SIGBREAK,sh)
signal.signal(signal.SIGTERM,sh)
return sh
def test01():
opc = OpenOPC.client(opc_class, client_name)
print #"### create opc!"
opc.connect(opc_server, opc_host)
print "### connect opc server:", opc_server
pathfile = 'phone.mdb'
tablename = 'user'
conn = mdb_conn(pathfile)
cur = conn.cursor()
print cur
test=random.randint(0, 10)
tag_vale=[('Channel1.Device1.q',test)]#寫隨機數給標簽q
taglist_opc = opc.read(taglist, update=1000,sync=True)
wropc=opc.write(tag_vale)
print wropc
for i in range(len(taglist_opc)):
(name, val, qual, time) = taglist_opc[i]
if qual=='Good':
print 'name:', name
print 'val:', type(val)
print 'qual:', qual
print 'time:', type(time)
#ll=[name,val,]
#sql = "Insert Into " + tablename + " (a,b,c,d) Values ('"+name+"','"+str(val)+"','"+qual+"','"+time+"')"#為強制類型轉換
#sql = "Insert Into " + tablename + " (name,val,qual,time) Values ('"+name+"','123','"+qual+"','"+time+"')"
#sql = "Insert Into " + tablename + " (a,b,c,d) Values ('%s',%.1f,'%s','%s')"%taglist_opc[i] #%s占位
sql = "Insert Into " + tablename + " (a,b,c,d,e) Values ('%s',%.1f,'%s','%s'"%taglist_opc[i]+",'%s')"%tt #%s占位
print sql
if mdb_add(conn, cur, sql):
print("修改成功!")
else:
print("修改失敗!")
else:
print'數據采集失敗'
cur.close() #關閉游標
conn.close()
def mdb_conn(db_name, password = ""):
"""
功能:創建數據庫連接
:param db_name: 數據庫名稱
:param db_name: 數據庫密碼,默認為空
:return: 返回數據庫連接
"""
str = 'Driver=;PWD' + password + ";DBQ=" + db_name
conn = pypyodbc.win_connect_mdb(str)
return conn
def mdb_add(conn, cur, sql):
"""
功能:向數據庫插入數據
:param conn: 數據庫連接
:param cur: 游標
:param sql: sql語句
:return: sql語句是否執行成功
"""
try:
cur.execute(sql)
conn.commit()
return True
except:
return False
if __name__ == '__main__':
while True:
test01()
time.sleep(10)