Foreword |
|
xv | |
Preface |
|
xix | |
Acknowledgments |
|
xxi | |
|
|
1 | (60) |
|
|
1 | (6) |
|
Virtual Instruments: LabVIEW's Foundation |
|
|
3 | (3) |
|
|
6 | (1) |
|
|
7 | (21) |
|
|
8 | (1) |
|
|
8 | (2) |
|
All the World's an Instrument |
|
|
10 | (1) |
|
A Hard-Core UNIX Guy Won over by the Macintosh |
|
|
11 | (1) |
|
Putting It All Together with Pictures |
|
|
12 | (2) |
|
Favoring the Underdog Platform for System Design |
|
|
14 | (1) |
|
|
15 | (1) |
|
Stretching the Limits of Tools and Machine |
|
|
16 | (1) |
|
Facing Reality on Estimated Development Times |
|
|
17 | (2) |
|
Shipping the First Version |
|
|
19 | (1) |
|
Apple Catches up with the Potential Offered by LabVIEW |
|
|
19 | (4) |
|
LabVIEW 2 A First-Rate Instrument Control Product Becomes a World-Class Programming System |
|
|
23 | (1) |
|
Info-LabVIEW List: The Beginnings of an Ecosystem |
|
|
24 | (1) |
|
The Port to Windows and Sun |
|
|
25 | (1) |
|
|
26 | (1) |
|
|
27 | (1) |
|
LabVIEW Continues to Improve |
|
|
28 | (10) |
|
|
28 | (2) |
|
|
30 | (1) |
|
|
30 | (1) |
|
|
31 | (2) |
|
NI Forums: The Beginning of the Ecosystem |
|
|
33 | (1) |
|
LAVA Forums: The LabVIEW Ecosystem Continues to Grow |
|
|
33 | (1) |
|
|
33 | (1) |
|
|
34 | (1) |
|
|
34 | (2) |
|
|
36 | (1) |
|
|
37 | (1) |
|
|
37 | (1) |
|
LabVIEW Switches to Yearly Releases |
|
|
38 | (18) |
|
|
38 | (1) |
|
CLA Summits, LabVIEW Community-Driven Events |
|
|
39 | (1) |
|
|
40 | (1) |
|
|
40 | (1) |
|
|
41 | (1) |
|
|
42 | (1) |
|
|
43 | (2) |
|
|
45 | (1) |
|
|
45 | (1) |
|
|
46 | (2) |
|
|
48 | (1) |
|
|
49 | (2) |
|
|
51 | (2) |
|
GDevCon---The Ecosystem Independent from NI |
|
|
53 | (1) |
|
Future Versions of LabVIEW |
|
|
54 | (1) |
|
|
54 | (2) |
|
Dr. T and Jeff Kodosky Inducted into the National Inventors Hall of Fame |
|
|
56 | (1) |
|
|
56 | (2) |
|
|
58 | (3) |
|
|
58 | (3) |
|
|
61 | (86) |
|
|
61 | (1) |
|
|
62 | (5) |
|
|
62 | (1) |
|
|
63 | (4) |
|
|
67 | (3) |
|
|
67 | (1) |
|
|
68 | (1) |
|
|
69 | (1) |
|
|
70 | (1) |
|
|
71 | (2) |
|
|
71 | (1) |
|
|
72 | (1) |
|
|
73 | (4) |
|
Uninitialized Shift Registers |
|
|
75 | (2) |
|
|
77 | (6) |
|
|
77 | (1) |
|
|
78 | (3) |
|
|
81 | (2) |
|
|
83 | (1) |
|
|
84 | (32) |
|
|
85 | (2) |
|
|
87 | (1) |
|
|
88 | (4) |
|
Spreadsheets, Strings, and Arrays |
|
|
92 | (3) |
|
|
95 | (8) |
|
|
103 | (3) |
|
|
106 | (3) |
|
|
109 | (1) |
|
|
110 | (1) |
|
Intricate Conversions and Type Casting |
|
|
111 | (3) |
|
Flatten To String (... Do what?) |
|
|
114 | (1) |
|
|
115 | (1) |
|
Get Carried Away Department |
|
|
116 | (1) |
|
|
116 | (11) |
|
Where Do Little Timers Come From? |
|
|
117 | (1) |
|
Using the Built-In Timing Functions |
|
|
118 | (1) |
|
|
118 | (2) |
|
|
120 | (3) |
|
|
123 | (1) |
|
|
123 | (1) |
|
Absolute Timing Functions |
|
|
124 | (2) |
|
High-Resolution and High-Accuracy Timing |
|
|
126 | (1) |
|
|
127 | (15) |
|
|
127 | (1) |
|
|
128 | (3) |
|
|
131 | (3) |
|
|
134 | (2) |
|
|
136 | (5) |
|
|
141 | (1) |
|
|
142 | (5) |
|
|
147 | (60) |
|
|
147 | (1) |
|
|
147 | (26) |
|
|
148 | (2) |
|
|
150 | (1) |
|
|
151 | (5) |
|
|
156 | (17) |
|
|
173 | (15) |
|
|
173 | (2) |
|
|
175 | (2) |
|
About ADCs, DACs, and Multiplexers |
|
|
177 | (5) |
|
Digital-to-Analog Converters |
|
|
182 | (1) |
|
|
183 | (4) |
|
|
187 | (1) |
|
Writing a Data Acquisition Program |
|
|
188 | (16) |
|
|
204 | (3) |
|
4 LabVIEW Object-Oriented Programming |
|
|
207 | (66) |
|
What, Where, When, and Why |
|
|
207 | (38) |
|
|
207 | (1) |
|
|
208 | (11) |
|
|
219 | (5) |
|
|
224 | (2) |
|
|
226 | (17) |
|
HAL: Hardware Abstraction Layers |
|
|
243 | (1) |
|
MAL: Measurement Abstraction Layers |
|
|
244 | (1) |
|
Actor Framework: The Most Recognizable LVOOP Architecture |
|
|
244 | (1) |
|
SOLID Principles of Object-Oriented Design |
|
|
245 | (23) |
|
SRP: Single Responsibility Principle |
|
|
247 | (3) |
|
OCP: The Open-Closed Principle |
|
|
250 | (2) |
|
LSP: The Liskov Substitution Principle |
|
|
252 | (3) |
|
ISP: The Interface Segregation Principle |
|
|
255 | (8) |
|
DIP: The Dependency Inversion Principle |
|
|
263 | (5) |
|
|
268 | (1) |
|
Accessors Get/Set Instead of Read/Write |
|
|
269 | (1) |
|
|
269 | (1) |
|
|
269 | (4) |
|
5 Why Would You Want to Use a Framework? |
|
|
273 | (128) |
|
|
274 | (1) |
|
|
274 | (1) |
|
What Is an Abstraction Layer? |
|
|
274 | (1) |
|
|
275 | (1) |
|
When Do You Make the Decision to Break Your Application into Parallel Tasks? |
|
|
275 | (1) |
|
What Are the Design Decisions That Need to Be Nailed Down at the Beginning to Make a Parallel Design Successful? |
|
|
276 | (2) |
|
What Project-Level Enforcement Is Available to Help Make Better Decisions? |
|
|
278 | (3) |
|
|
279 | (2) |
|
|
281 | (3) |
|
Advantages of Using a Framework |
|
|
282 | (1) |
|
Disadvantages of Using a Framework |
|
|
283 | (1) |
|
Framework versus Design Pattern |
|
|
283 | (1) |
|
The Contract between the Framework and the Programmer |
|
|
283 | (1) |
|
Why Not Make Your Own Framework? |
|
|
284 | (2) |
|
Criteria to Evaluate Frameworks |
|
|
285 | (1) |
|
|
286 | (3) |
|
Interprocess Communication |
|
|
287 | (1) |
|
|
287 | (1) |
|
Stop Processes Gracefully |
|
|
288 | (1) |
|
|
288 | (1) |
|
|
289 | (9) |
|
Configuring Source Code Control Repository Dependencies |
|
|
290 | (1) |
|
Packaging Modules Using VIPM |
|
|
290 | (2) |
|
Packaging Modules in PPLs |
|
|
292 | (6) |
|
|
298 | (56) |
|
|
298 | (1) |
|
|
298 | (14) |
|
|
312 | (31) |
|
|
343 | (8) |
|
|
351 | (1) |
|
Sharing Reusable DQMH Modules |
|
|
352 | (2) |
|
|
354 | (45) |
|
|
354 | (1) |
|
|
354 | (12) |
|
How to Use Actor Framework |
|
|
366 | (21) |
|
Actor Framework: Behind the Scenes |
|
|
387 | (4) |
|
Other Actor Framework Tools |
|
|
391 | (1) |
|
|
392 | (6) |
|
|
398 | (1) |
|
|
399 | (2) |
|
|
401 | (86) |
|
|
402 | (1) |
|
Unit Testing as Code Documentation |
|
|
403 | (1) |
|
What Makes a Good Unit Test? |
|
|
403 | (1) |
|
|
404 | (1) |
|
Writing Vis with Testing in Mind |
|
|
405 | (1) |
|
Test Harness versus Automated Test Frameworks |
|
|
406 | (1) |
|
What Are the Automated Test Frameworks Available for LabVIEW? |
|
|
406 | (1) |
|
What Is the Difference Between Black Box and White Box Testing? |
|
|
407 | (1) |
|
|
407 | (1) |
|
What Is Regression Testing? |
|
|
408 | (1) |
|
Getting Started with Unit Testing |
|
|
408 | (3) |
|
|
411 | (8) |
|
|
411 | (8) |
|
|
419 | (5) |
|
What about Testing Classes? Public versus Private Vis in Libraries |
|
|
424 | (23) |
|
Example of Unit Testing for a LabVIEW Class |
|
|
425 | (22) |
|
When Are Setup and Teardown Required? |
|
|
447 | (2) |
|
Should You Add Test Cases That Are Designed to Fail? |
|
|
449 | (1) |
|
What about Testing When the Expected Output Is an Array of NaN (Not a Number)? |
|
|
449 | (1) |
|
When Would You Create Unit Tests for a DQMH Public API? |
|
|
449 | (15) |
|
Unit Testing for a DQMH Module |
|
|
450 | (14) |
|
|
464 | (2) |
|
Example of Unit Testing for LabVIEW RT |
|
|
464 | (2) |
|
|
466 | (9) |
|
Example of Unit Testing for LabVIEW FPGA |
|
|
470 | (5) |
|
|
475 | (1) |
|
|
475 | (1) |
|
|
475 | (7) |
|
|
477 | (2) |
|
Assertions with AssertAPI |
|
|
479 | (3) |
|
UnitTesting and LabVIEW NXG |
|
|
482 | (3) |
|
|
483 | (1) |
|
Unit Testing Tool Alternatives for LabVIEW |
|
|
484 | (1) |
|
|
485 | (2) |
|
7 Developing in LabVIEW for Teams |
|
|
487 | (64) |
|
|
488 | (2) |
|
What Is the Problem You Are Trying to Solve? |
|
|
490 | (1) |
|
What Is Technical Wealth? |
|
|
491 | (3) |
|
|
494 | (7) |
|
|
494 | (1) |
|
Wasn't LabVIEW Supposed to Remove the Need for Modeling? |
|
|
494 | (3) |
|
Why and When to Use Models |
|
|
497 | (1) |
|
|
497 | (4) |
|
|
501 | (1) |
|
Source Code Control---The Developer's Time Machine |
|
|
501 | (22) |
|
What Is Source Code Control? |
|
|
502 | (1) |
|
Centralized Source Code Control |
|
|
503 | (3) |
|
Distributed Source Code Control |
|
|
506 | (3) |
|
Branch Merge versus Code Merge |
|
|
509 | (1) |
|
|
509 | (4) |
|
|
513 | (1) |
|
Good Practices for Source Code Control |
|
|
514 | (4) |
|
Establish a Source Code Workflow |
|
|
518 | (4) |
|
How to Select the Source Code Control Tool and the Workflow for Your Team |
|
|
522 | (1) |
|
|
523 | (4) |
|
|
525 | (1) |
|
|
526 | (1) |
|
|
526 | (1) |
|
|
527 | (1) |
|
|
527 | (1) |
|
|
528 | (8) |
|
|
530 | (1) |
|
VI Analyzer Tests Configuration |
|
|
531 | (1) |
|
|
532 | (1) |
|
Prepare Code and Documentation for a Code Review |
|
|
533 | (1) |
|
LabVIEW Compare for Code Reviews |
|
|
533 | (2) |
|
|
535 | (1) |
|
|
535 | (1) |
|
|
536 | (1) |
|
|
536 | (6) |
|
Why Do You Want to Use LabVIEW VI Scripting? |
|
|
537 | (1) |
|
Common Areas That Use LabVIEW Scripting |
|
|
537 | (1) |
|
Five Steps to Become a VI Scripting Ninja |
|
|
538 | (4) |
|
Deployment, Continuous Integration, and Continuous Delivery |
|
|
542 | (6) |
|
|
542 | (4) |
|
|
546 | (2) |
|
|
548 | (1) |
|
|
549 | (2) |
|
8 Enterprise and IoT Messaging |
|
|
551 | (38) |
|
|
555 | (3) |
|
|
558 | (3) |
|
|
561 | (6) |
|
|
561 | (6) |
|
|
567 | (4) |
|
|
571 | (1) |
|
|
572 | (1) |
|
|
573 | (16) |
|
Enabling the IoT Message Broker and CloudWatch |
|
|
574 | (1) |
|
Create Certificates and Keys |
|
|
574 | (3) |
|
|
577 | (1) |
|
|
578 | (2) |
|
|
580 | (9) |
Abbreviation |
|
589 | (2) |
Index |
|
591 | |