记一次通过使用Python的ModBusTCP库来控制电力开关站电气一次接线状态图
先上代码
file_name querydata1.py
# -*- coding: UTF-8 -*-
import pymysql
def queryData1():
db = pymysql.connect("127.0.0.1","root","root#admin","lxfc2")
cursor = db.cursor()
lists = []
sql = "SELECT `kgzt` FROM `snd` WHERE `id` = 1"
try:
cursor.execute(sql)
result = cursor.fetchone()[0]
if result == 0:
a = b = 0
elif result == 1:
a = b = 0
elif result == 2:
a = b = 1
unit = (a,b)
lists.append(unit)
except Exception as e:
print(e)
db.rollback()
for i in range(2,15):
sql = "SELECT `kgzt` FROM `snd` WHERE `id` = {id}".format(id=i)
try:
cursor.execute(sql)
result = cursor.fetchone()[0]
if result == 0 :
a = b = c = 0
elif result == 1:
a = b = 0
c = 1
elif result == 2:
a = b = 1
c = 0
unit = (a,b,c)
lists.append(unit)
except Exception as e:
print(e)
db.rollback()
db.close()
dicts = {}
dicts[0] = lists[0][0]
dicts[1] = lists[0][1]
dicts[2] = lists[1][0]
dicts[3] = lists[1][1]
dicts[4] = lists[1][2]
dicts[5] = lists[2][0]
dicts[6] = lists[2][1]
dicts[7] = lists[2][2]
dicts[8] = lists[3][0]
dicts[9] = lists[3][1]
dicts[10] = lists[3][2]
dicts[11] = lists[4][0]
dicts[12] = lists[4][1]
dicts[13] = lists[4][2]
dicts[14] = lists[5][0]
dicts[15] = lists[5][1]
dicts[16] = lists[5][2]
dicts[17] = lists[6][0]
dicts[18] = lists[6][1]
dicts[19] = lists[6][2]
dicts[20] = lists[7][0]
dicts[21] = lists[7][1]
dicts[22] = lists[7][2]
dicts[23] = lists[8][0]
dicts[24] = lists[8][1]
dicts[25] = lists[8][2]
dicts[26] = lists[9][0]
dicts[27] = lists[9][1]
dicts[28] = lists[9][2]
dicts[29] = lists[10][0]
dicts[30] = lists[10][1]
dicts[31] = lists[10][2]
dicts[64] = lists[11][0]
dicts[65] = lists[11][1]
dicts[66] = lists[11][2]
dicts[67] = lists[12][0]
dicts[68] = lists[12][1]
dicts[69] = lists[12][2]
dicts[70] = lists[13][0]
dicts[71] = lists[13][1]
dicts[72] = lists[13][2]
return dicts
querydata2.py
# -*- coding: UTF-8 -*-
import pymysql
def queryData2():
db = pymysql.connect("127.0.0.1","root","root#admin","lxfc2")
cursor = db.cursor()
lists = []
sql = "SELECT `kgzt` FROM `snd` WHERE `id` = 15"
try:
cursor.execute(sql)
result = cursor.fetchone()[0]
if result == 0:
a = b = 0
elif result == 1:
a = b = 0
elif result == 2:
a = b = 1
unit = (a,b)
lists.append(unit)
except Exception as e:
print(e)
db.rollback()
for i in range(16,28):
sql = "SELECT `kgzt` FROM `snd` WHERE `id` = {id}".format(id=i)
try:
cursor.execute(sql)
result = cursor.fetchone()[0]
if result == 0 :
a = b = c = 0
elif result == 1:
a = b = 0
c = 1
elif result == 2:
a = b = 1
c = 0
unit = (a,b,c)
lists.append(unit)
except Exception as e:
print(e)
db.rollback()
db.close()
dicts = {}
dicts[32] = lists[0][0]
dicts[33] = lists[0][1]
dicts[34] = lists[1][0]
dicts[35] = lists[1][1]
dicts[36] = lists[1][2]
dicts[37] = lists[2][0]
dicts[38] = lists[2][1]
dicts[39] = lists[2][2]
dicts[40] = lists[3][0]
dicts[41] = lists[3][1]
dicts[42] = lists[3][2]
dicts[43] = lists[4][0]
dicts[44] = lists[4][1]
dicts[45] = lists[4][2]
dicts[46] = lists[5][0]
dicts[47] = lists[5][1]
dicts[48] = lists[5][2]
dicts[49] = lists[6][0]
dicts[50] = lists[6][1]
dicts[51] = lists[6][2]
dicts[52] = lists[7][0]
dicts[53] = lists[7][1]
dicts[54] = lists[7][2]
dicts[55] = lists[8][0]
dicts[56] = lists[8][1]
dicts[57] = lists[8][2]
dicts[58] = lists[9][0]
dicts[59] = lists[9][1]
dicts[60] = lists[9][2]
dicts[61] = lists[10][0]
dicts[62] = lists[10][1]
dicts[63] = lists[10][2]
dicts[76] = lists[11][0]
dicts[77] = lists[11][1]
dicts[78] = lists[11][2]
dicts[73] = lists[12][0]
dicts[74] = lists[12][1]
dicts[75] = lists[12][2]
return dicts
上面两个文件的作用是读取数据中关于开关的状态值,1是分,2是合。然后将接线状态图上的寄存器和开关的位置一一对应,因为接线状态图上的寄存器位置不是按照顺序来的,有一部分是乱序的,所以我选择了手动将所有点位定义在了两个dict里面。
file_name main.py
# -*- coding: UTF-8 -*-
from flask import Flask
import time
import threading
from pyModbusTCP.client import ModbusClient
from querydata1 import queryData1
from querydata2 import queryData2
app = Flask(__name__)
@app.route('/getdata')
def getData():
start = time.time()
c = ModbusClient(host="192.168.1.251", port=502, auto_open=True,unit_id=3,auto_close=True,timeout=5)
lock = threading.RLock()
def modbusTCPWrite(dicts):
for key in dicts:
lock.acquire()
if c.write_single_register(key,dicts[key]):
print("OK")
else:
print("write error")
lock.release()
dicts1 = queryData1()
dicts2 = queryData2()
ta = threading.Thread(target=modbusTCPWrite,kwargs={'dicts':dicts1})
tb = threading.Thread(target=modbusTCPWrite,kwargs={'dicts':dicts2})
ta.start()
tb.start()
end = time.time()
return str(end-start)
if __name__ == "__main__":
app.run(debug=True)这里的time只是为了在页面上有个输出,没有实际意义。另外,使用了两个线程来执行modbusTCPWrite函数,因为状态图分为两部分,1G和2G机柜,所以用两个线程来执行写入工作【注:虽然我不知道这两个线程有没有起作用】。
使用了threading模块中的RLock对象,在对c.ModbusClient的寄存器写入数据前加上锁,写入完成的时候释放锁,以免产生冲突。
评论已关闭