コード例 #1
0
    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
コード例 #2
0
    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])
コード例 #3
0
ファイル: plcreader.py プロジェクト: jukahkon/DataLogger
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
コード例 #4
0
 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")
コード例 #5
0
ファイル: read_multi.py プロジェクト: su600/DataS
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
コード例 #6
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