Beispiel #1
0
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)
Beispiel #2
0
 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
Beispiel #4
0
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
Beispiel #5
0
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'
Beispiel #6
0
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
Beispiel #7
0
 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])
Beispiel #9
0
 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
Beispiel #10
0
    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
Beispiel #12
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))
Beispiel #13
0
    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)
Beispiel #14
0
    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
Beispiel #15
0
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)
Beispiel #17
0
 def test_db_read_bool(self):
     byte_data = self.client.db_read(151, 164, 1)
     data = get_bool(byte_data, 0, 5)
     print(data)
Beispiel #18
0
    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
Beispiel #19
0
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