Labview Intermediate 1 PDF
Labview Intermediate 1 PDF
Labview Intermediate 1 PDF
LabVIEW Intermediate I
Successful Development
Practices Course Manual
Worldwide Offices
Australia 1800 300 800, Austria 43 0 662 45 79 90 0, Belgium 32 0 2 757 00 20, Brazil 55 11 3262 3599, Canada 800 433 3488,
China 86 21 6555 7838, Czech Republic 420 224 235 774, Denmark 45 45 76 26 00, Finland 385 0 9 725 725 11,
France 33 0 1 48 14 24 24, Germany 49 0 89 741 31 30, India 91 80 51190000, Israel 972 0 3 6393737, Italy 39 02 413091,
Japan 81 3 5472 2970, Korea 82 02 3451 3400, Lebanon 961 0 1 33 28 28, Malaysia 1800 887710, Mexico 01 800 010 0793,
Netherlands 31 0 348 433 466, New Zealand 0800 553 322, Norway 47 0 66 90 76 60, Poland 48 22 3390150,
Portugal 351 210 311 210, Russia 7 095 783 68 51, Singapore 1800 226 5886, Slovenia 386 3 425 4200,
South Africa 27 0 11 805 8197, Spain 34 91 640 0085, Sweden 46 0 8 587 895 00, Switzerland 41 56 200 51 51,
Taiwan 886 02 2377 2222, Thailand 662 278 6777, United Kingdom 44 0 1635 523545
For further support information, refer to the Additional Information and Resources appendix. To comment on National Instruments
documentation, refer to the National Instruments Web site at ni.com/info and enter the info code feedback.
Contents
Student Guide
A.
B.
C.
D.
E.
F.
NI Certification .....................................................................................................vii
Course Description ...............................................................................................viii
What You Need to Get Started .............................................................................viii
Installing the Course Software..............................................................................ix
Course Goals.........................................................................................................ix
Course Conventions ..............................................................................................x
Lesson 1
Successful Development Practices
A. Scalable, Readable, and Maintainable VIs ...........................................................1-2
B. Successful Development Practices .......................................................................1-4
C. Course Project Overview ......................................................................................1-11
Summary .....................................................................................................................1-12
Lesson 2
Analyzing the Project
A. Evaluating the Needs of the Customer .................................................................2-2
Exercise 2-1
Analyze the Specifications ...............................................................2-5
B. Communicating with the Customer ......................................................................2-6
C. Developing the Requirements Document .............................................................2-8
Exercise 2-2
Analyze a Requirements Document .................................................2-9
D. Defining the Application ......................................................................................2-16
Summary .....................................................................................................................2-29
Lesson 3
Designing the User Interface
A. User Interface Design Issues.................................................................................3-2
B. User Interface Layout Issues.................................................................................3-4
C. Front Panel Prototyping ........................................................................................3-16
D. User Interface Example ........................................................................................3-17
E. Localizing User Interfaces ....................................................................................3-18
Exercise 3-1
Concept: User-Interface Design Techniques....................................3-20
Summary .....................................................................................................................3-26
iii
Contents
Lesson 4
Designing the Project
A. Design Patterns .....................................................................................................4-2
Exercise 4-1
Concept: Experiment with Design Patterns......................................4-12
B. Event-Based Design Patterns................................................................................4-13
Exercise 4-2
Concept: Experiment with Event Structures ....................................4-22
Exercise 4-3
Concept: Experiment with Event-Based Design Patterns ................4-28
C. Advanced Event-Based Design Patterns...............................................................4-29
Exercise 4-4
Concept: User Event Techniques .....................................................4-32
Exercise 4-5
Choose a Scalable Architecture........................................................4-40
D. Creating a Hierarchical Architecture ....................................................................4-41
E. Using the LabVIEW Project and Project Libraries ..............................................4-42
Exercise 4-6
Using the LabVIEW Project.............................................................4-54
F. Choosing Data Types............................................................................................4-55
Exercise 4-7
Choose Data Types...........................................................................4-57
G. Information Hiding ...............................................................................................4-60
Exercise 4-8
Information Hiding...........................................................................4-64
H. Designing Error Handling Strategies ....................................................................4-76
Exercise 4-9
Design Error Handling Strategy .......................................................4-80
Summary .....................................................................................................................4-84
Lesson 5
Implementing the User Interface
A. Implementing User Interface-Based Data Types..................................................5-2
Exercise 5-1
Implement User Interface-Based Data Types...................................5-8
B. Implementing Meaningful Icons...........................................................................5-12
Exercise 5-2
Implement a Meaningful Icon ..........................................................5-14
C. Implementing Appropriate Connector Panes........................................................5-15
Exercise 5-3
Implement an Appropriate Connector Pane .....................................5-18
Summary .....................................................................................................................5-19
Lesson 6
Implementing Code
A. Configuration Management ..................................................................................6-2
B. Implementing a Design Pattern.............................................................................6-7
Exercise 6-1
Implement the Design Pattern ..........................................................6-12
C. Implementing Code...............................................................................................6-27
Exercise 6-2
Timing ..............................................................................................6-49
D. Develop Scalable and Maintainable Modules ......................................................6-60
Exercise 6-3
Implement Code ...............................................................................6-67
E. Implement an Error Handling Strategy.................................................................6-76
Exercise 6-4
Implement Error Handling Strategy .................................................6-77
Summary .....................................................................................................................6-81
iv
ni.com
Contents
Lesson 7
Implementing a Test Plan
A. Verifying the Code................................................................................................7-2
B. Implementing a Test Plan for Individual VIs .......................................................7-2
C. Implementing a Test Plan for Integrating VIs ......................................................7-6
Exercise 7-1
Integrate Initialize and Shutdown Functions....................................7-10
Exercise 7-2
Integrate Display Module .................................................................7-16
Exercise 7-3
Integrate Record Function ................................................................7-22
Exercise 7-4
Integrate Play Function.....................................................................7-28
Exercise 7-5
Integrate Stop Function ....................................................................7-33
Exercise 7-6
Integrate Error Module .....................................................................7-35
Exercise 7-7
Integrate Save and Load Functions ..................................................7-39
Exercise 7-8
Integrate Select Cue Function ..........................................................7-46
Exercise 7-9
Integrate Move Cue Functions .........................................................7-48
Exercise 7-10 Integrate Delete Function .................................................................7-51
D. Implementing a Test Plan for the System .............................................................7-53
Exercise 7-11 Stress and Load Testing....................................................................7-59
Summary .....................................................................................................................7-61
Lesson 8
Evaluating VI Performance
A. Steps to Improving Performance ..........................................................................8-2
B. Using VI Metrics to Identify VI Issues.................................................................8-2
Exercise 8-1
Identify VI Issues with VI Metrics...................................................8-4
C. Further Identifying VI Issues with VI Analyzer (Optional) .................................8-5
Exercise 8-2
Identify VI Issues with VI Analyzer (Optional)...............................8-12
D. Identifying Performance Problems .......................................................................8-13
E. Fixing Performance Problems ..............................................................................8-14
Exercise 8-3
Concept: Methods of Updating Indicators .......................................8-22
Summary .....................................................................................................................8-24
Lesson 9
Implementing Documentation
A. Designing Documentation ....................................................................................9-2
B. Developing User Documentation..........................................................................9-2
C. Describing VIs, Controls, and Indicators..............................................................9-5
Exercise 9-1
Document User Interface..................................................................9-7
D. Creating Help Files ...............................................................................................9-9
Exercise 9-2
Implement Documentation ...............................................................9-10
Summary .....................................................................................................................9-12
Contents
Lesson 10
Deploying the Application
A. Implementing Code for Stand-Alone Applications ..............................................10-2
Exercise 10-1 Implementing Code for Stand-Alone Applications..........................10-8
B. Building a Stand-Alone Application.....................................................................10-13
Exercise 10-2 Create a Stand-Alone Application....................................................10-21
C. Building an Installer..............................................................................................10-23
Exercise 10-3 Create an Installer.............................................................................10-32
Summary .....................................................................................................................10-34
Appendix A
IEEE Requirements Documents
A. Institute of Electrical and Electronic Engineers (IEEE) Standards ......................A-2
B. IEEE Requirements Document .............................................................................A-3
Appendix B
Additional Information and Resources
Glossary
Index
Course Evaluation
vi
ni.com
Student Guide
Thank you for purchasing the LabVIEW Intermediate I: Successful
Development Practices course kit. You can begin developing an application
soon after you complete the exercises in this manual. This course manual
and the accompanying software are used in the three-day, hands-on
LabVIEW Intermediate I: Successful Development Practices course.
You can apply the full purchase of this course kit toward the corresponding
course registration fee if you register within 90 days of purchasing the kit.
Visit ni.com/training for online course schedules, syllabi, training
centers, and class registration.
A. NI Certification
The LabVIEW Intermediate I: Successful Development Practices course is
part of a series of courses designed to build your proficiency with LabVIEW
and help you prepare for NI LabVIEW certification exams. The following
illustration shows the courses that are part of the LabVIEW training series.
Refer to ni.com/training for more information about NI Certification.
Courses
Begin
Here
New User
Experienced User
Advanced User
LabVIEW Basics I*
LabVIEW Basics II*
LabVIEW Intermediate I*
LabVIEW Intermediate II*
LabVIEW Advanced
Application Development
Skills learned:
LabVIEW environment
navigation
Basic application creation
using LabVIEW
Skills learned:
Modular application development
Structured design and
development practices
Memory management and VI
performance improvement
Skills learned:
Large application design
Code reuse maximization
Object-oriented programming
in LabVIEW
Certifications
Certified LabVIEW
Associate Developer Exam
Skills tested:
LabVIEW environment
knowledge
Certified LabVIEW
Developer Exam
Skills tested:
LabVIEW application
development expertise
Certified LabVIEW
Architect Exam
Skills tested:
LabVIEW application
development mastery
Hardware-Based Courses:
Data Acquisition and Signal Conditioning Modular Instruments Instrument Control Machine Vision
Motion Control LabVIEW Real-Time
*Core courses are strongly recommended to realize maximum productivity gains when using LabVIEW.
vii
Student Guide
B. Course Description
The LabVIEW Intermediate I: Successful Development Practices course
teaches you four fundamental areas of software development in
LabVIEWdesign, implement, test, and deploy. By the end of the
LabVIEW Intermediate I: Successful Development Practices course, you
will be able to produce a LabVIEW application that uses good programming
practices and is easy to scale, easy to read, and easy to maintain. As a result,
you should be able to more effectively develop software with LabVIEW.
This course assumes that you have taken the LabVIEW Basics I:
Introduction and LabVIEW Basics II: Development courses or have
equivalent experience.
This course kit is designed to be completed in sequence. The course is
divided into lessons, each covering a topic or a set of topics. Each lesson
consists of:
The exercises in this course are cumulative and lead toward developing a final
application at the end of the course. If you skip an exercise, use the solution VI for that
exercise, available in the C:\Solutions\LabVIEW Intermediate I directory,
in later exercises.
Note
A summary that outlines the important concepts and skills in the lesson
viii
ni.com
Student Guide
Filename
Description
Exercises
Solutions
E. Course Goals
After completing the course, you will be able to:
ix
Student Guide
F. Course Conventions
The following conventions are used in this course manual:
The symbol leads you through nested menu items and dialog box options
to a final action. The sequence FilePage SetupOptions directs you to pull
down the File menu, select the Page Setup item, and select Options from
the last dialog box.
This icon denotes a tip, which alerts you to advisory information.
This icon denotes a note, which alerts you to important information.
This icon denotes a caution, which advises you of precautions to take to
avoid injury, data loss, or a system crash.
bold
Bold text denotes items that you must select or click in the software, such as
menu items and dialog box options. Bold text also denotes parameter names,
controls and buttons on the front panel, dialog boxes, sections of dialog
boxes, menu names, and palette names.
italic
monospace
Text in this font denotes text or characters that you enter from the keyboard,
sections of code, programming examples, and syntax examples. This font
also is used for the proper names of disk drives, paths, directories, programs,
subprograms, subroutines, device names, functions, operations, variables,
filenames, and extensions.
monospace
italic
Italic text in this font denotes text that is a placeholder for a word or value
that you must supply.
Platform
Text in this font denotes a specific platform and indicates that the text
following it applies only to that platform.
ni.com
Design
Implement
Test
Deploy
Analyze
the Project
Implement the
User Interface
Implement the
Test Plan
Implement the
Documentation
Design the
User Interface
Implement
the Code
Design
the Code
Topics
A. Scalable, Readable, and Maintainable VIs
B. Successful Development Practices
C. Course Project Overview
1-1
Lesson 1
Scalable
In order to create a scalable VI, you must begin thinking about the design of
the application early in the design process. A well-designed scalable VI
allows you to easily modify and add additional functionality to the original
design. For example, consider a data acquisition VI that acquires data from
three thermocouples. Suppose the requirements of the application change,
and you need to acquire data from hundreds of thermocouples. If the
original VI was designed to be scalable, extending the VI to acquire data
from hundreds of thermocouples would be easier than designing a new VI.
Use good design practices to create VIs that are scalable. Many existing
applications must be rewritten when changes are needed because the code
was not designed to be scalable. For a non-scalable VI, even simple changes,
such as acquiring data from more sensors or controlling more relays, can
require a rewrite. When you design any application, consider the purpose of
the application and how to manage changes when the scale of the
application goes beyond the original specification. This course teaches you
techniques for designing scalable VIs.
1-2
ni.com
Lesson 1
Readable
In your experience working with LabVIEW, you may have seen block
diagrams that were unstructured, difficult to read, and difficult to
understand. Confusing and unmaintainable code sometimes is called
spaghetti code. Unreadable code can make it impossible to decipher the
functionality of a block diagram. Figure 1-2 shows poorly designed block
diagram and a well-designed block diagram.
Poorly Designed
Well-Designed
Maintainable
A VI written using good program design and architecture allows you to add
new features without completely rewriting the application. When you
develop an application, keep in mind that another programmer might need
to use and modify the VI in the future. By using forethought in designing
and creating an application, you can create VIs that are more maintainable.
This course teaches you to apply the features of LabVIEW and use good
software design principles that relate directly to LabVIEW to create
well-formed, maintainable applications.
1-3
Lesson 1
Software Lifecycles
Software development projects are complex. To deal with these
complexities, many developers adhere to a core set of development
principles. These principles define the field of software engineering. A
major component of this field is the lifecycle model. The lifecycle model
describes steps to follow when developing softwarefrom the initial
concept stage to the release, maintenance, and subsequent upgrading of the
software.
1.
United States, United States Government Accounting Office, Medical Device Recalls Examination of Selected Cases GAO/PEMD-90-6
(Washington: GAO, 1989) 40.
2.
National Instruments tools are not designed for operating life critical support systems and should not be used in such applications.
1-4
ni.com
Lesson 1
Many different lifecycle models currently exist. Each has advantages and
disadvantages in terms of time-to-release, quality, and risk management.
This section describes some of the most common models used in software
engineering. Many hybrids of these models exist, so you can customize
these models to fit the requirements of a project.
Although this section is theoretical in its discussion, in practice consider all
the steps these models encompass. Consider how you decide what
requirements and specifications the project must meet and how you deal
with changes to them. Also consider when you need to meet these
requirements and what happens if you do not meet a deadline.
The lifecycle model is a foundation for the entire development process.
Good decisions can improve the quality of the software you develop and
decrease the time it takes to develop it.
Waterfall Model
The waterfall model is the classic model of software engineering. This
model is one of the oldest models and is widely used in government projects
and in many major companies. Because the model emphasizes planning in
the early stages, it catches design flaws before they develop. Also, because
the model is document and planning intensive, it works well for projects in
which quality control is a major concern.
The pure waterfall lifecycle consists of several non-overlapping stages, as
shown in the following figure. The model begins with establishing system
requirements and software requirements and continues with architectural
1-5
Lesson 1
The following list details the steps for using the waterfall model:
1-6
ni.com
Lesson 1
1-7
Lesson 1
important decisions until later in the process when they are more expensive
to correct.
Prototyping
One of the main problems with the waterfall model is that the requirements
often are not completely understood in the early development stages. When
you reach the design or coding stages, you begin to see how everything
works together, and you can discover that you need to adjust the
requirements.
Prototyping is an effective tool for demonstrating how a design meets a set
of requirements. You can build a prototype, adjust the requirements, and
revise the prototype several times until you have a clear picture of the overall
objectives. In addition to clarifying the requirements, a prototype also
defines many areas of the design simultaneously.
The pure waterfall model allows for prototyping in the later architectural
design stage and subsequent stages but not in the early requirements stages.
However, prototyping has its drawbacks. Because it appears that you have a
working system, customers may expect a complete system sooner than is
possible. In most cases, prototypes are built on compromises that allow it to
come together quickly but prevent the prototype from being an effective
basis for future development. You need to decide early if you want to use the
prototype as a basis for future development. All parties need to agree with
this decision before development begins.
Be careful that prototyping does not become a disguise for a code and fix
development cycle. Before you begin prototyping, gather clear requirements
and create a design plan. Limit the amount of time you spend prototyping
before you begin. Time limits help to avoid overdoing the prototyping
phase. As you incorporate changes, update the requirements and the current
design. After you finish prototyping, consider returning to one of the other
development models. For example, consider prototyping as part of the
requirements or design phases of the waterfall model.
1-8
ni.com
Lesson 1
and figure out how the controls work and how various actions require other
front panels. For more extensive prototypes, tie the front panels together.
However, do not get carried away with this process.
If you are bidding on a project for a client, using front panel prototypes is an
extremely effective way to discuss with the client how you can satisfy his or
her requirements. Because you can add and remove controls quickly,
especially if the block diagrams are empty, you help customers clarify
requirements.
Spiral Model
The spiral model is a popular alternative to the waterfall model. It
emphasizes risk management so you find major problems earlier in the
development cycle. In the waterfall model, you have to complete the design
before you begin coding. With the spiral model, you break up the project
into a set of risks that need to be dealt with. You then begin a series of
iterations in which you analyze the most important risk, evaluate options for
resolving the risk, deal with the risk, assess the results, and plan for the next
iteration. The following figure illustrates the spiral lifecycle model.
Determine Objectives,
Alternatives, and Constraints
Evaluate Alternatives
and Risks
Risk
Analysis
Cumulative Cost
Prototype
Commit to
Next Cycle
Risks are any issues that are not clearly defined or have the potential to
affect the project adversely. For each risk, consider the following two things:
You can use a scale of 1 to 10 for each of these items, with 1 representing
the lowest probability or loss and 10 representing the highest. Risk exposure
is the product of these two rankings.
1-9
Lesson 1
Use something such as the following table to keep track of the top risk items
of the project.
ID
Risk
Probability
Loss
Risk
Exposure
Acquisition rates
too high
45
Develop prototype to
demonstrate feasibility
15
Uncertain user
interface
10
In general, deal with the risks with the highest risk exposure first. In this
example, the first spiral deals with the potential of the data acquisition rates
being too high. If after the first spiral, you demonstrate that the rates are
high, you can change to a different hardware configuration to meet the
acquisition requirements. Each iteration can identify new risks. In this
example, using more powerful hardware can introduce higher costs as a
new risk.
For example, assume you are designing a data acquisition system with a
plug-in data acquisition card. In this case, the risk is whether the system can
acquire, analyze, and display data quickly enough. Some of the constraints
in this case are system cost and requirements for a specific sampling rate and
precision.
After determining the options and constraints, you evaluate the risks. In this
example, create a prototype or benchmark to test acquisition rates. After you
see the results, you can evaluate whether to continue with the approach or
choose a different option. You do this by reassessing the risks based on the
new knowledge you gained from building the prototype.
In the final phase, you evaluate the results with the customer. Based on
customer input, you can reassess the situation, decide on the next highest
risk, and start the cycle over. This process continues until the software is
finished or you decide the risks are too great and terminate development. It
is possible that none of the options are viable because the options are too
expensive, time-consuming, or do not meet the requirements.
The advantage of the spiral model over the waterfall model is that you can
evaluate which risks to handle with each cycle. Because you can evaluate
risks with prototypes much earlier than in the waterfall process, you can deal
with major obstacles and select alternatives in the earlier stages, which is
less expensive. With a standard waterfall model, assumptions about the
1-10
ni.com
Lesson 1
risky components can spread throughout the design, and when you discover
the problems, the rework involved can be very expensive.
1-11
Lesson 1
Summary
1-12
ni.com
Lesson 1
Notes
1-13
Lesson 1
Notes
1-14
ni.com
Analyzing a project before you start to build a VI helps you develop VIs
more efficiently and prevent feature creep. This lesson describes essential
steps in the process of analyzing a projectevaluating the specifications
document, creating the requirements document, and defining the
application. At the end of this lesson, you analyze a specifications document
and a requirements document. The requirements document defines the
features required for the application to function according to the
specifications.
Topics
A. Evaluating the Needs of the Customer
B. Communicating with the Customer
C. Developing the Requirements Document
D. Defining the Application
2-1
Lesson 2
2-2
ni.com
Lesson 2
2-3
Lesson 2
Job Aid
Use the following checklist to identify areas of concern with a specifications
document. Not all items in the checklist pertain to every project
specification.
2-4
ni.com
Lesson 2
Exercise 2-1
Goal
Analyze the specifications.
Scenario
You are the lead LabVIEW developer for the LabVIEW Measurement and
Automation Company. Your company produces highly successful
measurement and automation systems and this success is largely a result of
the software engineering practices your company uses. Your supervisor
supports you and the decisions that you make. You have complete
responsibility for the next project, which is defined in a specifications
document. You must analyze the specifications before you begin developing
the software.
For some projects, the customer may not be clearly defined. In this course, the
customer is the entity that uses the final application that you create.
Note
Implementation
1. Open the Analyze the Specifications.exe in the
C:\Exercises\LabVIEW Intermediate I\Analyze
the Specifications folder to view a demonstration of the
2-5
Lesson 2
Keeps to schedule
Keeps promises
Jon Conway and Steve Watts, A Software Engineering Approach to LabVIEW (Upper Saddle River: Prentice Hall, 2003) 113.
2.
2-6
ni.com
Lesson 2
evaluate the data, you might recommend displaying the data in a graphical
plot so that all the data is visually available. Solving issues regarding the
final requirements of the project is where you can add value to the process
of analyzing the project.
Communicating with your customer also can help reduce costs. If
specifications change during the implementation phase, you might have to
discard code. It is not easy to add changes to an existing application.
Software studies from corporations such as IBM, TRW, and GTE have
shown the significant cost increases associated with changing the
specifications during various phases of the software development process.
If a change occurs during the design phase of the project, it is five times
more expensive. If a change occurs in the implementation phase, it is
10 times more expensive. If a change occurs in the test phase, it is 20 times
more expensive. If a change occurs during deployment, it is 50 times more
expensive. Therefore it is important to make sure the specifications
document is as complete as possible so that changes do not occur during any
other phase than the design phase.1
It also is important to make sure that you are communicating with the right
individual. Always communicate with the individual who has design
authority.2 To save yourself frustration, formalize the decision making
process so that the person who has the final say on the project is identified
and aware of the project requirements.
In order to communicate effectively with your customer, first make sure that
you can check off each applicable item in the Specifications Content
Checklist. Any items that you cannot check off are questions for your
customer.
Job Aid
Use the following checklist when you communicate with your customer to
help make sure that you both agree on the specification items.
2.
2-7
Lesson 2
Job Aid
Use the following requirements checklist to make sure that the requirements
document is complete and adequate. This is not a complete checklist, but it
provides a starting place to determine if the requirements document is
appropriate.
2-8
ni.com
Lesson 2
Exercise 2-2
Goal
Assess a requirements document that was based on a software requirements
document specification.
Scenario
You worked with a Certified LabVIEW Architect to develop a requirements
document. You developed the requirements document after researching
commercially available theatre light control software and analyzing the
specifications document. You must analyze the requirements document to
ensure that it is complete and accurate.
Implementation
Analyze the requirements document for the Theatre Light Control Software.
1. Read the following requirements document to gain an understanding of
the software you create in this course.
Many organizations use their own techniques to create a requirements document. If
your organization is not using a format for a requirements document, you can use this
requirements document as a basis for other requirements documents.
Tip
Requirements Document
ABC Theatre Inc.
Theatre Light Control Software Specifications
Document NumberLV100975
2-9
Lesson 2
Use a state machine that uses either a type defined enumerated type
control, queue, or Event structure to manage states.
Respond to front panel controls within 100 ms and not utilize 100% of
CPU time.
Tip strips and descriptions for each front panel control and indicator.
2-10
ni.com
Lesson 2
Definitions
This section defines the terminology for the project.
Wait timeA cue timing attribute that defines the amount of time to
wait, in multiples of one second, before the cue fires.
Fade timeA cue timing attribute that defines the time it takes, in
multiples of one second, before a channel reaches its particular intensity
and color.
Follow timeA cue timing attribute that defines the amount of time to
wait, in multiples of one second, before the cue finishes.
Task
Design, implement, test, and deploy a theatre light control system that
allows a theatre lighting engineer to easily control and program the theatre
lights for any production.
2-11
Lesson 2
General Operation
Controls on the front panel control the operation of the theatre light control
software. Indicators on the front panel indicate the current status of the
theatre light control software.
The controller will store the channel intensity, channel color, channel wait
time, channel fade time, channel follow time, and name for the cue when the
user clicks the Record button. When the user clicks the Play button, the
controller services each cue in the Cue Control by cycling through the
recorded cues starting with the first cue in the Cue Control. A cue that is
playing will wait for the specified wait time, then fade the channels to the
desired color and intensity within the specified fade time, and then wait for
the specified follow time. The next cue in the Cue Control is loaded and the
process repeats, until all of the Cues have been played. The user can stop a
currently playing cue by clicking the Stop button. The user can move a cue
up in the Cue Control by clicking the Up button. The user can move a cue
down in the Cue Control by clicking the Down button. The user can delete
a cue from the Cue Control by clicking the Delete button, which deletes the
currently selected cue. The controller exits when the user selects FileExit.
Sequence of Operation
Application Run
When the application starts, all of the controls must initialize to the default
states as shown on the front panel. The Cue Control must be cleared to
remove all of the recorded Cues. The channels must be initialized with their
corresponding channel number, zero intensity, and the zero color.
Record
2-12
ni.com
Lesson 2
Play
Click the Play button to play the recorded cues. When the play begins, the
controller should disable the move cue up, move cue down, delete, record,
and play buttons on the front panel. The values of the first cue in the cue list
is loaded into memory. The controller waits based on the number of seconds
specified for the wait time for the current cue. The controller then fades the
channel up or down based on the current channel intensity and the desired
channel intensity. The software writes the color and intensity to the theatre
lighting hardware control system, and updates the front panel channels. The
controller must finish the fading within the specified fade time. The
controller will finish processing the cue by waiting for the number of
seconds specified for the follow time of the current cue. When the play is
complete, the controller should enable the move cue up, move cue down,
delete, record, and play buttons on the front panel.
Stop
Click the Stop button to stop a currently playing cue. The operation is
ignored if a cue is not playing.
Move Cue Up
Click the Move Cue Up button in the Cue Control to move a selected cue
up one level in the cue list. This will swap the currently selected cue with
the cue just above the currently selected cue. The operation is ignored if a
cue is not selected in the cue list, or if the selected cue is the first cue in the
cue list.
Move Cue Down
Click the Move Cue Down button in the Cue Control to move a selected cue
down one level in the cue list. This will swap the currently selected cue with
the cue just below the currently selected cue. The operation is ignored if a
cue is not selected in the cue list, or if the selected cue is the last cue in the
cue list.
Delete
Click the Delete button to delete a selected cue in the cue list. The operation
is ignored if a cue is not selected in the cue list.
Save
Click FileSave to save all of the recorded cues in a file for later playback.
The user specifies the filename.
2-13
Lesson 2
Open
Click FileOpen to open a file that contains recorded cues. The user
specifies the filename.
Exit
Control DescriptionFunction
Cue List
Move Cue Up
Delete
Play
Record
Stop
Indicator Name
Indicator DescriptionFunction
Cue Name
Wait Time
Fade Time
Follow Time
Channel
2-14
ni.com
Lesson 2
Scalability
Many of the newer theatre lights provide motor control to move the light
around the stage. The Theatre Light Control Software should provide for the
ability to easily implement channel pan and tilt. The software should be
easily scalable to control any number of channels.
Documentation
The application documentation should address the needs of the end user and
a programmer who might modify the application in the future.
Deliverables
The project includes the following deliverables:
Timeline
The project has the following timeline for completion:
2-15
Lesson 2
2-16
ni.com
Lesson 2
One way to limit the amount of information you have to write when
analyzing a project is to draw a diagram of the application. Creating a
diagram helps improve your ability to design the application and convey
ideas to your customer. The first step in creating a diagram is to determine
the abstract components of each requirement.
Procedural Abstraction
Procedural abstraction separates what a procedure accomplishes from how
the procedure is implemented. For example, consider the following
application outline.
Procedure
Implementation
Data Abstraction
Data abstraction separates the data you want to store from the physical
means of storing the data. Data abstraction provides a more logical view of
the data rather than the bits and bytes that create the data. An example of
data abstraction is a cluster. A cluster can represent data with a more logical
1.
Jeri R. Hanly and Elliot B. Koffman, Problem Solving and Program Design in C (Reading:Addison-Wesley, 1996) 622.
2.
2-17
Lesson 2
view without requiring the user to be concerned with the details of its
implementation.
Consider the following excerpt from the requirements document for a
Theatre Light Control System. To analyze this example requirements
document, extract all the nouns from the document and use the nouns to
define components.
Start of Requirements Document Excerpt
Task
Design, implement, test, and deploy a theatre light control system that
allows a theatre lighting engineer to easily control and program the theatre
lights for any production.
Controls on the front panel control the operation of the theatre light control
software. Indicators on the front panel indicate the current status of the
theatre light control software.
General Operation
The controller will store the channel intensity, channel color, channel wait
time, channel fade time, channel follow time, and name for the cue when the
user clicks the Record button. When the user clicks the Play button, the
controller services each cue in the Cue Control by cycling through the
recorded cues starting with the first cue in the Cue Control. A cue that is
playing will wait for the specified wait time, then fade the channels to the
desired color and intensity within the specified fade time, and then wait for
the specified follow time. The user can stop a currently playing cue by
clicking the Stop button. The user can move a cue up in the Cue Control by
clicking the Up button. The user can move a cue down in the Cue Control
by clicking the Down button. The user can delete a cue from the Cue Control
by clicking the Delete button, which deletes the currently selected cue. The
controller exits when the user selects FileExit.
End of Requirements Document Excerpt
2-18
ni.com
Lesson 2
The following list shows the nouns from the previous requirements
document.
Theatre Light Control System
Theatre Lights
Production Controls
Front Panel
Indicators
Status
Controller
Channel Intensity
Channel Color
Name
Cue
User
Record Button
Play Button
Cue Control
Stop Button
Up Button
Delete Button
Down Button
Selected Cue
After you have a set of nouns, you can group the nouns into actual
components of your system. The following table organizes the components
into more abstract components.
2-19
Lesson 2
Nouns
Abstracted Nouns
Theatre Lights
Hardware
Indicators
Display
Status
Record Button
Play Button
Cue Control
Stop Button
Up Button
Down Button
Delete Button
Selected Cue
Channel Intensity
Cue
Name
Cue
Channel Color
Channel Wait Time
Timing
2-20
ni.com
Lesson 2
Play
Click the Play button to play the recorded cues. When the play begins, the
controller should disable the move cue up, move cue down, delete, record,
and play buttons on the front panel. The values of the first cue in the cue list
is loaded into memory. The controller waits based on the number of seconds
specified for the wait time for the current cue. The controller then fades the
channel up or down based on the current channel intensity and the desired
channel intensity. The software writes the color and intensity to the theatre
lighting hardware control system and updates the front panel channels. The
controller must finish the fading within the specified fade time. The
controller will finish processing the cue by waiting for the number of
seconds specified for the follow time of the current cue. When the play is
complete, the controller should enable the move cue up, move cue down,
delete, record, and play buttons on the front panel.
End of Requirements Document Excerpt
Extract the verbs from the excerpt of the requirements document. Consider
the context of the verbs to establish what functions the abstract components
perform.
The following list shows the verbs from the previous requirements
document excerpt.
click
loaded
fades
enable
disable
waits
writes
update
After you have a set of verbs, you can organize the verbs to determine what
functions the abstract components perform. You can ignore verbs that do not
improve your understanding of the system, such as click in the previous list.
You must also try to remember the context of the verbs. The following table
organizes the verbs into the abstract components.
2-21
Lesson 2
Verb
Abstracted Component
disable
Display
enable
update
loaded
Cue
writes
Hardware
waits
Timing
fades
Creating a phrase for each verb improves readability and provides the
following function list.
Verb Phrase
Disable Front Panel
Abstracted Component
Display
Cue
Hardware
Timing
Fade Time
Performing the verb parse on the entire requirements document generates a
list of the individual actions each component performs. Table 2-1 lists each
component and the individual actions that the module performs.
2-22
ni.com
Lesson 2
Module
Actions
Hardware
Display
Cue
Add Cue
Delete Cue
Get Cue Values
Set Cue Values
Swap
Get Number of Cues
Get Empty Cue
Timing
Wait Time
Fade Time
Follow Time
Error
Report Errors
Handle Errors
File
Save Cues
Read Cues
After you identify the high-level actions for each module, you can break
each action into smaller actions. This technique helps you to further analyze
the application and make sure each individual module accomplishes only
one goal. When a module accomplishes more than one goal, it is difficult to
test the module and determine that it works correctly.
2-23
Lesson 2
If you determine that a module performs more than one goal, break the
module into more modules. With this design, each module performs one
specific goal. Creating a software design with this level of detail helps you
develop VIs that are scalable, readable, and that consist of reusable code.
Coupling
A module rarely stands by itself. A VI is called by other VIs. Top-level VIs
can become plug-ins to other VIs or utilities for the operating system.
Coupling refers to the connections that exist between modules. Any module
that relies on another module to perform some function is coupled to that
module. If one module does not function correctly, other modules to which
it is coupled do not function correctly. The more connections among
modules, the harder it is to determine what module causes a problem.
Coupling measures how many dependencies a system of modules contains.
The fewer outputs a module exposes, the more you can change the code
inside the module without breaking other modules. Low coupling also helps
make bug tracking more efficient. For example, a data acquisition bug
cannot occur in a VI that performs only GPIB instrument control. If a data
acquisition bug appears in a GPIB VI, you know the code is probably too
tightly coupled.
The dataflow model of LabVIEW automatically encourages low coupling
among modules. The dataflow model means each VI has only the
information it needs to do its job. A VI cannot change data in another VI.
You can introduce other communication paths, such as global variables,
queues, I/O connections, and so on, that can increase coupling, but a typical
VI is self-sufficient and couples only to the subVIs it calls. The goal of any
hierarchical architecture is to make sure that the implementation uses low or
loose coupling.
Cohesion
In a well-designed VI, each module fulfills one goal and thus is strongly
cohesive. If a single module tries to fulfill more than one goal, you should
probably break it into modules. When a module tries to accomplish multiple
goals, the block diagram becomes harder to read, and the code for one goal
can affect how the code for another goal works. In this case, fixing a bug in
one goal might break the code of another goal.
A VI with strong cohesion has one goal per module. Strong cohesion
decreases overall development time. You can more easily understand a
single module if it focuses on one task. You can read a clean, uncomplicated
block diagram quickly and make deliberate changes with confidence.
2-24
ni.com
Lesson 2
The Mathematics VIs and functions that ship with LabVIEW demonstrate
strong cohesion. For example, the Sine function performs a single goal, and
performs it well. It is a perfect example of a function that has strong
cohesion. The name of the function clearly indicates what the function
accomplishes. Other VIs that have strong cohesion are the File I/O VIs and
functions. The File I/O VIs and functions perform sequential cohesion
because one module must execute before another module can execute. The
Open File, Read File, Write File, and Close File functions each perform a
single goal within each module.
After you have abstracted the components, you can produce a diagram that
helps to visualize the abstracted components. Use the diagram to start
designing the individual modules in the application. Each abstracted
component corresponds to a module within the application. At the top level,
you define the actions for each abstracted component. Defining the actions
allows you to determine the specific goal of each individual module.
Flowcharts
Flowcharts are a powerful way to organize ideas related to a piece of
software. Flowcharts should provide a good understanding of the
application flow. The block diagram programming paradigm used in
LabVIEW is easy to understand and similar to a flowchart. Many engineers
already use flowcharts to describe systems. The flowchart makes it easier to
convert the design into executable code.
The purpose of a flowchart is to divide the task into manageable pieces at
logical places. Start to design the VI hierarchy by breaking the problem into
logical pieces. Figure 2-1 shows a flowchart for the Play functionality in the
Theatre Light Controller.
2-25
Lesson 2
Load
Cue
Wait
Wait Time
Elapsed
No
Yes
Fade Each
Channel
Update Front
Panel
No
Fade Time
Elapsed
Yes
Wait
Follow Time
Elapsed
No
Yes
End
Figure 2-1. Flowchart of Play Function in the Theatre Light Control System
2-26
ni.com
Lesson 2
Dataflow Diagrams
Dataflow diagrams follow the paradigm of LabVIEW in that they represent
the flow of data through an application. Figure 2-2 shows the common
symbols used in dataflow diagrams.
1
2
Data Store
Process
3
4
External Entity
Data Flow
Figure 2-3 shows a dataflow diagram for the Play functionality in the
Theatre Light Control System. Notice that the focus of a dataflow diagram
is the data. A dataflow diagram conceptualizes the system based on the flow
of data through the system, similar to the dataflow paradigm of LabVIEW.
Even though LabVIEW is a dataflow programming language, it is important
to spend time away from LabVIEW to design an appropriate system.
Light Control
System
Channel Intensity
and Color
Update
Display
Error
Data
Handle
Error
Follow Time
Fade Time
Wait Time
Cue Data
Load
Cue
Wait
Time
Error
Data
Fade
Time
Error
Data
Follow
Time
Error
Data
Handle
Error
Error
Data
2-27
Lesson 2
As you can see by the differences in the flowchart and the dataflow diagram
of the Play function in the Theatre Light Controller, the processes are
different. Nodes in the flowchart represent the functions to perform. Nodes
in the dataflow diagram represent the processes and the focus is on the flow
of data through the system. You can translate a dataflow diagram into a
LabVIEW block diagram.
2-28
ni.com
Lesson 2
Summary
You must interact with the customer closely to make sure the
specifications document contains all the necessary information.
2-29
Lesson 2
Notes
2-30
ni.com
Front panels must be well organized and easy to use because users see the
front panel first when working with a VI. When designing a front panel,
keep in mind two types of usersthe end user and the developer. End users
work with user interface VIs, which have front panels that the end user sees.
Developers work with subVIs, which have front panels that only developers
see.
At the end of this lesson, you design a user interface for a software project
that you analyzed.
Topics
A. User Interface Design Issues
B. User Interface Layout Issues
C. Front Panel Prototyping
D. User Interface Example
E. Localizing User Interfaces
3-1
Lesson 3
Colors
Color can distract the user from important information. For instance, a
yellow, green, or bright orange background makes it difficult to see a red
danger light. Another problem is that some platforms do not have as many
colors available. Use a minimal number of colors, emphasizing black, white,
and gray. The following are some simple guidelines for using color:
Never use color as the sole indicator of device state. People with some
degree of color-blindness can have problems detecting the change. Also,
multiplot graphs and charts can lose meaning when displayed in black
and white. Use lines for plot styles in addition to color.
Use light gray, white, or pastel colors for backgrounds. The first row of
colors in the color picker contains less harsh colors suitable for front
3-2
ni.com
Lesson 3
panel backgrounds and normal controls. The second row of colors in the
color picker contains brighter colors you can use to highlight important
controls. Select bright, highlighting colors only when the item is
important, such as an error notification.
3
4
1
2
Grayscale Spectrum
Transparency Box
3
4
Keep these things in mind when designing a front panel. For most objects,
use complimentary neutral colors that vary primarily in their brightness. Use
highlight colors sparingly for objects such as plots, meter needles, company
logo, and so on.
Graphics
Use imported graphics to enhance the front panel. You can import bitmaps,
Macintosh PICTs, Windows Enhanced Metafiles, and text objects to use as
front panel backgrounds, items in picture rings, and parts of custom controls
and indicators.
Check how the imported pictures look when you load the VI on another
platform. For example, a Macintosh PICT file that has an irregular shape
might convert to a rectangular bitmap with a white background on Windows
or Linux.
One disadvantage of using imported graphics is that they slow down screen
updates. Make sure you do not place indicators and controls on top of a
graphic object so that LabVIEW does not have to redraw the object each
3-3
Lesson 3
time the indicator updates. If you must use a large background picture with
controls on top of it, divide the picture into several smaller objects and
import them separately because large graphics usually take longer to draw
than small ones.
Run-Time Menus
To help reduce clutter, use menus. You can create custom menus for every
VI you build, and you can configure VIs to show or hide menu bars.
Note
Static Menus
To add a custom menu bar to a VI rather than the default menu bar, select
EditRun-Time Menu and create a menu in the Menu Editor dialog box.
LabVIEW creates a run-time menu (.rtm) file. After you create and save
the .rtm file, you must maintain the same relative path between the VI and
the .rtm file. You also can create a custom run-time shortcut menu by
right-clicking a control and selecting AdvancedRun-Time Shortcut
MenuEdit. This option opens the Shortcut Menu Editor.
When the VI runs, it loads the menu from the .rtm file.
Menu items can be the following three types:
3-4
ni.com
Lesson 3
case-insensitive string identifier. The tag identifies the user item on the
block diagram. When you type a name, LabVIEW copies it to the tag.
You can edit the tag to be different from the name. For a menu item to
be valid, its tag must have a value. The Item Tag text box displays
question marks for invalid menu items. LabVIEW ensures that the tag is
unique to a menu hierarchy and appends numbers when necessary.
Click the blue + button, shown at left, on the toolbar to add more items to
the custom menu. Click the red X button, shown at left, to delete items. You
can arrange the menu hierarchy by clicking the arrow buttons in the toolbar,
using the hierarchy manipulation options in the Edit menu, or by dragging
and dropping.
3-5
Lesson 3
Decorations
Use decorations, such as a Raised Box or Horizontal Smooth Box, to
visually group objects with related functions.
3-6
ni.com
Lesson 3
Tab Controls
Use tab controls to overlap front panel controls and indicators in a smaller
area. A tab control consists of pages and tabs. Place front panel objects on
each page of a tab control and use the tab as the selector for displaying
different pages.
Tab controls are useful when you have several front panel objects that are
used together or during a specific phase of operation. For example, you
might have a VI that requires the user to first configure several settings
before a test can start, then allows the user to modify aspects of the test as it
progresses, and finally allows the user to display and store only pertinent
data.
On the block diagram, the tab control is an enumerated type control by
default. Terminals for controls and indicators placed on the tab control
appear as any other block diagram terminal.
The NI Example Finder, shown in Figure 3-3, is a VI that uses tab controls
to organize the user interface.
3-7
Lesson 3
Subpanel Controls
Use the subpanel control to display the front panel of another VI on the front
panel of the current VI. For example, you can use a subpanel control to
design a user interface that behaves like a wizard. Place the Back and Next
buttons on the front panel of the top-level VI and use a subpanel control to
load different front panels for each step of the wizard.
You can create and edit subpanel controls only in the LabVIEW Full and
Professional Development Systems. If a VI contains a subpanel control, you can run the
VI in all LabVIEW packages, but you cannot configure the control in the Base Package.
Note
Refer to the LabVIEW Help for more information about subpanel controls.
Tree Controls
Use the tree control to give users a hierarchical list of items from which to
select. You organize the items you enter in the tree control into groups of
items, or nodes. Click the expand symbol next to a node to expand it and
display all the items in that node. You also click the symbol next to the node
to collapse the node.
You can create and edit tree controls only in the LabVIEW Full and Professional
Development Systems. If a VI contains a tree control, you can run the VI in all LabVIEW
packages, but you cannot configure the control in the Base Package.
Note
3-8
ni.com
Lesson 3
Refer to the LabVIEW Help for more information about tree controls.
3-9
Lesson 3
Refer to the LabVIEW Help for more information about split pane
containers. Refer to the Creating Custom Toolbars section of Exercise 3-1
for an example that uses the split pane container to create a toolbar.
3-10
ni.com
Lesson 3
3-11
Lesson 3
Front panels should open in the upper-left corner of the screen for the
convenience of users with small screens. Place sets of VIs that are often
opened together so the user can see at least a small part of each. Place front
panels that open automatically in the center of the screen. Centering the
front panels makes the VI easier to read for users on monitors of various
sizes. Use the VI Properties dialog box to customize the window appearance
and size.
Labels
The name of a control or indicator should describe its function. If the control
is visible to the user, use captions to display a long description and add a
short label to prevent using valuable space on the block diagram. For
example, when labeling a ring control or slide control that has options for
volts, ohms, or amperes, select an intuitive name for the control. A caption
such as "Select units for display" is a better choice than "V/O/A". Use
Property Nodes to change captions programmatically.
Use consistent capitalization, and include default values and unit
information in label names. For example, if a control sets the high limit
temperature and has a default value of 75 F, name the control high limit
temperature (75 degF). If you will use the VI with the control on multiple
platforms, avoid using special characters in control names. For example, use
degF instead of F, because the symbol might not display correctly on
other platforms.
For Boolean controls, use the name to give an indication of which state
corresponds to which function and to indicate the default state. For
checkboxes and radio buttons, the user can click the Boolean text of the
control and the value of the Boolean control changes. Free labels next to a
Boolean control can help clarify the meaning of each position on a switch.
For example, use free labels like Cancel, Reset, and Initialize that describe
the action taken.
The Context Help window displays labels as part of the connector pane. If
the default value is essential information, place the value in parentheses next
to the name in the label. Include the units of the value if applicable.
The Required, Recommended, Optional setting for connector pane
terminals affects the appearance of the inputs and outputs in the Context
Help window.
3-12
ni.com
Lesson 3
Give each control a reasonable default value, which allows the example to
run without the user modifying its value whenever possible. All default
values and/or units should be added to the label in parentheses, if
appropriate, as shown in Figure 3-6.
Captions
Front panel objects also can have captions. Right-click the object and select
Visible ItemsCaption from the shortcut menu to display the caption. You
can use captions instead of labels to localize a VI without breaking the VI.
Unlike a label, a caption does not affect the name of the object, and you can
use it as a more descriptive object label. The caption appears only on the
front panel.
If you assign the object to a connector pane terminal, the caption appears in
a tip strip when you use the Wiring tool to move the cursor over the terminal
on the block diagram. The caption also appears next to the terminal in the
Context Help window if you move the cursor over the connector pane or VI
icon.
Captions are useful for providing detailed descriptions when the label text
needs to be concise or for providing concise descriptions when the label text
needs to be more detailed. Captions also are useful when creating localized
versions of your applications.
3-13
Lesson 3
Key Navigation
Some users prefer to use the keyboard instead of a mouse. In some
environments, such as a manufacturing plant, only a keyboard is available.
Consider including keyboard shortcuts for VIs even if the use of a mouse is
available because keyboard shortcuts add convenience to a VI.
Pay attention to the key navigation options for objects on the front panel and
set the tabbing order for the objects to read left to right and top to bottom.
Set the <Enter> key as the keyboard shortcut for the front panel default
control, which is usually the OK button. However, if you have a multiline
string control on the front panel, you might not want to use the <Enter> key
as a shortcut.
If the front panel has a Cancel button, set the <Esc> key to be the keyboard
shortcut. You also can use function keys as navigation buttons to move from
screen to screen. If you do this, be sure to use the shortcuts consistently.
Select EditSet Tabbing Order to arrange controls in a logical sequence
when the user needs to tab between the controls. For controls that are
offscreen, use the Key Navigation tab of the Properties dialog box to skip
over the controls when tabbing or to hide the controls.
Also consider using the key focus property to set the focus
programmatically to a specific control when the front panel opens.
3-14
ni.com
Lesson 3
1
1
2
3
3
Use the system controls and indicators located on the System palette in
dialog boxes you create. The system controls and indicators are designed
specifically for use in dialog boxes and include ring and spin controls,
numeric slides, progress bars, scroll bars, listboxes, tables, string and path
controls, tab controls, tree controls, buttons, checkboxes, radio buttons, and
an opaque label that automatically matches the background color of its
3-15
Lesson 3
parent. These controls differ from those that appear on the front panel only
in terms of appearance. These controls appear in the colors you have set up
for your system.
Because the system controls change appearance depending on which
platform you run the VI, the appearance of controls in VIs you create is
compatible on all LabVIEW platforms. When you run the VI on a different
platform, the system controls adapt their color and appearance to match the
standard dialog box controls for that platform.
Use the System controls palette to create user interfaces that look more
professional, as shown in the third example in Figure 3-7.
If new options are presented, follow those ideas by creating new front panels
to illustrate the results. This kind of prototyping helps to define the
requirements for a project and gives you a better idea of its scope.
Systems with many user interface requirements are perfect for prototyping.
Determining the method you use to display data or prompt the user for
settings is difficult on paper. Instead, consider designing VI front panels
with the controls and indicators you need. Leave the block diagram empty
and figure out how the controls work and how various actions require other
front panels. For more extensive prototypes, tie the front panels together.
However, do not get carried away with this process.
If you are bidding on a project for a client, using front panel prototypes is an
extremely effective way to discuss with the client how you can satisfy his or
her requirements. Because you can add and remove controls quickly,
especially if the block diagrams are empty, you help customers clarify
requirements.
3-16
ni.com
Lesson 3
Limit the amount of time you spend prototyping before you begin. Time
limits help to avoid overdoing the prototyping phase. As you incorporate
changes, update the requirements and the current design.
Figure 3-9 shows the same user interface with several improvements, such
as reduced use of color, regrouped controls, fewer labels, knobs instead of
sliders, and rearranged objects.
3-17
Lesson 3
Leave space for localization. Allow for at least 30% growth in short
strings and 15% growth for long sentences.
Use a label to define the name of a control but always make the caption
visible. Use the caption as the label for a control because you can change
captions programmatically.
Refer to the Porting and Localizing VIs topic in the LabVIEW Help for more
information about localizing VIs.
1.
3-18
ni.com
Lesson 3
Job Aid
Use the following checklist to ensure that your user interface follows good
user interface design principles.
3-19
Lesson 3
Exercise 3-1
Goal
Learn techniques you can use to create professional user interfaces in
LabVIEW.
Description
LabVIEW includes features that allow you to create professional user
interfaces. Learn techniques to remove borders from clusters, create custom
cursors, create custom toolbars, and use the transparency property to
enhance the users experience with your application.
Tip
Click the Search button on the palette toolbar to perform text-based searches for
any control, VI, or function on the Controls or Functions palette.
Tip
Select the Coloring tool and click the foreground color block to open
the color picker.
Click the T in the upper right corner of the color picker to change the
foreground color to transparent.
3-20
ni.com
Lesson 3
Click the border of the cluster with the Coloring tool as shown in
Figure 3-10. Notice that the cluster border disappears.
You also can use this technique with other Classic controls. The Classic
controls are easier to modify and customize than Modern controls.
Using this technique with the Modern controls is not possible because
you cannot remove the three dimensionality of the Modern controls.
3. Close this VI.
3-21
Lesson 3
3-22
ni.com
Lesson 3
splitter bar.
5. Rearrange the controls and color the splitter bar to look like a toolbar.
Hide the labels on the controls.
Use the Align Objects and Distribute Objects buttons on the
toolbar to align the controls.
Color the background of the pane to blend the controls into the
panel.
Click the background color block of the Coloring tool to open the
color picker.
Click the More Colors button in the bottom right corner of the color
picker to open the Color dialog box.
Enter the following values and click the OK button to set the
background color:
Red: 231
Green: 223
Blue: 231
3-23
Lesson 3
6. Lock the splitter bar so that the user cannot move it.
Right-click the splitter bar and make sure Locked is checked in the
shortcut menu.
7. Close the VI.
directory.
Place a Flat Square button from the Classic palette on top of the
Tank, and resize the control to fit completely on top of the Tank.
Change the Flat Square button to a control.
2. Modify the button to make it transparent.
Change the True and False color of the button to transparent by using
the Coloring tool.
Click the button with the Operating tool to verify that the button is
transparent whether it is True or False.
3. Modify the block diagram to use a Case structure inside the While Loop
to cause the Tank Value indicator to update only when the button on top
of the tank is True, as shown in Figure 3-13.
3-24
ni.com
Lesson 3
Place a Case structure inside the While Loop to enclose the Tank
Value indicator.
Wire the Boolean control to the case selector terminal of the Case
structure.
Leave the False case empty.
4. Run the VI and test the behavior of the VI when you click the Tank
indicator.
5. Stop and close the VI.
You can place transparent controls on top of other controls to create more
professional user interfaces.
3-25
Lesson 3
Summary
Consider both design and layout issues when developing a user interface
front panel.
Use the front panel style checklist to ensure that your user interface
follows good user interface design principles.
3-26
ni.com
Lesson 3
Notes
3-27
Lesson 3
Notes
3-28
ni.com
Topics
A. Design Patterns
B. Event-Based Design Patterns
C. Advanced Event-Based Design Patterns
D. Creating a Hierarchical Architecture
E. Using the LabVIEW Project and Project Libraries
F. Choosing Data Types
G. Information Hiding
H. Designing Error Handling Strategies
4-1
Lesson 4
A. Design Patterns
To take the first step in choosing a scalable architecture, explore the
architectures that exist within LabVIEW. Architectures are essential for
creating a successful software architecture. The most common architectures
are usually grouped into design patterns.
As a design pattern gains acceptance, it becomes easier to recognize when a
VI uses a design pattern. VIs that use design patterns can be easier to read
and modify.
There are many design patterns available for LabVIEW. Most applications
use at least one design pattern. Select FileNew to open the New dialog box
and access VI templates based on common design patterns. The LabVIEW
Basics II course explores some of the basic design patterns you can use in
LabVIEW, which are summarized in the following sections.
4-2
ni.com
Lesson 4
The error clusters control the execution order of the three sections. The Wait
function prevents the loop from running continuously, especially if the loop
monitors user input on the front panel. Continuous loops can use all of the
computer system resources. The Wait function forces the loop to run
asynchronously even if you specify a wait of 0 milliseconds. If
the operations inside the main loop react to user inputs, increase the wait to
100200 ms because most users do not detect that amount of delay between
clicking a button on the front panel and the resulting action.
4-3
Lesson 4
Case StructureContains a case for each state and the code to execute
for each state
4-4
ni.com
Lesson 4
While Loop
Shift Register
Case Structure
The While Loop implements the flow of the state transition diagram. Cases
in the Case structure represent individual states. A shift register on the While
Loop keeps track of the current state and communicates the current state to
the Case structure input.
4-5
Lesson 4
For each message that might be sent, the Case structure contains one case
with appropriate code to handle the message. The Case structure also can
have a default case that queues new events if the queue is empty.
Each iteration of the While Loop removes the top message from the queue
and runs the proper handling subdiagram in the Case structure. Handlers
that have a Default or No Event case execute this code when the queue is
empty. The While Loop terminates when the Exit message reaches the top
of the queue.
Remember the following key points when using the queued message
handler design pattern:
Always terminate the While Loop by checking the latest message rather
than by polling a control. Checking the latest message allows you to
execute any necessary cleanup code before shutting down the main
While Loop.
4-6
ni.com
Lesson 4
Although you can generate new messages inside the handler code for a
message, it is possible to generate an infinite cascade of messages,
which would effectively hang the user interface. A good guideline is to
require that messages generated by handler code never generate new
messages of their own.
Use the parallel loop design pattern for simple menu VIs where you expect
a user to select from one of several buttons that perform different actions.
You can handle multiple, simultaneous, independent processes and
responding to one action does not prevent the VI from responding to another
action. For example, if a user clicks a button that displays a dialog box,
parallel loops can continue to respond to I/O tasks.
The parallel loop VI design pattern requires you to coordinate and
communicate among different loops. You cannot use wires to pass data
between loops because doing so prevents the loops from running in parallel.
Instead, you must use a messaging technique for passing information among
4-7
Lesson 4
processes. This can lead to race conditions where multiple tasks attempt to
read and modify the same data simultaneously resulting in inconsistent
behavior that is difficult to debug.
4-8
ni.com
Lesson 4
Both loops are synchronized to the master loop. The slave loop only
executes when the master loop sends a notification.
With a master/slave design pattern, make sure that no two While Loops
write to the same shared data.
The slave loop should not take too long to respond to the master. If the slave
is processing a signal from the master and the master sends more than one
message to the slave, the slave only receives the latest message. Use a
master/slave design pattern only if you are certain that each slave task
executes faster than the master loop.
4-9
Lesson 4
The consumer loop processes the data at its own pace, while the producer
loop continues to queue additional data. You also can use the
producer/consumer (data) design pattern to create a VI to analyze network
communication where two processes operate at the same time and at
different speeds. The first process constantly polls the network line and
retrieves packets. The second process analyzes the packets retrieved by the
4-10
ni.com
Lesson 4
first process. The first process acts as the producer because it supplies data
to the second process, which acts as the consumer. The parallel producer and
consumer loops handle the retrieval and analysis of data off the network, and
the queued communication between the two loops allows buffering of the
network packets retrieved.
4-11
Lesson 4
Exercise 4-1
Goal
Observe the functionality and design of standard LabVIEW design patterns.
Description
Explore the design pattern VI templates that ship with LabVIEW and
observe how they operate. You can use the design pattern VI templates that
are built into LabVIEW as the basis for the underlying architecture of VIs
you create.
1. Select FileNew to open the New dialog box.
2. In the Create New section, expand the VIFrom Template
FrameworksDesign Patterns tree.
3. Select the Standard State Machine design pattern from the tree and
click the OK button to open the template.
4. Open the block diagram, turn execution highlighting on, and run the VI.
Notice how the design pattern handles the following items:
State transitions
Data flow
5. Close the design pattern. Do not save changes.
6. Repeat steps 1 through 5 to observe the operation of the following
design pattern VI templates:
Master/Slave Design Pattern
Queued Message Handler Design Pattern
Producer/Consumer Design Pattern (Data)
In particular, observe the data flow with the Master/Slave Design
Pattern, and the Producer/Consumer Design Pattern (Data). Also,
compare and contrast the differences between the Master/Slave Design
Pattern and the Producer/Consumer Design Pattern (Data). As you run
these templates, notice how each template implements a message
passing mechanism.
4-12
ni.com
Lesson 4
Event-Driven Programming
LabVIEW is a dataflow programming environment where the flow of data
determines the execution order of block diagram elements. Event-driven
programming features extend the LabVIEW dataflow environment to allow
the user's direct interaction with the front panel and other asynchronous
activity to further influence block diagram execution.
Note Event-driven programming features are available only in the LabVIEW Full and
Professional Development Systems. You can run a VI built with these features in the
LabVIEW Base Package, but you cannot reconfigure the event-handling components.
4-13
Lesson 4
in a loop, checking to see if any change has occurred. Polling the front panel
requires a significant amount of CPU time and can fail to detect changes if
they occur too quickly. By using events to respond to specific user actions,
you eliminate the need to poll the front panel to determine which actions the
user performed. Instead, LabVIEW actively notifies the block diagram each
time an interaction you specified occurs. Using events reduces the CPU
requirements of the program, simplifies the block diagram code, and
guarantees that the block diagram can respond to all interactions the user
makes.
Use programmatically generated events to communicate among different
parts of the program that have no dataflow dependency. Programmatically
generated events have many of the same advantages as user interface events
and can share the same event handling code, making it easy to implement
advanced architectures, such as queued state machines using events.
The Event structure works like a Case structure with a built-in Wait On
Notification function. The Event structure can have multiple cases, each of
which is a separate event-handling routine. You can configure each case to
handle one or more events, but only one of these events can occur at a time.
When the Event structure executes, it waits until one of the configured
events occur, then executes the corresponding case for that event. The Event
structure completes execution after handling exactly one event. It does not
implicitly loop to handle multiple events. Like a Wait on Notification
function, the Event structure can time out while waiting for notification of
an event. When this occurs, a specific Timeout case executes.
The event selector label at the top of the Event structure, shown as follows,
indicates which events cause the currently displayed case to execute.
View other event cases by clicking the down arrow next to the case name and
selecting another case from the shortcut menu.
4-14
ni.com
Lesson 4
The Timeout terminal at the top left corner of the Event structure, shown as
follows, specifies the number of milliseconds to wait for an event before
timing out.
This node is attached to the inside left border of each event case. The node
identifies the data LabVIEW provides when an event occurs. You can resize
this node vertically to add more data items, and you can set each data item
in the node to access any event data element. The node provides different
data elements in each case of the Event structure depending on which
event(s) you configure that case to handle. If you configure a single case to
handle multiple events, the Event Data Node provides only the event data
elements that are common to all the events configured for that case.
The Event Filter Node, shown as follows, is similar to the Event Data Node.
This node is attached to the inside right border of filter event cases. The node
identifies the subset of data available in the Event Data Node that the event
case can modify. The node displays different data depending on which
event(s) you configure that case to handle. By default, these items are
inplace to the corresponding data items in the Event Data Node. If you do
not wire a value to a data item of an Event Filter Node, that data item
remains unchanged.
Refer to the Notify and Filter Events section of this lesson for more
information about filter events.
The dynamic event terminals, shown as follows, are available by
right-clicking the Event structure and selecting Show Dynamic Event
Terminals from the shortcut menu.
4-15
Lesson 4
Refer to the LabVIEW Help for information about the default values for data
types.
Notify and Filter Events
There are two types of user interface eventsnotify and filter.
Notify events are an indication that a user action has already occurred, such
as when the user has changed the value of a control. Use notify events to
respond to an event after it has occurred and LabVIEW has processed it. You
can configure any number of Event structures to respond to the same notify
event on a specific object. When the event occurs, LabVIEW sends a copy
of the event to each Event structure configured to handle the event in
parallel.
Filter events inform you that the user has performed an action before
LabVIEW processes it, which allows you to customize how the program
responds to interactions with the user interface. Use filter events to
participate in the handling of the event, possibly overriding the default
behavior for the event. In an Event structure case for a filter event, you can
validate or change the event data before LabVIEW finishes processing it, or
you can discard the event entirely to prevent the change from affecting the
VI. For example, you can configure an Event structure to discard the Panel
Close? event, preventing the user from interactively closing the front panel
of the VI. Filter events have names that end with a question mark, such as
Panel Close?, to help you distinguish them from notify events. Most filter
events have an associated notify event of the same name, but without the
question mark, which LabVIEW generates after the filter event if no event
case discarded the event.
As with notify events, you can configure any number of Event structures to
respond to the same filter event on a specific object. However, LabVIEW
sends filter events sequentially to each Event structure configured for the
event. The order in which LabVIEW sends the event to each Event structure
depends on the order in which the events were registered. Each Event
4-16
ni.com
Lesson 4
structure must complete its event case for the event before LabVIEW can
notify the next Event structure. If an Event structure case changes any of the
event data, LabVIEW passes the changed data to subsequent Event
structures in the chain. If an Event structure in the chain discards the event,
LabVIEW does not pass the event to any Event structures remaining in the
chain. LabVIEW completes processing the user action which triggered the
event only after all configured Event structures handle the event without
discarding it.
National Instruments recommends you use filter events only when you want to
take part in the handling of the user action, either by discarding the event or by modifying
the event data. If you only want to know that the user performed a particular action, use
notify events.
Note
Event structure cases that handle filter events have an Event Filter Node.
You can change the event data by wiring new values to these terminals. If
you do not wire a data item, that item remains unchanged. You can
completely discard an event by wiring a TRUE value to the Discard?
terminal.
A single case in the Event structure cannot handle both notify and filter events. A
case can handle multiple notify events but can handle multiple filter events only if the
event data items are identical for all events.
Note
Refer to the Using Events in LabVIEW section of this lesson for more
information about event registration.
In the Edit Events dialog box, notify events are signified by a green arrow, and filter
events are signified by a red arrow.
Tip
4-17
Lesson 4
The event data provided by a LabVIEW event always include a time stamp,
an enumeration that indicates which event occurred, and a VI Server
reference to the object that triggered the event. The time stamp is a
millisecond counter you can use to compute the time elapsed between two
events or to determine the order of occurrence. The reference to the object
that generated the event is strictly typed to the VI Server class of that object.
Events are grouped into classes according to what type of object generates
the event, such as Application, VI, or Control. If a single case handles
multiple events for objects of different VI Server classes, the reference type
is the common parent class of all objects. For example, if you configure a
single case in the Event structure to handle events for a numeric control and
a color ramp control, the type of the control reference of the event source is
Numeric because the numeric and color ramp controls are in the Numeric
class.
If you register for the same event on both the VI and Control class, LabVIEW
generates the VI event first. LabVIEW generates Control events for container objects,
such as clusters, before it generates events for the objects they contain. If the Event
structure case for a VI event or for a Control event on a container object discards the
event, LabVIEW does not generate further events.
Note
Each Event structure and Register For Events function on the block diagram
owns a queue that LabVIEW uses to store events. When an event occurs,
LabVIEW places a copy of the event into each queue registered for that
event. An Event structure handles all events in its queue and the events in
the queues of any Register For Events functions that you wired to the
dynamic event terminals of the Event structure. LabVIEW uses these queues
4-18
ni.com
Lesson 4
to ensure that events are reliably delivered to each registered Event structure
in the order the events occur.
By default, when an event enters a queue, LabVIEW locks the front panel
that contains the object that generated that event. LabVIEW keeps the front
panel locked until all Event structures finish handling the event. While the
front panel is locked, LabVIEW does not process front panel activity but
places those interactions in a buffer and handles them when the front panel
is unlocked. Front panel locking does not affect certain actions, such as
moving the window, interacting with the scroll bars, and clicking the Abort
button. You can disable front panel locking for notify events by removing
the checkmark from the option in the Edit Events dialog box. Front panel
locking must be enabled for filter events to ensure the internal state of
LabVIEW is not altered before it has an opportunity to completely process
the pending event.
LabVIEW can generate events even when no Event structure is waiting to
handle them. Because the Event structure handles only one event each time
it executes, place the Event structure in a While Loop to ensure that an Event
structure can handle all events that occur.
If no Event structure executes to handle an event and front panel locking is
enabled, the user interface of the VI becomes unresponsive. If this occurs, click the
Abort button to stop the VI. You can disable panel locking by right-clicking the Event
structure and removing the checkmark from the Lock front panel until the event case
for this event completes checkbox in the Edit Events dialog box. You cannot turn off
front panel locking for filter events.
Caution
Refer to the LabVIEW Help for more information about caveats and
recommendations when using events in LabVIEW. Refer to the LabVIEW
Help for information about available events.
4-19
Lesson 4
When you run a VI, LabVIEW sets that top-level VI and the hierarchy of
subVIs the VI calls on its block diagram to an execution state called
reserved. You cannot edit a VI or click the Run button while the VI is in the
reserved state because the VI can be called as a subVI at any time while its
parent VI runs. When LabVIEW sets a VI to the reserved state, it
automatically registers the events you statically configured in all Event
structures on the block diagram of that VI. When the top-level VI finishes
running, LabVIEW sets it and its subVI hierarchy to the idle execution state
and automatically unregisters the events.
Refer to the labview\examples\general\uievents.llb for
examples of using static event registration.
Configuring Events
Before you configure events for the Event structure to handle, refer to the
LabVIEW Help for more information about caveats and recommendations
when using events in LabVIEW.
Complete the following steps to configure an Event structure case to handle
an event.
1. (Optional) If you want to configure the Event structure to handle a user
event, a Boolean control, or a user interface event that is generated based
on a reference to an application, VI, or control, you must first
dynamically register that event. Refer to the Dynamic Event
Registration topic of the LabVIEW Help for more information about
using dynamic events.
2. Right-click the border of the Event structure and select Edit Events
Handled by This Case from the shortcut menu to display the Edit
Events dialog box to edit the current case. You also can select Add
Event Case from the shortcut menu to create a new case.
3. Specify an event source in the Event Sources section.
4. Select the event you want to configure for the event source, such as Key
Down, Timeout, or Value Change from the Events list. When you
select a dynamic event source from the Event Sources list, the Events
list displays that event. This is the same event you selected when you
registered the event. If you have registered for events dynamically and
wired event reg refnum out to the dynamic event terminal, the sources
appear in the Dynamic section.
5. If you want to add additional events for the current case to handle, click
the + button and repeat steps 3 and 4 to specify each additional event.
The Event Specifiers section at the top of the dialog box lists all the
events for the case to handle. When you click an item in this list, the
Event Sources section updates to highlight the event source you
4-20
ni.com
Lesson 4
selected. You can repeat steps 3 and 4 to redefine each event or click
the X button to remove the selected event.
6. Click the OK button to save the configuration and close the dialog box.
7. Repeat steps 1 through 6 for each event case you want to configure.
Refer to the following VIs for examples of using events:
labview\examples\general\dynamicevents.llb
labview\examples\general\uievents.llb for examples of using
events.
Event Example
Figure 4-9 shows an Event structure configured with the Menu Selection
(User) event. This VI uses the Event structure to capture menu selections
made using the user-defined menu named sample.rtm. The ItemTag returns
the menu item that was selected and the MenuRef returns the refnum to the
menubar. This information is passed to the Get Menu Item Info function.
Refer to examples\general\uievents.llb for more examples of using events.
If you use the Get Menu Selection function with an Event structure configured to
handle the same menu item, the Event structure takes precedence, and LabVIEW ignores
the Get Menu Selection function. In any given VI, use the Event structure or the Get
Menu Selection function to handle menu events, not both.
Note
4-21
Lesson 4
Exercise 4-2
Goal
Experiment with the operation of the Event structure in a VI.
Description
Use and modify a VI that contains an Event structure.
1. Open the NI Example Finder.
Select HelpFind Examples.
2. Open the New Event Handler VI example.
Navigate to Building User InterfacesAcquiring User Input
General and double-click New Event Handler.vi.
3. Enable execution highlighting on the block diagram.
4. Run the VI.
5. Observe the operation of the VI when you click the buttons on the front
panel.
6. Stop the VI.
7. Modify the VI to respond to a Value Change event with a new control on
the front panel.
Switch to the front panel of the VI.
Create a copy of a Boolean button on the front panel.
Change the button text and label of the button to New Button.
Right-click the new button and verify that the Mechanical Action is
set to Latch When Released.
Switch to the block diagram of the VI.
Right-click the border of the Event structure and select Add Event
Case from the shortcut menu to open the Edit Events dialog box.
Select New Button in the Event Sources section and select Value
Change in the Events section as shown in Figure 4-10.
4-22
ni.com
Lesson 4
4-23
Lesson 4
Select Panel Close? from the Events list and click the OK button.
Wire a True constant to the Discard? Event Filter Node in the Panel
Close? case.
Wire the Time Waveform data through the case.
Wire a False constant to the Boolean tunnel.
9. Run the VI.
10. Attempt to close the VI by closing the front panel.
11. Click the STOP button to stop the VI.
12. Open the NI Example Finder.
13. Open the Old Event Handler VI example.
Navigate to Building User InterfacesAcquiring User Input
General and double-click Old Event Handler.vi.
14. Enable execution highlighting on the block diagram.
15. Run the VI.
16. Observe the operation of the Old Event Handler VI and compare and
contrast the operation with the New Event Handler VI.
17. Close all VIs without saving changes.
4-24
ni.com
Lesson 4
3
2
1
4
1
2
Event Structure
While Loop
3
4
Timeout Terminal
Event Data Node
A common problem when using the user interface event handler is that it
computes the While Loop termination before the Event structure executes.
4-25
Lesson 4
This can cause the While Loop to iterate one more time than you expected.
To avoid this situation, compute the While Loop termination within all your
event handling code.
The event handler code must execute quickly, generally within 200 ms.
Anything slower can make it feel as if the user interface is locked up. Also,
if the event handler code takes a long time to execute, the Event structure
might lock. By default, the front panel locks while an event is handled. You
can disable front panel locking for each event case to make the user interface
more responsive. However, any new events that are generated while an event
is being handled will not be handled immediately. So, the user interface will
still be unresponsive.
Any code that is in an event case cannot be shared with another Event
structure. You must utilize good code design when using the Event structure.
Modularize code that will be shared between multiple Event structure cases.
The Event structure includes a Timeout event, which allows you to control
when the Timeout event executes. For example, if you set a Timeout of
200 ms, the Timeout event case executes every 200 ms in the absence of
other events. You can use the Timeout event to perform critical timing in
your code.
4-26
ni.com
Lesson 4
Figure 4-12 shows how you can use Synchronization VIs and functions to
add functionality to the design pattern. Queues have the ability to transfer
any data type. The data type transferred in Figure 4-12 is a string. A string
is not the most efficient data type for passing data in design patterns. A more
efficient data type for passing data in design patterns is a cluster consisting
of an enumerated type control and a variant.
4-27
Lesson 4
Exercise 4-3
Goal
Observe the functionality and design of event-based LabVIEW design
patterns.
Description
Explore the event-based design pattern VI templates that ship with
LabVIEW and observe how they operate. Use the event-based design
pattern VI templates in LabVIEW as the basis for the underlying
architecture of VIs you create.
1. Select FileNew to open the New dialog box.
2. In the Create New section, expand the VIfrom Template
FrameworksDesign Patterns tree.
3. Select the User Interface Event Handler design pattern from the tree
and click the OK button to open the template.
4. Open the block diagram, turn execution highlighting on, and run the VI.
Notice how the design pattern handles the following items:
State transitions
Data flow
VIs used to create design patterns
5. Close the design pattern. Do not save changes.
6. Repeat steps 1 through 5 to observe the operation of the
Producer/Consumer Design Pattern (Events) design pattern
4-28
ni.com
Lesson 4
Producer
User
Event
Queue
Consumer
This section describes user events and how to use them to create advanced
event-based design patterns.
User Events
You programmatically can create and name your own events, called user
events, to carry user-defined data. Like queues and notifiers, user events
allow different parts of an application to communicate asynchronously. You
can handle both user interface and programmatically generated user events
in the same Event structure.
4-29
Lesson 4
The user event out output of the Create User Event function is a strictly
typed refnum that carries the name and data type of the user event. Wire the
user event out output of the Create User Event function to an event source
input of the Register For Events function.
You cannot register for a user event statically. Handle a user event the same
way you handle a dynamically registered user interface event. Wire the
event registration refnum output of the Register For Events function to the
dynamic event terminal on the left side of the Event structure. Use the Edit
Events dialog box to configure a case in the Event structure to handle the
event. The name of the user event appears under the Dynamic subheading
in the Event Sources section of the dialog box.
The user event data items appear in the Event Data Node on the left border
of the Event structure. User events are notify events and can share the same
event case of an Event structure as user interface events or other user events.
You can wire a combination of user events and user interface events to the
Register For Events function.
4-30
ni.com
Lesson 4
4-31
Lesson 4
Exercise 4-4
Goal
Complete a VI that contains a static user interface event and a user event.
Scenario
This VI contains the Fire Event Boolean control that causes an LED to light
when the user clicks the control. In addition, the block diagram contains a
countdown that displays on the slider on the front panel. When the
countdown reaches zero, a programmatic event fires that lights the LED.
Design
1. Modify the block diagram to create and generate a user event for the
LED.
2. Configure the Fire Event event case to handle both the Value Change
event on the Fire Event Boolean control and the User event.
Implementation
1. Open the User Event VI located in the C:\Exercises\LabVIEW
Intermediate I\User Event Techniques directory. Figure 4-14
and Figure 4-15 show the front panel and block diagram.
4-32
ni.com
Lesson 4
4-33
Lesson 4
Configure Events
3. Place an Event structure, located on the Structures palette, inside the
user interface loop. Wire the event reg refnum out from the Register
For Events node to the dynamic event terminal of the Event structure.
4. Complete the following steps to configure the Fire Event event case to
handle both the Value Change event on the Fire Event Boolean control
and the User event, as shown in Figure 4-17.
4-34
ni.com
Lesson 4
4-35
Lesson 4
Testing
1. Run the VI. Try to generate a user interface event at the same time as a
programmatic event. Does the VI record both events?
2. Stop the VI and move the Fire Event Boolean control from the event
case to outside the While Loop. Try running the VI again. What
happens? Because the Boolean control is a latch, the VI must read the
control to reset it. When the control is outside the While Loop, the VI
reads it only once during the execution of the VI.
3. Close the VI. Do not save changes.
4-36
ni.com
Lesson 4
4-37
Lesson 4
Job Aid
Use Table 4-1 to determine the best uses for the design patterns described in
this lesson.
Table 4-1. Design Pattern Comparisons
Design Pattern
Use
Advantage
Disadvantage
Simple
Simple calculations
Easily perform
simple calculations
General
Standard Control
Flow
Distinct Initialize,
Unable to return to a
Run, and Stop phases previous phase
State Machine
Controls the
functionality of a VI
by creating a system
sequence
Controls sequences
Queued Message
Handler
Stores future
sequences to execute
Parallel Loop
Efficient use of
computing resources
Synchronization and
data passing
Master/Slave
Producer/Consumer
(Data)
Processes or analyzes
data in parallel with
other data processing
or analysis
User Interface
Event Handler
Processes messages
from the user
interface
Handles user
interface messages
Producer/Consumer
(Events)
Responds to user
interface with
processor-intensive
applications
4-38
N/A
ni.com
Lesson 4
Use Figure 4-21 as a guide to help in determining the best design pattern to
use for an application.
Contains a
Sequence?
Yes
Pre-store
Sequence
Execution?
No
No
Responds to
User Interface?
Yes
Intensive
Processing
Needed?
Yes
Relation
Between
Loops?
No
No
Simple VI
Architecture
State Machine
Producer/
Consumer with
Events
Yes
No
No
Parallel
Operations?
Queued
Message
Handler
Yes
Yes
User Interface
Event Handler
Is Timing
the Loop
Relation?
Yes
No
Master/Slave
Producer/
Consumer
Parallel Loop
Architecture
4-39
Lesson 4
Exercise 4-5
Goal
Determine the appropriate design pattern to use for a scalable architecture
for the application.
Scenario
Evaluate each of the design patterns and pick the best pattern to implement
the Theatre Light Control Software application.
Implementation
1. Run Design Pattern.exe in the C:\Exercises\LabVIEW
Intermediate I\Choose a Scalable Architecture directory.
4-40
ni.com
Lesson 4
Hierarchy
It is good development style to create a good module hierarchy in
LabVIEW. A good module hierarchy has high cohesion and low coupling.
You can graph the VIs that are coupled to other VIs within a hierarchy.
Graphing the hierarchy helps you visualize the coupling among modules.
Modules within an application should appear near each other in the
hierarchy. The module hierarchy should have independent sections that are
shaped somewhat like a diamond, as shown in Figure 4-22.
4-41
Lesson 4
the lowest level of the hierarchy. Every software design needs to strike a
balance on the acceptable level of coupling.
Plan your application before you build it. Think about what operations are
necessary. A complex application includes major tasks, such as network
communication or data acquisition, and minor tasks, such as user login or
dialog box display. Most of the smallest tasks, such as string concatenation
and basic mathematics, have existing VIs or functions in LabVIEW. Try to
build modules that have only one goal and accomplish that goal well.
If you are editing an existing VI, understand what function each part of the
block diagram performs before you insert new functionality. Strive to
achieve strong cohesion. Mimic existing organization patterns. If all
existing waveform calculations occur in one module, make sure that you add
any new waveform calculations to the same module.
Job Aid
Use the following checklist to create a hierarchical architecture and
determine if each VI uses the correct level of detail.
Each individual VI performs a single goal
Each VI is loosely coupled
Implementation details of the VI are hidden
You can reuse each VI in other VIs
Each VI has clearly defined inputs and outputs
4-42
ni.com
Lesson 4
If you are using a project with an NI device driver, refer to the specific driver
documentation for more information about using projects with drivers.
Saving a Project
You can save a LabVIEW project in the following ways:
Right-click the project root and select Save from the shortcut menu.
4-43
Lesson 4
You must save new, unsaved files in a project before you can save the
project. When you save a project, LabVIEW does not save items under
Dependencies as part of the project file.
Make a backup copy of a project when you prepare to make major revisions to the
project.
Note
When you save dependencies, LabVIEW does not save the project file. Select
FileSave All to save the project file and all dependencies.
Note
Right-click a target or a folder under the target, select AddFile from the
shortcut menu, and select the file(s) you want to add from the file dialog
box. You also can select the target, select ProjectAdd To Project
Add File, and select the file(s) you want to add from the dialog box.
After you add a folder on disk to a project, LabVIEW does not automatically
update the folder in the project if you make changes to the folder on disk.
Note
Right-click a target and select NewVI from the shortcut menu to add
a new, blank VI. You also can select FileNew VI or ProjectAdd To
ProjectNew VI to add a new, blank VI.
Select the VI icon in the upper right corner of a front panel or block
diagram window and drag the icon to the target.
(Windows and Mac) Select an item or folder from the file system on your
4-44
ni.com
Lesson 4
You also can add new LabVIEW files to a project from the New dialog box.
Select FileNew or ProjectAdd To ProjectNew to display the New
dialog box. In the New dialog box, select the item you want to add and place
a checkmark in the Add to project checkbox. If you have multiple projects
open, select the project to which you want to add the item from the Projects
list.
Items you add to the Project Explorer window can include icons.
Project Dependencies
Use Dependencies to view items that VIs under a target require. Each target
in a LabVIEW project includes Dependencies.
You cannot add items directly to Dependencies. LabVIEW adds
dependencies for VIs under a target when you right-click Dependencies and
select Refresh from the shortcut menu. For example, if you add a VI that
includes a subVI to a target, LabVIEW adds the subVI to Dependencies
when you select Refresh. However, if you add a dependent item under a
target, the item does not appear under Dependencies. For example, if you
add the VI and the subVI under the target, LabVIEW does not add the subVI
under Dependencies when you select Refresh.
Dependencies include VIs, DLLs, and LabVIEW project libraries that a VI
calls statically.
Items that a VI calls dynamically do not appear under Dependencies. You must
add these items under a target to manage them in a project.
Note
4-45
Lesson 4
Note
Right-click the item you want to remove and select Remove from the
shortcut menu.
Select the item you want to remove and press the <Delete> key.
Select the item you want to remove and press the Delete button on the
Standard toolbar.
Removing an item from a project does not delete the corresponding item on disk.
4-46
ni.com
Lesson 4
Caution
Use project libraries to limit access to certain types of files. You can
configure access to items and folders in a project library as public or private
to prevent users from accessing certain items. When you set access for a
folder as private, all VIs in that folder also have private access.
You can limit editing permission by locking or password-protecting project
libraries. When you lock a project library, users cannot add or remove items
and cannot view items that you set as private. When you assign a password
to a project library, users cannot add or remove items or edit project library
properties without a password. Users can open the Project Library
Properties dialog box, but all dialog box components except protection
options are disabled. Users must unlock the project library or enter a
password to enable the dialog box components.
Adding password protection to a project library does not add password protection
to the VIs it owns. You must assign password protection to individual VIs.
Note
You can create project libraries from project folders. You also can convert
LLBs to project libraries. LLBs have different features and advantages than
project libraries, so consider the ways in which you might use an LLB
before you decide whether to convert it to a project library. You can include
project library files in an LLB.
If you include a palette menu file (.mnu) in a project library, you can set it
as the default palette menu for all VIs that the project library owns. After
4-47
Lesson 4
you select a default palette menu, you can right-click a subVI call to any VI
that the project library owns and view the default palette for that subVI from
the shortcut menu. From the General Settings page of the Project Library
Properties dialog box, select the menu file in the Default Palette ring
control. You also can set the default palette menu from the Item Settings
page. Select the .mnu file in the Contents tree and place a checkmark in the
Default Palette checkbox.
Project Sublibraries
Project sublibraries are project libraries that another project library owns.
The settings in the owning project library do not affect access settings and
editing permission for items within the project sublibrary. You can set the
access of a project sublibrary file (.lvlib) as private within the owning
project library, but when you edit the project sublibrary itself, items the
sublibrary owns retain public or private access settings.
Project sublibraries are useful if you want to create a project library that
includes separate areas of functionality. For example, if you are creating a
project library of graphics tools, you might divide the two-dimensional and
three-dimensional drawing tools into separate sublibraries. Each project
sublibrary can include private and public access items and folders.
If you add a VI that is not in memory to a project library, a dialog box appears that
prompts you to save changes to the VI. Save changes to the VI so it will link correctly to
the owning project library.
Note
4-48
ni.com
Lesson 4
3.
Select FileSave All or right-click the project library icon and select
Save As from the shortcut menu to name and save the project library
file.
4. Right-click the project library icon and select Properties from the
shortcut menu to display the Project Library Properties dialog box.
5. From the General Settings page, set the version number, create or select
an icon, and assign security settings to the project library.
Note The icon you select becomes the default icon for any VIs you create from within
the project library. You can create a template icon to edit and use in all VIs that a project
library owns.
6. From the Documentation page, enter information for context help for
the project library.
7. From the Item Settings page, set access options for files in the project
library.
8. Click the OK button to update the project library with the edited settings
and close the dialog box.
You also can create a project library from a project folder.
4-49
Lesson 4
items might include support VIs, copyrighted files, or items you might want
to edit later without taking the risk of breaking users' code.
You can set the access of a project sublibrary file (.lvlib) as private within
the owning project library, but when you edit the project sublibrary itself,
items the sublibrary owns retain public or private access settings.
Complete the following steps to configure access options in a project library.
1. Right-click the project library icon in the Project Explorer or
stand-alone project library window and select Properties from the
shortcut menu to display the Project Library Properties dialog box.
2. From the Item Settings page, click an item in the Contents tree to select
it. The current access settings for the item appear in the Access Scope
box. Click one of the following radio buttons in the Access Scope box
to apply to the item.
PrivateThe item does not appear visible when users view the
project library or palettes if you lock the project library. Other VIs
and applications that the project library does not own cannot call a
private VI.
If you specify access options for a folder, the access setting applies to all items in
the folder and overrides access options for individual items in the folder.
Note
You can set individual instances of a polymorphic VI as private and set the primary
polymorphic VI as public. The polymorphic VI does not break even though instance VIs
are private. Setting instance VIs as private is useful if you want users to access instances
only through the polymorphic VI selector, so you can edit instance order without causing
user problems.
Note
3. Click the OK button to incorporate the changes into the project library
and close the dialog box.
Items set as private appear in the Project Explorer window with a private
icon. If you lock the project library, private items do not appear in the
Project Explorer window.
4-50
ni.com
Lesson 4
Complete the following steps to set levels of protection for a project library.
1. Right-click the project library icon in the Project Explorer or
stand-alone project library window and select Properties from the
shortcut menu to display the Project Library Properties dialog box.
2. From the General Settings page, select one of the following options to
apply to the project library.
4-51
Lesson 4
Create a separate directory of files for each project library you create.
You can include the files that the project library owns in the directory. If
you include files for more than one project library in the same directory,
conflicts might occur if you try to include VIs of the same name in
different libraries. Organizing project library files into separate
directories makes it easier to identify files related to specific project
libraries on disk.
If you move files on disk that a project library owns, reopen and resave
the project library to ensure that the project library links correctly to the
moved items.
make sure you save the files that the project library owns on the same
drive as the project library. If some files are on a different drive, such as
a network drive, project library links will break if you include the project
library in an installer.
Determine which items in a project library you want to set as private and
which as public. Users cannot use private VIs as subVIs in other VIs or
applications. Public items provide the interface to the project library
functionality and might include palette VIs, XControls, instrument
drivers, and tools you want users to find and use. Private items might
include support VIs, copyrighted files, or items you might want to edit
later without taking the risk of breaking users' code. Consider the
following recommendations:
4-52
ni.com
Lesson 4
Assume that all project library files that are not in the private
folder are public. You do not need to create a folder for public files.
You also can organize public and private items in a project library by
creating folders for each functionality group within a project library
and adding a private subfolder within each functionality group
folder.
4-53
Lesson 4
Exercise 4-6
Goal
Create a LabVIEW project for the application.
Scenario
Every large LabVIEW development needs to use a project to control naming
and project hierarchy. Using the LabVIEW Project simplifies the
development of larger applications.
Design
Create a LabVIEW project that includes folders for modules and controls.
Save the project as TLC.lvproj in the C:\Exercises\LabVIEW
Intermediate I directory.
Implementation
1. Launch LabVIEW.
2. Create a new project.
Select FileNew Project to open the Project Explorer window.
3. Create a folder for modules and a folder for controls in the My
Computer hierarchy. You use these folders later in the course.
Right-click My Computer in the Project Explorer window and
select NewFolder from the shortcut menu to create a new folder.
Name the folder Modules.
Repeat the previous steps to create the Controls folder.
4. Save the project as TLC.lvproj.
Select FileSave Project.
Save the project as TLC.lvproj in the C:\Exercises\LabVIEW
Intermediate I\Course Project directory.
4-54
ni.com
Lesson 4
Scalars
Scalar data is the most basic data structure in LabVIEW. Scalar data can be
a number or a Boolean value. Use scalar data in your VIs for items that
contain only a single value. For example, if your software requirements
specify the use of a stop button in a VI, design a data structure that uses a
single Boolean stop button. If the VI requires that you use a device number
to specify the hardware to access, design a data structure that contains an
integer numeric to contain the device number. Examine all aspects of a
software requirements document and identify all data elements that are
appropriately represented as scalar data.
Because the dataflow programming model of LabVIEW is tightly integrated
with the data that a VI uses, you must evaluate each data element. If you
know that scalar data will always remain scalar, even as the program
evolves, you can use scalar data structures in the design of the software.
Because scalars are the most basic data structure in LabVIEW, VIs that use
primarily scalar data have the highest levels of efficiency and performance.
However, if you know that an application will evolve over time and require
more advanced data structures to replace the scalars, it may be difficult to
modify the application if you initially build it using scalar data structures.
Arrays
Arrays group data elements of the same type. Arrays are powerful data
structures for storing sets of the same data type where each data element is
associated with the others. Use arrays to contain data that includes more
than one element of the same data type and each element is associated with
one another. For example, if you need to contain data that streams from a
hardware device, such as a DAQ device, design a data structure that includes
an array to handle that data. Storing the streaming data into individual scalar
elements is impractical and results in a VI that is difficult to debug and use.
Clusters
Clusters enable you to create data structures that contain any type of data.
A cluster is useful for storing data about objects. When you create software,
you might need to model real-world items. For example, you might need to
4-55
Lesson 4
Job Aid
Use the following checklist to help identify appropriate data structures.
Use scalars for data items that are associated with single, non-related
items.
Make sure all scalar data would never need to be a more advanced data
structure.
Use arrays for items of the same type that should be grouped together.
Use clusters for items of different or similar types that can be grouped
to form a single, coherent data item.
4-56
ni.com
Lesson 4
Exercise 4-7
Goal
Design and create the data types that you want to use in the application.
Scenario
When you develop a VI, it is important to design the data types that you want
to use in the application.
Design
Design a cluster called Cue for the cue information that contains the
following data elements:
4-57
Lesson 4
Implementation
1. Add tlc_Cue_Information.ctl to the Controls folder in the
TLC project.
Right-click the Controls folder in the TLC project tree and select
Add File from the shortcut menu.
Navigate to the C:\Exercises\LabVIEW Intermediate I\
Course Project\Controls directory, select
tlc_Cue_Information.ctl and click the Add File button to add
the file.
2. Open the control.
3. Verify that the Type Def. Status pull-down menu is set to Type Def..
4. Create the Cue Name, Wait Time, Fade Time, and Follow Time controls
as described in the Design section. Use the System palette to create the
controls. Place the controls inside the cluster.
Place a system string control in the cluster and name the control Cue
Name.
Place a system numeric control in the cluster and name the numeric
Wait Time (s).
Right-click the numeric and select RepresentationUnsigned
Long (U32) from the shortcut menu.
Place two copies of the Wait Time (s) control inside the cluster.
Name one Fade Time (s) and name one Follow Time (s).
5. Create the Channel 2D array shell. Turn off index display for the array.
Place an array from the Modern palette inside the cluster and name
the array Channels.
Right-click the array shell and select Add Dimension from the
shortcut menu to make the array 2D.
Right-click the array shell and select Visible ItemsIndex Display
to turn off index display.
6. Add the channel.ctl file located in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Controls directory to the
Controls folder of the TLC project.
4-58
ni.com
Lesson 4
7. Click and drag channel.ctl from the Project Explorer window into
the Channel array shell that you created in step 5.
8. Save the completed control.
9. Close the Control Editor and any open VIs. Do not save changes.
4-59
Lesson 4
G. Information Hiding
When you design a data structure, consider whether you need to limit
interaction among components. When you develop a VI, it is important to
protect the data so that other modules or applications can not modify the
data. In academia, protecting the data is often referred to as data
encapsulation or information hiding. In this course, information hiding
refers to preventing or limiting other components from accessing data items
in a module except through some predetermined method. Use information
hiding to create VIs that are highly reliable and easy to maintain.
Consider a VI that accesses data using a global variable. It is possible for any
module to access that same global variable and change its value without any
other module knowing that the global variable has changed, as shown in
Figure 4-24.
1
1
The advantage to using information hiding is that you alleviate the details
from the program. All the work that needs to happen to read from and write
to a data item occurs in a lower-level VI. You can modify the functionality
of the data without breaking the code that calls the VI that hides the
information. The only thing you need to modify is the VI that operates on
LabVIEW Intermediate I Course Manual
4-60
ni.com
Lesson 4
the data. This improves reliability when you are working with data in a VI.
Whenever you are working with data in LabVIEW, make sure that you
create an interface that can interact with the data in the system. This
interface is a VI that can read from and/or write to the data.
4-61
Lesson 4
Figure 4-27. Functional Global Variable with Set and Get Functionality
In this example, data passes into the VI and is stored in the shift register if
the enumerated data type is configured to Set. Data is retrieved from the
shift register if the enumerated data type is configured to Get.
Before you use a local or global variable, make sure a functional global variable
would not have worked instead.
Tip
4-62
ni.com
Lesson 4
The Elapsed Time case gets the current date and time in seconds and
subtracts it from the time that is stored in the shift register. The Reset Time
case initializes the functional global variable with a known time value.
Job Aid
In order to achieve information hiding, ensure that all data items have an
interface to read from and/or write to the data.
4-63
Lesson 4
Exercise 4-8
Information Hiding
Goal
Design a VI that provides an interface to the data.
Scenario
Build a VI that uses a functional global variable to provide an interface to
the Cue data type you created in Exercise 4-7. The functional global
variable provides a safe way to access the data that the application needs.
Design
To provide an interface to the data in the Cue data type, you need to create
a VI that can access the Cue data type. Create a functional global variable to
access the data.
The functional global variable implements the following functions:
Initialize
Add Cue
Delete Cue
Swap
Implementation
1. Open the TLC project if it is not already open.
2. Create a Cue folder in the Modules folder of the TLC project.
Right-click the Modules folder in the Project Explorer window
and select NewFolder from the shortcut menu.
Name the folder Cue.
3. Add tlc_Cue Module.vi located in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Modules\Cue directory to the
Cue folder.
Right-click the Cue folder in the Project Explorer window and
select Add File from the shortcut menu
4-64
ni.com
Lesson 4
4-65
Lesson 4
Wire Cue Input to the bottom element input of the Build Array
function.
Wire the appended array output of the Build Array function to the
right shift register of the loop.
Wire the left shift register of the loop to the top element input of the
Build Array function.
6. Build the Delete Cue case as shown in Figure 4-30.
Place the Delete From Array function in the Delete Cue case.
Wire the array from the left tunnel to the array input of the Delete
From Array function.
Wire the Cue Index control to the index input of the Delete From
Array function.
Create a constant of 1 for the length input of the Delete From Array
function.
Wire the array w/subset deleted output of the Delete From Array
function to the right tunnel.
4-66
ni.com
Lesson 4
4-67
Lesson 4
4-68
ni.com
Lesson 4
4-69
Lesson 4
Wire the bottom element output of the Index Array function to the
top new element/subarray input of the Replace Array Subset
function.
Wire the top element output of the Index Array function to the
bottom new element/subarray input of the Replace Array Subset
function.
Wire the output array of the Replace Array Subset function to the
right tunnel.
10. Build the Get Number of Cues case as shown in Figure 4-34.
4-70
ni.com
Lesson 4
4-71
Lesson 4
12. Build the Get Empty Cue case, as shown in Figure 4-36.
13. Create a cue that contains the desired number of channels and initialize
each channel to an intensity of zero, color of black, and the appropriate
channel number.
Create two nested For Loops.
Create more working space on the front panel or block diagram by pressing the
<Ctrl> key and using the Positioning tool to drag out a rectangle where you want more
space.
Tip
Wire the number of rows to the count terminal of the outer For Loop.
Wire the number of columns to the count terminal of the inner For
Loop.
Create a shift register on each For Loop to store the channel count.
Drag channel.ctl from the Project Explorer window to the
inner For Loop on the block diagram.
Arrange a cluster horizontally, or vertically by right-clicking on the cluster border
and selecting AutosizingArrange Horizontally or AutosizingArrange Vertically.
This can be used to decrease the size of the cluster.
Tip
4-72
ni.com
Lesson 4
4-73
Lesson 4
Testing
Test the VI to verify its operation.
1. Set the following front panel controls:
Enum = Initialize
Rows = 4
Columns = 8
2. Run the VI.
3. Set the following front panel controls:
Enum = Get Empty Cue
4. Run the VI.
5. Verify that the Cue Output contains a 32 element Channel array. The
array should contain 32 elements because you specified four rows and
eight columns. Show the index display on the array to view the elements.
6. Set the following front panel controls:
Enum = Add Cue
Cue Input = Place dummy data in the Wait Time(s), Fade Time(s),
and Follow Time(s) controls.
7. Run the VI.
8. Set the following front panel controls:
Enum = Get Number of Cues
9. Run the VI.
10. Verify that the Number of Cues indicator displays 1.
11. Set the following front panel controls:
Enum = Get Cue Values
Cue Index = 0
12. Run the VI.
4-74
ni.com
Lesson 4
13. Verify that the Cue Output matches the information that you placed in
step 6.
14. Test the Swap functionality by adding another Cue, then calling the
module with the enum set to Swap. Swap the two cues that you have
entered.
4-75
Lesson 4
You can design a proactive system that catches potential errors. For
example, you might need to catch any problems in a configuration
before the system passes the configuration to a data acquisition driver.
The system can prevent the data acquisition driver from executing if
there are errors in the configuration.
You can design corrective error processing that tries to determine the
error and fix the error. This allows each module to implement error
correcting code. For example, you could develop a Read File I/O VI to
fix errors that occur in the Open/Create/Replace File VI.
You can design a system that reports errors to the user. If an error occurs,
the individual modules do not execute, and the system notifies the user
what error occurred.
When creating software, you should develop separate error handling code
for two phases of the processdevelopment and deployment. During
development, the error handling code should be noticeable and should
clearly indicate where errors occur. This helps you determine where any
bugs might exist in a VI. During deployment, however, you want the error
handling system to be unobtrusive to the user. This error handling system
should allow a clean exit and provide clear prompts to the user.
When you design the error handling strategy, consider how the system
should respond based on the severity of the error. If the error is only a
warning, it is not necessary to completely stop the system when the error
occurs. For example, consider a File dialog box that contains a Cancel
button the user can click to cancel the selection of a file. If the user clicks
the Cancel button, the entire software system should not stop. It is
preferable to log this type of error as a warning. An exception error indicates
that something drastic has occurred in the system, such as a file logging
system that runs out of storage space. Exception errors should prevent the
rest of the system from operating.
4-76
ni.com
Lesson 4
Error Handling
You can choose other error handling methods. For example, if an I/O VI on
the block diagram times out, you might not want the entire application to
stop and display an error dialog box. You also might want the VI to retry for
a certain period of time. In LabVIEW, you can make these error handling
decisions on the block diagram of the VI.
Use the LabVIEW error handling VIs and functions on the Dialog & User
Interface palette and the error in and error out parameters of most VIs and
functions to manage errors. For example, if LabVIEW encounters an error,
you can display the error message in different kinds of dialog boxes. Use
error handling in conjunction with the debugging tools to find and manage
errors.
VIs and functions return errors in one of two wayswith numeric error
codes or with an error cluster. Typically, functions use numeric error codes,
and VIs use an error cluster, usually with error inputs and outputs.
Error handling in LabVIEW follows the dataflow model. Just as data values
flow through a VI, so can error information. Wire the error information from
the beginning of the VI to the end. Include an error handler VI at the end of
the VI to determine if the VI ran without errors. Use the error in and error
out clusters in each VI you use or build to pass the error information through
the VI.
As the VI runs, LabVIEW tests for errors at each execution node. If
LabVIEW does not find any errors, the node executes normally. If
LabVIEW detects an error, the node passes the error to the next node
without executing that part of the code. The next node does the same thing,
and so on. At the end of the execution flow, LabVIEW reports the error.
4-77
Lesson 4
Error Clusters
The error in and error out clusters include the following components of
information:
Error Codes
You can create custom error messages that are meaningful for your own VIs.
Determine where possible errors can occur in the VI, and define error codes
and messages for those errors. National Instruments recommends that you
use the General Error Handler VI to define custom error codes in the range
of 5000 to 9999 and 8999 to 8000. However, you also can define
custom error codes in the same range using the Error Code File Editor
dialog box. Use this method if you want to use the same custom error codes
with several VIs or if you want to distribute custom error codes with an
application or shared library. If you want to distribute the custom error codes
with an application or shared library, you must distribute the error code text
files.
Complete the following steps to define custom error codes using the Error
Code File Editor.
1. Select ToolsAdvancedEdit Error Codes to launch the Error Code
File Editor.
2. Click the New button to create an error codes file or click the Open
button to browse to an existing error codes file.
3. Enter comments about the error codes file in the Comments about this
file text box.
4. Click the Add button to add an error code and description to the error
codes file.
5. Select and edit an error code description using the Current Error Code
and Description controls.
6. When you are done editing the error codes file, select FileSave to save
the error codes file in the labview\user.lib\errors directory.
You also can define custom error codes in the same range by creating an
XML-based text file. You must name the text file xxx-errors.txt, where
xxx is a name that you supply. The xxx-errors.txt file must use the
following syntax exactly, including capitalization, spacing, and so on. You
supply the italic text:
4-78
ni.com
Lesson 4
<?xml version="1.0"?>
<nidocument>
<nicomment>
This file describes custom errors for my VI.
</nicomment>
<nierror code="5000">
Memory full.
Add more memory.
</nierror>
<nierror code="5001">
Invalid name. Enter a new name.
</nierror>
</nidocument>
Job Aid
Use the following checklist to determine the critical sections of a VI that
require an error handling strategy.
Code that interfaces with hardware
Code that interacts with an external database
Any user input
Code that interacts with and manages files
Code that interfaces with output devices, such as printers
Code that interacts with external applications
4-79
Lesson 4
Exercise 4-9
Goal
Develop a strategy to handle errors in the application.
Scenario
Creating an error code that is custom to the application is easy in the
LabVIEW environment. Using the error code in the application provides a
detailed description of the error that occurred. You can use this information
to diagnose the error and where the error occurred. Every application that
contains multiple states must provide a method and strategy for handling
errors.
Design
Use the LabVIEW Error Code File Editor to create the following error code,
based on a possible error that can occur in the application.
Error Code
Description
Cue Data Error
5000
Implementation
1. Open the TLC project if it is not already open.
2. Open the Error Code File Editor.
Select ToolsAdvancedEdit Error Codes and click the New
button to create a new error code file.
3. Create the error code as specified in the Design section.
Click the Add button to open the Add Error Code dialog box.
LabVIEW automatically sets the New Code value to 5000 and
increments it each time you click the Add button.
Enter the description from the table in the Design section in the New
Description text box.
Click the OK button to add the error code.
4. Select FileSave As to save the error code file as tlc-errors.txt in
the labview\user.lib\errors directory and close the editor.
5. Close the LabVIEW Error Code File editor.
4-80
ni.com
Lesson 4
Place a Case structure around the While Loop. Wire the error in and
error out clusters to the Case structure and the While Loop.
4-81
Lesson 4
Select the Delete Cue case and place a Case structure around the
Delete From Array function.
Place the Array Size function on the block diagram. Wire the array
to the array input of the Array Size function.
Place a Decrement function on the block diagram and wire it to the
size(s) output of the Array Size function.
Place a Greater or Equal? function on the block diagram. Wire the
output of the Decrement function to the x input and wire Cue Index
to the y input. Wire the output of the Greater or Equal? function to
the case selector terminal.
Select the False case of the Case structure and place the Error
Cluster From Error Code VI on the block diagram. This VI converts
an error or warning code to an error cluster. This VI is useful when
you receive a return value from a DLL call or when you return
user-defined error codes. Create a True constant from the show call
chain? input so that when an error occurs, source includes the chain
of callers from the VI that produced the error or warning to the
top-level VI. Pass the error code that you defined for the cue data
error (5000) to the error code (0) input of the VI.
8. Save the project and the VI.
Testing
1. Restart LabVIEW to load the error code file.
2. Generate an error with the Cue Module VI.
Open the TLC project.
Open tlc_Cue Module.vi located in the Project Explorer
window.
Enter an invalid Cue Index with the Command enum set to Delete
Cue.
Run the VI.
3. Verify that the error explanation matches what you specified when you
created the error code file.
4-82
ni.com
Lesson 4
Challenge
1. Modify the other cases so that a error generates when an invalid cue
index passes to the VI.
Tip
For the Swap case, also include code that checks for a valid swap index.
4-83
Lesson 4
Summary
VIs that use design patterns can be easier to read and modify.
Use information hiding to create VIs that are highly reliable and easy to
maintain.
4-84
ni.com
Lesson 4
Notes
4-85
Lesson 4
Notes
4-86
ni.com
In this lesson, you implement the user interface that you prototyped in
Lesson 3, Designing the User Interface. This lesson describes techniques
you can use in LabVIEW to improve the way you implement user interfaces.
You use a structured approach to developing a VI user interface. You learn
valuable techniques that improve the usability of the user interface and
improve the development of the VI.
Topics
A. Implementing User Interface-Based Data Types
B. Implementing Meaningful Icons
C. Implementing Appropriate Connector Panes
5-1
Lesson 5
Scalar Data
As described in Lesson 3, Designing the User Interface, an example of a
scalar value can be a numeric value or a Boolean value. There are many
ways to organize scalar data to improve the user interface and the usability
of the application. The preferred method for organizing scalar data is to use
a ring control or enumerated type control. These controls associate a
numeric value with a text string that the user sees on the front panel or user
interface.
Ring Controls
Ring controls are numeric objects that associate numeric values with strings
or pictures. Ring controls appear as pull-down menus that users can cycle
through to make selections.
Ring controls are useful for selecting mutually exclusive items, such as
trigger modes. For example, use a ring control for users to select from
continuous, single, and external triggering.
When you configure the list of items for a ring control, you can assign a
specific numeric value to each item. If you do not assign specific numeric
values to the items, LabVIEW assigns sequential values that correspond to
the order of the items in the list, starting with a value of 0 for the first item.
5-2
ni.com
Lesson 5
5-3
Lesson 5
Terminal
Bits of
Storage
on Disk
128
Double-precision,
floating point
64
Single-precision,
floating point
32
32
2,147,483,648 to 2,147,483,647
16
32,768 to 32,767
128 to 127
32
0 to 4,294,967,295
word unsigned
integer
16
0 to 65,535
0 to 255
Complex,
extended-precision,
floating-point
256
Complex,
double-precision,
floating-point
128
5-4
ni.com
Lesson 5
Terminal
Bits of
Storage
on Disk
Complex,
single-precision,
floating-point
64
<64.64>
Arrays
Arrays group data elements of the same type. You can build arrays of
numeric, Boolean, path, string, waveform, and cluster data types. Consider
using arrays when you work with a collection of similar data and when you
perform repetitive computations. Arrays are ideal for storing data you
collect from waveforms or data generated in loops, where each iteration of
a loop produces one element of the array.
Users can view the data stored in the array using the index display. However,
the best method for displaying the data stored in an array is to output the data
to a graph rather than placing an array on the front panel of a VI. It is much
easier for a user to view the array data in a graph rather than in an array.
Keep in mind the following rules when you work with arrays:
5-5
Lesson 5
Clusters
Clusters group data elements of mixed types, such as a bundle of wires,
as in a telephone cable, where each wire in the cable represents a different
element in the cluster. Using clusters to store data provides the following
advantages:
Clusters eliminate wire clutter on the block diagram and reduce the
number of connector pane terminals a subVI uses.
Clusters are valuable tools for creating readable, maintainable VIs. You can
create clusters that include any data type you choose. When you create a
cluster, you should always create a type definition of the cluster so you can
add new data elements to the cluster. Creating a cluster with a type definition
helps make your data structures and your VIs more scalable, readable, and
maintainable.
Always use the Bundle By Name and Unbundle By Name functions with
clusters in your VIs. The Bundle By Name and Unbundle By Name
functions help make your block diagram more readable because you can
identify the data that you are placing in or using from the cluster. Also, these
functions do not require you to maintain cluster order. By contrast, the
Bundle and Unbundle functions are dependent on the order of items in the
cluster, which can cause problems if you have similar data types in a cluster
and you do not know the cluster order. The Bundle By Name and Unbundle
By Name functions display the owned labels of the items in the cluster on
the function terminals.
5-6
ni.com
Lesson 5
Job Aid
Use the following checklist to help develop user interface-based data
structures.
Use a ring control to programmatically change the string labels in the
control.
Use a ring control instead of a Boolean control to improve the scalability
of a VI.
Use an enumerated type control to improve block diagram readability.
When you wire an enumerated type control to a Case structure, the Case
structure displays the values of the enumerated type control in the case
selector.
Use arrays to store data of the same type, but use a graph to display array
data.
Use clusters to eliminate wire clutter and create your own custom data
types.
Always use the Unbundle By Name and Bundle By Name functions for
programmatic control of cluster data.
Always create a type definition for clusters, ring controls, and
enumerated type controls.
5-7
Lesson 5
Exercise 5-1
Goal
Implement the user interface-based data types.
Scenario
Implement the user interface for the application. The specification from the
customer and the requirements document define the user interface for the
project.
Design
Figure 5-1 shows the user interface from the requirements document.
Inputs
Outputs
5-8
ni.com
Lesson 5
Wait Time(s) numericdisplays the wait time for the currently playing
cue
Fade Time(s) numericdisplays the fade time for the currently playing
cue
Implementation
Create a front panel similar to the user interface shown in Figure 5-1.
1. Create a new VI based on the producer/consumer (events) design pattern
template that you chose in Exercise 4-5.
Select FileNew from the Project Explorer window to open the
New dialog box.
In the New dialog box, select VIFrom TemplateFrameworks
Design PatternsProducer/Consumer Design Pattern(Events)
and make sure a checkmark appears in the Add to Project
checkbox.
Click the OK button to open the design pattern.
Save the VI as TLC Main.vi in the C:\Exercises\LabVIEW
Intermediate I\Course Project directory. LabVIEW
automatically adds the file to the project.
2. Delete the Queue Event button and the STOP button.
3. Create the cue list.
Place a system Listbox on the front panel.
Change the label of the Listbox to Cue List.
4. Create a custom dialog button for the play button by placing an image
decal on the dialog button.
Place a system button on the front panel.
Right-click the button and select AdvancedCustomize from the
shortcut menu to open the Control Editor.
5-9
Lesson 5
directory.
Select Play Button.ctl in the Project Explorer window and
drag the file to the Controls folder in the Project Explorer
window to place the control in the project hierarchy.
Change the label of the control to Play.
Close the Control Editor. When prompted, click Yes to replace the
original control with the custom control.
5. Add the following custom controls to the project and the front panel:
Record Button.ctl
Stop Button.ctl
Up Button.ctl
Down Button.ctl
Delete Button.ctl
Right-click the Controls folder, select Add File from the shortcut
menu and navigate to the C:\Exercises\LabVIEW
Intermediate I\Course Project\Controls directory.
Select the custom button controls from the previous list and click the
Add File button to add the controls to the Controls folder.
Tip
Hold the <Ctrl> key down while clicking on the file names to select multiple files.
Click and drag the custom controls from the Project Explorer
window to the front panel.
Arrange the controls on the front panel.
5-10
ni.com
Lesson 5
Tip
8. Place error in and error out clusters on the front panel to pass error data
through the VI.
9. Resize the window to hide the error clusters.
10. Save the VI.
The Run button is broken because you deleted the Queue Event button and the
Stop button. You resolve the broken run button in a later exercise.
Note
5-11
Lesson 5
Icons
Create a meaningful icon for every VI.
The icon represents the VI on a palette and a block diagram. When subVIs
have well-designed icons, developers can gain a better understanding of the
subVI without the need for excessive documentation.
Use the following suggestions when creating icons.
The LabVIEW libraries include well-designed icons that you can use as
prototypes. When you do not have a picture for an icon, text is
acceptable. If you localize the application, make sure you also localize
the text on the icon. A good size and font choice for text icons is 8 point
Small Fonts in all caps.
Always create a black and white icon for printing purposes. Not every
user has access to a color printer.
Create a unified icon style for related VIs to help users visually
understand what subVIs are associated with the top-level VI.
Always create standard size (32 32 pixels) icons. VIs with smaller
icons can be awkward to select and wire and might look strange when
wired.
Refer to the Creating an Icon topic of the LabVIEW Help for more
information about creating icons.
You can use the graphics available in the NI Icon Art Glossary to create icons. To
access the Icon Art Glossary, visit ni.com/info and enter the info code rdglos. Each
graphic in the glossary corresponds to an operation, such as aborting an I/O session or
controlling the mode of an instrument.
Tip
5-12
ni.com
Lesson 5
The Report Generation VIs use images of a disk, a printer, a pencil, and a
trashcan to represent what the VIs do. The image of a piece of paper with
text on it represents a report and is a common element in the icons. This
consistency unifies the icon designs. Notice that none of the icons are
language dependent, thus they are suitable for speakers of any language.
You also can create non-square icons that are similar to the built-in
LabVIEW functions, such as the Numeric and Comparison functions. This
style of icon can improve readability of the block diagram. For example, you
can implement non-square icons to represent control theory functions, such
as a summer. To create a non-square icon, create the image in the icon editor,
then remove the border in each color mode of the icon. It is necessary to
remove the border because LabVIEW treats any non-enclosed white space
in the icon as transparent. Keeping the border creates enclosed white space
and results in a square VI icon.
5-13
Lesson 5
Exercise 5-2
Goal
Implement a meaningful icon for the VI.
Scenario
Follow the suggestions for creating an icon to develop an icon that describes
the purpose of TLC Main VI.
Design
Create an icon for the TLC Main VI that resembles the icon shown at left.
Implementation
1. Open the front panel of TLC Main VI.
2. Right-click the VI icon in the upper right corner of the front panel and
select Edit Icon from the shortcut menu to open the Icon Editor.
3. Create the icon. You can use bitmap images to create a meaningful icon.
Select EditImport Picture from File and select icon
background.bmp from the C:\Exercises\LabVIEW
Intermediate I\Course Project\Shared\Images
5-14
ni.com
Lesson 5
5-15
Lesson 5
for the subVI to run properly. Use the Optional setting for inputs that
have default values that are appropriate for the subVI most of the time.
Include error in and error out clusters on all subVIs, even if the subVI
does not process errors. Error in and error out clusters are helpful for
controlling execution flow. If a subVI has an incoming error, you can use
a Case structure to send the error through the VI without executing any
of the subVI code.
Figure 5-3 shows the recommended style for assigning inputs and outputs to
a connector pane, with the inputs on the left and the outputs on the right,
following the flow of data from left to right.
1
1
Inputs
2
2
Outputs
When you develop VIs that are loosely coupled, it is easier to create an
appropriate connector pane. The 4 2 2 4 connector pane should work
for every loosely coupled VI. The VI shown in Figure 5-4 is not loosely
coupled because it performs work on more than one function.
5-16
ni.com
Lesson 5
In fact, the VI shown in Figure 5-5 uses an enumerated type control to pass
the function that the VI performs. A VI that uses a standard 4 2 2 4
connector pane provides for scalability.
5-17
Lesson 5
Exercise 5-3
Goal
Implement an appropriate connector pane for the VI.
Scenario
Build every VI with the 4 2 2 4 connector pane. This connector pane
pattern provides for scalability, maintainability, and readability. The
4 2 2 4 connector pane is very easy to wire on a block diagram.
Design
Modify the TLC Main VI by following the connector pane guidelines in this
lesson to create a 4 2 2 4 connector pane, as shown at left. Connect the
error in and error out clusters on the front panel to the connector pane.
Implementation
1. Open the front panel of TLC Main VI.
2. Right-click the VI icon in the upper right corner of the front panel and
select Show Connector from the shortcut menu to display the connector
pane for the VI.
3. Right-click the connector pane and select Patterns from the shortcut
menu. Verify that the connector pane uses the 4 2 2 4 pattern.
4. Use the Wiring tool to connect the error in and error out clusters on the
front panel to the connector pane following the guidelines described in
this lesson.
5. Right-click the connector pane and select Show Icon from the shortcut
menu to display the icon for the VI.
6. Save and close the VI.
5-18
ni.com
Lesson 5
Summary
5-19
Lesson 5
Notes
5-20
ni.com
Implementing Code
This lesson focuses on creating the algorithms and VIs for your application.
You learn techniques to make modular applications and create VIs that are
readable and easy to maintain.
Topics
A. Configuration Management
B. Implementing a Design Pattern
C. Implementing Code
D. Develop Scalable and Maintainable Modules
E. Implement an Error Handling Strategy
6-1
Lesson 6
Implementing Code
A. Configuration Management
Configuration management is the process of controlling changes and
ensuring they are reviewed before they are made. A central focus of the
development models described in Lesson 1, Successful Development
Practices, is to convert software development from a chaotic, unplanned
activity to a controlled process. These models improve software
development by establishing specific, measurable goals at each stage of
development.
Regardless of how well development proceeds, changes that occur later in
the process need to be implemented. For example, customers often
introduce new requirements in the design stage, or performance problems
discovered during development prompt a reevaluation of the design. You
also may need to rewrite a section of code to correct a problem found in
testing. Changes can affect any component of the project from the
requirements and specification to the design, code, and tests. If these
changes are not made carefully, you can introduce new problems that can
delay development or degrade quality.
Source Control
After you set the project quality requirements, develop a process to deal with
changes. This process is important for projects with multiple developers. As
developers work on VIs, they need a method to collect and share their work.
A simple method to deal with this is to establish a central source repository.
If all the development computers are on the network, you can create a shared
location that serves as a central source for development. When developers
need to modify files, they can retrieve the files from this location. When
developers complete their changes, they can return the files to this location.
Common files and areas of overlap introduce the potential for accidental
loss of work. If two developers decide to work on the same VI at the same
time, only one developer can work on the master copy. The other developer
must compare the VIs to determine the differences and incorporate the
changes into a new version. Avoid this situation by ensuring good
communication among the developers. If each developer notifies the others
when he needs to work on a specific VI, the others know not to work on
that VI.
Source control is a good solution to the problem of sharing VIs and
controlling access to avoid accidental loss of data. Source control makes it
easy to set up shared software projects and to retrieve the latest files from a
server. After you create a source control project, you can check out a file for
development. Checking out a file marks it with your name so other
developers know you are working on the file. If you want to modify a file,
you can check out the file from source control, make changes, test the
6-2
ni.com
Lesson 6
Implementing Code
changes, and check the file back into source control. After you check in the
file, the latest version is available to the development team. Another
developer can check out the file to make further modifications.
Note
Tracking Changes
If you are managing a software project, it is important to monitor changes
and track progress toward specific milestone objectives. You can use this
information to determine problem areas of a project by identifying which
components required many changes.
6-3
Lesson 6
Implementing Code
Source control providers maintain a log of all changes made to files and
projects. When checking in a file, the provider prompts the developer to
write a summary of the changes made. The provider adds this summary
information to the log for that file.
You can view the history information for a file or for the system and
generate reports that contain the summary information.
In addition, if you back up files at specific checkpoints, you can compare the
latest version of a file with another version to verify changes.
Change Control
Large software projects can require a formal process for evaluation and
approval each time a developer asks to make changes. A formal process can
be too restrictive, so be selective when selecting the control mechanisms you
introduce into the system.
Deal cautiously with changes to specific components, such as documents
related to user requirements, because they generally are worked out through
several iterations with the customer. In this case, the word customer is
used in a general sense. You can be the customer, other departments in a
company can be the customer, or you can develop the software under
contract for a third party. When you are the customer, adjusting
requirements as you move through the specification and even the design
stage is much easier. If you are developing for someone else, changing
requirements is more difficult.
Source control gives you a degree of control when making changes. You can
track all changes, and you can configure a source control provider to
maintain previous versions so you can undo changes if necessary. Some
source control providers give you more options for controlling software
change. For example, with Microsoft Visual SourceSafe, IBM Rational
ClearCase, or Perforce, you can control access to files so some users have
access to specific files but others do not. You also can specify that anyone
can retrieve files but only certain users can make modifications.
With this kind of access control, consider limiting change privileges for
requirement documents to specific team members. You also can control
access so a user has privileges to modify a file only with the approval of the
change request.
The amount of control you apply varies throughout the development
process. In the early stages of the project, before formal evaluation of the
requirements, you do not need to strictly restrict change access to files nor
do you need to follow formal change request processes. After the
requirements are approved, however, you can institute stronger controls.
6-4
ni.com
Lesson 6
Implementing Code
Apply the same concept of varying the level of control to specifications, test
plans, and code before and after completing a project phase.
Perforce
Refer to the KnowledgeBase for the most current list of third-party source
control providers that work with LabVIEW.
6-5
Lesson 6
Implementing Code
If you use source control with VIs outside of a LabVIEW project, you
cannot perform source control operations on project-specific items, such as
project libraries (.lvlib) or projects (.lvproj).
When you attempt to perform source control operations on a VI in an LLB,
LabVIEW performs the operations on the LLB that contains the VI, not on the VI itself.
You cannot perform a source control operation on only one VI in an LLB.
Note
Get Latest VersionCopies the latest version of the selected file from
source control to the local directory to synchronize the two versions. The
latest version of the file in source control overwrites the version in the
local directory.
Check InChecks the selected file into source control. A new version
with the changes you made replaces the previous version in source
control.
Check OutChecks out the selected file from source control. If you try
to edit a file in source control that you did not check out, LabVIEW
prompts you to check out the file if you configured source control to
enable the prompt.
Be careful when you remove files from source control. Some source control
providers delete the local directory copy of the file, all previous versions of the file that
the provider maintains, and the history log for the file.
Caution
6-6
ni.com
Lesson 6
Implementing Code
6-7
Lesson 6
Implementing Code
6-8
ni.com
Lesson 6
Implementing Code
6-9
Lesson 6
Implementing Code
Variant Data
Variant data do not conform to a specific data type and can contain
attributes. LabVIEW represents variant data with the variant data type. The
variant data type differs from other data types because it stores the control
or indicator name, information about the data type from which you
converted, and the data itself, which allows LabVIEW to correctly convert
the variant data type to the data type you want. For example, if you convert
a string data type to a variant data type, the variant data type stores the text
and indicates that the text is a string.
Use the Variant functions to create and manipulate variant data. You can
convert any LabVIEW data type to the variant data type to use variant data
in other VIs and functions. Several polymorphic functions return the variant
data type.
Use the variant data type when it is important to manipulate data
independently of data type, such as when you transmit or store data; read
and/or write to unknown devices; or perform operations on a heterogeneous
set of controls.
6-10
ni.com
Lesson 6
Implementing Code
the function of the consumer. The variant data then passes into the Case
structure, where the variant data is converted to the data type. The advantage
to using this data type is any other event cases can pass any type or form of
data to the consumer. This provides for scalable and readable code.
If you are using the Real-Time platform, replace the variant data type with a string
data type.
Note
Job Aid
Use the following checklist to implement scalable architectures.
Use a single frame Sequence structure to initialize a design pattern.
Make sure that all architectures perform a proper initialization and
cleanup.
Implement the control code using a type defined enumerated type
control.
6-11
Lesson 6
Implementing Code
Exercise 6-1
Goal
Implement a design pattern as the basis for the application architecture.
Scenario
Using a design pattern for the architecture makes the application readable,
scalable, and maintainable. Implementing the producer/consumer (events)
design pattern makes the user interface more responsive. Using a variant
data type makes the architecture scalable for future needs.
Design
1. Create a type definition for the functions that the application performs.
2. Use the type definition as the data type to pass data from the producer to
the consumer.
3. Initialize the design pattern.
4. In the consumer loop of the design pattern, make sure a case exists to
process each function in the enumerated data type.
5. Enqueue an element into the producer/consumer with (events) queue
when an event is received in the producer.
6. Create a custom run-time menu to perform the Load, Save, and Exit
functions.
7. Add a case to the Event structure in the producer loop to respond to
menu selections.
8. Create user events that allow the consumer loop to send error data to the
producer loop to stop the producer
Implementation
Implement the scalable architecture that you chose in Exercise 4-5.
1. Open the TLC Main VI in the Project Explorer window.
2. Complete the steps below to build a functioning producer/consumer
(events) design pattern as shown in Figure 6-4.
6-12
ni.com
Implementing Code
Lesson 6
6-13
Lesson 6
Implementing Code
Initialize
Record
Load
Save
Play
Move Cue Up
Select Cue
Delete
Stop
Exit
6-14
ni.com
Lesson 6
Implementing Code
Select Type Def. from the Type Def. Status pull-down menu.
Save the type definition as tlc_Consumer Control.ctl in the
C:\Exercises\LabVIEW Intermediate I\
Course Project\Controls directory.
6-15
Lesson 6
Implementing Code
6-16
ni.com
Lesson 6
Implementing Code
Delete the control from the TLC Main VI. You use this custom
control reference when you build the display module.
8. In the consumer loop of the design pattern, make sure a case exists to
process each function in the enumerated data type.
Place the Unbundle by Name function outside the Case structure in
the consumer loop.
Wire the element output of the Dequeue Element function to the
input of the Unbundle by Name function.
Delete the error cluster wire connected to the case selector terminal.
In a later exercise you implement a functional global variable to
handle errors in the application.
Wire the Command element of the Unbundle by Name function to
the case selector terminal of the Case structure.
Right-click the border of the Case structure and select Add Case
For Every Value from the shortcut menu to populate the Case
structure with the items in the enumerated type control.
Wire a False constant to the loop condition terminal of the While
Loop in each case of the Case structure. Change the constant in the
Exit case to True to enable the Exit case to stop the consumer loop.
Wire the queue out refnum and error cluster through each of the
cases.
9. Create an event case in the producer loop to respond to the Value Change
event for the Play button.
Right-click the Event structure and select Add Event Case from the
shortcut menu to open the Edit Events dialog box.
Select the Play button from the Event Sources list and select Value
Change from the Events list.
Click the OK button.
10. Modify the Play event case to send a message to the consumer loop to
execute Play, as shown in Figure 6-6.
6-17
Lesson 6
Implementing Code
6-18
ni.com
Lesson 6
Implementing Code
Repeat this step for the remaining the controls, changing the
command the producer sends to the consumer to correspond to the
appropriate function.
The following table shows the appropriate enumerated type control item
to place in the queue when each control receives a value change event.
Control
Enum Item
Record button
Record
Play button
Play
Move Cue Up
Select Cue
Delete button
Delete
Stop button
Stop
12. Place the Record, Play, Up, Down, Delete, and Stop controls in the
corresponding event cases to ensure that the control is read when the
control generates an event.
Because you duplicate event cases, place each terminal in the corresponding event
case after you create all the event cases. If you duplicate an event case with the terminal
in the event case, you also duplicate the terminal. Placing a terminal in the corresponding
event case is good programming style because it ensures that LabVIEW reads the
terminal when the event occurs.
Tip
13. Create a custom run-time menu to perform the Load, Save, and Exit
functions. Figure 6-7 shows the completed menu.
6-19
Lesson 6
Implementing Code
Enter an underscore (_) before the letter you want to associate with the <Alt> key
for that menu. When you associate a letter with the <Alt> key, the user can press the
<Alt> key and the associated key to access the menu.
Tip
Click the blue + button on the Menu Editor toolbar to add a new item
under the File item.
Click the right arrow button on the toolbar to make the new item a
subitem of the File menu.
Enter _Open... in the Item Name textbox to create a menu item
for Open.
Modify the Item Tag to Open.
Assign the shortcut <Ctrl+O> to this menu item.
The Item Tag is passed to LabVIEW so that you can create decision making code
to respond to the selected menu item.
Note
Click the blue + button on the Menu Editor toolbar to add a new item
under the File item.
Click the right arrow button on the toolbar to make the new item a
subitem of the File menu.
Enter _Save... in the Item Name textbox to create a menu item
for Save.
Modify the Item Tag to Save.
Assign the shortcut <Ctrl+S> to this menu item.
Click the blue + button on the Menu Editor toolbar to add a new item
under the FileSave item.
Create a menu Separator by selecting Separator from the Item
Type drop-down menu.
Click the blue + button on the Menu Editor toolbar to add a new item
under the File item.
Click the right arrow button on the toolbar to make the new item a
subitem of the File menu.
Enter E_xit in the Item Name textbox to create a menu item for
Exit.
6-20
ni.com
Lesson 6
Implementing Code
6-21
Lesson 6
Implementing Code
Wire the queue reference and error cluster wires through the
remaining cases in the Case structure. You build the remaining cases
in later exercises.
15. Complete the block diagram as shown in Figure 6-9 to create user events
that allow the consumer loop to send error data to the producer loop to
stop the producer.
Right-click the border of the Event structure in the producer loop
and select Show Dynamic Event Terminals from the shortcut
menu.
Place the Create User Event function on the block diagram. This
function creates a user event based on the data type passed to it.
Create an error constant and wire it to the user event data type
input. Label the error constant error.
Place the Register for Events node on the block diagram. This
function dynamically registers the user event. Wire the output of the
Register for Events node to the dynamic terminal of the Event
structure.
6-22
ni.com
Implementing Code
Lesson 6
6-23
Lesson 6
Implementing Code
Add the Dynamic Event case to the Event structure. Right-click the
Event structure border and select Add Event Case from the shortcut
menu. Notice that the name of the dynamic event is the same as the
owned label for the data structure that is wired to the Create User
Event function. Select the dynamic <error>: User Event from the
Event Sources list and click the OK button.
Wire status output from the event data node to the loop condition
terminal.
Place the Unregister for Events function on the block diagram. This
function unregisters the dynamic event.
Place the Destroy User Event function on the block diagram. This
function destroys the reference to the user event.
16. Create a custom control for the user event reference that the Create User
Event function generates. This reference generates user events within
subVIs.
Right-click the user event out terminal of the Create User Event
function and select CreateControl from the shortcut menu to
create the reference, shown at left.
Double-click the user event out reference to locate the object on the
front panel.
Right-click the control and select AdvancedCustomize from the
shortcut menu to open the Control Editor.
Select Type Def. from the Type Def. Status pull-down menu.
Label the control tlc_User Event Reference.ctl.
Save the control as tlc_User Event Reference.ctl in the
C:\Exercises\LabVIEW Intermediate I\Course
Project\Controls directory.
6-24
ni.com
Lesson 6
Implementing Code
17. Delete the event cases on the Event structure that are left over from the
design pattern.
18. Wire the Release Queue, Unregister for Events, and Destroy User
Events functions, and the Merge Error VIs as shown in Figure 6-9.
19. Connect the error in and error out clusters to the design pattern as
shown in Figure 6-9.
20. Save the VI.
Testing
1. Place a One Button Dialog function in each case of the consumer loop.
Wire a string constant to the message input of the One Button Dialog
function to open a dialog box indicating that the case executes when the
front panel receives events.
You can use the following code to easily wire the name of the executing case to the
One Button Dialog function. You also can use this technique to convert an enum to a
string.
Tip
6-25
Lesson 6
Implementing Code
4. Verify that you can exit the application from the run-time menu.
5. Close the TLC Main VI.
6-26
ni.com
Lesson 6
Implementing Code
C. Implementing Code
Developing code and interfaces is the process of implementing the
actual VI. Good software design techniques ensure that you create
VIs that are scalable, readable, and maintainable. When you implement
code, you also must provide a timing mechanism and document the VI.
Add as few bends in the wires as possible and keep the wires short.
Avoid creating wires with long complicated paths because long wires
are confusing to follow.
Avoid using local variables when you can use a wire to transfer data.
Every local variable that reads the data makes a copy of the data. Use
global and local variables as sparingly as possible.
6-27
Lesson 6
Implementing Code
Make sure data flows from left to right and wires enter from the left and
exit to the right.
Use comments on the block diagram to explain what the code is doing.
The free label located on the Decorations palette has a colored
background that works well for block diagram comments. This free
label is the standard for comments. Remember that comments in the
block diagram are more likely to be read than the VI, so it is important
to use correct spelling and grammar.
Use small free labels with white backgrounds to label long wires to
identify their use. Labeling wires is useful for wires coming from shift
registers and for long wires that span the entire block diagram.
When using free labels on wires, it is good practice to indicate the flow
of data using the greater than (>) or less than (<) characters.
Use labels on Call Library Function Nodes to specify what function the
node is calling and the path to the library the node calls.Use free labels
to document algorithms that you use on the block diagrams. If you use
an algorithm from a book or other reference, provide the reference
information.Do not show labels on function and subVI calls because
they tend to be large and unwieldy. A developer looking at the block
diagram can find the name of a function or subVI by using the Context
Help window.
6-28
ni.com
Lesson 6
Implementing Code
You can use the information that is located in the Context Help window to
create a free label comment on the block diagram that documents the
configuration of Express VIs, as shown in Figure 6-13.
6-29
Lesson 6
Implementing Code
Data binding is another tool that hides its functionality in a VI. The VIs in
Figure 6-14 and Figure 6-15 communicate with one another using shared
variables, but there is no indication of that functionality on either block
diagram.
The VI in Figure 6-15 reads data from the VI in Figure 6-14. There is
nothing on the block diagram to indicate that this VI reads data through a
shared variable. Looking at the VI in Figure 6-15, you would not expect the
waveform graph to update. But, when you run the VI, it receives data. You
should always clearly document VIs that receive data through data binding.
6-30
ni.com
Lesson 6
Implementing Code
You can use free labels to indicate the behavior and functionality of the VIs,
as shown in Figure 6-16 and Figure 6-17.
When you use the tools that are included with LabVIEW, always provide
block diagram comments to indicate the functions they perform.
6-31
Lesson 6
Implementing Code
Eliminate Constants
Block diagrams that contain numerous constants can become
unmanageable. It also can be difficult to maintain code when numerous
constants are used throughout the application. An alternative to using
constants is to place the values of the constants into configuration files.
Creating Configuration Files
Use the Configuration File VIs to read and create standard Windows
configuration settings (.ini) files and to write platform-specific data, such
as paths, in a platform-independent format so that you can use the files these
VIs generate across multiple platforms. The Configuration File VIs do not
use a standard file format for configuration files. While you can use the
Configuration File VIs on any platform to read and write files created by the
VIs, you cannot use the Configuration File VIs to create or modify
configuration files in a Mac OS or Linux format.
Refer to the labview\examples\file\config.llb for examples of
using the Configuration File VIs.
6-32
ni.com
Lesson 6
Implementing Code
The standard extension for Windows configuration settings files is .ini, but the
Configuration File VIs work with files with any extension, provided the content is in the
correct format.
Note
You can use the Configuration File VIs to read this data, as shown in the
following block diagram. This VI uses the Read Key VI to read the key
named Value from the section called Data. This VI works regardless of how
the file changes, provided the file remains in the Windows configuration
settings file format.
Windows configuration settings files are text files divided into named
sections. Brackets enclose each section name. Every section name in a file
must be unique. The sections contain key/value pairs separated by an equal
sign (=). Within each section, every key name must be unique. The key name
represents a configuration preference, and the value name represents the
setting for that preference. The following example shows the arrangement
of the file:
[Section 1]
key1=value
key2=value
[Section 2]
key1=value
key2=value
6-33
Lesson 6
Implementing Code
Use the following data types with Configuration File VIs for the value
portion of the key parameter:
String
Path
Boolean
The Configuration File VIs can read and write raw or escaped string data.
The VIs read and write raw data byte-for-byte, without converting the data
to ASCII. In converted, or escaped, strings LabVIEW stores any
non-displayable text characters in the configuration settings file with the
equivalent hexadecimal escape codes, such as \0D for a carriage return. In
addition, LabVIEW stores backslash characters in the configuration settings
file as double backslashes, such as \\ for \. Set the read raw string? or
write raw string? inputs of the Configuration File VIs to TRUE for raw
data and to FALSE for escaped data.
When VIs write to a configuration file, they place quotation marks around
any string or path data that contain a space character. If a string contains
quotation marks, LabVIEW stores them as \". If you read and/or write to
configuration files using a text editor, you might notice that LabVIEW
replaced quotation marks with \".
LabVIEW stores path data in a platform-independent format, the standard
Linux format for paths, in .ini files. The VIs interpret the absolute path
/c/temp/data.dat stored in a configuration settings file as follows:
(Windows) c:\temp\data.dat
(Linux) /c/temp/data.dat
(Windows) temp\data.dat
(Linux) temp/data.dat
6-34
ni.com
Lesson 6
Implementing Code
6-35
Lesson 6
Implementing Code
When naming VIs, LLBs, and directories, avoid using characters not all file
systems accept, such as backslash (\), slash (/), colon (:), and tilde (~).
Most operating systems accept long descriptive file names up to 255
characters.
Avoid creating files with the same name anywhere within the hierarchy.
Only one VI of a given name can be in memory at a time. If you have a VI
with a specific name in memory and you attempt to load another VI that
references a subVI of the same name, the VI links to the VI in memory. If
you make backup copies of files, be sure to save them into a directory
outside the normal search hierarchy so that LabVIEW does not mistakenly
load them into memory when you open development VIs.
Refer to the Creating VIs and SubVIs topic of the LabVIEW Help for more
information about saving VIs individually and in VI libraries.
Execution Timing
You can explicitly time a design pattern or time it based on events that occur
within the VI.
Use explicit timing for design patterns that perform some type of polling
while they execute. The master/slave, producer/consumer (data), queued
message handler, and standard state machine design patterns execute
continuously and monitor external inputs to control the execution of the
6-36
ni.com
Lesson 6
Implementing Code
The master loop executes continuously and polls for an event to send a
message to the slave loop. You need to time the master loop so it does not
take over the execution of the processor. In this case, you typically use the
Wait (ms) function to regulate how frequently the master loop polls.
Always use a timing function such as the Wait (ms) function or the Wait Until Next
ms Multiple function in any design pattern that continually executes and requires
regulation.
Tip
Notice that the slave loop does not contain any form of timing. The use of
Synchronization functions to pass messages provides an inherent form of
timing in the slave loop. The slave loop waits for the Notifier function to
receive a message. After the notifier receives a message, the slave loop
executes on the message. This creates an efficient block diagram that does
not waste processor cycles by needlessly polling for messages.
6-37
Lesson 6
Implementing Code
When you implement design patterns where the timing is based on the
occurrence of events, you do not have to determine the correct timing
frequency because the design pattern executes only when an event occurs.
In other words, the design pattern executes only when it receives an event.
For example, the producer/consumer (events) VI shown in Figure 6-1 does
not require any timing functions. The Event structure in the producer loop
controls when the producer loop executes. The Dequeue Element function
in the consumer loop waits until an item is placed in the queue, thus
controlling the execution of the consumer loop. Design patterns such as the
producer/consumer (events) and the user interface event handler do not
require any timing because external events control their timing.
6-38
ni.com
Lesson 6
Implementing Code
Figure 6-22. Software Timing Using the Get Date/Time In Seconds Function
The Get Date/Time In Seconds function, connected to the left terminal of the
shift register, initializes the shift register with the current system time. Each
state uses another Get Date/Time In Seconds function and compares the
current time to the start time. If the difference in these two times is greater
or equal to the wait time, the state finishes executing and the rest of the
application executes. Always use the Get Date/Time In Seconds function
instead of the Tick Count function for this type of comparison because the
value of the Tick Count function can rollover to 0 during execution.
To make the timing functionality modular and reusable, use the functional
global variable design pattern to build a timing VI as shown in Figure 6-23.
6-39
Lesson 6
Implementing Code
In this example, the Initialize case retrieves the current time using the Get
Date/Time In Seconds function and places the value into a shift register that
recirculates the time through the functional global variable. The Check Time
case subtracts the current time from the Recirculate Time shift register and
compares that value to the Time to Wait value to determine if the expected
time has elapsed. If the expected time has not elapsed, the Recirculate Time
value passes back into the shift register, otherwise the current time passes to
the shift register and the Time Elapsed Boolean value returns True.
By replacing the timing code in Figure 6-22 with the Timing functional
global variable in Figure 6-23, the VI becomes more readable and easier to
understand, as shown in Figure 6-24.
6-40
ni.com
Lesson 6
Implementing Code
Synchronization Timeout
All of the synchronization VIs can timeout after a specified number of
milliseconds have elapsed. For example, the Dequeue Element function can
timeout after a specified number of milliseconds. This can help if you want
to execute a function in a queued state machine, or a queue based design
pattern every specified number of milliseconds. Figure 6-25 shows an
example of a synchronization timeout.
6-41
Lesson 6
Implementing Code
6-42
ni.com
Lesson 6
Implementing Code
the structures. The input and output nodes provide configuration data and
return error and timing information from the structure. Timed structures also
can have terminals on the structure border that feed data into and out of the
structure subdiagrams.
Timed structures execute at a priority below the time-critical priority of any
VI but above high priority, which means that a timed structure executes in
the data flow of a block diagram ahead of any VI not configured to run at a
time-critical priority.
Timed Sequence Structure
Note
The Output node returns error information received in the error in input of
the Input node, error information generated by the structure during
execution, or error information from any task subdiagram that executes
within a frame of the Timed Sequence. The Output node also returns timing
and status information for the final frame.
Adding a VI set to time-critical priority and a Timed Sequence on the same block
diagram can lead to unexpected timing behavior.
Note
6-43
Lesson 6
Implementing Code
Timed Loop
The Left Data node of the Timed Loop provides timing and status
information about the previous loop iteration, such as if the iteration
executed late, the time the iteration actually started executing, and when the
iteration should have executed. You can wire data to the Right Data node to
configure the options of the next loop iteration dynamically, or you can use
the Configure Next Frame Timing dialog box to enter values for the
options. Refer to the Setting the Input Options of a Timed Structure
Dynamically topic of the LabVIEW Help for information about using the
Right Data node to dynamically change the behavior of the next iteration of
a Timed Loop.
The Output node returns error information received in the Error in input of
the Input node, error information generated by the structure during
execution, or error information from the task subdiagram that executes
within the Timed Loop. The Output node also returns timing and status
information.
Timed Loop with Frames
You can add frames to a Timed Loop to execute multiple timed subdiagrams
sequentially each iteration of the loop at the period you specify. A Timed
Loop with frames behaves like a regular Timed Loop with an embedded
Timed Sequence.
Note Adding a VI set to time-critical priority and a Timed Loop on the same block
diagram can lead to unexpected timing behavior.
6-44
ni.com
Lesson 6
Implementing Code
You can set configuration options of the Timed Loop by wiring values to the
inputs of the Input node, or you can use the Configure Timed Loop With
Frames dialog box to enter values for the options. Refer to the Configuring
Timed Loops topic of the LabVIEW Help for more information about
configuring a Timed Loop with frames.
The Left Data node of a Timed Loop frame provides timing and status
information about the previous loop iteration or frame. You can wire data to
the Right Data node of a Timed Loop frame to configure the options of the
next loop iteration dynamically, or you can use the Configure Next Frame
Timing dialog box to enter values for the options. Refer to the Setting the
Input Options of a Timed Structure Dynamically topic of the LabVIEW Help
for information about using the Right Data nodes to dynamically change the
behavior of the next frame or iteration of a Timed Loop.
The Output node returns error information received in the Error in input of
the Input node, error information generated by the structure during
execution, or error information from the task subdiagrams that executes
within the Timed Loop frames. The Output node also returns timing and
status information.
Setting Priorities of a Timed Structure
6-45
Lesson 6
Implementing Code
After the first frame of the Timed Sequence executes, LabVIEW checks the
priority of other structures or frames that are ready to execute. The priority
of the Timed Loop is higher than the priority of the second frame of the
Timed Sequence. LabVIEW executes an iteration of the Timed Loop and
then checks the priority of the structures or frames that are ready to execute.
The Timed Loop priority (100) is higher than the second frame of the Timed
Sequence (50). In this example, the Timed Loop executes completely before
the second frame of the Timed Sequence executes.
You can dynamically set the priority of subsequent iterations of a Timed
Loop or the priority of the next frame of a Timed Loop or Sequence by
wiring a value to the Priority input terminal of the Right Data node in the
current frame. Refer to the Setting the Input Options of a Timed Structure
Dynamically topic of the LabVIEW Help for information about dynamically
configuring priority values.
Selecting a Timing Source for Timed Structures
6-46
ni.com
Lesson 6
Implementing Code
Use the Source listbox in the Configure Timed Loop or Configure Timed
Sequence dialog boxes to select an internal timing source or use the Create
Timing Source VI to programmatically select an internal or external timing
source.
Internal Timing Sources
Internal timing sources for controlling a Timed Structure include the 1 KHz
clock of the operating system and the 1 MHz clock of a supported real-time
(RT) target.
Signal from TaskCreates a timing source that uses the signal you
specify to determine when a Timed Structure executes.
Use the VIs and functions on the Timed Structures and DAQmx palettes
to create external timing sources to control a Timed Structure.
National Instruments Corporation
6-47
Lesson 6
Implementing Code
Setting a Timeout
Job Aid
Use the following checklist when determining the timing mechanism to use
for an application.
Use event-based design patterns to simplify execution timing.
Use a functional global variable to perform software control timing.
6-48
ni.com
Lesson 6
Exercise 6-2
Implementing Code
Timing
Goal
Create a VI that uses the timing structures in LabVIEW to provide accurate
software controlled timing.
Scenario
The Theatre Light Controller requires accurate timing to control the cue
wait, fade, and follow time. The requirements for the Theatre Light
Controller require that the application respond within 100 ms when any
operation is running. So when choosing a method to accurately time the
Theatre Light Controller the timing method cannot interfere with the
application response. The timing structures in LabVIEW provide very
accurate timing. You also can control the timing structures while they are
running. You use the timing structures in LabVIEW to time the Theatre
Light Controller.
Design
Build a timing module that you can use to control the timing of the Theatre
Light Controller. The VI controls the timing for the wait, fade, and follow
times of the Theatre Light Controller. Use the timing structures to control
the timing.
This application requires a structure that has precise timing characteristics
and does not use the processor. However, the structure also must respond
when necessary for the wait, fade, and follow time requirements. Therefore,
the Timed Loop is the best timing structure to implement these timing
requirements.
A functional global variable provides for a good architecture to modularize
the timing functionality. The functional global variable has the following
functions:
6-49
Lesson 6
Implementing Code
Implementation
1. Create a new folder in the Modules folder called Timing.
2. Add the following files, located in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Modules\Timing directory
to the Timing folder.
tlc_Timing Command Control.ctl
tlc_Timing Module.vi
6-50
ni.com
Lesson 6
Implementing Code
6. Modify the Create case to create a timing source for the timing
structures as shown in Figure 6-26.
6-51
Lesson 6
Implementing Code
7. Create the Wait functionality by placing a Timed Loop in the Wait case
as shown in Figure 6-27.
6-52
ni.com
Lesson 6
Implementing Code
8. Create the Fade functionality by placing a Timed Loop in the Fade case
as shown in Figure 6-28.
6-53
Lesson 6
Implementing Code
9. Stop the Timed Loop when the Fade Time has elapsed.
Outside of the Timed Loop, add the Fade Time in milliseconds with
the cumulative offset time.
Compare if the Expected Start [i] time is greater than or equal to the
Fade Time added with the cumulative offset time.
Pass the result of the comparison through the Normal case of the
Case structure.
10. Wiring the Wakeup Reason from the Timed Loop to the Case Structure
allows the programmer to have very fine control over the operation of
the Timed Loop. Modify the code to stop the Timed Loop when the
Wakeup Reason is Aborted, Timing Source Error, or Timed Loop Error.
Wire a True constant to the Case structure tunnel that is connected
to the loop condition terminal on the Timed Loop in the following
cases: Aborted, Timing Source Error, and Timed Loop Error.
11. Modify the code to keep the Timed Loop running if the Wakeup Reason
is Asynchronous Wakeup, or Timeout.
Wire a False constant to the Case structure tunnel that is connected
to the loop condition terminal on the Timed Loop in the following
cases: Asynchronous Wakeup, and Timeout.
12. Wire the error and cue data through each case.
6-54
ni.com
Lesson 6
Implementing Code
13. Create the Follow functionality by placing a Timed Loop in the Follow
case as shown in Figure 6-29.
6-55
Lesson 6
Implementing Code
14. Modify the Shutdown case to clear the timing source as shown in
Figure 6-30.
15. Clear the Timing Source only if the Timing Source is not an Empty
String. The Empty String initializes the Timing module. After the
Timing Source is created, the name of the Timing Source passes through
the module. The Clear Timing Source VI generates an error if a
non-existent Timing Source is passed to the Clear Timing Source VI.
Place a Case structure in the Shutdown case.
Wire the Timing Source to the case selector terminal.
Verify that the Case structure contains two cases.
Change one of the cases of the Case structure to Anyname, and set
that case as the default case.
Place the Clear Timing Source VI in the Anyname case.
Change the second case to an empty ("") string.
Wire the diagram as shown in Figure 6-30.
16. Save the VI.
6-56
ni.com
Lesson 6
Implementing Code
6-57
Lesson 6
Implementing Code
Testing
A unit test VI is provided to verify the functionality of the Timing module.
The Unit Test VI repetitively calls the Timing module and uses the Get/Date
Time in Seconds function to determine how long the execution of the
Timing module takes.
1. Use the Unit Test VI to test that the Timing module returns the values
you specify in the Cue control.
Open tlc_Timing Module Unit Test.vi located in the
Timing folder in the Project Explorer window.
Observe the functionality of the Unit Test VI by examining the block
diagram.
Specify a value for the wait time, fade time, and follow time in the
Cue control.
Run the VI, and verify that the times returned match what you
specified in the Cue control.
2. Test the stopping capability of the Timing module.
Enter the Play Structure Names control in the tlc_Timing
Module Stop.vi to have the same structure names that are
specified in the tlc_Timing Module Unit Test.vi.
Run the tlc_Timing Module Stop.vi with the command
control set to Initialize.
Run tlc_Timing Module Unit Test.vi.
6-58
ni.com
Lesson 6
Implementing Code
6-59
Lesson 6
Implementing Code
General Techniques
Use the techniques and ideas described in this course to create the VIs that
function as modules or subVIs in a larger VI hierarchy. Develop with loose
coupling and strong cohesion to make your implemented VI modules more
scalable and maintainable.
6-60
ni.com
Lesson 6
Implementing Code
has no inherent verification that the data was logged correctly. You must
explicitly create a mechanism to determine that the module correctly stored
the data in the database, such as reading the value back from the database
and checking it against the original value.
Handling Errors
Whenever possible, correct any errors that occur in a module within the
module where the error occurs. When you cannot correct an error within the
module, return the error to the calling VI so that the calling VI can correct,
ignore, or display the error to the user. When you implement a module, make
sure the module handles any errors that it can. Include error clusters to pass
error information into and out of the module.
6-61
Lesson 6
Implementing Code
Using Libraries
LabVIEW Libraries are a powerful tool for organizing your modules. If you
are using libraries, include each module in its own library. Using a library
provides a number of benefits. First, a library allows you to clearly
differentiate between top-level VIs which should be called by external code,
and low-level VIs which the module uses as subVIs. The ability to mark VIs
in a library as public and private allows you to specify that no VI outside of
the module can call one of the low-level VIs, preventing confusion for
programmers using the module. Marking VIs as public or private also allows
you to make assumptions or requirements about the use of a private VI that
might not otherwise be safe. Libraries also create a namespace for your
module, thereby preventing difficulties if VIs in your module have the same
name as other VIs in memory. This feature is particularly useful when
distributing modules for use in an unknown environment. Finally, libraries
abstract your module from other VIs and allow you to easily organize your
modules within the project space.
6-62
ni.com
Lesson 6
Implementing Code
6-63
Lesson 6
Implementing Code
Remember that a VI remains in memory until all references to the VI are closed.
6-64
ni.com
Lesson 6
Implementing Code
delete the case that implements the functionality without deleting the item
in the enumerated type control that corresponds to that case. This allows you
to verify that external VIs that call the module no longer need that state.
Job Aid
Use the following checklist when you implement your code.
Avoid creating extremely large block diagrams. Limit the scrolling
necessary to see the entire block diagram to one direction.
Make sure data flows from left to right and wires enter from the left and
exit to the right.
Use free labels to document algorithms that you use on the block
diagrams. If you use an algorithm from a book or other reference,
provide the reference information.
While LabVIEW code can be self-documenting because it is graphical,
use free labels to describe how the block diagram functions.
Organize VIs in a hierarchical directory with easily accessible top-level
VIs and subVIs in subdirectories.
Consider using functional global variables instead of global variables.
Functional global variables do not create extra copies of data and allow
certain actions, such as initialize, read, write, and empty. They also
eliminate race conditions.
Align and distribute functions, terminals, and constants.
Avoid placing block diagram objects, such as subVIs or structures, on
top of wires, and do not wire behind objects.
Use path constants instead of string constants to specify the location of
files or directories.
Make good use of reusable, testable subVIs.
Use error in and error out clusters in all subVIs.
6-65
Lesson 6
Implementing Code
Make sure the program can deal with error conditions and invalid values.
Show name of source code or include source code for any CINs.
Use sequence structures sparingly because they hide code. If
flow-through parameters are not available and you must use a sequence
structure in the VI, consider using a Flat Sequence structure.
Save the VI with the most important frame of multiframed
structuresCase, Stacked Sequence, and Event structuresshowing.
Review the VI for efficiency, data copying, and accuracy, especially
parts without data dependency.
Make sure the subVI icon, rather than the connector pane, is visible on
the block diagram.
Use a type definition when you use the same unique control in more than
one location or when you have a very large data structure passing
between several subVIs.
If you open references to a LabVIEW object, such as an application,
control, or VI, close the references by using the Close Reference
function. It is good practice to close any reference you open
programmatically.
Make sure the Name Format for Property Nodes and Invoke Nodes is
set to Short Names to ensure the best readability of the block diagram.
Make sure control and indicator terminals on the connector pane are not
inside structures on the block diagram.
6-66
ni.com
Lesson 6
Exercise 6-3
Implementing Code
Implement Code
Goal
Observe and implement the VIs that you identified as modules for the
application.
Scenario
When you carefully plan and design an application, your implementation of
the system creates scalable, readable, and maintainable VIs. Implement the
Display, File, and Hardware modules. These are the major modules that you
identified for the Theatre Light Control Software application. You have
already implemented the Cue and Timing modules.
Design
The functional global variable approach you used to implement the cue and
timing modules provides for a very scalable, readable, and maintainable
method to build VIs. Continue to use a functional global variable to
implement the remaining modules for the application.
Display
The tight coupling that exists between the front panel and block diagram in
a VI requires that you update the front panel using terminals on the VI block
diagram, or use references from a subVI. Each of these methods has its
advantages and disadvantages. Updating a front panel directly using a
terminal is a very fast and efficient method of updating front panel controls
and indicators. However, you must have a way to get subVI data to the
top-level VI to update the front panel. You can loosed the tight coupling that
exists between the front panel and the block diagram by sending a message
from subVIs to the top-level VI that contains that control and indicator. An
ideal implementation for this is a functional global variable.
LabVIEW is inherently a parallel programming language. You can take
advantage of the parallelism by using a separate loop to update the user
interface. The separate loop contains a queue that stores commands to
perform inside the loop. You can use a functional global variable to control
the separate loop from anywhere in the application by placing commands in
the queue.
The display module uses a functional global variable to store the reference
for the display queue. This allows the module to be called from anywhere in
the application to control the separate display loop.
6-67
Lesson 6
Implementing Code
File
The file module calls the File I/O VIs. The file module provides the
functionality to initialize, load cues from a file, save cues to a file, and
shutdown. Implement the file module using the functional global variable
architecture.
Hardware
The hardware module calls the Theatre Light Control API. The hardware
module provides the functionality to initialize, write, and shutdown the
hardware.
Implementation
Display
The Display module provides a method to update the front panel controls
and indicators from anywhere in the application. This module populates a
queue that contains commands to perform and the data for the commands.
The display module performs the Initialize Front Panel, Update Front Panel
Channels, Select Cue in Cue List, Enable/Disable Front Panel Controls, and
Update Cue List functions.
To build a system that can perform these functions, you first must modify
the design pattern in TLC Main VI to have a third loop, and then create a
display module that is a functional global variable to send messages to the
third loop.
A queue that is specifically for the display loop controls the third loop. The
third loop only updates the user interface in the top-level VI.
Design Pattern Modification
1. Open the TLC Main VI.
2. Open the block diagram.
3. Modify the block diagram to have three loops. Create another queue to
pass data to the display loop as shown in Figure 6-34.
Place a While Loop on the block diagram.
Place a Case Structure inside the While Loop.
Place the Unbundle By Name function inside the While Loop.
6-68
ni.com
Lesson 6
Implementing Code
6-69
Implementing Code
Lesson 6
6-70
ni.com
Lesson 6
Implementing Code
Display Module
Create a module that stores which function to perform on the display. As the
application runs, update the display. Complete the following steps to create
the Display module.
1. Create a Display folder in the Modules project hierarchy.
2. Add tlc_Display Module.vi and tlc_Display Command
Control.ctl located in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Modules\Display directory
to the Display folder.
3. Open the tlc_Display Module.vi that you just added into the
LabVIEW project.
4. Complete the front panel of the Display module, shown in Figure 6-35.
6-71
Lesson 6
Implementing Code
front panel.
5. Complete the Initialize case as shown in Figure 6-36. The Initialize case
stores the queue reference in a shift register.
6-72
ni.com
Lesson 6
Implementing Code
6-73
Lesson 6
Implementing Code
Place the Enqueue Element function in the case and wire the Queue
Reference, Error Handler, and output of the Bundle By Name
function.
Modify the connector pane as shown in Figure 6-38.
7. Verify in the Shutdown case that all of the tunnels are wired. You do not
need to add any functionality to the Shutdown case.
8. Save and close the VI.
File
The File module saves and loads a file from the application. The File module
accepts an array of cues, a file path, and a command, and returns an array of
cues. The File module performs the Save Cues and Load Cues functions.
1. Create a File folder in the Modules project hierarchy.
2. Add tlc_File Module.vi located in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Modules\File directory to
the File folder.
3. Open the tlc_File Module.vi that you just added to the LabVIEW
project.
4. Observe the architecture and design of the File module. Notice that
standard File I/O VIs are used to perform the reading and writing of the
data.
Testing
Test the functionality of the VI with simple hand tests.
1. Set the Command control to Save Cues.
2. Use the Browse button on the Path control to provide a path to a new
file in the Path control. The Path control has been set to browse for new
or existing files.
3. Place dummy data in the Cue Array Input.
4. Run the VI.
6-74
ni.com
Lesson 6
Implementing Code
Hardware
The Hardware module interacts with the Theatre Light Control API. The
Hardware module performs the Write Color and Intensity function.
1. Create a Hardware folder in the Modules project hierarchy.
2. Add tlc_Hardware Module.vi located in the C:\Exercises\
LabVIEW Intermediate I\Course Project\Modules\
Hardware directory to the Hardware folder.
3. Open the tlc_Hardware Module.vi that you just added into the
LabVIEW project.
4. Observe the architecture and design of the hardware module. Notice that
the VI calls the Theatre Light Control API.
5. Close the VI.
6-75
Lesson 6
Implementing Code
6-76
ni.com
Lesson 6
Exercise 6-4
Implementing Code
Goal
Develop a module that handles the errors in the application.
Scenario
Handling errors is an important part of developing applications in
LabVIEW. When you are developing the application, you can use error
handling to help find bugs in the applications.
A good error handling strategy is to call a module that stores the error
information and safely stops the application if an error occurs.
Design
Using a functional global variable, store the error information in an
uninitialized shift register. If an error occurs, the VI sends a stop message to
the producer to shut the program down.
Implementation
1. Create a Error folder in the Modules project hierarchy.
2. Add the following files located in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Modules\Error directory to
the Error folder:
tlc_Error Module.vi
6-77
Lesson 6
Implementing Code
Drag the following files from the Controls folder in the Project
Explorer window to the Input Data section of the front panel.
tlc_User Event Reference.ctl
Modify the connector pane to pass the User Event Reference to the
VI as shown in Figure 6-40.
6-78
ni.com
Lesson 6
Implementing Code
6-79
Lesson 6
Implementing Code
6-80
ni.com
Lesson 6
Implementing Code
Summary
6-81
Lesson 6
Implementing Code
Notes
6-82
ni.com
Now that the project is complete, you implement the test plan. Use
techniques described in this lesson to verify code, test individual VIs, test
the integration of individual VIs into a larger system, and test the entire
system for functionality, performance, reliability, and usability.
Topics
A. Verifying the Code
B. Implementing a Test Plan for Individual VIs
C. Implementing a Test Plan for Integrating VIs
D. Implementing a Test Plan for the System
7-1
Lesson 7
Code Reviews
A code review is similar to a design review except that it analyzes the code
instead of the design. To perform a code review, give one or more developers
printouts of the VIs to review. You also can perform the review online
because VIs are easier to read and navigate online. Talk through the design
and compare the description to the actual implementation. Consider many
of the same issues included in a design review. During a code review, ask
and answer some of the following questions:
Are there any race conditions? A race condition is a block diagram that
reads from and writes to a global variable. A parallel block diagram has
the potential to simultaneously attempt to manipulate the same global
variable, resulting in loss of data.
Is the block diagram easy to maintain? Does the developer make good
use of hierarchy, or is he placing too much functionality in a single VI?
Does the developer adhere to established guidelines?
There are a number of other features you can look for in a code review. Take
notes on the problems you encounter and add them to a list you can use as a
guideline for other walk-throughs.
Focus on technical issues when doing a code review. Remember to review
only the code, not the developer who produced it. Do not focus only on the
negative; be sure to raise positive points as well.
7-2
ni.com
Lesson 7
effective strategy is to develop test cases that can identify the largest number
of errors in the application. The goal of a good test plan is to find the
majority of the errors.
The individual component VI you want to test is referred to as the unit under
test (UUT). You must perform unit testing before you perform system
integration testing. System integration testing evaluates how your VIs
perform with devices and software external to LabVIEW. The output of unit
testing is useful in performing system integration because it provides
structure information about the LabVIEW code. Use unit testing as one of
the many tools, methods, and activities to help ensure quality software.
Identify areas that need usability testing, such as the user interface
Functional tests
Error tests
Functional Tests
Functional tests focus on the most important aspects of a VI. Use functional
tests to determine if a VI works and functions as expected. A functional test
involves more than passing simple test data to a VI and checking that the VI
returns the expected data. Although this is one way to test a VI, you should
develop a more robust test.
A functional test should test for expected functionality as noted in the
requirements document. An easy way to create a functional test plan is to
7-3
Lesson 7
create a table with three columns. The first column indicates the action that
the VI should perform, as noted in the requirements document. The second
column indicates the expected result, and the third column indicates if the
VI generates the expected result. Using this table is a good way to create a
usable test plan for the listed requirements.
Testing Boundary Conditions
Functional testing also should include tests for boundary conditions, which
can be a common source of functional errors. A boundary condition is a
value that is above or below a set maximum. For example, if a requirement
calls for a maximum value, you should test (maximum value +1),
(maximum value 1), and maximum value. Creating tests this way
exercises each boundary condition.
Hand Checking
Another common form of functional testing is simple hand checking. This
type of testing occurs during the development of the VI but can help during
the testing phase. If you know the value that a VI should return when a
certain set of inputs are used, use those values as a test. For example, if you
build a VI that calculates the trigonometric sine function, you could pass an
input of 0 to the VI and expect the VI to generate a result of 0. Hand
checking works well to test that a VI functions.
Be careful that hand checks do not become too difficult to work with. For
example, if you pass the value 253.4569090 to the sine function, it would be
difficult to determine if the VI generated the correct results. You increase the
possibility of incorrectly determining the expected value of a VI when you
hand check with values that appear to add complexity to the test. In general,
passing more complex numbers to a VI does not provide better test results
than passing values such as 0 or 3.14. Make sure to pass data that is of the
same data type but do not complicate the test plan by using numbers that
make it difficult for you to calculate the expected result.
Error Tests
Error tests help you determine if the error handling strategy you designed
works correctly and make sure the error handling code performs as you
expect. Test the error handling code by creating test plans that force errors.
The error test should verify that the proper errors are reported and recovered.
The error test plan also should verify that the error handling code handles
errors gracefully.
7-4
ni.com
Lesson 7
Job Aid
Use the following checklist to help generate a test plan for a VI.
Develop the test plan before developing any code.
Develop a test plan for each requirement in the requirements document.
Test each boundary condition.
Test all the error handling capabilities of the VI.
Pass test data that you know is incorrect.
7-5
Lesson 7
Integration Testing
You perform integration testing on a combination of units. Unit testing
usually finds most bugs, but integration testing can reveal unanticipated
problems. Modules might not work together as expected. They can interact
in unexpected ways because of the way they manipulate shared data.
Note You can perform integration testing only in the LabVIEW Full and Professional
Development Systems.
You also can perform integration testing in earlier stages before you put the
whole system together. For example, if a developer creates a set of VIs that
communicates with an instrument, he can develop unit tests to verify that
each subVI correctly sends the appropriate commands. He also can develop
integration tests that use several of the subVIs in conjunction with each
other to verify that there are no unexpected interactions.
Do not perform integration testing as a comprehensive test in which you
combine all the components and try to test the top-level program. This
method can be expensive because it is difficult to determine the specific
source of problems within a large set of VIs. Instead, consider testing
incrementally with a top-down or bottom-up testing approach.
The bottom-up approach consists of tests that gradually increase in scope,
while the top-down approach consists of tests that are gradually refined as
new components are added.
7-6
ni.com
Lesson 7
7-7
Lesson 7
Sandwich Testing
Sandwich testing is a combination of bottom-up and top-down integration
testing. This method uses top-down tests to test the upper-level control.
Bottom-up tests are used to test the low-level hardware and system
functionality. This method takes advantage of the benefits that both
integration testing methods use, while minimizing their disadvantages.
Figure 7-3 shows an example of sandwich testing.
7-8
ni.com
Lesson 7
Regardless of the approach you take, you must perform regression testing at
each step to verify that the previously tested features still work. Regression
testing consists of repeating some or all previous tests. If you need to
perform the same tests numerous times, consider developing representative
subsets of tests to use for frequent regression tests. You can run these subsets
of tests at each stage. You can run the more detailed tests to test an individual
set of modules if problems arise or as part of a more detailed regression test
that periodically occurs during development.
Job Aid
Each of the integration testing methods except the big-bang method
emphasizes that units should be tested before they are integrated. Also, each
of the methods encourages you to test with incremental integration and to
test the system as components are added. Incremental integration enables
you to quickly identify and isolate which VIs generate errors. There is no
single incremental testing method that is best for testing a VI. However,
incremental integration saves time and helps you create more reliable
applications. Use the following checklist to determine if the incremental
testing strategy you use is adequate.
The strategy requires you to write fewer stub or driver VIs.
The strategy accurately tests if the VI meets the project requirements.
The strategy enables you to easily determine and locate errors.
The strategy does not introduce errors into the VI.
The strategy is repeatable.
The strategy is specific to the requirement.
7-9
Lesson 7
Exercise 7-1
Goal
Learn techniques to initialize and shutdown a set of code modules.
Scenario
The Initialize function places the application into a stable mode by
initializing all of the modules and clearing the user interface.
When the user selects the FileExit menu, the application should safely
shutdown. Safely shutting down an application requires closing all open
memory references.
Design
The Initialize function outlined in the requirements document performs the
following actions:
Initialize Error Module
Initialize Display Module
Initialize Cue Module
Initialize File Module
Initialize Hardware Module
Initialize Timing Module
Initialize Stop Timing Module
Disable Front Panel Controls
Initialize Front Panel
Update Cue List
Because you designed the modules to close open memory references, the
Shutdown VI accesses the function on the module to shutdown the module.
Also, Shutdown needs to send a Stop message to the display loop. Sending
a Stop message to the display loop causes that loop to finish executing. The
following modules need to shutdown: Display, Hardware, and File. You can
re-initialize the Cue module to delete any Cues that are stored in the
persistent shift register.
Implementation
The implementation of the Initialize VI involves calling the modules that
you built and wiring the correct data type to them. There is not a specific
order that is necessary to call the VIs. Follow the order in the Design section
just to be complete.
7-10
ni.com
Lesson 7
Initialize
1. Create an Integration folder in the Modules project hierarchy.
2. Add tlc_Initialize.vi located in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Integration directory to the
Integration folder.
3. Open the tlc_Initialize.vi that you just added into the LabVIEW
project.
4. Complete the block diagram as shown in Figure 7-4. Use the modules to
perform the initialization functions.
5. Create controls for the references by right-clicking the inputs of
tlc_Error Module.vi.
7-11
Lesson 7
7-12
ni.com
Lesson 7
12. Open the TLC Main VI and place the tlc_Initialize.vi in the
Initialize case of the consumer loop.
As you integrate each function into the application, delete the One Button Dialog
function in the corresponding case of the Case structure.
Tip
7-13
Lesson 7
Wire the user event out output of the Create User Event function to
tlc_Initialize.vi to initialize the error module with the
correct user event reference.
Wire the Queue Reference from the display loop to
tlc_Initialize.vi to initialize the error module and the display
module.
Wire the Queue Reference from the consumer loop to
tlc_Initialize.vi to initialize the error module.
Create a constant for the Number of Channels control. Assign the
constant the number of channels that you want.
Create a constant for Play Structure Names to provide names for the
Timing Structures. Provide a name for each structure in the constant.
13. Save the VI.
Shutdown
1. Add tlc_Shutdown.vi located in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Integration directory to the
Integration folder.
2. Open the tlc_Shutdown.vi that you just added into the LabVIEW
project.
3. Complete the block diagram as shown in Figure 7-7.
The Cue module is set to Initialize, which causes the shift register in the Cue
module to reinitialize with an empty Cue array.
Note
7-14
ni.com
Lesson 7
Testing
1. Run the TLC Main VI and select FileExit. Verify that the Shutdown
function causes the application to end. After you integrate the Display
functionality, you also can verify that the Initialize function executes.
7-15
Lesson 7
Exercise 7-2
Goal
Learn techniques to update the controls on the front panel.
Scenario
The design of this application splits the functionality into three separate
loops. The producer loop uses an Event structure to monitor changes to the
front panel. The consumer loop handles all of the processing for the
application. The display loop updates the user interface. The advantage to
this three loop architecture is that functionality is contained within
individual parallel processes. This increases performance and stability of
the application. Using the three loops also improves the maintainability and
scalability of the application.
Implement the code in the display loop to update the user interface.
Design
In order to perform the functions specified in the requirements document,
you need to have the following display functions: Initialize Front Panel,
Update Front Panel Channels, Select Cue in Cue List, Enable/Disable Front
Panel Controls, and Update Cue List. Implement these functions in the
display loop of the top-level VI. The advantage to implementing this code
on the top-level VI is that you have direct access to the terminals on the front
panel.
Implementation
1. Open the TLC Main VI.
2. Open the block diagram and edit the display loop.
Modify the following cases in the Case structure.
7-16
ni.com
Lesson 7
1. Use the Cue module to get an empty cue and wire the cue cluster to a
local variable of the front panel.
Drag the tlc_Cue Module.vi from the Cue folder in the Project
Explorer window to the Initialize Front Panel case.
Create a local variable for the Cue Information cluster on the front
panel and wire the output cue of the Cue Module to the local
variable.
Create an enumerated type constant for the command on the Cue
Module and set the constant to Get Empty Cue.
2. Save the VI.
7-17
Lesson 7
1. Create the code to select an item in the listbox on the front panel.
Select the Select Cue in Cue List case.
Place the Variant To Data function on the block diagram.
Right-click the Cue List control on the front panel and select
CreateLocal Variable from the shortcut menu.
Place the Cue List local variable in the Select Cue in Cue List case
and wire the data output of the Variant To Data function to the local
variable.
2. Save the VI.
1. Create the code to enable and disable the front panel controls as
specified in the requirements document. Use the Disabled property to
enable and disable the following front panel controls:
Cue List
Up
Down
Record
Delete
7-18
ni.com
Lesson 7
1. Create the code to update the items in the Cue List. Each time the Update
Cue List function is called, the Cue Module is called to return the
number of cues stored in the cue. The number of cues is passed to a For
Loop to iterate through each Cue in the Cue Module to get the Cue Name
of the cues.
Drag the tlc_Cue_Module.vi from the Cue folder in the Project
Explorer window to the Update Cue List case. Set the command to
Get Number of Cues.
Place a For Loop on the block diagram and wire the Number of
Cues output of the Cue module to the count terminal.
Drag the tlc_Cue_Module.vi from the Cue folder in the Project
Explorer window to the Update Cue List case. Set the command to
Get Cue Values.
Wire Cue Index to the iteration terminal of the For Loop.
7-19
Lesson 7
1. Create the Update Front Panel Channels code to write the channel data
directly to the Cue Information terminal.
Select the Update Front Panel Channels case.
Place a Variant To Data function on the block diagram.
Wire the Variant To Data function to the Cue control.
2. Save the VI.
7-20
ni.com
Lesson 7
Testing
1. Run the VI.
2. The Initialize function is called, which initializes the front panel. All of
the channels on the front panel should initialize with the correct channel
numbers.
7-21
Lesson 7
Exercise 7-3
Goal
Use a scalable data type to pass data from the user interface to the rest of the
application and use an Event structure to create a dialog box.
Scenario
The record function needs to prompt the user for the Cue Name, Wait Time,
Fade Time, Follow Time, and the settings for the channels. Prompt the user
with a modal dialog box where the user can enter values. After the user
enters the values, the values are placed into the Cue module, and the user
interface updates.
Design
To create the Record dialog box, start with the Dialog Based Events
framework. This framework uses an Event structure to monitor events on the
user interface. Add the functionality to retrieve the inputs from the user. Pass
a Cue Data type that was created from the producer loop into the consumer
loop to store the recorded cue in the application. Using a variant for the
design pattern makes it easier to perform this functionality.
Implementation
1. Create a modal dialog box that uses an Event structure to record the Cue
Name, Wait Time, Fade Time, Follow Time, and channel settings from
the user.
Select FileNew to open the New dialog box.
In the New dialog box, select VIFrom TemplateFrameworks
Dialog Using Events and make sure a checkmark appears in the
Add to Project checkbox.
Click the OK button to open the design pattern.
Save the VI as tlc_Record Dialog Box.vi in the
C:\Exercises\LabVIEW Intermediate I\
Course Project\Integration directory.
7-22
ni.com
Lesson 7
2. Modify the block diagram to initialize the front panel and pass the
results of the VI to the connector pane, as shown in Figure 7-14.
Place the Cue module outside the While Loop, and set the command
to Get Empty Cue.
Create an error in control on the Cue module.
7-23
Lesson 7
7-24
ni.com
Lesson 7
8. Open the tlc_Record.vi that you just added into the LabVIEW
project and complete the block diagram as shown in Figure 7-17.
7-25
Lesson 7
9. Place two Display Modules and one Cue Module in the No Error case.
10. Wire the Cue data to the Display Module and the Cue Module.
11. Create and set the enums as shown in Figure 7-17.
12. Save and close the VI.
13. Modify the consumer loop to call the Record VI and convert the variant
data into data that the Record VI can accept. Figure 7-18 shows the
completed Record case in the consumer loop.
7-26
ni.com
Lesson 7
Testing
1. Run the TLC Main VI.
2. Click the Record button and record a Cue.
3. If the application is running correctly, you should see that the front panel
channels update with the Cue you recorded, and the Cue List updates
with the name of the cue that you entered in the Record Dialog Box.
4. Stop the VI by selecting FileExit.
7-27
Lesson 7
Exercise 7-4
Goal
Learn a technique to execute a state machine design pattern in a
producer/consumer (events) design pattern.
Scenario
The Play functionality for the Theatre Light Controller is best implemented
as a state machine. Figure 7-19 shows the states of the Play function.
Start
Cue
Exists
Begin Play
Initialize
End
Wait Time
Follow Time
Fade Time
Cue Exists
Load Cue
Check for
Next Cue
7-28
ni.com
Lesson 7
Design
The Play function uses the Timing module to implement the wait, fade, and
follow timing requirements. The Timing module performs the majority of
the work. Modify the Timing module to perform the fade of the channels by
taking advantage of a pre-built VI that takes the desired channel data and
increments or decrements the channel intensity. Using a Timed Loop
Structure for this operation improves the performance and reliability of the
the fade timing requirements.
After you modify the Timing module, integrate the Play function into the
TLC Main VI. At this point in the exercise, you see how you can implement
a state machine in a producer/consumer design pattern.
Implementation
Build the play functionality to place in the consumer loop.
1. Open the Timing module and modify the Fade state to call the
tlc_Play_Update Cue.vi which calculates all of the channel
intensities and colors. The Fade state uses a Timed loop that runs for the
number of seconds specified by the Fade Time. Placing the VI that
calculates the channel and intensity inside the timed loop creates a
reliable channel fade.
Add tlc_Play_Update Cue.vi located in the C:\Exercises\
LabVIEW Intermediate I\Course Project\Integration
directory to the Integration folder.
Notice that the VI calls the Light Color Controller VI, which
calculates a color based on intensity.
7-29
Lesson 7
7-30
ni.com
Lesson 7
7-31
Lesson 7
Wire the error cluster and Queue reference to the tunnels on the True
case.
5. Save the VI.
Testing
1. At this point, you can run the VI, record a cue, and play the Cue.
2. Run the VI.
3. Record a cue with a single channel that contains a color other than black,
and an intensity of 100. Set the Wait time to 0, Fade time to 10, and
follow time to 0.
4. Click the Play button on the front panel of the VI.
5. The channel that you recorded should begin to fade from 0% intensity to
100% intensity within 10 seconds.
6. Try recording another cue and notice the response of the system.
7. Stop the VI by selecting FileExit.
7-32
ni.com
Lesson 7
Exercise 7-5
Goal
Learn how to flush a queue to guarantee when a command is sent.
Scenario
The requirements for the application state that the user can stop a playing
cue by clicking the Stop button on the front panel. This exercise implements
that capability.
Design
When the user clicks the Stop button, the Event structure generates an event
to process the Stop button. To guarantee that the application responds to the
Stop button, flush the queue that controls the consumer to remove any
messages stored in the queue. Also, stop the Timed Loops.
1. In the producer loop, modify the Stop event case to flush the queue and
call the tlc_Timing Stop Module.vi.
2. In the consumer loop, modify the Stop case to enable the front panel
controls.
Implementation
1. Open the TLC Main VI.
2. In the producer loop, modify the Stop event case to flush the queue and
call the tlc_Timing Stop Module.vi, as shown in Figure 7-23.
7-33
Lesson 7
3. In the consumer loop, modify the Stop case to enable the front panel
controls, as shown in Figure 7-24.
Place the Display module in the Stop case, and set the Data Type to
Enable/Disable Front Panel Controls. Wire a U8 numeric constant
set to 0 to the Data input.
Testing
1. Run the TLC Main VI.
2. Record a cue, and play the cue. Verify that the stop functionality works
by clicking the Stop button during play.
7-34
ni.com
Lesson 7
Exercise 7-6
Goal
Integrate an error handling module into the design pattern.
Scenario
The Error module that you built is designed to safely shutdown the
application if an error occurs. Shutting down the producer requires sending
a user event to the producer. Shutting down the consumer loop requires
placing a Exit message in the queue. Shutting down the display loop
requires placing a Stop message in the queue.
When designing and developing an application, it is always important to be
mindful of how the application should respond when an error occurs. With
the Theatre Light Controller, an error should cause the system to gracefully
shut down by executing the cases in each of the application loops that cause
the loops to stop.
If an error occurs, the Timed Loops inside the Timing module should also
be stopped by calling the tlc_Timing Stop Module.vi.
Design
Modify the TLC Main VI to call the Error module after each
computation in the producer, consumer, and display loop.
Implementation
1. Modify the TLC Main VI to call the Error module after each
computation in the producer, consumer, and display loop as shown in
Figure 7-25.
7-35
Lesson 7
7-36
ni.com
Lesson 7
Place the Error module from the Project Explorer window into the
individual loops.
Place an Error module after the Destroy User Event function.
Set the Command of the Error module to Report Errors.
Place the Simple Error Handler VI on the block diagram and wire
the output of the Error module to the error handler.
Wire the error out terminal to the output of the Simple Error
Handler.
2. Save the VI.
Testing
1. Test the error handling capability by placing a Diagram Disable
Structure over the Clear Specific Error VI in the tlc_Timing Stop
Module.vi.
You can use the Diagram Disable Structure to comment out code on the
Block Diagram. It is a useful tool for testing functionality or for trying to
isolate problem areas on the block diagram.
Open the tlc_Timing Stop Module.vi.
Place the Diagram Disable structure located on the Structures
palette over the Clear Specific Error VI as shown in Figure 7-26.
7-37
Lesson 7
Figure 7-27. Enabled Case of Stop Module with Diagram Disable Structure
7-38
ni.com
Lesson 7
Exercise 7-7
Goal
Use a scalable data type to pass data from the consumer to the producer.
Scenario
The file save and load functionality are important for the lighting designers
who use the software. Most theatres orchestrate a lighting scene during
dress rehearsals, and the lighting designer re-uses the lighting design from
dress rehearsal for opening night and beyond. Save and load functionality is
important for any large scale application.
Design
Modify the producer loop in the TLC Main VI to prompt the user for the file
name. Several checks need to occur to determine if the user cancels the file
operation or tries to open a file that does not exist.
Modify the Save case in the consumer loop to get the values stored in the
Cue module and pass the recorded Cues to the File module.
Modify the Load case in the consumer loop to open the file and extract the
saved cues, while populating the Cue module with the saved cues.
Implementation
Modify the Save case in the consumer loop to get the values stored in the
Cue module and pass the recorded Cues to the File module.
Save
1. Open TLC Main VI.
2. Modify the Save case in the Menu Selection event of the producer loop,
as shown in Figure 7-28.
7-39
Lesson 7
Note
7-40
ni.com
Lesson 7
7-41
Lesson 7
Load
Modify the Load case in the consumer loop to open the file and extract the
saved cues, while populating the Cue module with the saved cues.
1. Create the Open case in the Producer Menu Selection event as shown in
Figure 7-28.
Right-click the Save case, and select Duplicate Case from the
shortcut menu.
Enter Open in the case selector label.
Configure the File Dialog Express VI to Files Only, and Existing
File. Click the OK button.
Change the tlc_Consumer Control.ctl constant enum to
Load.
Delete the Open case that you created earlier in the course to test the
menu handling capability of the application.
2. Create a VI that loads the cues from a file.
Add tlc_Load.vi located in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Integration directory
to the Integration folder.
Open the tlc_Load.vi and modify the VI to load the cues from the
file, initialize the front panel, add the cues to the cue module, update
the cue list, and deselect any selection in the cue list as shown in
Figure 7-31.
7-42
ni.com
Lesson 7
In order to store the cues that are saved in the Cue module, you must
initialize the Cue module and pass the number of rows and columns to
the Cue module. The logic to perform this requires that you determine
the number of rows and columns saved in the cues. Access the first
element of the Cue array from the File module and unbundle the
channels. Use the Array Size function to return the number of elements
in each dimension. Use the Array to Cluster function with a size of 2 to
bundle the array from the Array Size function with two elements in the
cluster. The item with cluster order 0 indicates the number of rows. The
item with cluster order 1 indicates the number of columns.
Place the File module on the block diagram, and wire the Path
control to the Path input of the File module. Set the File module to
Load Cues.
Place the Display module on the block diagram and set it to Initialize
Front Panel.
Place the Cue module on the block diagram and set it to Initialize.
Place the Index Array function on the block diagram and wire the
Cue Array output from the File module to the Index Array function.
Place the Unbundle By Name function on the block diagram and
wire the output of Index Array to the function. Set the function to
Channels.
Wire the output of the Bundle By Name function to Array Size.
Place the Array To Cluster function on the block diagram and wire
to the Array Size function.
Right-click the Array To Cluster function and select Cluster Size
from the shortcut menu. Set the size to 2.
7-43
Lesson 7
6. Place the Variant to Data function in the Load case and complete the
wiring of the case.
7. Save the VI.
7-44
ni.com
Lesson 7
Testing
1. Run the TLC Main VI.
2. Record several Cues.
3. Select FileSave from the menu.
4. Save the data file as File Test.dat in the C:\Exercises\
LabVIEW Intermediate I directory.
5. Stop the VI by selecting FileExit.
6. Run the TLC Main VI.
7. Load the file you just saved by selecting FileOpen and navigating to
File Test.dat in the C:\Exercises\LabVIEW
Intermediate I directory. Verify that the cues are the ones you saved
earlier.
7-45
Lesson 7
Exercise 7-8
Goal
Use a modular design for implementing applications.
Scenario
The Select Cue function is specified to update the user interface with the
values in a selected recorded cue.
Design
There are two primary tasks that you must implement to build the Select Cue
functionality. The Select Cue function needs to get the cue values for the
selected cue and update the front panel with the cue values.
1. Modify the producer loop to pass the index of the selected cue to the
consumer loop.
2. Modify the consumer loop to get the selected cue value and update the
front panel.
Implementation
1. Open the TLC Main VI.
2. Modify the producer loop to pass the value of the selected cue to the
consumer loop, as shown in Figure 7-33.
In the Cue List event case of the TLC Main VI, wire the NewVal
event data node to the Variant input cluster.
7-46
ni.com
Lesson 7
3. Modify the consumer loop to get the selected cue value and update the
front panel, as shown in Figure 7-34.
Testing
1. Run the TLC Main VI to make sure everything still performs as you
expect. Verify the select cue functionality by recording several cues and
clicking each row in the cue list.
2. The Cue Information cluster on the front panel of the VI should update
with the selected cue in the cue list.
7-47
Lesson 7
Exercise 7-9
Goal
Use a modular design approach to improve the maintainability of an
application.
Scenario
The Move Cue function takes a currently selected cue in the cue list and
moves the cue up or down based on which button the user clicks.
Design
For the Move Cue function, the following set of common elements that
occur if the cue moves up or down.
You can build these common elements for the Move Cue Up and Move Cue
Down functions.
Moving a selected cue up requires verification that the selected cue is not the
first cue in the cue list. If the selected cue is not the first cue in the cue list,
the selected cue is swapped with the previous cue above it. Moving a
selected cue down requires a verification that the selected cue is not the last
cue in the cue list. If the selected cue is not the last cue in the cue list, the
selected cue is swapped with the cue below it.
Implementation
1. Add tlc_Move Cue.vi located in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Integration directory to the
Integration folder.
Open the tlc_Move Cue.vi that you just added into the LabVIEW
project.
Observe the functionality of the VI. Notice how the code that is
common to moving the cue up and moving the cue down has been
factored out of the VI. Modularizing and simplifying your
application in this way improves the readability, scalability, and
maintainability of the application.
2. Open the TLC Main VI.
7-48
ni.com
Lesson 7
3. Modify the Move Cue Up case in the consumer to call the tlc_Move
Cue.vi, as shown in Figure 7-35.
Place the Cue List terminal in the consumer loop, and wire the
terminal to a tunnel on the case structure.
Place tlc_Move Cue.vi in the Move Cue Up case, set the Cue
Operation to Move Cue Up, and wire the error clusters, and Cue List
data to the VI.
4. Modify the Move Cue Down case in the consumer loop to call
tlc_Move Cue.vi, as shown in Figure 7-36.
Place the tlc_Move Cue.vi in the Move Cue Down case, set Cue
Operation to Move Cue Down, and wire the error clusters and Cue
List data to the VI.
5. Save the VI.
7-49
Lesson 7
Testing
1. Run the TLC Main VI.
2. Load the File Test.dat that you created in the C:\Exercises\
LabVIEW Intermediate I directory by selecting FileOpen.
3. Select a cue in the Cue List and click the Up or Down button. Observe
that the cue moves up or down according to the button you click.
Challenge
1. Modify the tlc_Move Cue.vi to cause the selected row to move up or
down when the user clicks the Up button or Down button.
7-50
ni.com
Lesson 7
Scenario
The Delete function removes a selected cue from the Cue module and the
user interface.
Design
The Delete function deletes the selected cue from the Cue module, then
updates the cue list and deselects the selected cue in the cue list. Lastly, the
function initializes the front panel.
Implementation
1. Open the TLC Main VI.
2. Modify the Delete case in the consumer loop, as shown in Figure 7-37.
Place the Cue module in the Delete case and wire the Cue List
terminal to the Cue Index input. Set the Cue module to Delete Cue.
Place three instances of the Display module in the Delete case.
Set the first Display module to Update Cue List.
Set the second Display module to Select Cue in Cue List and pass a
1 I32 constant to the Data terminal.
Set the third Display module to Initialize Front Panel.
3. Save the VI.
7-51
Lesson 7
Testing
1. Run the TLC Main VI.
2. Load the File Test.dat that you created in the C:\Exercises\
LabVIEW Intermediate I directory by selecting FileOpen.
3. Highlight a cue in the Cue List and click the Delete button. The cue
should be removed from the Cue List.
7-52
ni.com
Lesson 7
Configuration
Performance
Stress/load
Functionality
Reliability
Usability
Every individual or company has its own method for testing a system. The
guidelines described in this section are suggestions for system testing, not requirements.
Do not change your existing testing strategy unless it is deficient.
Note
Configuration Tests
Use configuration tests to test variations in system and software
configurations. Include testing on multiple operating systems unless the
requirements document clearly specifies the operating system for the VI.
Configuration testing also includes running the VI on different screen
resolutions. Make sure the VI can display the required information on the
minimum screen resolution stated in the requirements document. Also, test
the VI on higher screen resolutions to ensure that the user interface items
remain proportional and are not distorted.
7-53
Lesson 7
Performance Tests
Performance tests define and verify performance benchmarks on the
features that exist in the VI. Performance tests include tests for execution
time, memory usage, and file sizes. The requirements document should
indicate any performance requirements for the VI. Make sure you test each
performance requirement in the requirements document.
The final implementation of the system must be able to meet the
performance requirements. The system should respond to the user within the
predefined limits specified in the requirements. Performance testing also
tests how well the software performs with external hardware and interfaces.
Check all interfaces outside the system to make sure the software responds
within set limits. You can use benchmarking in performance tests to evaluate
the performance of the system.
Stress/Load Tests
The stress/load tests define ways to push a VI beyond the required limits in
the specification. Typical stress/load tests include large quantities of data,
extended time testing, and running a large number of applications
concurrently with the VI. Stress/load testing helps guarantee that a VI
performs as required when it is deployed.
Functional Tests
The final implementation of a system must be functional to the level stated
in the requirements document. The easiest way to test for functionality is to
refer to the original requirements document. Check that there is a functional
implementation of each requirement listed in the requirements document.
Functional testing also must involve the customer at some point to guarantee
that the software functions at the level stated in the requirements. After you
complete functional testing and the software passes the software test, you
can verify the software as functional.
Reliability Tests
Testing the reliability of the system often involves using pilot testing to test
the system in a non-development environment. There are two forms of pilot
testingalpha and beta testing. Schedule alpha testing to begin when the
software first reaches a stage where it can run as a system. Alpha testing
typically involves a developer running the system on another computer. Beta
testing begins when most of the system is operational and implemented and
ready for user feedback. Pilot testing provides a good indication of how
reliable the software is when it is deployed on computers other than the
development computer. Pilot testing helps identify issues with hardware and
operating system compatibility.
7-54
ni.com
Lesson 7
You can complete this testing with alpha and beta testing. Alpha and beta
testing serve to catch test cases that developers did not consider or complete.
With alpha testing, test a functionally complete product in-house to see if
any problems arise. With beta testing, when alpha testing is complete, the
customers in the field test the product.
Alpha and beta testing are the only testing mechanisms for some companies.
Unfortunately, alpha and beta testing actually can be inexact and are not a
substitute for other forms of testing that rigorously test each component to
verify that the component meets stated objectives. When this type of testing
is done late in the development process, it is difficult and costly to
incorporate changes suggested as a result.
Alpha Tests
The main focus of alpha testing is to execute system tests, fix errors, and
produce beta-quality software. Beta-quality software is defined as software
ready for external customer use.
System tests should verify behavior from a user-interaction perspective.
Usually a developer does not test his or her own features. Execute system
tests and any relevant regression tests from previous releases. You also may
want to test existing features that have not been modified but that are
affected by new functionality.
Alpha testing usually involves making the software available to other
internal departments for testing, including departments whose products
interact with or depend on the software.
Beta Tests
Beta testing involves sending a beta version of the software to a select list of
customers for testing. Include a test plan that asks the users to test certain
aspects of the software.
Write additional systems tests to execute during the beta phase. Include
performance and usability tests. The tests executed during the alpha phase
should be executed again as part of beta testing. Also include time to test the
product by freely developing applications like users do. Consider that you
might need to create more test cases or update existing tests.
Usability
Usability measures the potential of a system to accomplish the goals of the
user. Some factors that determine system usability are ease-of-use, visual
consistency, and a clear, defined process for evolution.
Systems that are usable enable users to concentrate on their tasks and do real
work rather than focusing on the tools they use to perform tasks.
7-55
Lesson 7
Easy to learn
Efficient to use
Easy to remember
Enjoyable to use
Visually pleasing
1.
Match between system and the real worldThe system should speak
the users language, with words, phrases, and concepts familiar to the
user, rather than system-oriented terms. Follow real-world conventions,
making information appear in a natural and logical order.
7-56
ni.com
Lesson 7
Usability Testing
Usability testing is a cyclic process, resulting in several iterations of design
and test. A typical usability study includes three iterations and a final
meeting. Each iteration includes three stepsmeeting, testing, and report.
7-57
Lesson 7
There are many techniques you can apply to the usability process. No single
technique can ensure the usability of a product. Usability is an iterative
process that works best when it occurs in partnership with software
development.
Consider incorporating the following usability techniques into the
development and testing process:
7-58
ni.com
Lesson 7
Scenario
Before releasing an application, a set of system level tests must take place.
These tests can consist of usability testing, performance testing, stress, and
load testing.
Design
Create a large set of cues stored in a file that contain random wait times, fade
times, follow times, and channel colors and intensities. The VI used to
create the large set of cues requests from the user the maximum times to use
for the wait, fade, and follow so that it is easier to analyze the functionality
of the application.
Implementation
1. Open the System Testing Driver.vi located in the
C:\Exercises\LabVIEW Intermediate I\Course Project\
System Testing folder.
2. Open the block diagram and examine how this VI uses the modules that
you created to create a large set of Cues.
3. Switch to the front panel, and set the following front panel controls:
Wait Time = 0
Fade Time = 5
Follow Time = 0
7-59
Lesson 7
7-60
ni.com
Lesson 7
Summary
Design a test plan for a VI that uses functional and error tests.
Use integration testing to test the individual VIs as you integrate them
into a larger system.
Configuration
Performance
Stress/load
Functionality
Reliability
Usability
Design a system test that uses alpha and beta tests for reliability.
7-61
Lesson 7
Notes
7-62
ni.com
Evaluating VI Performance
Make it Right, Then Make It Fast Anonymous
Topics
A. Steps to Improving Performance
B. Using VI Metrics to Identify VI Issues
C. Further Identifying VI Issues with VI Analyzer (Optional)
D. Identifying Performance Problems
E. Fixing Performance Problems
8-1
Lesson 8
Evaluating VI Performance
1.
8-2
ni.com
Lesson 8
Evaluating VI Performance
For more information about VI metrics, refer to Using the VI Metrics Tool
in the LabVIEW Help.
8-3
Lesson 8
Evaluating VI Performance
Exercise 8-1
Goal
Determine the complexity of the VI.
Scenario
Using VI Metrics can determine the complexity of the VI to help in being
able to identify issues with the application.
Design
Run the VI Metrics tool to determine the complexity of the VI.
Implementation
1. Open the TLC Main VI.
2. Select ToolsProfileVI Metrics.
3. In the Show statistics for section, place checkmarks in the checkboxes
for Diagram, User interface, Globals/locals, CINs/shared lib calls,
and SubVI interface.
4. Notice that by using the modular approach to developing the application
that the max diag depth remains very low. This statistic indicates how
deeply a VI is nested. Also, notice the number of global and local
variables that this application uses.
5. When you finish viewing the VI Metrics, click the Done button.
8-4
ni.com
Lesson 8
Evaluating VI Performance
Note
The toolkit organizes the tests into the following main categories:
Performance
The tests in the following list analyze coding conventions that affect VI
performance.
8-5
Lesson 8
Evaluating VI Performance
Style
The tests in the following list analyze block diagrams for issues related to
LabVIEW style. Refer to the LabVIEW Style Checklist topic of the
LabVIEW Help for information about LabVIEW style.
Warnings
The tests in the following list analyze block diagrams for potential design
problems.
8-6
ni.com
Lesson 8
Evaluating VI Performance
handling disabled. You also can ignore nodes that usually have unwired
error outputs.
Pattern LabelChecks whether a file dialog box that uses file patterns
specifies a pattern label. The two items you can check are the File Dialog
function and the browse options on a path control.
8-7
Lesson 8
Evaluating VI Performance
Documentation Tests
The VI Analyzer groups the Documentation tests into the Developer and
User subcategories.
Developer Tests
The tests in the following list ensure that VIs contain documentation that
benefits other developers.
User Tests
The following test ensures that VIs contain documentation that benefits
users.
SubVI Tests
The tests in the following list check the appearance and arrangement of front
panel controls on VIs used as subVIs.
Cluster Sized to FitChecks that front panel clusters are set to Size to
Fit, Arrange Horizontally, or Arrange Vertically. If you do not select
8-8
ni.com
Lesson 8
Evaluating VI Performance
Clipped TextChecks that any visible text on the front panel is not cut
off. This includes text in control labels, control captions, free labels, and
text controls such as strings and paths. The test cannot check the text
inside listboxes, tables, tree controls, and tab controls.
8-9
Lesson 8
Evaluating VI Performance
General Tests
The VI Analyzer groups the General tests into three subcategories: File
Properties, Icon and Connector Pane, and VI Properties.
8-10
ni.com
Lesson 8
Evaluating VI Performance
VI Properties Tests
The tests in the following list analyze the overall setup of a VI.
VI Lock StateChecks the lock state of a VI. The test fails if the lock
state matches the user-specified lock state(s).
8-11
Lesson 8
Evaluating VI Performance
Exercise 8-2
Goal
Learn how to use the VI Analyzer to interactively test the style of a VI.
Scenario
Before deploying an application, it is important to verify that the code is
scalable, readable, and maintainable. Using the VI Analyzer can automate
this verification process.
Design
Run the VI Analyzer on the TLC Main VI.
Implementation
1. Open the TLC Main VI.
2. Select ToolsVI AnalyzerAnalyze VIs.
3. Select the Analyze the VI you are currently editing option.
4. Follow the prompts to start the VI Analyzer.
5. Identify style issues that are of a concern in the application with the VI
Analyzer.
8-12
ni.com
Lesson 8
Evaluating VI Performance
VI Performance Profiling
Use the VI Profile Window to identify the location of performance problems
in the VI.
The Profile Performance and Memory window is a powerful tool for
determining where your application is spending its time and how it is using
memory. The Profile Performance and Memory window has an
interactive tabular display of time and memory usage for each VI in your
system. Each row of the table contains information for a specific VI. The
time spent by each VI is divided into several categories and summarized.
The Profile Performance and Memory window calculates the minimum,
maximum, and average time spent per run of a VI.
You can use the interactive tabular display to view all or part of this
information, sort it by different categories, and look at the performance data
of subVIs when called from a specific VI. Select ToolsAdvancedProfile
VIs to display the Profile window.
The collection of memory usage information is optional because the
collection process can add a significant amount of overhead to the running
time of your VIs. You must choose whether to collect this data before
starting the Profile Performance and Memory window by checking the
Profile memory usage checkbox appropriately. This checkbox cannot be
changed once a profiling session is in progress.
Refer to the Using the VI Profile Window to Monitor VI Performance topic
in the LabVIEW Help for more information using the VI Profile Window.
8-13
Lesson 8
Evaluating VI Performance
Memory
In text-based programming languages, memory allocation, reallocation, and
deallocation cause many bugs and performance bottlenecks. In text-based
languages, you must allocate memory before you use it and deallocate
memory when you finish using it. Bounds checking does not occur when
you write to this memory, so you have to create your own tests to make sure
you do not corrupt memory.
The dataflow paradigm for LabVIEW removes much of the difficulty of
managing memory. In LabVIEW, you do not allocate variables, nor assign
values to and from them. Instead, you create a block diagram with
connections representing the transition of data.
Memory allocation still occurs, but it is not explicit on the block diagram.
This allows you to focus on developing the code to solve a problem rather
than allocating and deallocating memory. But, it is important to understand
how LabVIEW handles memory. Memory reallocation buffers and coercion
can affect memory in LabVIEW.
Memory Reallocation Buffers
LabVIEW tries to minimize the reallocation of memory. Reallocating
memory is an expensive operation because it involves allocating a larger
memory location and moving the contents from the previously allocated
memory to the new location. You can often fix memory issues by reducing
or preventing situations where LabVIEW must reallocate memory.
Consider the following block diagram, which creates an array of data. This
block diagram creates an array in a loop by constantly calling Build Array
to concatenate a new element. The input array is reused by Build Array. The
VI continually resizes the buffer in each iteration to make room for the new
array and appends the new element. The resulting execution speed is slow,
especially if the loop is executed many times.
8-14
ni.com
Lesson 8
Evaluating VI Performance
If you want to add a value to the array with every iteration of the loop, you
can see the best performance by using auto-indexing on the edge of a loop.
With For Loops, the VI can predetermine the size of the array (based on the
value wired to N), and resize the buffer only once.
With While Loops, auto-indexing is not quite as efficient, because the end
size of the array is not known. However, While Loop auto-indexing avoids
resizing the output array with every iteration by increasing the output array
size in large increments. When the loop is finished, the output array is
resized to the correct size. The performance of While Loop auto-indexing is
nearly identical to For Loop auto-indexing.
Auto-indexing assumes you are going to add a value to the resulting array
with each iteration of the loop. If you must conditionally add values to an
array but can determine an upper limit on the array size, you might consider
preallocating the array and using Replace Array Subset to fill the array.
When you finish filling the array values, you can resize the array to the
correct size. The array is created only once, and Replace Array Subset can
reuse the input buffer for the output buffer. The performance of this is very
8-15
Lesson 8
Evaluating VI Performance
8-16
ni.com
Lesson 8
Evaluating VI Performance
The number of bytes for extended-precision values varies for each platform.
You can coerce values in a VI, but the effects of coercion on memory can be
extreme. To improve memory use of a VI, minimize coercion, or eliminate
coercion entirely.
VI Execution Speed
Although LabVIEW compiles VIs and produces code that generally
executes very quickly, you want to obtain the best performance possible
when working on time-critical VIs. This section discusses factors that affect
execution speed and suggests some programming techniques to help you
obtain the best performance possible.
8-17
Lesson 8
Evaluating VI Performance
Other factors, such as execution overhead and subVI call overhead, usually
have minimal effects on execution speed.
Input/Output
Input/Output (I/O) calls generally incur a large amount of overhead. They
often take much more time than a computational operation. For example, a
simple serial port read operation might have an associated overhead of
several milliseconds. This overhead occurs in any application that uses
serial ports because an I/O call involves transferring information through
several layers of an operating system.
The best way to address too much overhead is to minimize the number of
I/O calls you make. Performance improves if you can structure the VI so that
you transfer a large amount of data with each call, instead of making
multiple I/O calls that transfer smaller amounts of data.
Screen Display
Frequently updating controls on a front panel can be one of the most
time-consuming operations in an application. This is especially true if you
use some of the more complicated displays, such as graphs and charts.
Although most indicators do not redraw when they receive new data that is
the same as the old data, graphs and charts always redraw. If redraw rate
becomes a problem, the best solutions are to reduce the number of front
panel objects and keep the front panel displays as simple as possible. In the
case of graphs and charts, you can turn off autoscaling, scale markers,
anti-aliased line drawing, and grids to speed up displays.
If you have controls overlapped with other objects, their display rate is
significantly slower. The reason for this is that if a control is partially
obscured, more work must be done to redraw that area of the screen. Unless
you have placed a checkmark in the Use smooth updates during drawing
checkbox, you might see more flicker when controls are overlapped. To
improve the performance of a VI, remove the checkmark from the Use
smooth updates during drawing checkbox.
As with other kinds of I/O, there is a certain amount of fixed overhead in the
display of a control. You can pass multiple points to an indicator at one time
using certain controls, such as charts. You can minimize the number of chart
updates you make by passing more data to the chart each time. You can see
8-18
ni.com
Lesson 8
Evaluating VI Performance
much higher data display rates if you collect your chart data into arrays to
display multiple points at a time, instead of displaying each point as it comes
in.
When you design subVIs whose front panels are closed during execution,
do not be concerned about display overhead. If the front panel is closed, you
do not have the drawing overhead for controls, so graphs are no more
expensive than arrays.
In multithreaded systems, you can use the AdvancedSynchronous
Display shortcut menu item to set whether to defer updates for controls and
indicators. In single-threaded execution, this item has no effect. However, if
you turn this item on or off within VIs in the single-threaded version, those
changes affect the way updates behave if you load those VIs into a
multithreaded system.
By default, controls and indicators use asynchronous displays, which means
that after the execution system passes data to front panel controls and
indicators, it can immediately continue execution. At some point thereafter,
the user interface system notices that the control or indicator needs to be
updated, and it redraws to show the new data. If the execution system
attempts to update the control multiple times in rapid succession, you might
not see some of the intervening updates.
In most applications, asynchronous displays significantly speed up
execution without affecting what the user sees. For example, you can update
a Boolean value hundreds of times in a second, which is more updates than
the human eye can discern. Asynchronous displays permit the execution
system to spend more time executing VIs, with updates automatically
reduced to a slower rate by the user interface thread.
If you want synchronous displays, right-click the control or indicator and
select AdvancedSynchronous Display from the shortcut menu to place a
checkmark next to the menu item.
Turn on synchronous display only when it is necessary to display every data value.
Using synchronous display results in a large performance penalty on multithreaded
systems.
Note
You also can use the Defer Panel Updates property to defer all new requests
for front panel updates.
8-19
Lesson 8
Evaluating VI Performance
8-20
ni.com
Lesson 8
Evaluating VI Performance
8-21
Lesson 8
Evaluating VI Performance
Exercise 8-3
Goal
Learn about the performance of different methods used to update indicators.
Description
There are three primary methods of updating a value on a user interface:
8-22
ni.com
Lesson 8
Evaluating VI Performance
Job Aid
Use the following checklist to identify and fix performance issues.
Ensure that the code is correct before trying to improve performance.
Use the Profile window to identify slow parts of the VI.
Minimize memory reallocations.
Minimize coercion dots.
Minimize I/O overhead.
Minimize front panel updates.
8-23
Lesson 8
Evaluating VI Performance
Summary
8-24
ni.com
Lesson 8
Evaluating VI Performance
Notes
8-25
Lesson 8
Evaluating VI Performance
Notes
8-26
ni.com
Implementing Documentation
Topics
A. Designing Documentation
B. Developing User Documentation
C. Creating Help Files
D. Describing VIs, Controls, and Indicators
9-1
Lesson 9
Implementing Documentation
A. Designing Documentation
The quality goals of the project determine the format and detail level of the
documentation you develop for requirements, specifications, and other
design-related documentation. If the project must meet a quality standard
such as the ISO 9000, the format and detail level of the documentation is
different from the format and detail level of an internal project.
LabVIEW includes features that simplify the process of creating
documentation for the VIs you design.
Print dialog box Use this dialog box to create printouts of the front
panel, block diagram, connector pane, and description of a VI. You also
can use it to print the names and descriptions of controls and indicators
for the VI and the names and paths of any subVIs. You can print this
information, generate text files, or generate HTML or RTF files that you
can use to create compiled help files.
9-2
ni.com
Lesson 9
Implementing Documentation
For each subVI, include information such as the VI name and description, a
picture of the connector pane, and a picture of the data type description for
each control and indicator on the connector pane.
To generate most of the documentation for VIs and controls, select FileVI
Properties and select Documentation from the Category pull-down menu.
Select FilePrint to print VI documentation in a format almost identical to
the format used in the VI and function reference information in the
LabVIEW Help. Use the Print dialog box to save the documentation to a file
and to create documentation for multiple VIs at once.
Documenting an Application
If you are developing an application for users who are unfamiliar with
LabVIEW, the documentation requires more introductory material. Create
a document that provides system requirements, basic installation
instructions, and an overview about how the package works. If the package
uses I/O, include hardware requirements and any configuration instructions
the user must complete before using the application.
For each front panel with which the user interacts, provide a picture of the
front panel and a description of the major controls and indicators. Organize
the front panel descriptions in a top-down fashion, with the front panel the
user sees first documented first. You also can use the Print dialog box to
create this documentation.
9-3
Lesson 9
Implementing Documentation
Start
User
Interface
Configure
System
Configuration
Error
Handler
Error?
Error?
Error?
Configure
Hardware
Error?
Acquire
Data
Hardware
Component
Save
Data
File
Handler
Read
Data
Analyzer
Revision Numbers
The revision number is an easy way to track changes to a VI. The revision
number starts at zero and increases incrementally every time you save the
VI. To display the current revision number in the title bar of the VI and the
title bar of the History window, select ToolsOptions, select Revision
History from the Category list, and place a checkmark in the Show
revision number in titlebar checkbox.
The number LabVIEW displays in the History window is the next revision
number, which is the current revision number plus one. When you add a
comment to the history, the header of the comment includes the next
revision number. The revision number does not increase when you save a
VI if you change only the history.
Revision numbers are independent of comments in the History window.
Gaps in revision numbers between comments indicate that you saved the VI
without a comment.
Because the history is strictly a development tool, LabVIEW automatically
removes the history when you remove the block diagram of a VI. The
History window is not available in the run-time version of a VI. The
General page of the VI Properties dialog box displays the revision number,
LabVIEW Intermediate I Course Manual
9-4
ni.com
Lesson 9
Implementing Documentation
even for VIs without block diagrams. Click the Reset button in the History
window to erase the revision history and reset the revision number to zero.
Creating VI Descriptions
Create and edit VI descriptions by selecting FileVI Properties and
selecting Documentation from the Category pull-down menu. The VI
description is often the only source of information about a VI available to
the user. The VI description appears in the Context Help window when you
move the cursor over the VI icon and in any VI documentation you generate.
Include the following items in a VI description:
An overview of the VI
9-5
Lesson 9
Implementing Documentation
Functionality
Data type
Default value (for inputs)You also can list the default value in
parentheses as part of the control or indicator name.
Behavior for special values (0, empty array, empty string, and so on)
Additional information, such as if the user must set this value always,
often, or rarely
9-6
ni.com
Lesson 9
Exercise 9-1
Implementing Documentation
Goal
Learn techniques to document the user interface.
Scenario
Document the user interface. You must document the front panel of every
VI that you create.
Design
Document the TLC Main VI. Documentation needs to include a VI
description, and each control and indicator needs a meaningful description
and tip.
Implementation
1. Open the TLC Main VI.
2. Select FileVI Properties and select Documentation from the
Category list. Insert the following documentation in the VI description
section:
Enter an overview of the VI
Enter instructions about how to use the VI
Click the OK button to close the Documentation page.
3. Include a description for every control and indicator. Right-click the
object and select Description and Tip from the shortcut menu to create,
edit, and view object descriptions. The object descriptions appear in the
Context Help window when you move the cursor over the object and in
any VI documentation you create.
Every control and indicator needs a description that includes the
following information:
Functionality
Data type
Valid range (for inputs)
Default value (for inputs)
9-7
Lesson 9
Implementing Documentation
You also can list the default value in parentheses as part of the
control or indicator label.
Behavior for special values (0, empty array, empty string, and so on)
4. Save the VI.
9-8
ni.com
Lesson 9
Implementing Documentation
9-9
Lesson 9
Implementing Documentation
Exercise 9-2
Implement Documentation
Goal
Learn about the LabVIEW features for creating professional documentation
for the application.
Scenario
Documentation is an important part of developing applications that are
scalable, readable, and maintainable. Also, the end user of the application
requires documentation in order to use the system. LabVIEW assists in
developing documentation. LabVIEW can automatically generate HTML,
or RTF documents that document the functionality of the application. After
LabVIEW generates the documentation, the developer can embellish the
documentation for other developers who maintain the application, and for
the end user.
Design
Use the Print dialog box to generate an HTML document that you can link
to the VI Properties of the TLC Main VI.
Implementation
1. Open the TLC Main VI.
2. Select FilePrint and select TLC Main.vi. Click the Next button.
3. Click the Next button in the Print dialog box.
4. Select Complete for the VI Documentation Style and click the Next
button.
5. Select HTML file in the Destination section and click the Next button.
6. Click the Save button on the HTML page.
7. Save the documentation as TLC Main.htm in the C:\Exercises\
LabVIEW Intermediate I\Course Project\Documentation
directory.
8. Select FileVI Properties and select Documentation from the
Category list.
9. Enter C:\Exercises\LabVIEW Intermediate I\Course
Project\Documentation\TLC Main.htm in the Help Path
textbox and click the OK button.
9-10
ni.com
Lesson 9
Implementing Documentation
Testing
1. Open the Context Help window.
2. Idle your mouse over the icon/connector pane of the TLC Main VI.
3. Click the Detailed help link in the Context Help window to load the
documentation for the application.
9-11
Lesson 9
Implementing Documentation
Summary
Use the History window and Print dialog box to create a documentation
framework.
Ensure that all design patterns are fully documented and commented.
9-12
ni.com
Lesson 9
Implementing Documentation
Notes
9-13
Lesson 9
Implementing Documentation
Notes
9-14
ni.com
10
Topics
A. Implementing Code for Stand-Alone Applications
B. Building a Stand-Alone Application
C. Building an Installer
10-1
Lesson 10
With these differences in mind, this section describes techniques you can
use when you create stand-alone applications to improve the application and
and conform to licensing requirements.
Single VI
VI in a Library
VI in an Application
10-2
ni.com
Lesson 10
If a VI uses the Current VI's Path function, make sure the function works as
expected in the application or shared library. In an application or shared
library, the Current VI's Path function returns the path to the VI in the
application file and treats the application file as an LLB. For example, if you
build foo.vi into an application, the function returns a path of
C:\..\Application.exe\foo.vi, where C:\..\Application.exe
represents the path to the application and its filename.
You must build code that has a relative file path independent of where the
VI resides so that LabVIEW can access the necessary support and data files.
One method to do this is to use the VI Server to return information about the
properties of the LabVIEW application as shown in Figure 10-2.
10-3
Lesson 10
You can have only one About VI per application. If you do not supply an
About VI, LabVIEW displays a default dialog box similar to the dialog box
that appears in the LabVIEW development system when you select Help
About.
Complete the following steps to create an About VI and include it in a
stand-alone application.
1. Build a VI with a front panel that contains the information you want to
display in the About dialog box, such as the version number, company
name, and copyright information. The About VI you create can share
subVIs with other VIs you include in the application. However, you
cannot use the About VI as a subVI because the About VI cannot run
while other VIs in the application run.
The front panel must include a National Instruments copyright notice. Refer to the
National Instruments Software License Agreement located on the LabVIEW Professional
Development System and Application Builder distribution CDs for more information
about the requirements for any About dialog box you create for a LabVIEW application.
Note
2. Build the block diagram of the About VI. For example, if you want the
About dialog box to appear until the user clicks a button, use a While
Loop on the block diagram.
3. Save the VI. The name of the VI must start with About.
4. Add the VI to the project from which you are building the application.
5. When you configure the application build settings, add the About VI to
the Dynamic VIs and Support Files list on the Source Files page of the
Application Properties dialog box.
6. From the Source File Settings page, select the About VI in the Project
Files tree. In the VI Settings section, make sure a checkmark does not
appear in the Remove Panel checkbox and that the destination is the
application.
7. Configure the remaining application build settings and build the
application.
Figure 10-3 shows an example of an About dialog box that would satisfy
the National Instruments Software License Agreement.
10-4
ni.com
Lesson 10
Figure 10-4 shows one method for implementing an About VI. The block
diagram uses an Event structure with one event case set to capture the
Mouse Down event. When the user clicks the About dialog box with the
mouse, the VI stops and closes.
Make sure that the settings in the VI Properties dialog box are correct.
For example, you might want to configure a VI to hide scroll bars, or you
might want to hide the buttons on the toolbar.
10-5
Lesson 10
If a VI uses the Current VI's Path function, make sure the function works
as expected in the application or shared library. In an application or
shared library, the Current VI's Path function returns the path to the VI
in the application file and treats the application file as an LLB. For
example, if you build foo.vi into an application, the function returns a
path of C:\..\Application.exe\foo.vi, where
C:\..\Application.exe represents the path to the application and
its filename.
Distributing Builds
10-6
ni.com
Lesson 10
If the VI uses custom run-time menus, make sure the application menu
items that the VI uses are available in the LabVIEW Run-Time Engine.
When you close all front panels in an application, the application stops.
If the VI you build into the application contains code that executes after
the last front panel closes, this code does not execute in the application.
Avoid writing block diagram code that executes after the last front panel
closes.
10-7
Lesson 10
Scenario
Most applications have an About dialog box that displays general
information about the application and the user or company that designed it.
You can create a VI that LabVIEW runs when a user selects HelpAbout to
display information about the stand-alone application you create.
When creating a stand-alone application, it is important to understand the
architecture of the Application Builder. A VI that is running as a stand-alone
executable remains in memory when the application finishes running. It is
necessary to call the Quit LabVIEW function in order to close the
application when the application finishes executing. Placing the Exit
LabVIEW function on the block diagram can make editing the application
more difficult in the future because LabVIEW exits each time the
application finishes. With the use of the Conditional Disable Structure, you
can specify if code should execute or not, without having to edit the block
diagram.
Stand-alone applications in LabVIEW should have the Window Appearance
set to Top-level application to cause the front panel to open when the VI
runs.
Design
1. Implement a dialog box VI that uses an Event structure to create an
About dialog box.
Create a dialog box VI that allows the user to click the mouse
anywhere on the VI panel to close the VI.
10-8
ni.com
Lesson 10
Implementation
About Dialog Box
1. Create a dialog box VI that allows the user to click the mouse button
anywhere on the VI panel to close the VI.
Create a new VI.
Set the Window Appearance of the VI to Dialog by selecting File
VI Properties and modifying the Window Appearance category.
Place any free text or images you want on the front panel of the VI.
Place error clusters on the front panel.
Switch to the block diagram and build the code that allows the user
to click the mouse button anywhere on the VI, as shown in
Figure 10-5.
directory.
Add an About folder below the Modules folder in the Project
Explorer window.
Place the About.vi in the About folder in the Project Explorer
window.
2. Modify the TLC Main VI so that the Run-Time Menu contains Help
About LabVIEW. This displays the About dialog box in the
10-9
Lesson 10
10-10
ni.com
Lesson 10
Figure 10-7. Conditional Disable Structure Enclosing the Quit LabVIEW Function
10-11
Lesson 10
Window Appearance
1. Select FileVI Properties and select Window Appearance from the
Category list.
2. Select Top-level application window and click the OK button.
3. Save the TLC Main VI.
10-12
ni.com
Lesson 10
10-13
Lesson 10
10-14
ni.com
Lesson 10
Source Files
The Source Files page includes the following components:
Startup VIsSpecifies the startup VIs, which are top-level VIs, to use
in the application. You must define at least one VI as a startup VI.
Startup VIs display and run when you launch the application. Click the
arrow buttons next to the Startup VIs listbox to add selected VIs from
the Project Files listbox or to remove selected VIs from the Startup VIs
listbox. When you add a VI to an application as a startup VI, the
application also includes the dependencies of the VI. When you add a
folder, you add all items in the folder and cannot remove individual
items.
Dynamic VIs are VIs that LabVIEW dynamically calls through the VI
Server. Support files are non-VI files, such as drivers, text files, help files,
and .NET assemblies that the application uses.
Destinations
The Destinations page includes the following components:
Destination labelSpecifies the name that the dialog box uses for the
directory selected in the Destinations listbox. Edit the label if you want
to change the name. You cannot change the name of the default
10-15
Lesson 10
Set inclusion type for all contained itemsAppears when you select
a folder in the Project Files tree. Place a checkmark in the checkbox to
specify how to include the items in the selected folder in the application.
10-16
ni.com
Lesson 10
Icon
When you create an application, you want it to have a professional
appearance. One way to make your application look more professional is to
provide a custom icon for the application. LabVIEW applications default to
the standard LabVIEW icon, shown at left, which does not give the customer
an idea of the functionality of your application.
Use the Icon page of the Application Properties dialog box to select the
icon file (.ico) to use for a stand-alone application. You can use the default
LabVIEW icon, select a custom icon file, or create an icon file. The page
displays previews of 32 32 and 16 16 pixel icons in color and in black
and white.
The Icon page includes the following components:
Icon file in projectSpecifies the icon file (.ico) to use for the
application. LabVIEW can import black-and-white and color icons in
10-17
Lesson 10
Icon EditorLaunches the Icon Editor dialog box, which you can use
to create or edit an icon file.
You also can use a third-party icon editor to create icons. Refer to the Icon
Art Glossary at ni.com for standard graphics to use in a VI icon. You also
can use the icon creation tool in LabWindows/CVI.
Advanced
The Advanced page includes the following components.
10-18
ni.com
Lesson 10
Use the default project alias fileAssociates the project alias file with
the application. If you remove the checkmark from the checkbox,
specify an alias file to use in Alias file in project.
Alias file in projectSpecifies the alias file to use with the application
if you do not enable Use the default project alias file. Click the Browse
button to display the Select Project File dialog box, which you can use
to select a file.
Run-Time Languages
Use this page of the Application Properties dialog box to set the language
preferences for a stand-alone application. You can select from all languages
that LabVIEW supports.
10-19
Lesson 10
Preview
Use the Preview page of the Application Properties dialog box to see a
preview of the stand-alone application build.
Note
10-20
ni.com
Lesson 10
Scenario
Creating a stand-alone application is important for distributing and
deploying your application. It is also a step in the creation of a professional
installer.
Design
Use the Application (EXE) Build Specifications to create a stand-alone
application for the Theatre Light Controller.
Implementation
1. Create a stand-alone application of the Theatre Light Controller.
Open the TLC.lvproj.
Right click Build Specifications and select NewApplication
(EXE) from the shortcut menu to open the Application Properties
dialog box.
On the Application Information page, specify a Build
specification name and Target filename.
Set the Application destination directory to C:\Exercises\
LabVIEW Intermediate I\Course Project\Builds\
Executable.
Select the Source Files page and select TLC Main.vi in the
Project Files listbox. Click the right arrow to place the VI in the
Startup VIs listbox.
Select About.vi in the ModulesAbout folder and click the right
arrow to place the VI in the Dynamic VIs and Support Files
listbox.
Select the Icon page and create a 16 color icon for both the 32 32
and 16 16 icons. Save the icon in the C:\Exercises\LabVIEW
Intermediate I\Course Project\Icons directory.
Select the Preview page and click the Generate Preview button to
preview the output of the Build Specification.
10-21
Lesson 10
Testing
1. Navigate to the directory you specified for the destination directory and
run the executable.
10-22
ni.com
Lesson 10
C. Building an Installer
You can use the Application Builder to build an installer for files in a
LabVIEW project or for a stand-alone application you created with a build
specification. Use installers to distribute stand-alone applications, shared
libraries, and source distributions that you create with the Application
Builder. Installers that include the LabVIEW Run-Time Engine are useful if
you want users to be able to run applications or use shared libraries without
installing LabVIEW.
Before you create a build specification or start the build process, review the
Caveats and Recommendations for Building Installers.
When you select files to include in the installer build from the page of
the Installer Properties dialog box, you cannot select part of a build
specification or a LabVIEW project library. You must include or exclude
build specifications and project libraries as a whole. The entire
specification or project library appears in the Destination View
directory.
If you want to include a project library in the installer build, make sure
the project library does not include files on a network or other files with
links that will break if moved. You cannot copy a project library from
the Project View directory to the Destination View directory if any of the
files are on different drives, or if the files do not share a common path
with the LabVIEW project file (.lvproj).
You can include custom error codes in the installer. The [LV80RTEDIR]
folder in the Destination View directory corresponds to the
Shared\LabVIEW Run-Time\8.0 directory. If you place a
checkmark in the Install custom error code files? checkbox on the
Advanced page, the installer build includes all error code files from
labview\project\errors and labview\user.lib\errors and
10-23
Lesson 10
Use the [LVDIR] folder in the Destination View directory to add files
to install in the directory of the latest version of LabVIEW that the user
has installed.
user.
Windows folder.
Refer to the Microsoft Installer documentation on the Microsoft Web site for
more information about using these folders.
10-24
ni.com
Lesson 10
10-25
Lesson 10
Refer to the Microsoft Web site for more information about Microsoft
Installer (MSI) properties.
Source Files
Use this page of the Installer Properties dialog box to add files to include
in the installer and to configure the destination directory structure.
This page includes the following components:
10-26
ni.com
Lesson 10
and press the <F2> key to rename it. You cannot rename top-level
folders, which appear in brackets in Destination View.
10-27
Lesson 10
Shortcuts
Use this page of the Installer Properties dialog box to create and configure
shortcuts for the installer. You can create multiple shortcuts for the same file.
This page includes the following components:
Target fileSpecifies the file to which the shortcut points. Click the
button next to the Target file text box to display the Select Target File
dialog box, which you can use to select a different file for the shortcut.
Registry
Use this page of the Installer Properties dialog box to create and configure
custom registry keys for the installer build. The structure of the Registry
page is similar to the Windows Registry Editor.
Avoid creating registry keys that other applications already create because
duplication might result in unexpected behavior.
LabVIEW Intermediate I Course Manual
10-28
ni.com
Lesson 10
Add ValueAdds a value to the registry key. The new value appears in
the Registry Values table. The default is a string value. Double-click
the value type in the table to change it.
Refer to the Microsoft Web site for more information about Microsoft
Installer (MSI) registry keys.
Additional Installers
Use this page of the Installer Properties dialog box to add installers for
National Instruments products and drivers, such as the LabVIEW Run-Time
Engine, to the installer build.
When you build the installer, make sure the product installer files are
available in the correct location. For example, you might need to insert the
CD that contains the product installer files into a CD drive.
10-29
Lesson 10
Install typeSpecifies the installer type to include for the installer you
select in the National Instruments Installers to Include listbox.
Installer types depend on the product. For example, types might include
Full or Run-Time.
10-30
ni.com
Lesson 10
Command-Line Argument
Description
[INSTALLDIR]
[ProductName]
[ProductVersion]
10-31
Lesson 10
Scenario
A professional application should always have an installer to deploy the
application. Providing an installer improves the end user experience with the
application.
Design
Create an installer build specification for the executable you created.
Implementation
1. Create an installer for the Theatre Light Controller.
2. Open TLC.lvproj.
Right-click Build Specifications and select NewInstaller from the
shortcut menu to open the Installer Properties dialog box.
On the Product Information page, specify a Build specification
name, and Product name.
Set the Installer destination to C:\Exercises\LabVIEW
Intermediate I\Course Project\Builds\Installer.
Select the Source Files page and verify that a folder that matches
your project name exists under ProgramFilesFolder. If no folder
exists for your project, add a folder and provide a meaningful name
for the folder.
In the Project View list, select the stand-alone application (EXE)
build specification. Click the arrow to place the EXE build
specification in the folder you created.
Select the Shortcuts page to create a shortcut to the
ProgramMenuFolder in Windows. Click the blue + button to open
the Select Target File dialog box. Select the EXE for your project
and click the OK button. Change the Name to Theatre Light
Controller. This places the item in the StartPrograms menu.
Select the Additional Installers page and verify that a checkmark
appears in the checkbox for the LabVIEW Run-Time Engine
installer.
10-32
ni.com
Lesson 10
Testing
1. Navigate to the installer destination directory you specified and run the
installer. After the installer runs, verify the installation of the Theatre
Light Controller.
10-33
Lesson 10
Summary
Verify that the relative file path handling is correct for built applications.
Use the Icon page of the Application Properties dialog box to select
the icon file (.ico) to use for a stand-alone application.
Use the Application Builder tools to create a build specification for and
build a stand-alone application (EXE).
10-34
ni.com
Lesson 10
Notes
10-35
Lesson 10
Notes
10-36
ni.com
This appendix describes the IEEE standards for software engineers and
includes a requirements document for the Theater Light Control system that
conforms to the IEEE 830 standard for requirements documents.
Topics
A. Institute of Electrical and Electronic Engineers (IEEE) Standards
B. IEEE Requirements Document
A-1
Appendix A
A.
Purpose
Reference documents
Management
Documentation
Test
Code control
Media control
Supplier control
Training
Risk management
As with the ISO standards, IEEE 730 is fairly short. It does not dictate how
to meet the requirements but requires documentation for these practices to a
specified minimum level of detail.
In addition to IEEE 730, several other IEEE standards related to software
engineering exist, including the following:
A-2
ni.com
Appendix A
Your projects may be required to meet some or all these standards. Even if
you are not required to develop to any of these specifications, they can be
helpful in developing your own requirements, specifications, and quality
plans.
Section 1: Introduction
This section provides an overview of the software requirements document.
Purpose
The purpose of this document is to provide a detailed, precise, and easy to
understand set of software requirements. Software developers use this
document as a reference to design, implement, and test the software. This
document serves as a basis to begin implementation of the software.
Scope
The scope of this document is to describe the software requirements for the
Theatre Light Control Software. The deliverables for the Theatre Light
Control Software will consist of the software system and software
documentation.
A-3
Appendix A
Fade Time Cue timing attribute that defines the time it takes, in
multiples of one second, before a channel reaches its particular intensity
and color.
Follow Time A cue timing attribute that defines the amount of time
to wait, in multiples of one second, before the cue finishes.
LightA standard theatre light that has the ability to vary in intensity
from 0% to 100% and change in color with a combination of red, green,
and blue.
Wait TimeA cue timing attribute that defines the amount of time to
wait, in multiples of one second, before the cue fires.
References
IEEE Recommended Practice for Software Requirements Specifications,
IEEE Std. 830-1998.
Document Overview
This document contains three sections. The first section is an introduction
and overview of the requirements document. The second section provides
an overall description of the software that will be produced. The third
section addresses the specific requirements of the Theatre Light Control
Software.
A-4
ni.com
Appendix A
Product Perspective
The Theatre Light Control Software will perform as part of a theatre lighting
system as described by the specifications provided by ABC Theatre
Lighting Inc. The Theatre Light Control Software will provide the necessary
control for the theatre lighting system to operate.
The Theatre Light Control Software is an independent and entirely
self-contained control system that interfaces with the local theatre lighting
hardware device. The theatre lighting device controls the color and intensity
of the physical lights.
Product Functions
The Theatre Light Control Software will perform the following functions:
Initialize
Record
Load
Save
Play
Move Cue Up
Select Cue
Delete
Stop
Close
User Characteristics
The users of the Theatre Light Control Software will have a deep
understanding of how theatre light systems operate. Also, the users will be
able to understand how to install and integrate the Theatre Light Control
Software into their system.
Constraints
The following are general design constraints for the Theatre Light Control
Software:
A-5
Appendix A
Apportioning of Requirements
Many theatre lighting hardware devices provide for lights that have motor
control to move the light around the stage. The Theatre Light Control
Software shall provide for the ability to easily implement channel pan and
tilt in a future version of the software. The Theatre Light Control Software
will only interface to theatre lighting hardware devices that do not contain
motor control capability for this version of the software.
A-6
ni.com
Appendix A
The Cue Control and Cue Information sections are the primary visible
components on the user interface. Cue Control contains a Cue Number and
Cue Name and controls for manipulating cues. Cue Information displays
all 16 channels of the system and particular information about a selected
cue. Each channel displays the user intensity settings and color information
for that channel.
The main user interface shall contain a menu to control the operation of the
application. The menu shall contain FileOpen, FileClose, and FileExit.
Hardware Interfaces
The Theatre Light Control Software interfaces to the Theatre Lighting
Hardware Device, which is physically connected to the lights. The Theatre
Lighting Hardware Device controls light intensity and color. The following
illustration shows a high-level system diagram of the theatre lighting
system.
A-7
Appendix A
Theatre Lighting
Control Software
Theatre Lighting
Hardware Device
32
The Theatre Write VI, shown, shown in the following figure, writes the
intensity and color information to a specific channel.
The Theatre Close VI, shown in the following figure, closes the Theatre
Lighting Hardware Device.
A-8
ni.com
Appendix A
Functions
This section describes each of the product functions in detail.
Initialize
Introduction
Record
Introduction
Record shall take the current settings specified for the channels and create
a cue. This function prompts the user for the cue attributes, which are wait
time, fade time, and follow time.
Processing
Prompt the user for the channel color, channel
intensity, cue name, wait time, fade time, and follow
time
Store the attributes for the cue
Store the cue name in the cue list
Load
Introduction
Load shall prompt the user for a LabVIEW datalog file that contains a
saved set of Cues.
Inputs
A-9
Appendix A
Save
Introduction
Save Cues shall store all attributes that relate to the cues in a LabVIEW
datalog file.
Processing
Prompt the user for a filename
Check that file exists
If the file exists
Prompt the user that file exists
Suspend processing
Save all recorded cues in memory
Outputs
Play shall start at the top of the Cue List and execute the cue in real time.
This function updates the front panel channel array by displaying what the
Theatre Lighting Hardware Device is being commanded to do. The
information displayed to the user on the front panel will correspond to the
information that is being communicated to the Theatre Lighting Hardware
Device using the LabVIEW API.
Processing
Disable the following controls: Record, Play, Up, Down,
Delete
Repeat the following for each cue:
Wait for the number of seconds specified by wait time
Fade the channels in the cue to the desired level
within the specified number of fade time seconds
Wait for the number of seconds specified by the follow
time
Enable the following controls: Record, Play, Up, Down,
Delete
Outputs
Move Cue Up shall move the currently selected Cue up one level.
A-10
ni.com
Appendix A
Processing
Check if currently selected cue is the first cue in the
list
If the selected cue is not the first cue in the list
Swap Selected Cue with Selected Cue - 1
Move Cue Down shall move the currently selected Cue down one level.
Processing
Check if currently selected cue is the last cue in the
list
If the selected cue is not the last cue in the list
Swap Selected Cue with Selected Cue + 1
Select Cue
Introduction
Select Cue shall display the Cue Name, Fade Time, Wait Time, and
Follow Time for the Cue in the Cue Information display when a Cue is
selected in the Cue List. This function also enables the Move Cue Up, Move
Cue Down, and Delete functions to operate as expected.
Processing
Get Cue Values for Selected Cue
Update Front Panel Channels
Delete
Introduction
Delete shall delete a cue and all information regarding the cue that is
stored in memory.
Processing
Delete Selected Cue
Update Cue List
Stop
Introduction
"Stop" shall cause any playing cue to stop when the button is clicked.
Processing
Send a stop message to stop playing cues
A-11
Appendix A
Close
Introduction
Exit shall close all open references and cleanly stop the application. This
function also initializes all channels to an intensity of 0% with a color
combination of 0% red, 0% green, and 0% blue.
Processing
Shutdown all modules
Shutdown all open references
Outputs
Performance Requirements
Design Constraints
The software will be tested with 32 channels.
A-12
ni.com
Appendix A
Other Requirements
No other requirements exist for the application.
End of Requirements Document
A-13
If you searched ni.com and could not find the answers you need, contact
your local office or NI corporate headquarters. Phone numbers for our
worldwide offices are listed at the front of this manual. You also can visit the
Worldwide Offices section of ni.com/niglobal to access the branch
office Web sites, which provide up-to-date contact information, support
phone numbers, email addresses, and current events.
B-1
Appendix B
LabVIEW Resources
This section describes how you can receive more information regarding
LabVIEW.
LabVIEW Publications
The following publications offer more information about LabVIEW.
LabVIEW Books
Many books have been written about LabVIEW programming and
applications. The National Instruments Web site contains a list of all
the LabVIEW books and links to places to purchase these books.
info-labview Listserve
info-labview is an email group of users from around the world who
discuss LabVIEW issues. The list members can answer questions about
building LabVIEW systems for particular applications, where to get
instrument drivers or help with a device, and problems that appear.
B-2
ni.com
Appendix B
B-3
Glossary
Numbers
1D
One-dimensional.
2D
Two-dimensional.
A
A
Amperes.
absolute path
File or directory path that describes the location relative to the top level
of the file system.
active window
Window that is currently set to accept user input, usually the frontmost
window. The title bar of an active window is highlighted. Make a
window active by clicking it or by selecting it from the Windows
menu.
application software
array
array shell
artificial data
dependency
ASCII
auto-indexing
autoscaling
G-1
Glossary
B
black box testing
block diagram
Boolean controls
and indicators
buffer
Bundle node
C
Capability Maturity
Model (CMM)
caption label
Label on a front panel object used to name the object in the user
interface. You can translate this label to other languages without
affecting the block diagram source code. See also Name Label.
case
Case structure
checkbox
Small square box in a dialog box you can select or clear. Checkboxes
generally are associated with multiple options that you can set. You
can select more than one checkbox.
CIN
G-2
ni.com
Glossary
cluster
cluster shell
COCOMO Estimation
Special block diagram node through which you can link text-based
code to a VI.
coercion
coercion dot
Appears on a block diagram node to alert you that you have wired data
of two different numeric data types together. Also appears when you
wire any data type to a variant data type.
cohesion
Coloring tool
compile
connector
connector pane
constant
control
G-3
Glossary
control flow
conversion
count terminal
coupling
current VI
D
D
DAQ
data acquisition
data dependency
data encapsulation
data flow
data type
Code that identifies data types; used in data storage and representation.
datalog file
G-4
ni.com
Glossary
datalogging
default
Preset value. Many VI inputs use a default value if you do not specify
a value.
default input
design patterns
device
dialog box
dimension
directory
DLL
driver
G-5
Glossary
E
empty array
Array that has zero elements but has a defined data type. For example,
an array that has a numeric control in its data display window but has
no defined values for any element is an empty numeric array.
error in
error message
error out
error structure
event
event driven
programming
F
file refnum
See refnum.
For Loop
frame
free label
Label on the front panel or block diagram that does not belong to any
other object.
front panel
function
G-6
ni.com
Glossary
functional global
variable
G
General Purpose
Interface Bus
global variable
GPIB
H
heuristic
Hierarchy window
I
I/O
icon
Icon Editor
IEEE
indicator
information hiding
inplace
inplace execution
G-7
Glossary
integration testing
ISA
iteration terminal
L
label
Labeling tool
LabVIEW
LED
Light-emitting diode.
library
See VI library.
lifecycle model
listbox
Box within a dialog box that lists all available choices for a command.
For example, a list of filenames on a disk.
LLB
VI Library.
local variable
M
memory buffer
See buffer.
menu bar
Horizontal bar that lists the names of the main menus of an application.
The menu bar appears below the title bar of a window. Each
application has a menu bar that is distinct for that application, although
some menus and commands are common to many applications.
modular programming
G-8
ni.com
Glossary
multithreaded
application
N
Name Label
Label of a front panel object used to name the object and as distinguish
it from other objects. The label also appears on the block diagram
terminal, local variables, and property nodes that are part of the object.
See also caption label.
node
non-displayable
characters
numeric controls
and indicators
O
object
Generic term for any item on the front panel or block diagram,
including controls, indicators, nodes, wires, and imported pictures.
operator
P
palette
panel window
VI window that contains the front panel, the toolbar, and the icon and
connector panes.
pixel
polling
Property Node
G-9
Glossary
prototype
pseudocode
pull-down menus
Menus accessed from a menu bar. Pull-down menu items are usually
general in nature.
R
race condition
real-time
refactor
refnum
representation
Subtype of the numeric data type, of which there are 8-, 16-, and 32-bit
signed and unsigned integers, as well as single-, double-, and
extended-precision floating-point numbers.
ring control
S
scalar
sequence structure
G-10
ni.com
Glossary
shared library
shift register
shortcut menu
software configuration
management (SCM)
Software Engineering
Institute (SEI)
spaghetti code
specifications document
Document that lists the individual tasks that define the function of the
application that is produced by the customer.
spiral model
Stacked Sequence
structure
G-11
Glossary
string
structure
stub VI
subdiagram
subVI
system testing
T
terminal
tip strip
Small yellow text banners that identify the terminal name and make it
easier to identify terminals for wiring.
top-level VI
tunnel
type definition
type descriptor
U
unit testing
universal constant
G-12
ni.com
Glossary
user-defined constant
UUT
V
Variant
VI
VI library
Special file that contains a collection of related VIs for a specific use.
VI Server
W
waterfall model
While Loop
Unlike black box testing, white box testing creates tests that take into
account the particular implementation of the module. For example, use
white box testing to verify all the paths of execution of the module have
been exercised.
wire
wire bend
wire branch
Section of wire that contains all the wire segments from junction to
junction, terminal to junction, or terminal to terminal if there are no
junctions between.
wire junction
wire segment
wire stubs
Truncated wires that appear next to unwired terminals when you move
the Wiring tool over a VI or function node.
G-13
Index
Symbols
comments, 6-28
left-to-right layouts, 6-28
positioning, 6-27
sizing, 6-27
style considerations, 6-27
variant data, 6-10
wiring techniques, 6-27
Boolean controls and indicators
compared to ring and enumerated type
controls, 5-3
boundary conditions, testing, 7-4
build specifications, 10-13
building
applications, 10-13
shared libraries, 10-13
stand-alone applications, 10-13
.ini files
reading and writing, 6-32
A
about dialog box, 10-3
abstract components
data abstraction, 2-17
drawing
dataflow diagrams, 2-27
flow charts, 2-25
procedural abstraction, 2-17
alpha testing, 7-55
application
analyzing an, 2-1
build specifications, 10-13
building, 10-1
caveats and recommendations, 10-5
designing an, 4-1
documenting, 9-1
error handling strategies, 4-76
evaluating performance, 8-1
hierarchical architecture, 4-41
implementing
code, 6-1, 10-2
scalable architecture, 6-7
user interface, 5-1
menu items, 3-5
support files
icons, 10-17
test plan, 7-1
user interface, 3-2
Application Builder, 10-13
application documentation, 9-3
arrays, 4-55
C
captions, 3-13
certification (NI resources), vii, B-2
checklist
code implementation, 6-65
customer communication, 2-7
data structures, 4-56
error handling strategy, 4-79
front panel style, 3-19
hierarchical architecture, 4-42
performance issues, 8-23
requirements document, 2-8
scalable architecture, 6-11
specifications content, 2-4
test plan, 7-5
testing strategy, 7-9
user interface-based data, 5-7
classic controls and indicators, 3-15
clusters, 4-55
error, 4-77
code
developing, 6-27
documenting, 6-28
B
beta testing, 7-55
block diagram
I-1
Index
I-2
ni.com
Index
custom controls
guidelines, 3-3
customer communication
customer expectations, 2-6
programmer expectations, 2-6
customizing
run-time shortcut menus, 3-6
D
data abstraction, 2-17
data acquisition system design example,
2-18, 2-22
data encapsulation. See information hiding
data structures
arrays, 4-55
checklist, 4-56
choosing, 4-55
clusters, 4-55
scalars, 4-55
user interface-based, 5-2
data types, choosing, 5-2
dataflow diagrams, 2-27
DataSocket, documenting, 6-30
decorations
for visual grouping of objects, 3-6
decorations, for visual grouping of objects,
3-6
default values for controls, 3-14
dependencies, 4-45
design patterns
comparing, 4-38
documenting, 9-3
execution timing, 6-36
initializing, 6-7
master/slave, 4-8
producer/consumer (data), 4-10
producer/consumer (events), 4-26
queued message handler, 4-5
software control timing, 6-38
state machine, 4-4
timing, 6-36
user interface event handler, 4-25
design techniques
I-3
Index
E
Embedded Project Manager, 4-43
enumerated type controls
compared to Boolean and ring controls,
5-3
error handling
checking for errors, 4-77
checklist, 4-79
error codes, 4-78
custom, 4-78
implementing, 6-76
strategies, 4-76
implementing, 6-76
tests, 7-4
errors
clusters, 4-77
codes, 4-77
I/O, 4-77
methods to handle, 4-77
evaluating specifications, 2-2
events
front panel locking, 4-19
examples (NI resources), B-1
execution
speed, 8-17
Express VIs, documenting, 6-29
LabVIEW Intermediate I Course Manual
I-4
ni.com
Index
examples, 3-17
fonts, 3-2
graphics, 3-3
keyboard navigation, 3-14
labels, 3-12
layout, 3-4
localization, 3-18
palettes, 3-15
paths, 3-13
positioning, 3-11
prototyping, 3-16
ranges, 3-14
ring controls, 5-2
sizing, 3-11
strings, 3-13
style checklist, 3-19
style considerations, 3-2
text, 3-2
transparent, 3-10
functional global variable, 4-61
using for timing, 4-62, 6-39
functional global variables
guidelines, 6-65
functional specification (definition), 2-2
functional tests, 7-3
boundary conditions, 7-4
hand checking, 7-4
functionality, testing, 7-54
I
I/O
effect on VI performance, 8-18
error, 4-77
icons
art glossary, 5-12
custom application icons, 10-17
intuitive icons, 5-13
style guidelines, 5-12
IEEE (Institute of Electrical and Electronic
Engineers) standards, A-2
indicators
captions, 3-12
classic, 3-15
colors, 3-2
custom controls, 3-3
descriptions, 9-6
dialog, 3-15
fonts, 3-2
graphics, 3-3
high-color, 3-15
keyboard navigation, 3-14
G
global variables
functional global variables, 4-61
timing, 4-62
graphics, 3-3
guidelines, 3-3
H
help files, 9-9
creating, 9-9
creating (guidelines), 9-9
linking to VIs, 9-9
help, technical support, B-1
I-5
Index
controls, 3-12
dialog box, 3-15
font usage, 3-2
indicators, 3-12
keyboard navigation, 3-12
LabVIEW projects, 4-42
viewing dependencies, 4-45
left-to-right layouts, 6-28
libraries
See also LLB
lifecycle models, 1-4
code and fix model, 1-5
modified waterfall model, 1-7
prototyping, 1-8
spiral model, 1-9
waterfall model, 1-5
lines of code. See source lines of code
(SLOCs) metric
LLBs
naming, 6-36
load tests, 7-54
localization guidelines, 3-18
locking
front panels with events, 4-19
labels, 3-12
layout, 3-4
low-color, 3-15
modern, 3-15
paths, 3-13
positioning, 3-11
sizing, 3-11
strings, 3-13
style considerations, 3-2
tab, 3-7
text, 3-2
information hiding, 4-60
global variables, 4-60
initializing
design patterns, 6-7
feedback nodes, 6-9
initialization state, 6-8
shift registers, 6-9
using single frame Sequence structure,
6-7
installer
building an, 10-23
installers, 10-13
installing the course software, ix
Institute of Electrical and Electronic
Engineers (IEEE) standards, A-2
instrument drivers (NI resources), B-1
integration testing, 7-6
big-bang, 7-7
bottom-up, 7-8
sandwich, 7-8
top-down, 7-7
M
maintainable
modules, 6-60
VIs, creating, 1-3
master/slave design pattern, 4-8
memory
allocation, 8-14
developing for, 6-65
reallocation buffers, 8-14
variant data, 6-10
menus
handling selections, 3-5
ring controls, 5-2
selection handling, 3-5
static menus, 3-4
models
See also development model
See also prototyping
K
keyboard navigation, 3-14
KnowledgeBase, B-1
L
labeling
captions, 3-13
labels
block diagram documentation, 6-28
I-6
ni.com
Index
N
naming
controls, 3-12
directories, 6-34, 6-36
guidelines for VIs, 6-36
LLB, 6-36
VI libraries, 6-34
VIs, 6-34
National Instruments support and services,
B-1
NI, Certification, vii, B-2
non-functional specification (definition), 2-2
O
objects
captions on front panel, 3-13
overlapping on front panel, 3-7
organizing documentation, 9-2
overlapping front panel objects, 3-7
P
palettes, 3-15
paths
See also relative file path handling
compared to strings, 3-13
front panels, 3-13
performance
checklist, 8-23
coercion and memory, 8-16
developing for, 6-65
evaluating, 8-1
improving, 8-2
memory allocation, 8-14
memory reallocation buffers, 8-14
problems, 8-13
fixing, 8-14
identifying, 8-13
tests, 7-54
VI Analyzer Toolkit, 8-5
VI execution speed, 8-17
I-7
Index
scalable architecture
checklist, 6-11
choosing a, 4-2
comparing, 4-38
implementing, 6-7
initializing, 6-7
master/slave design pattern, 4-8
producer/consumer (data) design pattern,
4-10
producer/consumer (events) design
pattern, 4-26
queued message handler design pattern,
4-5
state machine design pattern, 4-4
timing, 6-36
user interface event handler design
pattern, 4-25
scalable VIs, creating, 1-2
scalable, modules, 6-60
scalar data, 4-55
enumerated type controls, 5-2
numeric, 5-3
ring controls, 5-2
scroll bar controls, 3-9
shared libraries, 10-13
sizing
front panels, 3-11
software (NI resources), B-1
software development map, 1-1
software installation, course, ix
software lifecycles, 1-4
software quality standards
Institute of Electrical and Electronic
Engineers (IEEE), A-2
source code control tools
previous versions of files, 6-3
source control
change control, 6-4
quality control considerations, 6-2
tracking changes, 6-3
source distributions, 10-13
source lines of code (SLOCs) metric, 8-2
Q
quality control
change control, 6-4
code reviews, 7-2
configuration management, 6-2
retrieving old versions of files, 6-3
IEEE, A-2
retrieving old versions of files, 6-3
tracking changes, 6-3
queued message handler design pattern, 4-5
requirements, 4-6
R
ranges of values for controls, 3-14
readable VIs, creating, 1-3
relative file path handling, 10-2
reliability testing, 7-54
requirements
abstracting components, 2-17
checklist, 2-8
determining, 2-16
developing, 2-8
requirements for getting started, viii
reviews
code, 7-2
revision history
creating, 9-4
numbers, 9-4
ring controls, 5-2
compared to Boolean and enumerated
type controls, 5-3
rings, front panel, 5-2
risk management
See spiral model
run-time shortcut menus
customizing, 3-6
I-8
ni.com
Index
specifications
checklist, 2-4
evaluating, 2-2
functional, 2-2
non-functional, 2-2
speed at run time
optimizing, 8-17
spiral model, 1-9
split pane container, 3-9
splitter bars, 3-9
stand-alone applications, 10-13
state machine
design pattern, 4-4
infrastructure, 4-4
static menus, 3-4
application items, 3-5
separators, 3-5
user items, 3-4
stress tests, 7-54
strings
compared to paths, 3-13
strings, front panels, 3-13
stub VIs, 7-7
style guidelines
block diagram, 6-27
sizing, 6-27
speed optimization, 6-65
wiring techniques, 6-27
connector panes, 5-15
documentation, 6-28
front panels
colors, 3-2
default values, 3-14
fonts, 3-2
graphics, 3-3
keyboard navigation, 3-14
labels, 3-12
layout, 3-4
paths, 3-13
ranges, 3-14
sizing and positioning, 3-11
strings, 3-13
text, 3-2
T
tab controls, 3-7
technical support, B-1
test
alpha, 7-55
beta, 7-55
testing
boundary conditions, 7-4
checklist, 7-5, 7-9
configuration, 7-53
error, 7-4
functionality, 7-3, 7-54
guidelines
integration testing, 7-6
system testing, 7-53
unit testing, 7-3
usability testing, 7-57
hand checking, 7-4
implementing, 7-1
individual VIs, 7-2, 7-3
integration, 7-6
big-bang, 7-7
bottom-up, 7-8
sandwich, 7-8
top-down, 7-7
performance, 7-54
I-9
Index
reliability, 7-54
stress/load, 7-54
system, 7-53
usability, 7-55, 7-57
testing guidelines
integration testing, 7-6
system testing, 7-53
text
ring controls, 5-2
text style guidelines, 3-2
timing
design patterns, 6-36
execution, 6-36
functional global variable, 4-62, 6-39
software control, 6-38
Get Date/Time in Seconds, 6-39
tracking changes, 6-3
tracking development, 9-4
training (NI resources), B-2
transparent front panels, 3-10
tree controls, 3-8
troubleshooting (NI resources), B-1
V
variant data
handling, 6-10
Variant data type, producer/consumer
(events) design pattern, 6-10
VI Analyzer Toolkit, 8-5
VI libraries
documenting, 9-2
VI Metrics tool, 8-2
VI Performance Profiler, 8-13
viewing
dependencies in projects, 4-45
VIs
hierarchical organization, 6-34
linking to help files, 9-5
naming, 6-34
W
waterfall model, 1-5
modified, 1-7
Web resources, B-1
wiring techniques, 6-27
U
unit test, 7-2
plan, 7-2
usability
engineering techniques, 7-57
heuristics, 7-55
testing, 7-55, 7-57
user documentation
See documenting applications
user documentation. See documenting
applications
user interface
See also front panels
data structures
arrays, 5-5
checklist, 5-7
clusters, 5-6
designing an, 3-1
event handler, 4-25
implementing, 5-1
LabVIEW Intermediate I Course Manual
Z
zip files, 10-13
I-10
ni.com
Course Evaluation
Course _______________________________________________________________________________________
Location _____________________________________________________________________________________
Instructor _________________________________________
Date ____________________________________
Company _________________________________________
Instructor
Please evaluate the instructor by checking the appropriate circle.
Unsatisfactory Poor
Satisfactory Good
Excellent
Course
Training facility quality
Training equipment quality
Was the hardware set up correctly?
The course length was
Too long
Yes
No
Just right
Too much
Too short
Yes
Yes
Just right
No
Not enough
Sometimes
No
Co-worker
Other _____________________________________________________________________________________