Examples
You can download all nifgen examples for latest version here
nifgen_arb_waveform.py
1#!/usr/bin/python
2
3import argparse
4import math
5import nifgen
6import sys
7import time
8
9
10def create_waveform_data(number_of_samples):
11 waveform_data = []
12 angle_per_sample = (2 * math.pi) / number_of_samples
13 for i in range(number_of_samples):
14 waveform_data.append(math.sin(i * angle_per_sample) * math.sin(i * angle_per_sample * 20))
15 return waveform_data
16
17
18def example(resource_name, options, samples, gain, offset, gen_time):
19 waveform_data = create_waveform_data(samples)
20 with nifgen.Session(resource_name=resource_name, options=options) as session:
21 session.output_mode = nifgen.OutputMode.ARB
22 waveform = session.create_waveform(waveform_data_array=waveform_data)
23 session.configure_arb_waveform(waveform_handle=waveform, gain=gain, offset=offset)
24 with session.initiate():
25 time.sleep(gen_time)
26
27
28def _main(argsv):
29 parser = argparse.ArgumentParser(description='Continuously generates an arbitrary waveform.', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
30 parser.add_argument('-n', '--resource-name', default='PXI1Slot2', help='Resource name of an NI arbitrary waveform generator.')
31 parser.add_argument('-s', '--samples', default=100000, type=int, help='Number of samples')
32 parser.add_argument('-g', '--gain', default=1.0, type=float, help='Gain')
33 parser.add_argument('-o', '--offset', default=0.0, type=float, help='DC offset (V)')
34 parser.add_argument('-t', '--time', default=5.0, type=float, help='Generation time (s)')
35 parser.add_argument('-op', '--option-string', default='', type=str, help='Option string')
36 args = parser.parse_args(argsv)
37 example(args.resource_name, args.option_string, args.samples, args.gain, args.offset, args.time)
38
39
40def main():
41 _main(sys.argv[1:])
42
43
44def test_example():
45 options = {'simulate': True, 'driver_setup': {'Model': '5433 (2CH)', 'BoardType': 'PXIe', }, }
46 example('PXI1Slot2', options, 100000, 1.0, 0.0, 5.0)
47
48
49def test_main():
50 cmd_line = ['--option-string', 'Simulate=1, DriverSetup=Model:5433 (2CH);BoardType:PXIe', ]
51 _main(cmd_line)
52
53
54if __name__ == '__main__':
55 main()
56
57
nifgen_script.py
1#!/usr/bin/python
2
3import argparse
4import nifgen
5
6import math
7import sys
8import time
9
10# waveform size should be a multiple of the quantum, which is 4, 2 or 1, for all devices
11# minimum waveform size needed to prevent underflow varies with sample rate and device.
12# If underflow occurs, increase this value.
13NUMBER_OF_SAMPLES = 2096
14
15
16# waveforms finish just short of 360 degrees, so that we don't repeat the first point
17# if we repeat the waveform
18SINE_WAVE = [math.sin(math.pi * 2 * x / (NUMBER_OF_SAMPLES)) for x in range(NUMBER_OF_SAMPLES)]
19RAMP_UP = [x / (NUMBER_OF_SAMPLES) for x in range(NUMBER_OF_SAMPLES)]
20RAMP_DOWN = [-1.0 * x for x in RAMP_UP]
21SQUARE_WAVE = [1.0 if x < (NUMBER_OF_SAMPLES / 2) else -1.0 for x in range(NUMBER_OF_SAMPLES)]
22SAWTOOTH_WAVE = RAMP_UP[::2] + [(-1 + x) for x in RAMP_UP][::2]
23
24
25SCRIPT_ALL = '''
26script scriptmulti
27 repeat until scriptTrigger0
28 generate rampup
29 generate sine
30 generate rampdown
31 end repeat
32 repeat until scriptTrigger0
33 generate rampdown
34 generate square
35 generate rampup
36 end repeat
37 repeat until scriptTrigger0
38 generate rampup
39 generate rampdown
40 end repeat
41 repeat until scriptTrigger0
42 generate sine
43 end repeat
44 repeat until scriptTrigger0
45 generate sawtooth
46 end repeat
47 repeat until scriptTrigger0
48 generate rampdown
49 generate rampup
50 end repeat
51end script
52
53script scriptsine
54 repeat until scriptTrigger0
55 generate sine
56 end repeat
57end script
58
59script scriptrampup
60 repeat until scriptTrigger0
61 generate rampup
62 end repeat
63end script
64
65script scriptrampdown
66 repeat until scriptTrigger0
67 generate rampdown
68 end repeat
69end script
70
71script scriptsquare
72 repeat until scriptTrigger0
73 generate square
74 end repeat
75end script
76
77script scriptsawtooth
78 repeat until scriptTrigger0
79 generate sawtooth
80 end repeat
81end script
82'''
83
84
85def example(resource_name, options, shape, channel):
86 with nifgen.Session(resource_name=resource_name, options=options, channel_name=channel) as session:
87 # CONFIGURATION
88 # 1 - Set the mode to Script
89 session.output_mode = nifgen.OutputMode.SCRIPT
90
91 # 2 - Configure Trigger:
92 # SOFTWARE TRIGGER: used in the script
93 session.script_triggers[0].script_trigger_type = nifgen.ScriptTriggerType.SOFTWARE_EDGE # TRIG_NONE / DIGITAL_EDGE / DIGITAL_LEVEL / SOFTWARE_EDGE
94 session.script_triggers[0].digital_edge_script_trigger_edge = nifgen.ScriptTriggerDigitalEdgeEdge.RISING # RISING / FAILING
95
96 # 3 - Calculate and write different waveform data to the device's onboard memory
97 session.channels[channel].write_waveform('sine', SINE_WAVE) # (waveform_name, data)
98 session.channels[channel].write_waveform('rampup', RAMP_UP)
99 session.channels[channel].write_waveform('rampdown', RAMP_DOWN)
100 session.channels[channel].write_waveform('square', SQUARE_WAVE)
101 session.channels[channel].write_waveform('sawtooth', SAWTOOTH_WAVE)
102
103 # 4 - Script to generate
104 # supported shapes: SINE / SQUARE / SAWTOOTH / RAMPUP / RAMPDOWN / MULTI
105 script_name = f'script{shape.lower()}'
106 num_triggers = 6 if shape.upper() == 'MULTI' else 1 # Only multi needs multiple triggers, all others need one
107
108 session.channels[channel].write_script(SCRIPT_ALL)
109 session.script_to_generate = script_name
110
111 # LAUNCH
112 with session.initiate():
113 for x in range(num_triggers):
114 time.sleep(10)
115 session.script_triggers[0].send_software_edge_trigger()
116
117
118def _main(argsv):
119 parser = argparse.ArgumentParser(description='Generate different shape waveforms.', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
120 parser.add_argument('-n', '--resource-name', default='PXI1Slot2', help='Resource name of an NI arbitrary waveform generator.')
121 parser.add_argument('-s', '--shape', default='SINE', help='Shape of the signal to generate')
122 parser.add_argument('-c', '--channel', default='0', help='Channel to use when generating')
123 parser.add_argument('-op', '--option-string', default='', type=str, help='Option string')
124 args = parser.parse_args(argsv)
125 example(args.resource_name, args.option_string, args.shape.upper(), args.channel)
126
127
128def test_example():
129 options = {'simulate': True, 'driver_setup': {'Model': '5433 (2CH)', 'BoardType': 'PXIe', }, }
130 example('PXI1Slot2', options, 'SINE', '0')
131
132
133def test_main():
134 cmd_line = ['--option-string', 'Simulate=1, DriverSetup=Model:5433 (2CH);BoardType:PXIe', '--channel', '0', ]
135 _main(cmd_line)
136
137
138def main():
139 _main(sys.argv[1:])
140
141
142if __name__ == '__main__':
143 main()
144
145
146
147
nifgen_standard_function.py
1#!/usr/bin/python
2
3import argparse
4import nifgen
5import sys
6import time
7
8
9def example(resource_name, options, waveform, frequency, amplitude, offset, phase, gen_time):
10 with nifgen.Session(resource_name=resource_name, options=options) as session:
11 session.output_mode = nifgen.OutputMode.FUNC
12 session.configure_standard_waveform(waveform=nifgen.Waveform[waveform], amplitude=amplitude, frequency=frequency, dc_offset=offset, start_phase=phase)
13 with session.initiate():
14 time.sleep(gen_time)
15
16
17def _main(argsv):
18 supported_waveforms = list(nifgen.Waveform.__members__.keys())[:-1] # no support for user-defined waveforms in example
19 parser = argparse.ArgumentParser(description='Generates the standard function.', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
20 parser.add_argument('-n', '--resource-name', default='PXI1Slot2', help='Resource name of an NI function generator.')
21 parser.add_argument('-w', '--waveform', default=supported_waveforms[0], choices=supported_waveforms, type=str.upper, help='Standard waveform')
22 parser.add_argument('-f', '--frequency', default=1000, type=float, help='Frequency (Hz)')
23 parser.add_argument('-a', '--amplitude', default=1.0, type=float, help='Amplitude (Vpk-pk)')
24 parser.add_argument('-o', '--offset', default=0.0, type=float, help='DC offset (V)')
25 parser.add_argument('-p', '--phase', default=0.0, type=float, help='Start phase (deg)')
26 parser.add_argument('-t', '--time', default=5.0, type=float, help='Generation time (s)')
27 parser.add_argument('-op', '--option-string', default='', type=str, help='Option string')
28 args = parser.parse_args(argsv)
29 example(args.resource_name, args.option_string, args.waveform, args.frequency, args.amplitude, args.offset, args.phase, args.time)
30
31
32def main():
33 _main(sys.argv[1:])
34
35
36def test_example():
37 options = {'simulate': True, 'driver_setup': {'Model': '5433 (2CH)', 'BoardType': 'PXIe', }, }
38 example('PXI1Slot2', options, 'SINE', 1000, 1.0, 0.0, 0.0, 5.0)
39
40
41def test_main():
42 cmd_line = ['--option-string', 'Simulate=1, DriverSetup=Model:5433 (2CH);BoardType:PXIe', ]
43 _main(cmd_line)
44
45
46if __name__ == '__main__':
47 main()
48
49
50
nifgen_trigger.py
1import argparse
2import nifgen
3import sys
4import time
5
6
7def example(resource_name1, resource_name2, options, waveform, gen_time):
8 with nifgen.Session(resource_name=resource_name1, options=options) as session1, nifgen.Session(resource_name=resource_name2, options=options) as session2:
9 session_list = [session1, session2]
10 for session in session_list:
11 session.output_mode = nifgen.OutputMode.FUNC
12 session.configure_standard_waveform(waveform=nifgen.Waveform[waveform], amplitude=1.0, frequency=1000, dc_offset=0.0, start_phase=0.0)
13 session1.start_trigger_type = nifgen.StartTriggerType.SOFTWARE_EDGE
14 session2.start_trigger_type = nifgen.StartTriggerType.DIGITAL_EDGE
15 session2.digital_edge_start_trigger_edge = nifgen.StartTriggerDigitalEdgeEdge.RISING
16 session2.digital_edge_start_trigger_source = '/' + resource_name1 + '/0/StartTrigger'
17 with session2.initiate():
18 with session1.initiate():
19 session1.send_software_edge_trigger(nifgen.Trigger.START)
20 time.sleep(gen_time)
21
22
23def _main(argsv):
24 supported_waveforms = list(nifgen.Waveform.__members__.keys())[:-1] # no support for user-defined waveforms in example
25 parser = argparse.ArgumentParser(description='Triggers one device on the start trigger of another device.', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
26 parser.add_argument('-n1', '--resource-name1', default='PXI1Slot2', help='Resource name of an NI function generator.')
27 parser.add_argument('-n2', '--resource-name2', default='PXI1Slot3', help='Resource name of an NI function generator.')
28 parser.add_argument('-w', '--waveform', default=supported_waveforms[0], choices=supported_waveforms, type=str.upper, help='Standard waveform')
29 parser.add_argument('-t', '--time', default=5.0, type=float, help='Generation time (s)')
30 parser.add_argument('-op', '--option-string', default='', type=str, help='Option string')
31 args = parser.parse_args(argsv)
32 example(args.resource_name1, args.resource_name2, args.option_string, args.waveform, args.time)
33
34
35def main():
36 _main(sys.argv[1:])
37
38
39def test_example():
40 options = {'simulate': True, 'driver_setup': {'Model': '5433 (2CH)', 'BoardType': 'PXIe', }, }
41 example('PXI1Slot2', 'PXI1Slot3', options, 'SINE', 5.0)
42
43
44def test_main():
45 cmd_line = ['--option-string', 'Simulate=1, DriverSetup=Model:5433 (2CH);BoardType:PXIe', ]
46 _main(cmd_line)
47
48
49if __name__ == '__main__':
50 main()