Instrument identification in process model

Hi All,
I have a set of Instrument using LXI,VXI,PXI,MXI and GPIB buses. I have the code module in Labview to indentify and initialize the instruments. I need to identify the instuments every time the Test sequence is loaded,hence i'm thinking to modify the process model to do the same.
But i don have any idea,where to integrate my code module in process model. I require some suggestions for the same.
Thanks in advance
Regards
VDC

Hi VDC,
I have tried the mentioned Callbacks. All workes as assumed. I figured out that SequenceFile callback ist probably not the best for you because you can not give the instrument handel to your running execution(uut) with a SequenceFile Global (OK there are other solutions but i think they are too deep or not effectiv.)
I think you should try Pre and Post(for Cleanup Handles) UUT Loop
Just try the TS4.0 example
Greetings
Juergen
=s=i=g=n=a=t=u=r=e= Click on the Star and see what happens :-) =s=i=g=n=a=t=u=r=e=
Attachments:
DemoSeqFileCallback.seq ‏7 KB
DemoUutLoopCallback.seq ‏8 KB

Similar Messages

  • How to add process model results to the sequence file results?

    After my sequence file runs, I would like to add some additional results using the process model. I need to log my equipment list which is obtained by the process model. Alternatively, I could add a sub-sequence to the end of each of my sequence files for doing this, but that would create maintenance problems if I ever needed to change the way equipment is logged. Does anyone know a way to (1) append process model results to the sequence file results or (2) force each client sequence file to call a sub-sequence before returning to the process model.

    Mark -
    The report and database process model routines expect a single subsequence step result that invoked MainSequence. This result contains the results from the sequence call.
    In TestStand after the process model root sequence call to MainSequence is performed, the property Locals.ResultList[0] is the MainSequence result. The subproperty Locals.ResultList[0].TS.SequenceCall.ResultList contains the results from the steps in MainSequence.
    One option is to create a subsequence call in the process model that logs the equipment info in the results for its steps. The call to the subsequence should not be checked to record results.
    This subsequence would have a parameter called ResultList. The Result type does not exist in the Insert menu, so you can only create the parameter by copying the empty Locals.ResultList and pasting it in the parameters. Then change its type from By Value to By Reference.
    In the setup of the subsequence, add the following steps which do not record results. These steps rename the Locals.ResultList parameter to ResultListOrig, and then create a new Locals.ResultList alias property that really references Parameters.ResultList. This way any additions to the Locals.ResultList really append to the Parameter.ResultList.
    Setup
    Step: "Rename Locals.ResultList"
    StepType, Adapter: Action, Active-X
    Description:
    Action, Set PropertyObject.Name = "ResultListORIG"
    Record Results: False
    Step: "Create Alias in Locals"
    StepType, Adapter: Actioin, Active-X
    Description:
    Action, Call PropertyObject.SetPropertyObject ("ResultList",
    0x201 ' Not Owning and Create, Parameters.ResultList)
    Record Results: False
    In the Main steps, you add your equipment info steps which record results.
    In the Cleanup steps you undo the steps performed in Setup.
    Cleanup
    Step: "Delete Alias in Locals"
    StepType, Adapter: Action, Active-X
    Description:
    Action, Call PropertyObject.DeleteSubProperty ("ResultList",
    0x400 ' Refer to Alias)
    Record Results: False
    Step: "Rename Locals.ResultListORIG"
    StepType, Adapter: Action, Active-X
    Description:
    Action, Set PropertyObject.Name = "ResultList"
    Record Results: False
    I have attached a TS 2.0 version of SequentialModel.Seq that has a AppendResults subsequence in it and this is invoked after MainSequence in Single Pass entry point.
    Hope this helps...
    Scott Richardson (NI)
    Scott Richardson
    National Instruments
    Attachments:
    SequentialModel.Seq ‏174 KB

  • Reversal Process Model using PUOCBA

    Hi Guys,
    There is a requirement in our Co. to set up a reversal process model using PUOCBA.
    As far as i know, it is a pretty standard process and we need to copy standard process model SAPUSOCV and create our own and use the same in PUOCBA selecting the reversal option.
    I am doing my every steps correctly, but some how in table T52OCG the Processing type field is not converted to 'V' which is necessay for reversal and it does not allow me to do reversal.
    Kindly brief me on the same , if you have face the same kind of problem or have worked on it.
    Regards,
    Ketal Parikh.
    1-847-330-4127

    Hi Jim,
    So this is my understanding. You have two different sequence files that are run for two different Test Environments. These two environments uses two different data structures to perform some initialization on two different instruments.
    The best way to do so without any modification to the sequential process model is to create Sequence File Globals. So lets say that you have test sequence 1 and test Sequence 2. The two data structures will be DataStruct 1 and DataStruct 2. So open your Test sequence 1 in the sequence editor. From the "View" drop down box on the sequence editor, select "Sequence File Types" and create your DataStruct 1 here. Similarly do that same for Test Sequence 2, create DataStruct2.
    Now use the ProcessSetup and ProcessCleanup callback. Again you shouldn't modify your process model. Go to Edit Menu >> Sequence File Callbacks. Select your callbacks and click add. This will automatically add your callbacks to your Test Sequence files. Now you can add the code relevant to your instruments here and you have access to your datastructure as well. The beauty with callbacks is, you can override the ones in your process model by the ones in your sequence files. This is automatically done, when you place the callback in your sequence file. Now we have accomplished what you wanted to do without a single modification to your process model.
    I hope this helps
    Sijin Karayil
    National Instruments

  • Custom Unattended Process Model Based Upon Duration of Test

    I am looking to develop a test system that:
    Runs the Batch Process Model
    Displays a Custom UUT Serial Number dialog once upon start
    This dialog will also display the desired test duration and various instrument settings
    Loops on the MainSequence for a fixed amount of time OR Loops on the main sequence for a fixed number of iterations
    This should be implemented in the process model
    Does not display any pop-up dialogs during testing
    The goal is for the test to run "unattended"
    I started with a copy of the Test UUTs process model, but wanted to get some advice on how others would design this system.
    A few questions:
    What is the best method for implementing the looping on the MainSequence for a fixed amount of time in the process model?
    What is the best method for avoiding pop-up dialogs from occurring during the test?
    Thanks!
    CLA, CTA

    Put the call to MainSequence inside of a While loop. Use Seconds() to get current time, store in variable and then measure difference between subsequent calls to Seconds() and that variable to determine if your timeout has been met. You can also increment a counter in this loop as well.
    Use custom PreUUT, PostUUT, ProcessModelPostStepRunTimeError and ProcessModelPostStepFailure callbacks. All TestStand-based popups occur in those four areas. There are examples of handling run time errors and failures in the TestStand example folder.
    CTA, CLA, MTFBWY

  • How to load the sequence file from the process model?

    Does anyone have an example process model that loads a sequence file? The out-of-the-box process models assume the sequence file is already loaded. I want the process model to identify the UUT type and load the appropriate sequence file based on that.

    Mark,
    A better solution to your question can be accomplised if you have TestStand 2.0.
    Within the entry point of a process modle you can set the client sequence using Execution.ClientFile(). This is a new method of TestStand 2.0. It was specifically designed so that you could dynamically set the client sequence within the process model.
    Currently the entry points in the default process models (i.e. Test UUTs and Single Pass) are configured to Show Entry Point When Client File Window is Active. This means that you must open and have active a client sequence file before you can execute one of the entry point. You probably do not want this implementation if you are going to set the client file during the entry point execution. To change this you will need to go the sequence properties of your entry point (while the sequence is open select Edit>>Sequence Properties), switch to the Model tab of the entry point's property dialog box, and enable Show Entry Point For All Windows. The entry point will then appear whether or not you have an open sequence file active.
    You will need to add at least 3 steps to your entry point sequence that all use the ActiveX Automation Adapter. Remember that MUST disable Record Results for any step you add to the process model. The 3 steps will perform the following tasks:
    1) Obtains a sequence file reference of the file that you want to be the client sequence file. You will need to use the Engine.GetSequenceFileEx method. You will need a local variable (ActiveX data type) in which to store the sequence file reference.
    2) Set the client sequence file using the Execution.ClientFile property.
    3) Close the reference to the client sequence file in the Cleanup step group of your entry point sequence using Engine.ReleaseSequenceFileEx
    I am attaching a SequenceModel.seq file (the default process model in TestStand 2.0) in which we have modified the TestUUTs entry point as described above.
    Note that you'll be prompted to enter the path to your client sequence file. This is a message popup that you can delete and it was added for your review only.
    Good luck in your project,
    Azucena Perez
    National Instruments
    Attachments:
    sequentialmodel.seq ‏164 KB

  • Method to set the station process model

    Hi ppl...
    I'm building a custom operator interface in LabVIEW. I want to know the method to set the station process model.
    Thanks 
    Solved!
    Go to Solution.

    Vishal
    Applications Engineer 
    Natoional Instruments
    India

  • Best way to modify Sequential Process Model for report generation.

    I am using the Sequential Process Model in my application and the TestStand Reference Manual, (Figure A-1), clearly shows the following processing sequence:
    ...<part removed>
        Call the Test Sequence
        Display the UUT results
        Generate a Report
        Log Result to a Database
    ...<more removed>
    I want to generate the report BEFORE displaying the results to the operator, or at a minimum, I want to generate the report in parallel with displaying the results to the operator.  Currently, the problem I have is that when the test is done I have some automated scripts that take the data file and do some statistical processing on it, but the way the Sequential Process Model is set up, the test might finish but until the operator acknowledges the PASS/FAIL results display, the resulting file is never created.  It could be overnight, over the weekend, or several days before an operator comes back and says, "Oh that last test finished, I guess I can press the OK button!", but until they do, I get no data.  So I want the report generated no matter what, and right after the test finishes.
    Any ideas as to how that might be best accomplished?
    Thanks a billion -  Ski (noob)

    Ray,
    Is that new in 4.2 that the engine won't call a callback with nothing in it?  I just did it and it seemed to work fine.  I'm using 4.1.1 though.
    Ski,
    Maybe there is a better solution for what you want.  Are you using the SequentialModel?  What version of TS do you use?  Why does the report have to be written before the pass/fail banner displays?  The pass/fail banner gets displayed in the PostUUT callback.  Like Ray said if you just put that in your client sequence you won't see the banners.  However, I'm assuming there is more to this than just that.  I'm assuming you want to see the report because of your external analyzer that is gathering the statistical data.  And then based on that data you want to allow the user other options.  Is this correct? 
    If so then I would override the PostUUT callback and then use a different callback (possible the ProcessCleanup callback) to displaly the banners.  You could even do this without modifying the process model (which I always try to avoid).  Just override both the PostUUT and ProcessCleanup callbacks.  And then put code in the ProcessCleanup to behave like you need.
    Or if you want you can modify the process model and create a new callback lower in the process model.  Then have that new one do the post report analysis.
    Just some thoughts.
    jigg
    CTA, CLA
    teststandhelp.com
    ~Will work for kudos and/or BBQ~

  • Effective Language for Business Process Modelling in a Web Community

    It's a very exciting idea of having business process definition/innovation a community driven process.
    Just Imagine a stituation where somebody can innovate a process on a theoritical level which is then perfected by   business community opinion/examples for benchmarking, effectiveness, relevance etc.
    The ultimate business community dream would be Finding their process in the community. Finding merits and demerits of their process. Explore for a refinement to the process. Getting a copy of their newly created process and
    droping it into their IT system and the wonderful IT system upgrading itself to the new process and executing it.
    The Impact of simplification would be enormous:
    Just check out the possibilities
    Every businessman would be an IT user to get ideas for business and business execution
    The IT Guy would be recognized as process maker
    For a business entity Presentation during AGM could be extra transparent :-).
    A very concrete step in this direction would be to have a language or tool which is very easy to understand and drives people for exploration.
    My Wish would be a Visual web tool which defines a specific business process in the most simple form, and from there somebody can explore the enhancements to the process.
    For example a simple selling process done in medicine shop is
    listening the order verbally , delivering it immediately, getting cash immediately and [typing the Invoice on XL or Word or POS machines], printing it and then giving to Customer.
    after selecting this business process on the tool one should be able to explore the possible process
    enhancements with known business benefits
    like
    a) offer credit facility to customer--> just a worklist to collect pending money
    b) take order now and supply later for non available medicines
    c)Start home delivery
    The businessman should be able to select (1) or (2) which then becomes his new process.
    This can be sent to his IT landscape which should be able to interprete it and then grow itself Ah.... 
    dreaming
    [or atleast the model should tell the IT guy what to do!!].
    The generic business Process enhancements Options are not too many and can be defined and classified
    See the Options in the above mentioned business process context
    1)Automation[Create Purchase order from ]
    2)Increasing depth [The above example a,b,c are for increasing depth]
    3)Step simplification[In the above example instead of word using the POS Machine is simple]
    4)Resource utilization[If you have a PC and don't want to buy POS Machine then type the invoice on a Word :-)]
    5)Delegation
    5)Workforce optimization {any examples :-)community driven}
    7)Process optimization (How to deliver the medicine route wise)
    8)Colloboration (Using courier to send medicine)
    9)Knowledge provision (giving sales/payment trends,)
    The idea is so simple but making this tool highiely context(business) sensitive and intuitive is challenge.
    But anyway it's not impossible to have a business process language which is effective and an IT systems for which starting point is a business process. The IT system which takes your business process and executes them
    wonderfully.
    looking forward for this future
    Anand
    Message was edited by: Anand Rai
    Message was edited by: Anand Rai

    Hi Dilip,
    Thanks a lot for your reply.
    I'm also interested to know from community what are different tools used by them for process modelling?
    What are their merits?
    1)are they easily understandabale
    2) do they come with business context
    3)whether they can be used in a web comunity? Like somebody can give feedback or business case for a particular business process/step.
    4)Does it drive the IT automation
    5)Are there any appservers which take business model and generate/grow applications
    6)How the different modelling applications should communicate?
    7)Common standards
    For example
    I have used rational rose and RAD like VB they are complicated/simple enough to generate model based applications but the business representation and business context is totally missing. I would seek something with more business context or knowledgebase.
    Regards Anand

  • Finding the name of my teststand sequence in the process model

    I would like to be able to find the file path and name of a teststand sequence in the process model. I have created a simple vi which will display this information when run in a sequence. If i insert the vi into the process model, the file path and name returned is that of the process model and not the sequence under exectution. Is there a way of extracting this information in the process model?

    Davepar -
    If you are executing in the process model you can use the following as a lookup string if you are in the root context "RunState.ProcessModelClient.Path" or "RunState.Root.RunState.ProcessModelClient.Path" if you are not in the root context.
    Scott Richardson (NI)
    Scott Richardson
    National Instruments

  • BPM Process modeling

    Hi, I am creating process diagram in BPM Composer but within 30s to 40s the page getting auto refreshed and becoz of that I am not able to save my process model.
    how can I solve this problem?

    It's not that it's hard, it's just that there are a few things that you have to know how to do. You might find the step-by-step instructions in this to be helpful - http://www.oracle.com/webfolder/technetwork/tutorials/obe/fmw/obpm/11g/r1/firstProcess/firstprocess_obpm11g.htm. If you struggle with this, here are a few questions that might to help us understand where you are from a knowledge and a process perspective.
    1. Are you using Composer or Oracle BPM Studio (JDeveloper)? Reason for asking is the mapping is done differently in the two tools.
    2. Have you created an object in your catalog that represents the structure of the payload information you want to pass through the process?
    3. Do you have a process variables in your process that you will use to carry this payload through the process?
    4. Have you defined the Human Tasks for the Interactive activities in the process?
    5. If you have Human Tasks defined for the Interactive activities, have you defined the mapping of incoming and outgoing information using the Data Associations link?

  • How to push Process model to design model?

    I just learned how to capture business requirements and a logical design using the logical data modeler and process molder to create data flow diagrams, with composite, primitive and transformative processes in SQL Developer 3.0
    I know in Oracle Designer we were able to associate entities to business functions and transform the business functions into modules of type PL SQL or screen, etc.... We could create detail design documents from this information in Oracle Designer. In Oracle Designer the modules would be associated to the physical table definitions. However, the data flows in SQL developer are associated to logical entities.
    My question is can these objects/items (processes primitive, composite, transformative) be transformed into design items similar to how we transform a business function in Oracle Designer into a modulel?
    Thanks
    Mark
    Mark Kramm

    Hi Mark,
    there is no support for applications and modules in Data Modeler.
    Design can be exported to reporting repository and there is no limit in how you can utilize these meta data. Column groups and UI defaults can be defined at table and column level - I know some people are generating APEX applications and process model can be very helpful for that.
    In Oracle Designer the modules would be associated to the physical table definitions. However, the data flows in SQL developer are associated to logical entities.Each entity can be mapped to unlimited number of implementations in form of tables in relational and physical models. You need to engineer logical model to one or more relational models. There is small wizard appearing in context menu of data flow diagram node in browser - "Transform Process model roles to Physical role". You can create roles in process model and assign them to processes connected to data stores. Then this wizard will create these roles in selected physical model and CRUD settings will be transferred to permissions to select, insert, update and delete for related tables. This is just example that physical model can be reachable from process model.
    We'll add more utilization of definitions in process model in future releases.
    Philip

  • Using ARIS process models as the foundation for Business Process Monitoring

    Hello,
    Do anyone know if you can use IDS Scheer ARIS process models and the integration between IDS Scheer ARIS and SAP Solution Manager as the starting point for end-to-end Business Process Monitoring (BPM) so that you get the process description/model automatically in Solution Manager BPM and just need to configure the monitoring (more or less that you monitor against the modelled process in ARIS)?
    Is there an API for SAP Solution Manager BPM so that non-SAP solutions/systems can be part of the end-to-end process monitoring?
    If not, how do you usually integrate non-SAP solutions that are part of an end-to-end process that you want to monitor into SAP Solution Manager BPM, or do you not use Solution Manager BPM for this?
    What is the roadmap for SAP around SAP Solution Manager BPM when it comes to non-SAP systems/applications/solutions and the new SAP NetWeaver BPM functionality?
    Regards,
    Markus Johansson

    Hello Markus,
    I just paste my answer form the other forum entry Re: Business process management strategy in SAP?
    in a nutshell BPM Netweaver is focussing on so called edge-processes (usually
    SOA-based and often workflow related). These edge-processes a thought to enhance exisitng core business processes and should provide the fast competitive edge versus competitors. Examples would be also xApps. For this Netweaver provides process modelling tools, where you can get exectuable code through the integration between CE and PI. The monitoring part for these processes is mainly targeting business end-users and business manager.
    Business Process Monitoring with Solution Manager focusses on core business processes which are realized with the "conventional", "old" SAP Architecture, e.g. Order-to-Cash or Procure-to-Pay. You get a combination of technical monitors (average response times of transactions, background job runtimes, monitors for IDOC or qRFC processing) and application related monitors (you get more than 200 pre-configured application monitors out-of-the-box like number of overdue customer orders or outbound deliveries or number of deliveries with goods issue posted but no invoice). The target group here is the support organization of the customer, from Basis-Support over application support on IT side to process owner on business department side.
    Overview presentations can be found under
    https://service.sap.com/bpm --> Media Library --> Customer Information -->
    "Business Process Monitoring - Part 1 & 2".
    Or look under https://www.sdn.sap.com/irj/sdn/nw-processmonitoring
    In the end BPM Netweaver and BPMon SolMan are complementary for different purposes and different target groups.
    Best Regards
    Volker

  • Runtime error in process model and sequence still passes

    I am doing some custom initialization in the process model (in the ProcessSetup callback). I call a .NET module that may throw an exception under certain error conditions. This causes the the process model to jump to the Cleanup section of the process model (not the client sequence file cleanup) and that's okay. The problem I have is that in my UI I am getting the AxAppMgr_ExecutionEnded event and the e argument's exec.ResultStatus property indicates "Passed". I want it to indicate "Error" or "Incomplete" or something other than passed. The client sequence never ran at all. While it had no failures, it could not have passed.
    How do I force the status to be "Error" or something other than "Passed"?
    Solved!
    Go to Solution.

    Ryan,
    I am just getting back to this. Thanks for the response.
    I have my own sequence that gets called from ProcessSetup in the process model. That sequence sets up some station global variables for me including some Object References. One of the object references is a .NET object used to read a file. If that file does not exist, then the .NET object throws an exception which results in TestStand presenting a dialog with the error message and options about what to do next. I don't want our technicians getting that dialog box so I changed the Station Options to "Run Cleanup" on Run-time error. 
    The process model jumps to its Cleanup section when the run-time error is received. 
    Does that give you the information you need?
    Incidentally, I am able to look at the e.exec.ErrorObject in the AxAppMgr_EndExecution event handler and I can see the error as suggested by Doug above.
    Thanks.

  • Parallel Process Model vs Asynchrono​us Sequence

    I've been studying the features of TestStand, and learning how to use it for about a month, so still very new to the environment (although I have been using Labview and Veristand pretty heavily for about a year).  I wanted to get a little clarification on the use of the different process models, because I think I may be misunderstanding some of the terminology.  
    Here is a little background of my project:
    I have a Labview VI that I created to interface with a remote target (emulator).  I previously used the VI to run tests manually, and would like to use it as a code module in TestStand so that I can run automated tests.  I intend to use the same VI repeatedly throughout the test sequence.  The functionality of the system is dependent on maintaining constant communication with the emulator, so I can't be opening and closing the code module repeatedly.  Once it is open, it has to stay open and continually communicate  (I'm hoping I will not have to create "wrapper" code modules to be the go-between with my current VI).  Breaking communication would cause most of the test results to become invalid.  For these reasons, I had chosen to call the VI as a code module in a sub sequence so that it can be run asynchronously, outside of the main sequence.
    Now, as I learn more about the details of TestStand, I am introduced to the concept of "Process Models".  I had initially been using the default Sequential Process model, but would like to know if I should switch to the Parallel Process model.  From what I can tell, the parallel process model is used when testing multiple UUTs, or running tests in parallel.  Is this correct?  To clarify my situation, I will only be testing 1 UUT, I will only be using 1 code module, and I will be running several test steps with that 1 code module.  I will need to continually pass data back and forth with the code module as it runs in parallel to the main sequence, and there will likely be several sub sequences called during the process, so that I can maintain modularity with my testing.
    So the question is, do I switch to the Parallel Process Model, or should I continue with the Sequential Process Model and the asynchronous sequence to run my code module in parallel?  Thanks much.
    GSinMN          
    Solved!
    Go to Solution.

    Hey GSinMN,
    Are you wanting to run your test steps in parallel with each other, or will that need to be a sequential process? The Parallel model is probably not the right choice for this application. The purpose of the Parallel model is to run the same test program on multiple UUT's at once, as you mentioned. Since you are just testing with a single UUT, the best approach would be to run the emulator communication module asynchronously, as you mentioned. You can easily pass data to this code module using a TestStand queue or a similar synchronization object.
    Daniel E.
    TestStand Product Support Engineer
    National Instruments

  • Parallel Process Model Entry

    Hello,
    First, using LabVIEW 2011 and TestStand 2010 SP1.
    We have a custum GUI setup to use the sequential model.  At the heart of it, when we hit start, it accesses the Single Pass entry point and runs it with some modifications we've made.  Now, we'd like to have a setup that can test multiple DUTs and use the Parallel Process Model.  I'd like to have our GUI basically perform the same functions as the built in popup when running the TestUUTs entry point.  I've seen the PreUUT callback where you can disable the built in popup.  But what I can't seem to figure out is how to initiate a test socket test because it doesn't seem to line up with an entry point necessarily.
    When they push the start button next to DUT 0, I want to start socket 0.  And if they hit the start button next to DUT 1, I want to start socket 1.  What entry point does the GUI use to make this happen?  Does the GUI need to start an entry point (IE Test UUTs) then send more information later to start a test?  if so, where does TestStand wait for that information within the parallel process model?
    Thanks.

    One way you could do it is as follows:
    Still override PreUUT like in the example and add code which posts a UIMessage synchronously to the UI and then waits for a persocket notification (e.g. you can use the socket index as part of the name to make a per socket notification). Then in your UI, handle the UIMessageEvent on the ApplicationMgr. When you get the UIMessage from your PreUUT you will know it's ready and you can then update your UI to enable the start button, and when the user presses it, you can then Set() the notification to tell the testsocket thread to continue.
    for example, in preuut:
    Create Notification "MyUIStartNotification Socket 1"
    Thread.PostUIMessage(UIMsg_UserMessageBase + 1, RunState.TestSockets.MyIndex, "MyUIStartNotification Socket 1", null, true)
    Wait on Notification "MyUIStartNotification Socket 1"
    In your UI
    Handle UIMsg_UserMessageBase + 1
    Enable Start Button
    When start button pushed, Set Notification that corresponds to that socket. Pass any data needed with the notification, for example, create a container that contains a serialnumber property and a continuetesting property and pass that with the Set operation. In your PreUUT code get that data from the notification and update your parameters.
    Not simple, but doable.
    -Doug

Maybe you are looking for