We write the FPGA loader in LabVIEW. Part 2
3r31215. 3r3-31. 3r31078. 3r33554. Download configuration to FPGA via USB or disassemble FTDI MPSSE
3r3-1089. 3r31215. We write the FPGA loader in LabVIEW. Part 1 3r3-131121. 3r3-1089. 3r31215. 3r31120. 3r3-1089. 3r31215.
Error handling
3r3-1089. 3r31215. 3r31078. Open source source code, analyze the function MPSSE_open. Despite the algorithmic simplicity (functions are called for each other), quite a lot of D2XX API elements need to be imported: 3r3992. FT_OpenEx , 3r3992. FT_ResetDevice , 3r3992. FT_Purge , 3r3992. FT_SetUSBParameters , 3r3992. FT_SetChars , 3r3992. FT_SetTimeouts , 3r3992. FT_SetLatencyTimer , 3r3992. FT_SetFlowControl , 3r3992. FT_SetBitMode . As shown in previous article 3r31120. , functions are imported using the 3r3992 node. Call library Function . This node has dedicated terminals for error control. There is one simple rule in LabVIEW: all
VP
should track errors and report errors returned by the error terminals. Most embedded VIs should strictly follow it. I hope everyone understands how important it is to control and handle errors, especially at the debugging stage, but there is another reason why this is so important, it is not obvious to "classical" programmers. LabVIEW does not have a strict sequence of instrument execution on the block diagram: the instrument is executed when data are available at its inputs. If from the output of one VP the data is transmitted to the input of another VI, then it is clear that at the beginning the first VI will work, only after it the second one. And what if there is no data transfer, and the VIs perform independent actions? Of course, you can use the cumbersome "Flat Sequence Structure", but it is much more convenient to connect devices with each other by a stream of errors. 3r3-131121. 3r3-1089. 3r31215. 3r31078. When importing D2XX functions, we encounter two types of errors. The first — this is the error of the import itself — returns the block itself 3r3992. Call library Function . The second is the library error itself, returned by almost every function through 3r3992. FT_STATUS . All possible values are described as enum in the ftd2xx.h header file. Although it is enough to know that the value of 3r3r992. FT_OK - no error, and all other values are error codes, I would like to track not only the fact of the error, but also what error occurred and exactly where it occurred. 3r3-131121. 3r3-1089. 3r31215. 3r31078. In LabVIEW, error data is propagated through clusters of 3r3992. error . This is such a special dedicated data type, LabVIEW has many VIs and functions for working with it. The cluster of errors consists of three elements: a logical variable — it displays the status, a signed integer number — the error code, and a string — the source of the error. The status indicates whether an error occurred, the error code determines its type and is used by special VIs to generate a report. The line gives a more detailed idea of exactly where the error occurred. LabVIEW is accepted if the status is 3r3992. TRUE , then this is an error if the status is FALSE 3r3993. , but the code is not zero and the description string is not empty, then it is warning if the status is 3r3-392. FALSE 3r3993. , the code is zero and the string is empty - no error. 3r3-131121. 3r3-1089. 3r31215.
changes color and divides two subdiagrams: "No Error" - green, and "Error" - red. Inside the Error case, we pass an error cluster from the selector terminal directly to the output tunnel on the right border. And in the green case, add another , do not execute their code, and transmit information about the error to the terminal 3r3992. Error Out 3r3993. . This allows you to effectively transfer information about the source through the entire chain to the error handler, eliminating the execution of code in emergency mode. It is desirable that our VP behaved similarly. 3r3-131121. 3r3-1089. 3r31215. 3r31078. Let's make a list of D2XX statuses as 3-33992. enum 3r3993. and render it into a separate type (in the previous article we did this with the FTDI types). 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. enum FT_Status [/b] 3r31070.
, at the entrance of 3r3992. Case selector 3r3993. serve cluster 3r3992. Error In 3r3993. followed by a structure 3r3992. Case
Case
depending on the status, it will determine whether to create an error (status is not equal to FT_OK), or leave it as it is: skip the input error cluster to the output without changing. 3r3-131121. 3r3-1089. 3r31215. 3r31078. In order to technically convert the error code into a cluster, you can use VP 3r3-3992. Error Cluster From Error Code VI . This SubVI adds a call chain to the error description, so we can determine not only 3r3808. that happened, but also 3r3808. where this happened. 3r3-131121. 3r3-1089. 3r31215. 3r31078. To select the text corresponding to the input status (FT_Status), use the property block: select "RingText.Text". The text of the error is passed to the input 3r3992. error message VP 3r3992. Error Cluster From Error Code VI . 3r3-1089. 3r31215. Do not forget to draw the "talking" icon. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. FT_error.vi [/b] 3r31070. 3r31078. 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r3165. 3r3-1089. 3r31215. 3r31054. Block diagram At the entrance, error 3r31055. 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r3174. 3r3-1089. 3r31215. 3r31054. Block diagram There is no error at the input and the status is FT_OK 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r3183. 3r3-1089. 3r31215. 3r31054. Block diagram There is no error at the input, but the status is different from FT_OK 3r3-131121. 3r3-1089. 3r31215. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r31078. For the FT_error test, you can create an empty VI, add the created VI there and see how the value will change at startup if you submit different statuses. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. Test FT_error.vi [/b] 3r31070. 3r31078. 3r3204. 3r3-1089. 3r31215. 3r31054. Front (front) panel of the device 3r3r1055. 3r3-131121. 3r3-1089. 3r31215. 3r31078.
3r3-131121. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r31078. Now, after any function call from the D2XX API, we will use SubVI FT_error.vi. And the cluster of errors will pass through all the VIs throughout the call hierarchy 3r3-131121. 3r3-1089. 3r31215. 3r31078. In the top-level VI, we need to decide what to do with the detected error: you can display a message in a dialog box, write it to a report file, ignore it, or simply end the application silently. The dialog box is the easiest and most popular way to report errors. And it is also convenient for a novice programmer, since nothing needs to be done. Automatic error handling is enabled by default in each VI (3r3808. Enable automatic error error handling 3r3809., Is in the Execution category of the Properties VI menu). It works like this: if in some node the output terminal is 3r3992. Error Out 3r3993. is not connected anywhere, and an error occurs on this node, then LabVIEW pauses the execution of the application and displays a dialog box. If the terminal is 3r3992. Error Out 3r3993. the node is connected, the error stream is distributed as programmed, and no additional action occurs. However, the message box can be called programmatically, for this you need to use the VP 3r3992. General Error Handler and 3r3992. Simple Error Handler (located in the "Dialog & User Interface" panel). However, we can use the error information to terminate the program. In the block diagram, it looks like this: 3r3-31121. 3r3-1089. 3r31215. 3r31078.
3r3-131121. 3r3-1089. 3r31215. 3r31078. When an error occurs, the program will be paused, a window with a report will appear, after closing the window the program will terminate correctly. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. Report window 3r31069. 3r31070. 3r31078.
Open and close FTDI 3r3-1089. 3r31215. 3r31078. So back to function 3r3992. MPSSE_open . Create a new Vi . First of all, add terminals for the error stream. Add a selection structure and feed the selector to 3r3992. Error In 3r3993. . In the green case we do the import of functions in the order and with the parameters as in the Sishny prototype. All nodes are 3r3992. Call Library Function Node we chain in a stream of errors. In the red case through the tunnel we connect
Error In 3r3993. with output terminal errors. 3r3-131121. 3r3-1089. 3r31215. 3r31078.
(to find out the status of the receiver buffer). On the pavement, we create the corresponding VI: FT_Write.vi, FT_Read.vi, FT_Queue.vi. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. A little routine [/b] 3r31070. 3r31078. 3r33448. 3r3-1089. 3r31215. 3r31054. FT_Write.vi 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r33466. 3r3-1089. 3r31215. 3r31054. FT_Read.vi 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r33475. 3r3-1089. 3r31215. 3r31054. Block diagram FT_Read.vi 3r3-131121. 3r3-1089. 3r31215. 3r31078.
3r3-131121. 3r3-1089. 3r31215. 3r31078.
3r3-131121. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r31078. Now from these three bricks lay out the VI for reading a parallel port and writing to it. The value is conveniently represented as an array of Boolean variables. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. MPSSE_Set_LByte.vi and MPSSE_Get_LByte.vi [/b] 3r31070. 3r31078. 3r33512. 3r3-1089. 3r31215. 3r31054. MPSSE_Set_LByte.vi 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r33521. 3r3-1089. 3r31215. 3r31054. Block diagram MPSSE_Set_LByte.vi 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r? 3530. 3r3-1089. 3r31215. 3r31054. MPSSE_Get_LByte.vi 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r? 3539. 3r3-1089. 3r31215. 3r31054. Block diagram MPSSE_Get_LByte.vi 3r3-131121. 3r3-1089. 3r31215. 3r31078. I repent, I was lazy to create a named list for all op-code, so I left them in the form of Magic Numbers. 3r3-131121. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r31078. As stated in the very first 3r33554. Article 3r31120. FPGA "Passive Serial" download protocol is nothing more than SPI with additional flag manipulation. A total of five legs are used: lines 3r31054. DCLK , 3r31054. DATA[0]3r3-1055. , 3r31054. nCONFIG must be configured as exits, lines 3r3r1054. nSTATUS , 3r31054. CONF_DONE - as inputs. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. Pinout schemes in the form of a table [/b] 3r31070. 3r33573. 3r31215. 3r33575. 3r31215. 3r31215. 3r? 3594. FPGA pin 3r31215. 3r? 3594. Pin Name 3r39595. 3r31215. 3r? 3594. Pin 3r31215. 3r? 3594. MPSSE 3r39595. 3r31215. 3r? 3594. Direction 3r31215. 3r? 3594. default 3r31215. 3r33737. 3r31215. 3r3599. 3r31215. 3r3601. 3r31215. 3r31215. DCLK 3r31215. BDBUS0 3r31215. 38 3r31215. TCK /SK 3r31215. Out 3r31215. 0 3r31215. 3r33737. 3r31215. 3r31215. DATA[0] 3r31215. BDBUS1 3r31215. 39 3r31215. TDI /DO 3r31215. Out 3r31215. 1 3r31215. 3r33737. 3r31215. 3r31215. nCONFIG 3r31215. BDBUS2 3r31215. 40 3r31215. TDO /DI 3r31215. Out 3r31215. 1 3r31215. 3r33737. 3r31215. 3r31215. nSTATUS 3r31215. BDBUS3 3r31215. 41 3r31215. TMS /CS 3r31215. In 3r31215. 1 3r31215. 3r33737. 3r31215. 3r31215. CONF_DONE 3r31215. BDBUS4 3r31215. 43 3r31215. GPIOL0 3r31215. In 3r31215. 1 3r31215. 3r33737. 3r31215. 3r33737. 3r31215. 3r33737. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r31078. We will need a VP, which can change the value on the selected leg without affecting all the others. First, create 3r3992. Enum 3r3993. with the serial numbers of the legs in the port, save as "Strict Type Def" in the file SP_LBYTE_BITS.ctl. Create a new VI, add the usual error stream terminals. We read the current value of the parallel port using MPSSE_Get_LByte.vi, using the function 3r3992. Replace Array Subset modify the required bit and write the value back to the port (MPSSE_Set_LByte.vi). 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. SP_Set_Flag.vi [/b] 3r31070. 3r31078. 3r33737. 3r3-1089. 3r31215. 3r31054. SP_Set_Flag.vi 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r3742. 3r3-1089. 3r31215. 3r31054. Block diagram SP_Set_Flag.vi 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r3751. 3r3-1089. 3r31215. 3r31054. Enum SP_LBYTE_BITS.ctl 3r3-131121. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r31078. To begin configuration, the MPSSE controller must generate a low-to-high transition on line 3r31054. nCONFIG . As soon as the FPGA is ready to receive data, it will form a high level on the line 3r31054. nSTATUS . At this stage, everything is ready for an experiment in iron. In the block diagram SP_FT_MPSSE_FPGA.v, we add line management 3r31054. nCONFIG - after initializing the MPSSE, we submit a low level and then a high one. After each operation (for debugging) we read the state of the port's legs. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. SP_FT_MPSSE_FPGA.vi [/b] 3r31070. 3r31078.
3r3-131121. 3r3-1089. 3r31215. 3r31078.
3r3-131121. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r31078. In general, during the launch of VI, it can be seen that the FPGA responds to the transition on the line 3r31054. nCONFIG - on the leg 3r31054. nSTATUS set to zero and then one. But it will not be superfluous to check it with an oscilloscope. Almost any dual channel oscilloscope with the ability to run on the trigger (standby). Channel 3r3808. A (blue track) I put in the control point of the chain nCONFIG , channel 3r3808. B (red track) - chain nSTATUS . The trigger is set to the falling edge of the channel 3r3808. A . 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r33814. 3r33815. 3r31120. 3r3-1089. 3r31215. 3r31054. The picture is clickable. With details! 3r3-1055. 3r3-131121. 3r3-1089. 3r31215. 3r33824. Work with file 3r31083. 3r3-1089. 3r31215. 3r31078. FPGA is ready to accept the configuration file. Are we ready to transfer the file to the FPGA? 3r3-131121. 3r3-1089. 3r31215. 3r31078. LabVIEW contains an extensive set of tools for working with files. Not to say that the functional is enough for absolutely the whole range of tasks, but the basic operations like 3r31054. reading and 3r31054. Record 3r31055. performed easily and pleasantly. The main set of VI for working with files can be found in the "File I /O" panel. For the problem to be solved, it is required to open the configuration file, estimate its size (we need to know how many bytes to send the FPGA), read it and close it. Everything is simple and one after the other. We use VP 3r3992. Open /Create /Replace File , 3r3992. Get File Size , 3r3992. Read from Binary File , 3r3992. Close File , we unite them a chain of a stream of errors and 3r3992. refnum 3r3993. - a number, such as a file descriptor, is created when the file is opened and must be passed to the input by other VIs working with this file. 3r3-131121. 3r3-1089. 3r31215. 3r31078. So far we have nowhere to recycle the read data, but if you really want to check the performance of the chain, you can create an indicator of the type 3r3992. String 3r3993. and customize it a little bit. In the context menu, activate the "Hex Display" option, turn on the vertical scrollbar (Visible Items -> Vertical Scrollbar) and after launching we observe the contents of the binary configuration file. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. SP_FT_MPSSE_FPGA.vi [/b] 3r31070. 3r31078. 3r33861. 3r3-1089. 3r31215. 3r31054. Front Panel. We look at the contents of the file 3r31055. 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r33838. 3r33871. 3r31120. 3r3-1089. 3r31215. 3r31054. Block diagram Karinka clickable 3r31055. 3r3-131121. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r31078. The block diagram of the VI formed two independent parallel lines of code, so separate error chains are used for them. In order to reduce parallel threads into one terminal 3r3992. Error Out 3r3993. The function used is 3r3992. Merge Errors . This function looks for errors at the input from top to bottom (yes, there may be more than two input terminals, stretched with the mouse) and returns the first one it finds. If there are no errors, it returns the first warning that occurred. If no warnings are detected, then there is no error at the output. It is important to note that the order of connecting inputs 3r3992. Merge Errors determines the priority of errors, and if the error occurs in two chains at once, the lower error will be ignored. To this must be treated carefully. 3r3-131121. 3r3-1089. 3r31215. 3r31078. If we try to press the "Program" button in the top-level VI without selecting a file, then an empty path will go to the SP_FT_MPSSE_FPGA.vi input, which causes an error "Error 1430. LabVIEW: (Hex 0x596) The path is empty or relative. You must use an absolute path. " As my childhood friend says: “Trivia, it’s something everyday!” And this error is not at all an error, but a user's inattention. We will not stop the program and swear at it with a window with a red cross, simply remove the error with this code from the stream and in the dialog box we recommend the user to decide on the file. To filter errors, use the "Clear Errors" VP from the "Dialog & User Interface" palette. To display the message - "One Button Dialog". 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r33897. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. The block diagram of [/b] 3r31070. 3r31078. 3r3r6906. 3r3907. 3r31120. 3r3-1089. 3r31215. 3r31054. The picture is clickable 3r3-131121. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r33918. Download configuration 3r3-1089. 3r31215. 3r31078. For serial data transfer to the MPSSE processor, you need to send op-code 0x1? the command arguments will be the length of the transmitted sequence (two bytes, starting with the lowest), and the data sequence itself. Length is coded minus one. Sending a data block will be issued as MPSSE_send. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. MPSSE_Send.vi [/b] 3r31070. 3r31078. 3r3393931. 3r3-1089. 3r31215. 3r31054. MPSSE_Send.vi 3r3-131121. 3r3-1089. 3r31215. 3r31078. 3r340940. 3r3-1089. 3r31215. 3r31054. The block diagram 3r3-131121. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r31078. The size of the input buffer (
Array Size
) Is converted to a two-byte type U16 3r3993. , subtract one, swap the low byte and high byte (3r3-392. Swap Bytes
) - send the length starting from the low byte, and convert the two-byte number to a single byte array (3r3-3993. Type Cast ). 3r3-131121. 3r3-1089. 3r31215. 3r31078. Function 3r3-392. Type Cast deserves special attentionand I. This is such a universal type converter, which sometimes is surprisingly quick-witted. In short, then: 3r3-1089. 3r31215. 3r31078. 3r33939. 3r3-1089. 3r31215. 3r31054. Visually for the programmer 3r3-131121. 3r3-1089. 3r31215. 3r31078. However, this is not just a conversion of data to another type, it is also a heuristic interpretation. This function allows you to convert between incompatible data types, and the function does not hesitate to align the input data and even remove the "extra" parts. If the requested data type requires more memory than the input data, the function will allocate the missing amount. For novice developer LabVIEW Type Cast
can become a lifesaver, but with growing up, it is better to refuse such a converter — it is very much hidden from the eyes and can become a source of unforeseen mistakes. It is better to use more explicit conversion methods, for example, 3r3992. Coerce To Type . 3r3-131121. 3r3-1089. 3r31215. 3r31078. During the initialization of the MPSSE processor, we set the maximum allowed buffer size for data transfer to 65536 bytes, therefore we must divide the configuration file into fragments whose size does not exceed the specified size. Use the function 3r3992. Array Subset , this function extracts a subarray from an array starting with the element 3r3992. index and long 3r3992. length . We will break in a cycle 3r3992. While , each iteration of the index will be increased by 6553? between iterations, the value will be passed through the shift register. As soon as it is not possible to pinch 65536 bytes from the main array, we take everything that is left, we send and stop the cycle. 3r3-131121. 3r3-1089. 3r31215. 3r31078. According to the download protocol, after all the data has been transmitted, you need to give two more clock pulses to begin the initial FPGA. To do this, after the cycle, we are sending another “empty” byte. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. SP_FT_MPSSE_FPGA.vi [/b] 3r31070. 3r31078. 3r3-131121. 3r31211. 3r31211. 3r3-1089. 3r31215. 3r31078. In order to understand the success of the firmware, we consider the flags, and, if
CONF_DONE
installed in the unit, we report the top level VP, that everything is OK. 3r3-131121. 3r3-1089. 3r31215. 3r31078. The program is complete. It remains to make sure that the FPGA is successfully flashed, and the board blinks happily with LEDs. 3r3-131121. 3r3-1089. 3r31215. 3r31028. About naming VP
3r3-1089. 3r31215. 3r31078. It is not a secret to anyone that in classical programming all user objects and functions should be given meaningful names, the same can be said about LabVIEW, especially if SubVI acts as objects. I am used to giving the files to the VIs based on their place in the hierarchy of software being developed. In the current application, four levels of abstraction can be distinguished: 3r3-31121. 3r3-1089. 3r31215. 3r31036. 3r31215.
The lowest level is the VIs that perform direct interaction with FTDI, most of them come down to calling the corresponding function from the API D2XX. In my project, the names of the VIs of this level I started with the prefix "FT", for example FT_Close.vi or FT_Read.vi. 3r31199. 3r31215.
The second level is the interaction with the MPSSE processor. The names of the VIs of this level begin with the prefix "MPSSE". Example: MPSSE_open.vi, MPSSE_Set_LByte.vi, MPSSE_Get_LByte.vi. 3r31199. 3r31215.
The third level is the implementation of the "Passive Serial" protocol on top of the MPSSE. All files have the prefix "SP". For example, SP_FT_MPSSE_FPGA.vi (eerie name consisting of abbreviations) and SP_LBYTE_BITS.ctl. 3r31199. 3r31215.
Application level Top level ip. The name can be arbitrary, human-oriented. 3r31199. 3r31215. 3r31201. 3r3-1089. 3r31215. 3r31078. If the project is large enough (dozens of VPs), then for each level it is better to store the files in separate directories with the appropriate name. In our project, all the VPs are located in the same folder 3r31054. subVI
. 3r3-131121. 3r3-1089. 3r31215. 3r31059. Conclusion 3r3-1083. 3r3-1089. 3r31215. 3r31078. It may seem that the description of the process is too detailed, but I really didn’t want to create another handbook for drawing owls. 3r3-131121. 3r3-1089. 3r31215. 3r31067. 3r31068. We draw an owl [/b] 3r31070. 3r31078. Materials
3r3-1089. 3r31215. 3r3r1086. 3r31215.
Blum P. LabVIEW: programming style. Per. from English by ed. P. Mikheeva - M .: 3—3-31089. 3r31215. DMK Press, 2008 - 400 pp., Ill. 3r31199. 3r31215.
3r31094. labview_mpsse . Repository with the project. 3r31199. 3r31215.
3r31099. Training stand for DSP
. Iron for the experience 3r3r1199. 3r31215.
3r31-104. Software Application Development D2XX Programmer's Guide
. API Guide D2XX. 3r31199. 3r31215.
3r31211. 3r31215. 3r31215. 3r31112. ! function (e) {function t (t, n) {if (! (n in e)) {for (var r, a = e.document, i = a.scripts, o = i.length; o-- ;) if (-1! == i[o].src.indexOf (t)) {r = i[o]; break} if (! r) {r = a.createElement ("script"), r.type = "text /jаvascript", r.async =! ? r.defer =! ? r.src = t, r.charset = "UTF-8"; var d = function () {var e = a.getElementsByTagName ("script")[0]; e.parentNode.insertBefore (r, e)}; "[object Opera]" == e.opera? a.addEventListener? a.addEventListener ("DOMContentLoaded", d,! 1): e.attachEvent ("onload", d ): d ()}}} t ("//mediator.mail.ru/script/2820404/"""_mediator") () (); 3r31113. 3r31215. 3r31211. 3r31215. 3r31215. 3r31118. Only registered users can participate in the survey. 3r31119. Log in 3r31120. , you are welcome. 3r3-131121. 3r31215. 3r31215. 3r?13?124. 3r31215. 3rr31126. 3r31215. 3r?13?128. Is the LabVIEW
topic interesting? 3r31215. 3r31211. 3r31215. 3r31215. 3r31134. 3r31215. 3r31136. 3r31215. 3r31138. 3r31215. 3r31140. 3r31215. 3r31215. 3r31143. 3r31215. 3r31187. 3r31215. 3r31189. 3r31215.
3r31193. Yes. The topic is interesting. 3r31194. 3r31215. 3r31196. 3r31215. 3r31215. 3r31199. 3r31215. 3r31187. 3r31215. 3r31189. 3r31215. 3r31215. 3r31193. The topic may be interesting, but for Habra it is offtopic. 3r31194. 3r31215. 3r31196. 3r31215. 3r31215. 3r31199. 3r31215. 3r31187. 3r31215. 3r31189. 3r31215. 3r31215. 3r31193. Not interesting. Theme for a narrow circle of specialists. 3r31194. 3r31215. 3r31196. 3r31215. 3r31215. 3r31199. 3r31215. 3r31187. 3r31215. 3r31189. 3r31215. 3r31215. 3r31193. LabVIEW is a proprietary misunderstanding. Forgive and forget. 3r31194. 3r31215. 3r31196. 3r31215. 3r31215. 3r31199. 3r31215. 3r31201. 3r31215. 3r31215.
3r31215. 3r31211. 3r31215.
Voted 1 user. There are no abstentions. 3r31211. 3r31215. 3r31211. 3r31215. 3r31215. 3r31215. 3r31215.
It may be interesting
weber
Author12-11-2018, 08:11
Publication DateLabVIEW / Abnormal programming / Industrial Programming / Prototyping
Category- Comments: 0
- Views: 399