def tank_back(): while True: for i in range(8): start_t = 22 + i * 36 start_w = 578 + i * 4 start_s = 576 + i * 4 tank_state = plc_r(100, start_t, 6) truck_state = get_bool(tank_state, 1, 0) # 空罐装载完成 if truck_state: mysql_2 = DatabaseManagement() truck_s = get_bool(plc_r(100, start_s, 2), 0, 0) # 出铁口未出铁 if truck_s is False: truck = i + 1 # 原点、接铁、炼钢、废钢---1、2、3、4 # 查询炼钢区域指定轨道车辆 data = mysql_2.query_all( car_Position, car_Position.truck_num == truck and car_Position.position == 3) # 如果后车在炼钢 if data.car_num % 2 == 0: plc_w(start_t, struct.pack('B', 2)) news_b = Plan1(data.car_num, 0, 2, 0, None) # 如果前车在炼钢 else: data2 = mysql_2.query_all( car_Position, car_Position.car_num == data.car_num + 1) if data2.position > 0: plc_w(start_t, struct.pack('B', 2)) news_b = Plan1(data.car_num, 0, 2, 0, None)
def test_db_write_bool(self): byte_data = self.client.db_read(141, 164, 1) data = get_bool(byte_data, 0, 1) print(data) set_bool(byte_data, 0, 1, 1) self.client.db_write(141, 164, byte_data) byte_data = self.client.db_read(141, 164, 1) data = get_bool(byte_data, 0, 1) print(data)
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 transport1(): while True: tr = False # 读取出铁口状态 for i in range(8): db = 576 + i * 4 start_w = 578 + i * 4 start_s = 607 + i truck_state = plc_r(100, db, 2) # 出铁口状态 truck_state = get_bool(truck_state, 0, 0) # 铁水接满0-1 if truck_state - tr == -1: mysql_2 = DatabaseManagement() weight = get_int(plc_r(100, start_w, 4), 0) weight = get_int(weight, 0) steel_scrap_w = get_int(plc_r(100, start_s, 4), 0) real_w = weight + steel_scrap_w if weight >= 150: print('接铁完成') truck = i + 1 data = mysql_2.query_all(car_Position, car_Position.truck_num == truck) car_num = data.car_num start = 22 + (car_num - 1) * 36 plc_w(start, True) print(str(car_num) + '号车运走') news = Plan1(truck, 0, 3, weight, i, car_num) mysql_2.add_obj(news) tr = truck_state
def read_value(data_type, result, byte_index=0, bool_index=0): # 'FLOAT' if data_type == 1: return get_real(result, byte_index) # 'INT' elif data_type == 2: return get_int(result, byte_index) # 'DINT' elif data_type == 3: return get_dint(result, byte_index) # 'WORD' elif data_type == 4: return get_word(result, byte_index) # 'DWORD' elif data_type == 5: return get_dword(result, byte_index) # 'BYTE' elif data_type == 6: return get_byte(result, byte_index) # 'BOOL' elif data_type == 7: return get_bool(result, byte_index, bool_index) else: assert ValueError, 'data_type is not useful'
def unpack(array_read, array_order, variables): buffer = [] j = 0 for loop in range(len(array_order)): a = array_order[loop][0] print(a) start_index = int(math.modf(variables[a]['address'])[1]) i = 0 while i < len(array_order[loop]): order = array_order[loop][i] byte_index = int(math.modf(variables[order]['address'])[1]) type = variables[order]['data_type'] if type == 7: bool_index = round(math.modf(variables[order]['address'])[0] * 10) buffer.append([get_bool(array_read[loop], byte_index - start_index, bool_index)]) if type == 6: buffer.append([get_byte(array_read[loop], byte_index - start_index)]) if type == 4: buffer.append([get_word(array_read[loop], byte_index - start_index)]) if type == 5: buffer.append([get_dword(array_read[loop], byte_index - start_index)]) if type == 2: buffer.append([get_int(array_read[loop], byte_index - start_index)]) if type == 3: buffer.append([get_dint(array_read[loop], byte_index - start_index)]) if type == 1: buffer.append([get_real(array_read[loop], byte_index - start_index)]) buffer[j].append(order) j = j + 1 i = i + 2 order1(buffer) # 按最后一列顺序排序 return buffer
def test_read_booleans(self): data = self.client.db_read(0, 0, 1) self.assertEqual(False, get_bool(data, 0, 0)) self.assertEqual(True, get_bool(data, 0, 1)) self.assertEqual(False, get_bool(data, 0, 2)) self.assertEqual(True, get_bool(data, 0, 3)) self.assertEqual(False, get_bool(data, 0, 4)) self.assertEqual(True, get_bool(data, 0, 5)) self.assertEqual(False, get_bool(data, 0, 6)) self.assertEqual(True, get_bool(data, 0, 7))
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 set_value(self, byte): self.valor_anterior = self.valor if self.type_var == "R": self.valor = round(util.get_real(byte, self.address),2) elif self.type_var == "I" or self.type_var == "W": self.valor = round(util.get_int(byte, self.address),2) elif self.type_var == "DW" or self.type_var == "DI": self.valor = round(util.get_dword(byte, self.address),2) elif self.type_var == "B": self.valor = util.get_bool(byte, self.address, self.bit) if self.valor_anterior != self.valor: self.write = True else: self.write = False
def read_Bool(self): """ Read Bool type Data from snap7-server :param start: 开始的下标 :param size: 每一组数据的大小 """ data = self.client.db_read(self.db, self.bool_start, self.bool_size) bool_list = [] for be in range(0, self.bool_size): for bl in range(0, 8): bool_data = util.get_bool(data, byte_index=be, bool_index=bl) bool_list.append(bool_data) print("bool_list<{}> = {}".format(len(bool_list), bool_list))
def set_value(self, byte): self.valor_anterior = self.valor if self.type_var == "R": self.valor = util.get_real(byte, self.address) if self.type_var == "I" or self.type_var == "W": self.valor = util.get_int(byte, self.address) if self.type_var == "DW" or self.type_var == "DI": self.valor = int(util.get_dword(byte, self.address)) # print str(self.db )+"."+str(self.address )+" DI: "+ str(self.valor) if self.type_var == "B": #print self.address value_t = util.get_bool(byte, int(self.address), int(self.bit)) if value_t: self.valor = 1 else: self.valor = 0
def read_Bool(self): """ Read Bool type Data from snap7-server """ # read area = snap7.snap7types.areas.MK # {PE:input, PA:output, MK:bit memory, DB:DB, CT:counters, TM:Timers} data = self.client.read_area(area, self.db, self.bool_start, self.bool_size) print(data) # analysis bool_list = [] for be in range(0, self.bool_size): for bl in range(0, 8): bool_data = util.get_bool(data, byte_index=be, bool_index=bl) bool_list.append(bool_data) print("bool_list<{}> = {}".format(len(bool_list), bool_list))
def read(self, db_num=1, start=0, size=10): """ Read data from snap7-server :param start: 开始的下标 :param size: 读取的原始数据长度 """ data = self.client.db_read(db_num, start, size) # int_data = util.get_int(data, 0) # 2 bytearray --> 1 int # dword_data = util.get_dword(data, 1) # 4 bytearray --> 1 int # real_data = util.get_real(data, 0) # 4 bytearray --> 1 int bool_data = util.get_bool(data, 1, 2) # 4 bytearray --> 1 int print(data) print(data[1]) # print(int_data) # print(dword_data) # print(real_data) print(bool_data)
def get_bool(self): """get Bool type data :returns: bool_list: list """ bool_list = [] for point in self.bool_points: try: data = self.client.db_read(db_number=self.db_number, start=point, size=self.bool_data_size) except Exception as err: log.warn(err) else: for index in range(0, 2): bool_data = util.get_bool(_bytearray=data, byte_index=0, bool_index=index) bool_list.append(bool_data) return bool_list
def read_value(data_type, result, byte_index=0, bool_index=0): if data_type == 'FLOAT': return get_real(result, byte_index) elif data_type == 'INT': return get_int(result, byte_index) elif data_type == 'DINT': return get_dint(result, byte_index) elif data_type == 'WORD': return get_word(result, byte_index) elif data_type == 'BYTE': return get_byte(result, byte_index) elif data_type == 'BOOL': return get_bool(result, byte_index, bool_index) elif data_type == 'DWORD': return get_dword(result, byte_index) else: assert ValueError, 'data_type is not useful'
data_items[i].DBNumber = ctypes.c_int32(int(numero)) data_items[i].Start = ctypes.c_int32( 8 * int(byte) + int(bit) ) # al estar en modo bit es 8 bits * 5 bytes ya que en el DB0.DBX5.0 data_items[i].Amount = ctypes.c_int32(getattr(snap7types, tipo)) 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 result, data_items = plc.read_multi_vars(data_items) for di in data_items: check_error(di.Result) result_values = [] for di in data_items: if di.WordLen == getattr(snap7types, 'S7WLBit'): value = util.get_bool(di.pData, 0, 0) elif di.WordLen == getattr(snap7types, 'S7WLByte'): value = util.get_int(di.pData, 0) elif di.WordLen == getattr(snap7types, 'S7WLDWord'): value = util.get_dword(di.pData, 0) elif di.WordLen == getattr(snap7types, 'S7WLReal'): value = util.get_real(di.pData, 0) result_values.append(value) print(result_values)
def test_db_read_bool(self): byte_data = self.client.db_read(151, 164, 1) data = get_bool(byte_data, 0, 5) print(data)
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
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