Def sequence (table grapes) with loops, clocked by the relatively long software.

Hello and apologies in advance I am an infrequent user of LabVIEW.

Running on a VI to control a peristaltic pump and valve used to control some for a biosensor nanogap Microfluidic devices. I have the pump and the valve works manually (i.e., I adjust the values on the fly) but I am now trying to allow the user to define a sequence of steps that are then executed one after the other.

User input: number, flow, duration of valve, pump direction (boolean).  Ideally the user can then run several different steps by adding more steps, so I thought of an indexed cluster array where each element represents a step?

I would like the user to enter the time in minutes and seconds. The minimum will usually be 30 seconds and could be as long as an hour. I'm not sure of the best strategy for the timed loop, if I understand the use of the block 'waiting (ms)' can cause problems. I thought about getting a timestamp, a value added to it and the comparison? Are there any other suggestions?

Any advice would be appreciated.

I use an acquisition of data USB-6009.

PS the VI LabVIEW is probably an education version, so may cause problems when opening?

Just ask yourself how you should architect your code? Using a table of parameters of the step is an eay easy to do. And the wait is not necessarily a bad thing, it depends on your application and if you need the calendar to be exact in a certain way. You can use wait it until Mrs several place for synchronization.

You can lookin to a State Machine architecture to make the best UI feature.

The Computer of State Simple model that comes with LabVIEW is really the best way for new developers to become familiar with LabVIEW using a semi scalable architecture.

Here is a large example of the works of a state machine:

  • States: Init, slowed down, exit, DoThing1, DoThing2, DoThing3
  • Each State contains code that could take some time. Ideally, not too long because this is how long your code might not meet.
  • The idle state contains a structure of event for all of the user interactions.
  • The front panel has a button that says "do the 1 thing.
  1. Loop iteration 0: Application starts, the first State is Init. Init State made the initialization stuff and tells the application to go to the idle state when finished.
  2. Iteration of the loop 1: request goes to the idle state. He's sitting there, waiting for the structure of the event.
  3. Time passes, and then the user presses the button 'do 1 thing ". There is no code or minimal code, within the occurrence of the event. The output of this state of the event tells the application to go to the State of DoThing1.
  4. Iteration of the loop 3: Application passes to the State of DoThing1. Here, there is code that does a few things. The output of DoThing1 State tells the application to return to the idle state.
  5. Iteration of the loop 4: Application goes to a State of rest where he waits again to the structure of the event.
  • Each State can tell the application to go to any State they want. You want to reset? Return to the Init State. You want to put an end to the program? Go to the exit State. You want each State to start another (such as a sequence)? Have DoThing1 out of DoThing2, which DoThing3, which outputs Idle.

You can create a report that runs the cluster setting input and operates it. The risk with a long wait, is that the code will not be able to receive entries to user during this waiting period. So if you make a long wait, you can use a VI of elapsed time to check several times if the wait is over.

Tags: NI Software

Similar Questions

  • Create a table in a loop 'for' (reset the number of loops)

    Hello

    I try to incorporate a signal of acceleration from an analog input CRIO to get speed and then further integrate to get the moving of a vibration system.

    I understand that to achieve integration, a table must be fed in. My problem is that I could not buffer the signal in a buffer block, as I couldn't find buffer blocks. so I decided to create my data table by using a loop "for". The nests of the loop 'for' inside a timed loop. The problem that I'm stuck on is how to reset the loop 'for' in order to fill the buffer with each iteration of the outer loop timed.

    I enclose the code if that helps. Note that I use labview in 2013.

    If anyone who has encountered a similar problem before can help me, I would be gratefull.

    Concerning

    Ali

    You can use a shift register initialized as inputs to your curls, to build your table of one. However, you realize, don't you, that the execution of your program as written loops as soon as the computer can spit out responses, then the output array may contain several points that took place before the entry has updated? Assuming that your thing cRIO (I've not worked with these) has integrated into its routine acquisition of calendar data, I suggest you put that inside the loop to get a data point by reading.

    And do you really want your graph to distance for update only every thousand points (points of acceleration million) speed?

    Cameron

  • Table row with loop for each group to set the variable.

    HI: There is probably a simple answer for this, but I don't the have not found...

    I have a single row table to move through a group to set a variable containing a sum running. I'm not display the amount in the table but when I saw the report, I see that the table is expanding (add lines) for each loop.

    The only line table has 3 columns.

    1st column
    <? for-each: AC_GROUP? >

    2nd column
    <? xdoxslt:set_variable ($_XDOCTX, 'xAmtVar', xdoxslt:get_variable($_XDOCTX,'xAmtVar') + CURRENT_AMOUNT)? >

    3rd column
    <? end foreach? >

    Can I use <? for each group? > or something else. My requirement is to set the value of the variable with the total running, but because the loop is adding lines for each value he travels (though not displayed), it's also affecting other areas of the presentation of the page.

    Hope it makes sense. Thanks in advance.

    You can do it many ways.

    No need to loop
    You can create a variable and specify the amount of the sum directly to that.

    
    

    or

    loop through, then add as you do.

    
    

    give any space or enter characters in a word between them, just put it in a single form field will be

    But as I said, I'd definitely go with the first option.

  • Dynamic SQL, dynamic table name with TPCV statement including the date

    Hello

    I just wanted to help with the following block of PL. My problem is when I try to run this block it ask to call the values for 2, even if no variable substitution replacement variables not present in the code. Please find the code below:


    Declare
    Cursor C_1 is
    Single select table_name from gsi_daily_count;
    table_names varchar2 (240);
    Begin
    C_1 open;
    Loop
    Extract the C_1 in table_names;
    WHEN THE EXIT C_1% NOTFOUND;

    EXECUTE IMMEDIATE "select last_extract_date,
    TO_CHAR (min (largest (nvl (last_update_date,'| 1 January 10 |'), nvl (program_update_date,'| 1 January 10 |'))),'|) HH24:MI:SS DD-MON-YY |') MI,
    TO_CHAR (max (greatest (nvl (last_update_date,'| 1 January 10 |'), nvl (program_update_date,'| 1 January 10 |'))),'|) HH24:MI:SS DD-MON-YY |') my
    of ' | table_names | »
    Last_extract_date group
    order of last_extract_date desc';

    End loop;
    Close C_1;
    COMMIT;
    End;

    Help, please.

    Thanks in advance.

    Try this:

    Declare
    cursor C_1 is
    select unique table_name from user_tables;
    table_names varchar2(240);
    Begin
    Open C_1;
    Loop
    Fetch C_1 into table_names;
    EXIT WHEN C_1%NOTFOUND;
    
    EXECUTE IMMEDIATE('select last_extract_date,
    to_char(min(greatest(nvl(last_update_date,''01-Jan-10''),nvl(program_update_date,''01-Jan-10''))),''DD-MON-YY HH24:MI:SS'') mi,
    to_char(max(greatest(nvl(last_update_date,''01-Jan-10''),nvl(program_update_date,''01-Jan-10''))),''DD-MON-YY HH24:MI:SS'') ma
    from ' || table_names ||'
     group by last_extract_date
    order by last_extract_date desc');
    
    End Loop;
    Close C_1;
    COMMIT;
    End; 
    
  • Update a table in a loop with a table, not a single value

    Hey everybody,

    I'm new to the Forum, but I do LabVIEW for almost a year now.  I work to make my code much more simple, but I encountered a problem that I can't seem to overcome.

    Say I want to graph a numeric control.  I'm updating the digital control to 5 and 5 graphic updates.  Whenever my loop is executed, the 5 is reloti.  Easy to see that the updates fast loop, my FP will have too much processing time.  How to pass control to an array and only draw table each, for example, 10 iterations of the While loop?  I thought using the 'i' in the While loop and a structure case (use is equal to? 10 as the true to update case).  That doesn't really seem to be the answer... Any help is appreciated.

    Hi, Mr. Bass,.

    Thank you for your post and welcome to the forums of NOR.

    If you want to update every 10 iterations, for example, you can use "Quotient and remainder" LabVIEW function found in the palette of the digital - divide the number of iteration by 10 and check the rest, if it is equal to zero then you're on the 10th, 20th, 30th, etc the iteration. You can then use a case structure and write your chart in the case of true, with the condition is true, if the remainder is zero.

    Let me know how you go with this method.

    Thank you

  • How to insert data into tables using sql loops

    Oracle 10.2 g

    using Oracle sql * more

    Table amounts is
    create table student(id)
    as
    select distinct student_id
    from students_table;
    now
    desc student; will retrieve 
    
    student
    ======
    Name         Null?    Type
    ===========================
    ID                  VARCHAR2(10)
    Now create a sequence
    create sequence st_seq;
    alter table student add column no;
    select * from student
    
    no       id
    =========
            234
            298
    ..........
    This is the main part

    There are 100 student in the table

    now, I want to fill the table with sequences using seq.next_val

    How to use a loop to insert 100 auto generated numbers in the table.

    Thank you.

    Expected result
    Select * from student
    
    no     id
    =========
    1     234
    2     298
    .........
    Why I'm doing this instead of
    create table student(no,id)
    as
    select st_se.nextval,student_id
    from students;
    This will cause the duplication of the upn

    using separate throws an error.
    create table student(st_id,id)
    as select distinct st_seq.nextval,academicyear
    from student
    as select distinct st_seq.nextval,academicyear
    *
    ERROR at line 2:
    ORA-02287: sequence number not allowed here
    Thank you.

    Hello

    As you discovered, you cannot use SELECT DISTINCT and sequence. NEXTVAL in the same query.

    You can SELECT DISTINCT in a subquery, like this:

    CREATE TABLE     student
    AS
    WITH     distinct_ids     AS
    (
         SELECT DISTINCT     student_id     AS id
         FROM     students_table
    )
    SELECT     st_seq.NEXTVAL     AS st_id
    ,     id
    FROM     distinct_ids;
    
  • How to build a table inside a loop

    Hello world

    I have a fundamental question on labview. I would like to create a table in a loop 'for' in this way:

    inside the loop, if a condition named 'A' is true, then I add a new value to the first column of the table.  Otherwise, I have create a new column and start adding values in this column when the condition 'A' is checked, etc.

    I put an example of a VI when the 'A' condition is "improving the loop + 1 is not divisible by 5" and the values in the tables are to increase the loop + 1. The loop stops when the increment = 25.

    In this example, I have a single column with the values [1 2 3 4 6 7 8 9 11 12 13 14 16 17 18 19 21 22 23 24]

    while I wish I had a table of 5 columns:

    1 6 11 16 21

    2 7 12 17 22

    3 8 13 18 23

    4 9 14 19 24

    Note that this is just an example. More generally, the table may contain columns of different lengths.

    Thanks for your response

    Andrew

    Try to watch this VI I wrote, it takes a 1 d array and puts it into a 2D array based on a threshold. I think it's a pretty good example on how to insert a table of works. I hope it helps

  • Sorting table 2D with header?

    I'm not trying to apply anything in particular. I'm just wondering what would be the best aproach to solve this problem, if I asked.

    If I have a table 2D of strings with columns that contain text, others that contain numbers or timestamps, and the first line is the header, how I would go about how to sort on a particular column? The results did not come from a query of database so not "order by".

    I thought to use ActiveX calls to Excel. Another possibility is to use a temporary table of SQLite. How would you do that?

    SteveChandler wrote:

    I thought to use ActiveX calls to Excel. Another possibility is to use a temporary table of SQLite. How would you do that?

    In LabVIEW, of course!

    Here's what I'd do:

    (1) remove the header line, leaving a table 2D-data channels

    (2) extract the desired sort column.  In a loop for, browse the table 1 d resulting from chains.  Convert each string the appropriate representation and together with the number of iterations, so the output is an array of a cluster of two elements.

    (3) using 1-d matrix sort to sort the array of clusters.

    (4) browse the sorted table.  Unbundle the meter element, take this rank on the original 2D array and add it to a new table.

    (5) Insert the header row in the sorted table.

  • Table of path error 1430 in the loop for

    Hello!

    I have a problem with the 1430 error: path is empty or relative, which seems impossible. The thing is that I have a battery of indicators of path connected to the loop for (check the .jpg and there is no problem with writing to a file by using the paths of an array with the first and last index.) Others are not saved because of the error... to be honest, that all data paths are absolute. Record in the file of the idicator path is the work of a Subvi (merge data vi) but it is in a for loop because I need to make it available to multiple files. There is no error that occur with the work of Subvi to a path. The question is: what labview makes with the paths saved in a table between the loops? I have just run out of ideas so if someone had some time, I would really appreciate for all the tips and ideas.

    K.

    Hello again,

    If someone was interested in the happy ending: the solution is: 2 loops for. I think there must be something with the way that labview sends data between iterations. In any case - don't know how much exactly but works

    the floor is .jpg.

  • Import of CSV with loop value FOR

    Good afternoon

    I'm new to LabView and trying to write a VI that will eventually run a set of calculations on a set of data with millions of data points. I want the VI to count the number of data imported points of the. As they are written to a CSV file array. The number of points eventually will help me determine the behavior of the end of my calculations, it is not optional.

    I have trouble getting the file to read each successive line. The value 'for the iterations of the loop"feeds into the 'start reading Offset' «Worksheet File.vi reading» My intention was that this would result in a new line being read in the table with each iteration of the loop. What I get is the first value read over and over again in the first row of the table. Any ideas?

    Thanks for your time and help,

    Wes

    JWTyler wrote:

    I read it one line at a time so that the iteration of the loop is incremented at each line, to give me the size of the sample.

    Is there a better way to count how many points is imported? I could not find another way...

    There is a beautiful VI called "Table size" which will also do for you.

  • Save control table .cfg with knots of property.

    Hello!

    I have a façade with many (and I mean a lot!) boolean tables in tabs, and I want the ability to save the values selected by the user in a .cfg file, which will be used to make the same selection again without the trouble of clicking on buttons. The only controls that I want to save the value are Boolean tables 1 d of length 7 or 11, and these occur only on some pages tab. others have been setup so that their iteration a false criterion is satisfied and no code is running.

    I managed to get references to each control within each tab, and using a "more specific class' function to reduce it to only the controls in table. However, when this runs, pops up an error of "convert variant data" and use of a probe shows me the reference being called by my property at the time of the error node is to an INDICATOR array, rather than control. I thought that the node of 'controls on the page' and subsequently the control table class specifier would mean that references to other types of table would not make the real case where coming the backup configuration file.

    The indicator in question is a painting of a cluster of two strings and an array of strings, if that makes any sense / has no relevance, and the error occurs on the iteration 1 of the outer loop and the loop iteration 21 internal, corresponding to the control reference 22nd in the second tab.

    I hope that I have the problem clearly.

    There is a property called control? (or indicator?) This will help you sort out them.  I don't remember the exact name of the property, but that should get you close enough to find.

    Lynn

  • Synchronize with looping background

    Hello

    I'm doing 2d side view car animation.i have a background loop composition. Sometimes my car has to overcome obstacles on the road.and I cannot do a real synchronization between the compositions of the loop road and objects on the road.i cannot put objetcs open-ended know.how looping you can provide sync them together?

    the second question is have background looping and looping the wheels if I want to stop the animation I use the case expression, but when I want to start that maintain the rolling of composition, but it starts in the first image. How can I fix?

    Try this. Add a null value to the model and name it something like Null 1 speed. Add this expression to the position property of the null value:

    y = value [1];

    v = comp ("BackG.ai Comp 1").layer("BackG.ai").effect ("Offset") ("Center To Shift") .velocityAtTime (.1);

    s = (time - inPoint) * v 2;

    x = value [0] + s;

    [x [0], y]

    This is what makes the expression. Line a grab the current value of Y for the value null. Line 2 picks up speed of the offset in the model of the background. More on that later. Line 3 begins to count the time to the point of in the layer draw and then the time is multiplied by the speed of the offset in pixels per second. Because it is a shift of speed and not a speed of position, multiply this number by 2... Line 4 adds the value of "s" of line 3 to the value of position X of the null value. Finally, you declare the table for position that uses the calculated value for X based on the speed of the offset and the current value of y.

    Now you parent one of the obstacle of the layers to null, set the point in to the barrier layer and the null value at the point in the script where you want the barrier to appear and then down the timeline until it empties into the truck. Then divide you the layer (Ctrl/Cmnd + shift + d) and remove the first folio of parenting. You can then animate position and rotation to simulate the collision.

    Duplicate the value null and join the procedure with your other obstacles.

    One more comment on your computer. I noticed that the speed of your wheels did not match the speed of the background. It is also very easy to fix because you know the speed in pixels per second and if you multiply the diameter of the wheel by PI, you can calculate the circumference of the wheel. Simple math makes the wheels turn at the right speed. The expression in images keys and loopOut() courses can be replaced by this expression:

    v = comp ("BackG.ai Comp 1").layer("BackG.ai").effect ("Offset") ("Center To Shift") .velocityAtTime (.1);

    s = duration * v [0];

    c = Math.PI * width;

    s * c

    You should be able to figure thins out. Here is your comp with changes made to the layer of barrel. Take advantage of...

  • problem with loop statement

    Hello

    I'm new in plsql, so I need your help. I am rewriting the existing plpgsql function plsql function, but I have an error on line 15: PLS-00103: encountered the symbol "LOOP" when expecting one of the following values:

    What is the problem with the LOOP statement?

    FUNCTION to CREATE or REPLACE dothework (service_name text string_value)

    RETURNS the text AS

    BEGIN

    DECLARE

    result text;

    varying (31) of tempId character;

    tempFieldId bigint;

    text of tempStringValue;

    tempCount bigint;

    BEGIN

    result = ";

    FOR IN tempId

    SELECT ce.id FROM mfc.card_element this

    WHERE the ce.name AS service_name

    LOOP

    tempCount = 0;

    SELECT INTO tempFieldId mfc.card_field CF field_id

    WHERE cf.field_name = 'NPAname ';

    SELECT INTO tempCount count (*) FROM mfc.card_element_field_value cefv

    WHERE the cefv.card_element_id AS a tempId AND field_id = tempFieldId;

    IF tempCount = 1 THEN

    UPDATE mfc.card_element_field_value

    SET field_string_value = string_value

    WHERE the card_element_id AS a tempId AND field_id = tempFieldId;

    result: = result | tempId | 'UPDATE - YES,';

    ELSIF tempCount = 0 THEN

    INSERT INTO mfc.card_element_field_value (id, field_date_value, field_integer_value, field_string_value, card_element_id, field_id)

    VALUES (HIBERNATE_SEQUENCE.nextval,

    NULL,

    NULL,

    string_value,

    tempId,

    tempFieldId);

    result: = result | tempId | "INSERT - YES, ';

    ON THE OTHER

    result: = result | tempId | "tempCount,";

    END IF;

    -END IF;

    END LOOP;

    RETURN result;

    END;

    END;

    I did the same refatoring I program you unit and put comments to help to understand.

    Let me know if it help you

    FUNCTION to CREATE or REPLACE dothework (service_name in VARCHAR2

    string_value IN VARCHAR2) RETURN VARCHAR2 AS

    -Not necessary to define the new block here BEGIN-

    -SAYS - you only need the instruction stated in this case if you

    -believe that he can raise one exceptional and you want to manage block outsider

    --

    -You must set the buffer of varchar2

    -32767 is the largest amount

    RESULT VARCHAR2 (32767).

    --

    -You can dock this type for the column type, you will receive the data

    tempfieldid card_field.field_id%TYPE;

    -tempstringvalue VARCHAR2; -you do not use this variable

    tempcount NUMBER;

    BEGIN

    -You don't need to initialize with NULL, in this case. PLSQL has done already for you

    -THE RESULT: = ";

    --

    -It seems to me that this request can be outside of the loop

    -Once the table is not the change and the predicate doenst change is

    SELECT field_id

    IN tempfieldid

    Card_field FC

    WHERE cf.field_name = 'NPAname ';

    --

    FOR tempid IN (SELECT ce.id

    OF card_element this

    WHERE the ce.name AS service_name) LOOP

    -It is not necessary to initialize this variable to zero

    -tempcount: = 0;

    --

    --

    SELECT COUNT (*)

    IN tempcount

    OF card_element_field_value cefv

    WHERE the cefv.card_element_id AS a tempid

    AND field_id = tempfieldid;

    --

    IF tempcount = 1 THEN

    UPDATE card_element_field_value

    SET field_string_value = string_value

    WHERE the card_element_id AS a tempid

    AND field_id = tempfieldid;

    RESULT: = RESULT | tempid | 'UPDATE - YES,';

    ELSIF tempcount = 0 THEN

    INSERT INTO card_element_field_value

    (id

    field_date_value

    field_integer_value

    field_string_value

    card_element_id

    field_id)

    VALUES

    (hibernate_sequence.nextval

    NULL

    NULL

    string_value

    tempid

    tempfieldid);

    RESULT: = RESULT | tempid | "INSERT - YES, ';

    ON THE OTHER

    -I remove the tempCount on the "because I think you want to see the number of records

    -you do business with

    RESULT: = RESULT | tempid | ' ' || tempCount | ', ';

    END IF;

    END LOOP;

    RETURN RESULT;

    -END;

    END;

    Best regards

  • I want to loop through the data from two different tables using for loop where the query should be replaced at runtime, please help me

    I have the data into two table with the structure of similar column, I want to loop through the data in these two tables

    based on some condition and runtime that I want to put the query in loop for example, the example is given, please help me

    create table ab (a number, b varchar2 (20));

    Insert into ab

    Select rownum, rownum. "" sample "

    of the double

    connect by level < = 10

    create table bc (a number, b varchar2 (20));

    Insert into BC.

    Select rownum + 1, rownum + 1 | "" sample "

    of the double

    connect by level < = 10

    declare

    l_statement varchar2 (2000);

    Boolean bool;

    Start

    bool: = true;

    If it is true, then

    l_statement: =' select * ab ';

    on the other

    l_statement: =' select * from bc';

    end if

    I'm in execute immediate l_statement - something like that, but I don't know

    loop

    dbms_output.put_line (i.a);

    end loop;

    end;

    Something like that, but this isn't a peace of the code work.

    Try this and adapt according to your needs:

    declare

    l_statement varchar2 (2000);

    c SYS_REFCURSOR;

    l_a number;

    l_b varchar2 (20);

    Boolean bool;

    Start

    bool: = true;

    If it is true, then

    l_statement: = "select a, b, AB;

    on the other

    l_statement: = "select a, b from bc;

    end if;

    --

    Open c for l_statement;

    --

    loop

    extract the c in l_a, l_b;

    When the output c % notfound;

    dbms_output.put_line (l_a |') -' || l_b);

    end loop;

    close c;

    end;

    /

  • Get the attribute value of a def page table by using el expression.

    Hello

    Use Jdeveloper 11.1.2.0.0 and have a requirement like this for which a sample is created. Requirement is as follows...

    1. do you have a Taskflow with a readonly employee table.
    2. by clicking on a button called "itinerary" checks if the selected line, the attribute Manager id value = 200 then go to the first page on the other if the value attribute id manager is 200 then go to the second page.


    Through the def page, if it has the form, then we can access the attributes like #{data.view_FirstPageDef.ManagerId}. In the case of acquisition of the same attribute value from the table using the def page? is what I am unable to get...

    Come to the notion of routing using the router on Taskflow activity. But I am unable to get the selected row in a table of employee page def attribute value. Can anyone suggest on the same...


    Thank you and best regards,
    Olivier G

    On the router, right-click on its icon in the workflow and create a page definition. Then in the file def, add an iterator based on the same view of the table object in the first page, then add a value attribute that is mapped to the managerId in the iterator of the View object. Finally in the router, you can write EL expressions along the lines of #{bindings. ManagerId.inputValue = 200} or #{bindings. ManagerId.inputValue! = 200}.

    CM.

Maybe you are looking for

  • Update of FF 18.0.2, now FF crashes at startup

    I upgraded FF 18.0.2. Update immediately after FF crashes at startup. FF is running in safe mode.Crash ID: bp-f138d304-0040-4ac9-b51e-ab8c12130206 Please notify. Thank you.

  • 12 Firefox will not now allow Hotmail work.

    Having been using Firefox for a few years now and never had any problems with access to Hotmail. Recently updated to 12 of Firefox and initially it worked fine with Hotmail. In the last days, Hotmail has become unusable. I can connect you as usual, b

  • Different keyboards

    I just replaced the keyboard on my Satellite 1805 with a new keyboard. The new keyboard is very similar to the American keyboard but has a number of differences. For example, there are different combinations of the following keys:"2" and "and @ (in p

  • Satellite P100-347: I'm tired of this!

    On 30 March, I bought a new Toshiba laptop (P100-347) that was advertised as coming with a FREE update to Windows Vista. The guys at the shop told me that the only thing I have to do to get this update is contact Toshiba. I'm going home and I realize

  • Help, audio stop working in XW6600 with nVidia NVS 315 graphics card

    Greetings: I just buy a renovated, XW6600 Xeon dual processor, 8 GB of RAM, Windows 7 Professional 64 bit system.  The PC comes with a nVidia NVS 290 graphics card.  Everything works fine and the speaker in the motherboard Jack produces sounds.  Howe