先上代码

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函数,因为状态图分为两部分,1G2G机柜,所以用两个线程来执行写入工作【注:虽然我不知道这两个线程有没有起作用】。

使用了threading模块中的RLock对象,在对c.ModbusClient的寄存器写入数据前加上锁,写入完成的时候释放锁,以免产生冲突。


参考资料:
https://www.v2ex.com/t/732062

标签: none

评论已关闭