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
216 lines
6.9 KiB
Python
2 years ago
|
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)
|