Ejemplo n.º 1
0
def test_singlepoint_loopback(can_in_interface, can_out_interface):
    database_name = 'NIXNET_example'
    cluster_name = 'CAN_Cluster'
    frame_name = ['CANEventFrame1', 'CANEventFrame2']

    with nixnet.FrameInSinglePointSession(can_in_interface, database_name,
                                          cluster_name,
                                          frame_name) as input_session:
        with nixnet.FrameOutSinglePointSession(can_out_interface,
                                               database_name, cluster_name,
                                               frame_name) as output_session:
            # Start the input session manually to make sure that the first
            # frame value sent before the initial read will be received.
            input_session.start()

            first_payload_list = [2, 4, 8, 16]
            second_payload_list = [1, 3]
            expected_frames = [
                types.CanFrame(66, constants.FrameType.CAN_DATA,
                               bytes(bytearray(first_payload_list))),
                types.CanFrame(67, constants.FrameType.CAN_DATA,
                               bytes(bytearray(second_payload_list)))
            ]
            output_session.frames.write(expected_frames)

            # Wait 1 s and then read the received values.
            # They should be the same as the ones sent.
            time.sleep(1)

            actual_frames = list(input_session.frames.read())
            assert len(expected_frames) == len(actual_frames)
            for i, (expected,
                    actual) in enumerate(zip(expected_frames, actual_frames)):
                assert_can_frame(i, expected, actual)
Ejemplo n.º 2
0
def main():

    #ibs = IBS200_GEN1('LIN2', 'hella_gen1_ibs')
    ibs = IBS_GLOBAL_GEN2('LIN2', 'hella_gen2_ibs')
    # User Defined Configuration

    C_NOMINAL = 30 #Ah
    U0_MIN = 11200 #mV
    U0_MAX = 12650 #mV
    IQBATT = 250 #mA(100mA Default)
    ICHRG_MIN = 50 #mA (50mA Default)
    BATT_TECH = 'AGM'

    # Set Master payloads

    ibs.set_nominal_capacity(capacity_ah=C_NOMINAL)
    ibs.set_u0_minmax(u0_min = U0_MIN, u0_max = U0_MAX)
    #ibs.set_ibatt_quiescent(iqbatt = IQBATT, ichargemin = ICHRG_MIN)
    #ibs.set_batt_tech(batt_tech = 'AGM')


    # Setup LIN Sessions
    with nixnet.FrameInSinglePointSession(ibs.interface, ibs.database, ibs.cluster, ibs.slave_resp_input_frames) as input_session:
        with nixnet.FrameOutQueuedSession(ibs.interface, ibs.database, ibs.cluster, ibs.master_req_output_frames) as output_session:

            output_session.intf.lin_term = constants.LinTerm.ON
            output_session.intf.lin_master = True

            output_session.change_lin_schedule(ibs.lin_diag_schedule)

            def write_LIN(session, id, payload):
                """ Write LIN Frame to XNET Session."""

                print('Sending MasterReq Frame : ID:{} Payload:{}'.format(id,[hex(val) for val in payload]))
                frame = types.LinFrame(id, type=constants.FrameType.LIN_DATA, payload=bytearray(payload))
                output_session.frames.write([frame])


            def read_LIN(session):
                """ Read LIN Frame from XNET Session."""

                slave_frame, = input_session.frames.read(frame_type=types.LinFrame)
                print('Received SlaveResp Frame :{}'.format(slave_frame))
                data =[int(struct.unpack('B',val)[0]) for val in slave_frame.payload]
                print('SlaveResp Payload = {}'.format([hex(val) for val in data]))
                return data

            input_session.flush()
            # Wake up LIN Bus
            print('0) Waking up LIN Bus...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['Empty_Frame'])
            slave_frame, = input_session.frames.read(frame_type=types.LinFrame)
            time.sleep(0.1)


            # Configure IBS
            print('Check Table State...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['BattTable_State'])
            time.sleep(0.35)
            read_LIN(input_session)

            print('Switch Table OFF...')
            ibs.set_switch_table_OnOff(state='Off')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['BattTable_OnOff'])
            time.sleep(0.35)
            read_LIN(input_session)

            print('Change C_NOMINAL...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['BattCap_Write'])
            time.sleep(0.35)
            read_LIN(input_session)

            print('Change U0 MIN/MAX...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['U0_MinMax_Write'])
            time.sleep(0.35)
            read_LIN(input_session)

            # print('Change Batt IQ/Icharge_min...')
            # write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['IQbatt_Write'])
            # time.sleep(0.25)
            # read_LIN(input_session)

            print('Allow IBS to save all parameters (10s wait)...')

            print '['
            for i in range(0,100):
                print '#',
                time.sleep(0.1)
            print(']\n')

            print('Check Table State...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['BattTable_State'])
            time.sleep(0.35)
            read_LIN(input_session)

            print('Check C_Nominal...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['BattCap_Read'])
            time.sleep(0.35)
            read_LIN(input_session)

            print('Check U0 MIN/MAX...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['U0_MinMax_Read'])
            time.sleep(0.35)
            read_LIN(input_session)

            # print('Check Batt IQ/Charge_min...')
            # write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['IQbatt_Read'])
            # time.sleep(0.25)
            # read_LIN(input_session)

            print('Done!')
Ejemplo n.º 3
0
def main():

    #ibs = IBS200_GEN1('LIN2', 'hella_gen1_ibs')
    ibs = IBS_GLOBAL_GEN2('LIN2', 'hella_gen2_ibs')
    # User Defined Configuration

    C_NOMINAL = 30 #Ah
    U0_MIN = 11250 #mV
    U0_MAX = 12800 #mV
    IQBATT = 200 #mA(100mA Default)
    BATT_TECH = 'AGM'

    # Set Master payloads

    ibs.set_nominal_capacity(capacity_ah=C_NOMINAL)
    ibs.set_u0_minmax(u0_min = U0_MIN, u0_max = U0_MAX)
    #ibs.set_ibatt_quiescent(iqbatt = IQBATT)
    ibs.set_batt_tech(batt_tech = 'AGM')



    # Setup LIN Sessions
    with nixnet.FrameInSinglePointSession(ibs.interface, ibs.database, ibs.cluster, ibs.slave_resp_input_frames) as input_session:
        with nixnet.FrameOutQueuedSession(ibs.interface, ibs.database, ibs.cluster, ibs.master_req_output_frames) as output_session:

            output_session.intf.lin_term = constants.LinTerm.ON
            output_session.intf.lin_master = True

            output_session.change_lin_schedule(lin_schedule)

            def write_LIN(session, id, payload):
                """ Write LIN Frame to XNET Session."""

                print('Sending MasterReq Frame : ID:{} Payload:{}'.format(id,[hex(val) for val in payload]))
                frame = types.LinFrame(id, type=constants.FrameType.LIN_DATA, payload=bytearray(payload))
                output_session.frames.write([frame])


            def read_LIN(session):
                """ Read LIN Frame from XNET Session."""

                slave_frame, = input_session.frames.read(frame_type=types.LinFrame)
                print('Received SlaveResp Frame :{}'.format(slave_frame))
                data =[int(struct.unpack('B',val)[0]) for val in slave_frame.payload]
                print('SlaveResp Payload = {}'.format([hex(val) for val in data]))
                return data

            input_session.flush()
            # Wake up LIN Bus
            print('Waking up LIN Bus...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['Empty_Frame'])
            slave_frame, = input_session.frames.read(frame_type=types.LinFrame)
            time.sleep(0.1)

            print('Check Table State...')
            # frame_count = input_session.frames.count()
            # print('frames in buffer = {}'.format(frame_count))

            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['BattTable_State'])
            time.sleep(0.25)
            read_LIN(input_session)



            print('Check Table State...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['BattTable_State'])
            time.sleep(0.25)
            read_LIN(input_session)

            print('Check C_Nominal...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['BattCap_Read'])
            time.sleep(0.25)
            read_LIN(input_session)

            print('Check Batt Type...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['BattType_Read'])
            time.sleep(0.25)
            read_LIN(input_session)

            print('Check U0 MIN/MAX...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['U0_MinMax_Read'])
            time.sleep(0.25)
            read_LIN(input_session)

            print('Check Batt Tech...')
            write_LIN(output_session, ibs.MasterReqId, ibs.master_payloads['Batt_Tech_Read'])
            time.sleep(0.25)
            read_LIN(input_session)



            print('Done!')
Ejemplo n.º 4
0
def main():

    parser = argparse.ArgumentParser(
        description='Script used to test SOC gauge performance')
    #parser.add_argument('pos_current_lim', help="Choose the charger's positive current limit", type=float)
    ##parser.add_argument('neg_curr_lim', help="Choose the charger's negative current limit", type=float)
    #parser.add_argument('voltage_high', help='Choose what the high level charger voltage is', type=float)
    #parser.add_argument('voltage_low', help='Choose what the low level charger voltage is', type=float)
    parser.add_argument('profile_file',
                        help='Choose Test profile .csv file',
                        type=str)
    parser.add_argument('test_name', help='Choose name of the test', type=str)
    parser.add_argument('charger_visa_name',
                        help='Type in the charger VISA alias',
                        type=str)

    args = parser.parse_args()
    print('Profile chosen : {}'.format(args.profile_file))

    # Open Charger VISA open_resource
    rm = pyvisa.ResourceManager()
    charger_visa = rm.open_resource(args.charger_visa_name)
    # Open log file
    filename = args.test_name + '_' + str(today[1]) + '_' + str(
        today[2]) + '_' + str(today[3]) + str(today[4]) + '.csv'
    print("Opening log file as {}".format(filename))
    log_file = open(filename, 'w')
    header = "time,batt_voltage,batt_current,batt_soc,charger_voltage,charger_current\n"
    log_file.write(header)

    charger.visa = charger_visa
    print(charger.idn())
    charger.init()

    # Set up Profile State Machine
    local_path = os.path.dirname(os.path.abspath(__file__))
    filename = os.path.join(local_path, args.profile_file)

    with open(filename) as profile:
        test_profile = profile_state_machine(profile)
        test_profile.set_event_function(charger.set_charger_setpoints)

        # Setup LIN Sessions
        with nixnet.FrameInSinglePointSession(interface, database, cluster,
                                              frames) as session:
            with convert.SignalConversionSinglePointSession(
                    database, cluster, signals) as converter:

                session.intf.lin_term = constants.LinTerm.ON
                session.intf.lin_master = True

                def read_data_task(time):
                    """Aquires and Converts Telemetry data on the SCPI and LIN buses."""
                    # Read Telemetry
                    charger.read_data()
                    frame = session.frames.read(frame_type=types.LinFrame)

                    # Format Data
                    converted_signals = converter.convert_frames_to_signals(
                        frame)
                    batt.pack_data(time,
                                   *[float(v) for (_, v) in converted_signals])

                # Set the schedule. This will also automatically enable master mode.
                session.start()
                session.change_lin_schedule(schedule_index)
                time.sleep(1)

                # Setup charger
                # charger.set_curr_lim(0, 0)
                # charger.set_voltage(0)
                # charger.set_output('OFF')

                display_task = InfiniteTimer(DISPLAY_RATE, display_data_task)

                #daq_task = InfiniteTimer(SAMPLE_RATE, read_data_task)

                def exit_signal_handler(signal, frame):
                    print('Shutting Down...')
                    charger.set_output('OFF')
                    display_task.cancel()
                    #daq_task.cancel()
                    sys.exit()

                signal.signal(signal.SIGINT, exit_signal_handler)

                display_task.start()
                #daq_task.start()

                loop_count = 0
                start_time = time.time()
                next_step = 0

                while (1):
                    loop_start = time.time()
                    sample_time = loop_start - start_time
                    read_data_task(sample_time)

                    # Logging data
                    data_row = "{},{},{},{},{},{}\n".format(
                        sample_time, batt.voltage, batt.current, batt.soc,
                        charger.voltage, charger.current)
                    log_file.write(data_row)

                    #Feed profile state machine
                    test_profile.run_profile(batt)
                    if (test_profile.done):
                        print('Profile ended.')
                        print('Data acquisition stopped.')
                        log_file.close()
                        print('Shutting Down...')
                        charger.set_output('OFF')
                        display_task.cancel()
                        sys.exit()

                    loop_time = time.time() - loop_start
                    loop_wait = SAMPLE_RATE - loop_time
                    if (loop_wait < 0):
                        loop_wait = 0
                    time.sleep(loop_wait)

    print('Data acquisition stopped.')
Ejemplo n.º 5
0
def main():

    batt = battery('YUASA_30')

    def display_data_task():
        """Display latest data on console."""
        print(
            'Batt. Voltage = {:2.2f}V | Batt. Current = {:2.4f}A | Batt. temp = {:2.2f}C | Batt. SOC = {:2.2f}% | Q.Nom = {:2.2f}Ah | SOC.Recal = {}'
            .format(*(batt.list_data())))

    # Setup LIN Sessions
    with nixnet.FrameInSinglePointSession(interface, database, cluster,
                                          frames) as session:
        with convert.SignalConversionSinglePointSession(
                database, cluster, signals) as converter:

            session.intf.lin_term = constants.LinTerm.ON
            session.intf.lin_master = True

            def read_data_task():
                """Aquires and Converts Telemetry data on the SCPI and LIN buses."""
                # Read Telemetry
                frame = session.frames.read(frame_type=types.LinFrame)

                # Format Data
                converted_signals = converter.convert_frames_to_signals(frame)
                batt.pack_data(*[float(v) for (_, v) in converted_signals])

            # Set the schedule. This will also automatically enable master mode.
            session.start()

            session.change_lin_schedule(lin_schedule)
            time.sleep(1)

            display_task = InfiniteTimer(DISPLAY_RATE, display_data_task)

            def exit_signal_handler(signal, frame):
                print('Shutting Down...')
                display_task.cancel()
                #daq_task.cancel()
                sys.exit()

            signal.signal(signal.SIGINT, exit_signal_handler)

            display_task.start()
            #daq_task.start()

            loop_count = 0
            start_time = time.time()
            next_step = 0

            while (1):
                loop_start = time.time()
                sample_time = loop_start - start_time

                read_data_task()
                # status = session.num_unused
                # print(status)
                loop_time = time.time() - loop_start
                loop_wait = SAMPLE_RATE - loop_time
                if (loop_wait < 0):
                    loop_wait = 0
                time.sleep(loop_wait)

    print('Data acquisition stopped.')