def read_and_save(device, i_addr, i_subaddr, i_leng, file): global frames data_list = device.read_from_rt(i_addr, i_subaddr, i_leng) data_str = "" i = 0 for i in range(50): # print("%04X" % device.answer_word) if (device.answer_word & 0xF800 == device.command_word & 0xF800) & ( (device.answer_word & 0x0008) == 0): break else: data_str = "{:.3f}; R; ".format(time.perf_counter()) \ + "CW 0x{:04X}; ".format(device.command_word & 0xFFFF) \ + "AW 0x{:04X}; ".format(device.answer_word & 0xFFFF) + "RT busy %d times\t" % (i+1) data_list = device.read_from_rt(i_addr, i_subaddr, i_leng) time.sleep(0.05) # busy check if "RT busy" in data_str: frames.busy_cnt += 1 # crc16_new = crc16.calc(data_list[0:len(data_list) - 1], len(data_list) - 1, endian="big") crc16_old = data_list[len(data_list) - 1] crc16_state = "CRC OK" if crc16_new == crc16_old else "CRC BAD" # CRC_BAD check if crc16_new != crc16_old: frames.crc_bad_cnt += 1 # total_calc frames.total_cnt += 1 data_str += "{:.3f}; R; ".format(time.perf_counter()) \ + "CW 0x{:04X}; ".format(device.command_word & 0xFFFF) + "AW 0x{:04X}: ".format(device.answer_word & 0xFFFF) for var in data_list: data_str += "{:04X} ".format(var) data_str += "; {1:04X}; {0:s};\n".format(crc16_state, crc16_new) # if file: file.write(data_str) return data_str[0:len(data_str) - 1], data_list
def computed_crc(self): return crc16.calc(self.data_for_crc())
def test_crc_computation(self): msg = "1f01482a10030e0100".decode('hex') crc = crc16.calc(msg) self.assertEqual(crc, 0x802c)
def test_crc_computation(self): msg = "1f01482a10030e0100".decode("hex") crc = crc16.calc(msg) self.assertEqual(crc, 0x802c)
def test_crc_computation(self): msg = "1f00ee8628030e0100".decode("hex") crc = crc16.calc(msg) self.assertEqual(crc, 0x00d8)
def frame_parcer(frame): with data_lock: data = [] while len(frame) < 31: frame.append(0xFEFE) pass if frame[0] == 0x0F0D: # проверка на метку кадра if frame[1] == frame_definer(modificator=0, dev_num=0, type=15): # Системный кадр # data.append(["Метка кадра", "0x%04X" % frame[0]]) data.append(["Определитель", "0x%04X" % frame[1]]) data.append(["Номер кадра, шт", "%d" % frame[2]]) data.append( ["Время кадра, с", "%d" % ((frame[3] << 16) + frame[4])]) # data.append(["Ток МБКАП, мА", "%d" % frame[5]]) data.append(["Ток ЦМ, мА", "%d" % frame[6]]) data.append(["Ток МПП27, мА", "%d" % frame[7]]) data.append(["Ток МПП100, мА", "%d" % frame[8]]) data.append(["Ток ДИР, мА", "%d" % frame[9]]) data.append(["Ток ДНТ, мА", "%d" % frame[10]]) data.append(["Ток АДИИ, мА", "%d" % frame[11]]) # data.append(["Указатель чтения", "%d" % frame[12]]) data.append(["Указатель записи", "%d" % frame[13]]) # data.append(["Ошибки МКО", "%d" % frame[14]]) data.append(["Счетчик включений", "%d" % frame[15]]) # data.append( ["Разность времени, c", "%d" % c_int16(frame[16]).value]) data.append(["Кол-во синхрон., шт", "%d" % (frame[17] & 0xFF)]) sync_time = (frame[18] << 16) + frame[18] data.append(["Время синхр.,с", "%d" % sync_time]) data.append(["СТМ", "%d" % (frame[20] & 0xFF)]) # data.append(["Ошибки ВШ", "%d" % ((frame[21] >> 8) & 0xFF)]) data.append(["Неответы ВШ", "%d" % ((frame[21]) & 0xFF)]) data.append( ["Статус работы ВШ", "0х%02X" % ((frame[22] >> 8) & 0xFF)]) data.append( ["Статус неответов ВШ", "0х%02X" % (frame[22] & 0xFF)]) # data.append(["Температура", "%d" % frame[23]]) operating_time = (frame[24] << 16) + frame[25] data.append( ["Время наработки, ч", "%.3f" % (operating_time / 3600)]) data.append(["Интервал измерения", "%d" % frame[26]]) data.append(["Системный интервал", "%d" % frame[27]]) # data.append( ["Состояние т.з", "0x%02X" % ((frame[28] >> 8) & 0xFF)]) data.append( ["Статус т.з", "0x%02X" % ((frame[28] >> 0) & 0xFF)]) # data.append(["АДИИ ФК", "%02X" % ((frame[29] >> 8) & 0xFF)]) data.append(["АДИИ режим", "%02X" % ((frame[29] >> 8) & 0xFF)]) data.append(["АДии интервал, с", "%d" % frame[30]]) # data.append(["CRC-16", "0x%04X" % crc16.calc(frame, 32)]) pass elif frame[1] == frame_definer( modificator=0, dev_num=0, type=1) or frame[1] == frame_definer( modificator=0, dev_num=0, type=2): # Кадры МПП # подготовка if (frame[1] & 0xF) == 1: mpp_num, a, b = 1, 1, 0 elif (frame[1] & 0xF) == 1: mpp_num, a, b = 2, 1, 0 else: mpp_num, a, b = 5, 1, 0 # # data.append(["Метка кадра", "0x%04X" % frame[0]]) data.append(["Определитель", "0x%04X" % frame[1]]) data.append(["Номер кадра, шт", "%d" % frame[2]]) data.append( ["Время кадра, с", "%d" % ((frame[3] << 16) + frame[4])]) # data.append(["Кол-во измерений, шт", "%d" % frame[5]]) data.append(["Уставка, В", "%d" % frame[6]]) # data.append([ "Время регистрации, с", "%d" % ((frame[7] << 16) + frame[8]) ]) data.append([ "Время регистрации, мкс", "%d" % ((frame[9] << 16) + frame[10]) ]) data.append([ "Длительность, с", "%.3g" % (((frame[11] << 16) + frame[12]) * (10**-6) / 40) ]) data.append(["Переход через 0, шт", "%d" % frame[13]]) data.append(["Пиковое значение, В", "%.3g" % (a * frame[14])]) data.append([ "Мощность, В*с", "%.3g" % (a * ((frame[15] << 16) + frame[16]) * (10**-6) / 40) ]) data.append(["Среднее, В", "%.3g" % (a * frame[17] + b)]) data.append(["Шум, В", "%.3g" % (a * frame[18])]) # data.append([ "Время регистрации, с", "%d" % ((frame[19] << 16) + frame[20]) ]) data.append([ "Время регистрации, мкс", "%d" % ((frame[21] << 16) + frame[22]) ]) data.append([ "Длительность, с", "%.3g" % (((frame[23] << 16) + frame[24]) * (10**-6) / 40) ]) data.append(["Переход через 0, шт", "%d" % frame[25]]) data.append(["Пиковое значение, В", "%.3g" % (a * frame[26])]) data.append([ "Мощность, В*с", "%.3g" % (a * ((frame[27] << 16) + frame[28]) * (10**-6) / 40) ]) data.append(["Среднее, В", "%.3g" % (a * frame[29] + b)]) data.append(["Шум, В", "%.3g" % (a * frame[30])]) # data.append(["CRC-16", "0x%04X" % crc16.calc(frame, 32)]) pass elif frame[1] == frame_definer(modificator=0, dev_num=0, type=3): # Кадры ДИР # подготовка cal_dir_a = [1, 1, 1, 1] cal_dir_b = [0, 0, 0, 0] cal_resistor = 52000 # Ом cal_temp_a = [1, 1, 1, 1] cal_temp_b = [0, 0, 0, 0] # data.append(["Метка кадра", "0x%04X" % frame[0]]) data.append(["Определитель", "0x%04X" % frame[1]]) data.append(["Номер кадра, шт", "%d" % frame[2]]) data.append( ["Время кадра, с", "%d" % ((frame[3] << 16) + frame[4])]) # for meas in range(2): # пробегаемся по 2м измерениям for chan in range(4): # пробегаемся по 4м каналам current = ( cal_dir_a[chan] * frame[5 + 3 * chan + 12 * meas] + cal_dir_b[chan]) / cal_resistor data.append([ "%d-%d: Ток, мкА" % (meas + 1, chan + 1), "%.1f" % current ]) radiation = ( cal_dir_a[chan] * frame[6 + 3 * chan + 12 * meas] + cal_dir_b[chan]) data.append([ "%d-%d: Доза, В" % (meas + 1, chan + 1), "%.3f" % radiation ]) temperature = cal_temp_a[chan] * frame[ 7 + 3 * chan + 12 * meas] + cal_temp_b[chan] data.append([ "%d-%d: Темп., °С" % (meas + 1, chan + 1), "%.2f" % temperature ]) pass pass # data.append(["Резерв", "0x%04X" % frame[31]]) # data.append(["CRC-16", "0x%04X" % crc16.calc(frame, 32)]) pass elif frame[1] == frame_definer(modificator=0, dev_num=0, type=4): # Кадр ДНТ # подготовка cal_dnt_a = [1, 1, 1, 1] cal_dnt_b = [0, 0, 0, 0] # data.append(["Метка кадра", "0x%04X" % frame[0]]) data.append(["Определитель", "0x%04X" % frame[1]]) data.append(["Номер кадра, шт", "%d" % frame[2]]) data.append( ["Время кадра, с", "%d" % ((frame[3] << 16) + frame[4])]) # for meas in range(12): # пробегаемся по 12-ти измерениям ku = (frame[6 + 2 * meas] >> 8) & 0x03 current = cal_dnt_a[ku] * frame[5 + 2 * meas] + cal_dnt_b[ku] temp = c_int8((frame[6 + 2 * meas] >> 8) & 0x03).value data.append( ["%d: Ток, мкА" % (meas + 1), "%.3E" % current]) data.append(["%d: КУ, В" % (meas + 1), "%d" % 10**ku]) data.append(["%d: Темп., °С" % (meas + 1), "%d" % temp]) pass data.append( ["Напряжение, В", "%d" % ((frame[29] >> 8) & 0xFF)]) data.append(["№ смены, шт.", "%d" % (frame[29] & 0xFF)]) data.append(["Изм. интервал, с", "%.3g" % frame[30]]) # data.append(["CRC-16", "0x%04X" % crc16.calc(frame, 32)]) pass elif frame[1] == frame_definer(modificator=0, dev_num=0, type=5): # Кадр АДИИ # подготовка cal_dnt_a = [1, 1, 1, 1] cal_dnt_b = [0, 0, 0, 0] # data.append(["Метка кадра", "0x%04X" % frame[0]]) data.append(["Определитель", "0x%04X" % frame[1]]) data.append(["Номер кадра, шт", "%d" % frame[2]]) data.append( ["Время кадра, с", "%d" % ((frame[3] << 16) + frame[4])]) # data.append([ "Счетчик 1", "%d" % ((frame[5] << 16) + ((frame[6] & 0xFF) >> 8)) ]) data.append([ "Счетчик 2", "%d" % (((frame[6] & 0xFF) << 16) + frame[7]) ]) data.append([ "Счетчик 3", "%d" % ((frame[8] << 16) + ((frame[9] & 0xFF) >> 8)) ]) data.append([ "Счетчик 4", "%d" % (((frame[9] & 0xFF) << 16) + frame[10]) ]) data.append([ "Счетчик 5", "%d" % ((frame[11] << 16) + ((frame[12] & 0xFF) >> 8)) ]) data.append([ "Счетчик 6", "%d" % (((frame[12] & 0xFF) << 16) + frame[13]) ]) data.append([ "Счетчик 7", "%d" % ((frame[14] << 16) + ((frame[15] & 0xFF) >> 8)) ]) data.append([ "Счетчик 8", "%d" % (((frame[15] & 0xFF) << 16) + frame[16]) ]) data.append([ "Счетчик 9", "%d" % ((frame[17] << 16) + ((frame[18] & 0xFF) >> 8)) ]) data.append([ "Счетчик 10", "%d" % (((frame[18] & 0xFF) << 16) + frame[19]) ]) data.append([ "Счетчик 11", "%d" % ((frame[20] << 16) + ((frame[21] & 0xFF) >> 8)) ]) data.append([ "Счетчик 12", "%d" % (((frame[21] & 0xFF) << 16) + frame[22]) ]) data.append([ "Счетчик 13", "%d" % ((frame[23] << 16) + ((frame[24] & 0xFF) >> 8)) ]) data.append([ "Счетчик 14", "%d" % (((frame[24] & 0xFF) << 16) + frame[25]) ]) data.append(["Счетчик 15", "%d" % frame[26]]) data.append(["Счетчик 16", "%d" % frame[27]]) data.append(["Счетчик 17", "%d" % frame[28]]) data.append(["Счетчик 18", "%d" % frame[29]]) data.append(["Счетчик 19", "%d" % frame[30]]) # data.append(["CRC-16", "0x%04X" % crc16.calc(frame, 32)]) pass else: data.append(["Неизвестный определитель", "0"]) else: data.append(["Данные не распознаны", "0"]) return data