You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

216 lines
6.9 KiB
Python

import struct
import sys
from pathlib import Path
import socket
sys.path.append('C:\\Users\\lj\\Desktop\\dcstms-BJDCS-d8e78380ddcb10cf41a485e72e4c2c294ff0122e')
from utils.WorkModels import PointModel, init_database
from peewee import SqliteDatabase
import time
from Agreement.CS.skio.define import AIdataPacket, AOdataPacket, DIdataPacket, HSdataPacket
from Agreement.CS.skio.worker.memory import storeData
class SkIO(object):
def __init__(self):
# self.socket = socket.socket()
self.storeData = storeData()
# self.set_current_value()
def setup(self, uri, path):
# print(uri)
# host, port = uri.split(':')
# self._host = host
# self._port = int(port)
# self.socket.connect((self._host, self._port))
for x in ('', 'etc'):
p = path.joinpath(x)
if not p.exists():
p.mkdir(parents=True)
self.database = SqliteDatabase(path.joinpath('etc', 'skio.db'))
init_database(self.database)
self.storeData.setup(path)
def set_current_value(self):
self.D_index = set()
self.AO_index = set()
self.AI_index = set()
for i in PointModel.select():
if i.sig_type in ('DO', 'DI'):
self.D_index.add(int(i.reg))
# self.current_value1 = [[0 for w in range(8)] for q in range(len(self.D_index))]
if i.sig_type == 'AO':
self.AO_index.add(int(i.reg))
# self.current_value2 = [[0 for r in range(8)] for e in range(len(self.AO_index))]
if i.sig_type == 'AI':
self.AI_index.add(int(i.reg))
# self.current_value3 = [[0 for y in range(8)] for t in range(len(self.AI_index))]
# self.current_value = [[0 for x in range(8)] for z in range(len(self.D_index) + len(self.AO_index) + len(self.AI_index))]
def AIread(self, datapack: AIdataPacket):
# data = []
t = []
self.socket.send(datapack.packBytes())
# 读固定的 12 个字节
header = self.socket.recv(12)
start_flag, cmd_type, body_size, pack_no = struct.unpack('>HHLL', header)
# print(pack_no)
left_size = body_size
data = b''
while left_size:
buf = self.socket.recv(left_size)
recv_size = len(buf)
left_size = left_size - recv_size
# print('recv {} bytes'.format(recv_size))
data += buf
# print(data, 'data1')
# print(body_size)
stop_flag = self.socket.recv(2)
# print('stop_flag: {}'.format(stop_flag))
frame_size = 8 * 32
frame_count = int(body_size / frame_size)
datas = []
for i in range(frame_count):
values = struct.unpack('<32d', data[frame_size * i:frame_size * (i + 1)])
# print(len(values), '2222')
datas.append(values)
# print(datas)
# datas = self.getRealAI(datas)
# self.set_current_value()
return datas
def DIread(self, datapack: AIdataPacket):
# data = []
t = []
self.socket.send(datapack.packBytes())
# 读固定的 12 个字节
header = self.socket.recv(12)
start_flag, cmd_type, body_size, pack_no = struct.unpack('>HHLL', header)
# print(pack_no)
left_size = body_size
data = b''
while left_size:
buf = self.socket.recv(left_size)
recv_size = len(buf)
left_size = left_size - recv_size
# print('recv {} bytes'.format(recv_size))
data += buf
# print(len(data))
# print(data)
stop_flag = self.socket.recv(2)
# print('stop_flag: {}'.format(stop_flag))
frame_size = 8 * 8
frame_count = int(body_size / frame_size)
datas = []
for i in range(frame_count):
values = struct.unpack('<8Q', data[frame_size * i:frame_size * (i + 1)])
datas.append(values)
# print(datas, 1111)
# print(len(datas), 222)
return datas
# def DIread(self, datapack: AIdataPacket):
# data = []
# t = []
# self.socket.send(datapack.packBytes())
# res = self.socket.recv(12)
# size = int(struct.unpack('>HHLL', res)[2])
# for i in range(int(size / (6 * 8))):
# res = self.socket.recv(6 * 8)
# data1 = struct.unpack('Q' * 6, res)
# t.append(time.time())
# data.append(data1)
# res = self.socket.recv(2)
# return (data, t)
def AOwrite(self, datapack: AOdataPacket):
self.socket.send(datapack.packBytes())
res = self.socket.recv(14)
data = struct.unpack('>HHLLH', res)
return data
def DIwrite(self, datapack: DIdataPacket):
self.socket.send(datapack.packBytes())
res = self.socket.recv(14)
data = struct.unpack('>HHLLH', res)
return data
def start_gather(self, datapack: AIdataPacket):
self.socket.send(datapack.packBytes())
res = self.socket.recv(14)
data = struct.unpack('>HHLLH', res)
return data
def stop_gather(self, datapack: AIdataPacket):
self.socket.send(datapack.packBytes())
res = self.socket.recv(14)
data = struct.unpack('>HHLLH', res)
return data
def start_high_speed_test(self, datapack: HSdataPacket):
self.socket.send(datapack.packBytes())
res = self.socket.recv(14)
data = struct.unpack('>HHLLH', res)
return data
def receive_data(self):
header = self.socket.recv(12)
start_flag, cmd_type, body_size, pack_no = struct.unpack('>HHLL', header)
left_size = body_size
print(body_size)
data = b''
while left_size:
buf = self.socket.recv(left_size)
recv_size = len(buf)
left_size = left_size - recv_size
# print('recv {} bytes'.format(recv_size))
data += buf
# print(data)
stop_flag = self.socket.recv(2)
# frame_size = 8 * 16
# frame_count = int(body_size / frame_size)
# datas = []
# for i in range(frame_count):
# frame_size = 8 * 16
# frame_count = int(body_size / frame_size)
# datas = []
# for i in range(frame_count):
# values = struct.unpack('<16d', data[frame_size * i:frame_size * (i + 1)])
# datas.append(values)
values = struct.unpack('<16d', data)
datas = values
lis = [0xF312, 18, 0, 0x0000000, 0xF314]
self.socket.send(struct.pack('>HHLLH', *lis))
print(datas)
return datas
def close(self):
self.socket.close()
if __name__ == '__main__':
A = SkIO()
path = Path(__file__).absolute().parent.joinpath('static')
A.setup('192.168.10.21:6351', path)
# print(A.start_gather(B))
a = 0X000001
# while True:
B = DIdataPacket(2, 64, a, [[3, 0, 0, 0], [0, 0, 0, 0]])
print(A.AIread(B))
# a += 1
print(a)
# time.sleep(0.5)