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)
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!')
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!')
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.')
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.')