def create_data_for_fb(self, _bytearray): """ Create data for firebase :param _bytearray :return tuple (path, dict) :raises TypeError OverflowError ValueError """ if not isinstance(_bytearray, bytearray): raise TypeError("A parameter must be bytearray") if self.__size != len(_bytearray): raise OverflowError("Bytearray is not correct") holder = {} for index, foo in enumerate(self.__template): data_type = foo['Data_type'] offset = float(foo['Offset']) row = None old = None if data_type == 'Bool': byte, bit = str(offset).split('.') byte, bit = int(byte), int(bit) old = get_bool(self.__datablock, byte, bit) row = get_bool(_bytearray, byte, bit) elif data_type == 'String': offset = int(offset) old = get_string(self.__datablock, offset, 256) row = get_string(_bytearray, offset, 256) elif data_type == 'Int': offset = int(offset) old = get_int(self.__datablock, offset) row = get_int(_bytearray, offset) elif data_type == 'Real': offset = int(offset) old = get_real(self.__datablock, offset) row = get_real(_bytearray, offset) else: raise ValueError("data_type error") if old == row: continue holder[index] = row self.__datablock = _bytearray return 'current/datablocks/DB{_num}/data'.format( _num=self.__datablock_number), holder
def read(self,datatype,*args): self.plc2pc_data=self.plc.db_read(self.db_number,self.db_read_start,self.db_read_size) if datatype=='bool': return util.get_bool(self.plc2pc_data,args[0],args[1]) elif datatype=='int': return util.get_int(self.plc2pc_data,args[0]) elif datatype==('dint' or 'dword'): return util.get_dword(self.plc2pc_data,args[0]) elif datatype=='real': return util.get_real(self.plc2pc_data,args[0]) elif datatype=='string': return util.get_string(self.plc2pc_data,args[0],args[1])
def readValue(area, db, datatype, offset, size=0): if area == 'S7AreaDB' and db != 0: (buf, start) = readDataBlock(db, datatype, offset, size) elif area == 'S7AreaMK': (buf, start) = readMarker(datatype, offset, size) else: (buf, start) = (b'', 0) if buf: if datatype == 'INTEGER': value = s7util.get_int(buf, start) elif datatype == 'REAL': value = s7util.get_real(buf, start) elif datatype == 'STRING': value = s7util.get_string(buf, start, size) elif datatype == 'DATE_TIME': value = buf[:8] elif datatype == 'ARRAY OF REAL': value = [] if len(buf) >= start + (4 * size): for i in range(0, size): value.append(s7util.get_real(buf, start + (4 * i))) else: # print('setting default value') if datatype == 'INTEGER': value = 0 elif datatype == 'REAL': value = 0.0 elif datatype == 'STRING': value = '' elif datatype == 'DATE_TIME': value = b'' elif datatype == 'ARRAY OF REAL': value = [] for i in range(0, size): value.append(0.0) return value
def test_read_string(self): data = self.client.db_read(0, 100, 254) self.assertEqual(get_string(data, 0, 254), "the brown fox jumps over the lazy dog")
def s7_multi_read(plc, tag_type, tag_address,data_type,tag_name): ''' 从s7_read_excel处理完的变量表中批量读取变量 ''' # print('s7multiread函数') # print(tag_type, tag_address) taglens = len(tag_type) # print(taglens) # l = taglens # 变量表长度,如果大于20 必须分批读取 snp7 # x = (l // 20) +1 # 取整加1 组数 # y = l % 20 # 取余数 # dataitemsgroup=[] # for i in range(x): # dataitemsgroup.append("data_items"+str(i)) # for i in dataitemsgroup: # if i < x: # dataitemsgroup = (S7DataItem * pass)() # data_items[i].Area = areas[tag_type[i]] # 数据类型 # data_items[i].WordLen = ctypes.c_int32(S7WLByte) # data_items[i].Result = ctypes.c_int32(0) # data_items[i].DBNumber = ctypes.c_int32(0) # DB块 非DB写0 # data_items[i].Start = ctypes.c_int32(int(tag_address[i].split('.')[0])) # byte地址 # data_items[i].Amount = ctypes.c_int32(8) # 读取8位 # val = val + plc.read_multi_vars(data_items[20 * a:20 * (a + 1)]) # a += 1 # n += 1 # if n == x and y != 0: # val = val + plc.read_multi_vars(data_items[20 * a:20 * a + y]) # # a = 0 # 每一组变量的上标 # val = [] # 初始化列表 每一组变量值 # for n in range(x): # if n < x: # val = val + plc.read_multi_vars(data_items[20 * a:20 * (a + 1)]) # a += 1 # n += 1 # if n == x and y != 0: # val = val + plc.read_multi_vars(data_items[20 * a:20 * a + y]) # val2 = val # return val2 data_items = (S7DataItem * taglens)() # 括号 数组 # print(type(data_items)) # fixme 如果只有一个变量的情况 可能会有bug # 生成 data_items 待读取的变量结构体 for i in range(taglens): # print(i) data_items[i].Area = areas[tag_type[i]] # 数据类型 data_items[i].WordLen = ctypes.c_int32(S7WLByte) data_items[i].Result = ctypes.c_int32(0) data_items[i].DBNumber = ctypes.c_int32(0) # DB块 非DB写0 data_items[i].Start = ctypes.c_int32(int(tag_address[i].split('.')[0])) # byte地址 data_items[i].Amount = ctypes.c_int32(8) # 读取8位 # data_items[i].Bit = tag_address[i].split('.')[1] # 偏移量 # print(type(data_items)) # print(type(data_items[2])) # print(type(data_items[0:20])) # create buffers to receive the data # use the Amount attribute on each item to size the buffer for di in data_items: # create the buffer buffer = ctypes.create_string_buffer(di.Amount) # cast the pointer to the buffer to the required type pBuffer = ctypes.cast(ctypes.pointer(buffer), ctypes.POINTER(ctypes.c_uint8)) di.pData = pBuffer # di.Bit = di.Bit # fixme 分批读取 snap7单次20个以上报错 def readten(data_items): """ :type data_items: object """ # print(type(data_items)) # print(type(data_items[10:20])) # a=plc.read_multi_vars(data_items[10:20]) # print(a) l = len(data_items) # 变量表长度,如果大于20 必须分批读取 snp7 x = l // 20 # 取整 y = l % 20 # 取余数 a = 0 # 每一组变量的上标 val = [] # 初始化列表 每一组变量值 for n in range(x): if n < x: val = val + plc.read_multi_vars(data_items) a += 1 n += 1 if n == x and y != 0: val = val + plc.read_multi_vars(data_items) val2 = val return val2 result, data_items = plc.read_multi_vars(data_items) # print('读取的原始数据',data_items) ttt = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # for di in data_items: # check_error(di.Result) result_values = [] # function to cast bytes to match data_types[] above # byte_to_value = [util.get_bool, util.get_real, util.get_int,util.get_dword,util.get_string] # unpack and test the result of each read # todo 做一个函数列表,合并循环。逻辑上需要先读取,后get_bool for i in range(0, len(data_items)): # btv = byte_to_value[i] ddd = data_items[i] # print(ddd) d_bit = int(tag_address[i].split('.')[1]) # value = btv(di.pData, 0) if data_type[i] == 'Bool': value = util.get_bool(ddd.pData, 0, d_bit) elif data_type[i] == 'Real': value = util.get_real(ddd.pData, d_bit) elif data_type[i] == 'Int': value = util.get_int(ddd.pData, d_bit) elif data_type[i] == 'Dword': value = util.get_dword(ddd.pData, d_bit) elif data_type[i] == 'String': value = util.get_string(ddd.pData, d_bit) # assert isinstance(value, object) result_values.append(value) # print(result_values) # todo # client.disconnect() # client.destroy() siemensdata = dict(zip(tag_name, result_values)) print(siemensdata) return siemensdata, ttt
def s7_multi_read(plc, tag_type, tag_address, data_type, tag_name): ''' 从s7_read_excel处理完的变量表中批量读取变量 ''' taglens = len(tag_type) data_items = (S7DataItem * taglens)() # 括号 数组 # fixme 如果只有一个变量的情况 可能会有bug # 生成 data_items 待读取的变量结构体 for i in range(taglens): # print(i) data_items[i].Area = areas[tag_type[i]] # 数据类型 data_items[i].WordLen = ctypes.c_int32(S7WLByte) data_items[i].Result = ctypes.c_int32(0) data_items[i].DBNumber = ctypes.c_int32(0) # DB块 非DB写0 data_items[i].Start = ctypes.c_int32( int(tag_address[i].split('.')[0])) # byte地址 data_items[i].Amount = ctypes.c_int32(8) # 读取8位 for di in data_items: # create the buffer buffer = ctypes.create_string_buffer(di.Amount) # cast the pointer to the buffer to the required type pBuffer = ctypes.cast(ctypes.pointer(buffer), ctypes.POINTER(ctypes.c_uint8)) di.pData = pBuffer # fixme 分批读取 snap7单次20个以上报错 数组切片报错 暂时未使用 def readten(data_items): """ :type data_items: object """ # print(type(data_items)) # print(type(data_items[10:20])) # a=plc.read_multi_vars(data_items[10:20]) # print(a) l = len(data_items) # 变量表长度,如果大于20 必须分批读取 snp7 x = l // 20 # 取整 y = l % 20 # 取余数 a = 0 # 每一组变量的上标 val = [] # 初始化列表 每一组变量值 for n in range(x): if n < x: val = val + plc.read_multi_vars(data_items) a += 1 n += 1 if n == x and y != 0: val = val + plc.read_multi_vars(data_items) val2 = val return val2 result, data_items = plc.read_multi_vars(data_items) # print('读取的原始数据',data_items) ttt = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) for di in data_items: check_error(di.Result) result_values = [] # function to cast bytes to match data_types[] above # byte_to_value = [util.get_bool, util.get_real, util.get_int,util.get_dword,util.get_string] # unpack and test the result of each read # todo 做一个函数列表,合并循环。逻辑上需要先读取,后get_bool for i in range(0, len(data_items)): ddd = data_items[i] d_bit = int(tag_address[i].split('.')[1]) if data_type[i] == 'Bool': value = util.get_bool(ddd.pData, 0, d_bit) elif data_type[i] == 'Real': value = util.get_real(ddd.pData, d_bit) elif data_type[i] == 'Int': value = util.get_int(ddd.pData, d_bit) elif data_type[i] == 'Dword': value = util.get_dword(ddd.pData, d_bit) elif data_type[i] == 'String': value = util.get_string(ddd.pData, d_bit) result_values.append(value) # fixme # client.disconnect() # client.destroy() siemensdata = dict(zip(tag_name, result_values)) # print(siemensdata) return siemensdata, ttt