I see where your problem is! You aren't using the semaphore properly. Did you look up semaphores in the example finder? If you haven't, make sure you take a look at the example "Semaphore with SubVI's." first.
In your subVI, you never wired up the control for the semaphore reference to the connector pane. When the subVI runs, it has an empty semaphore reference which throws an error when you try to acquire it. It doesn't know what semaphore to acquire.
1. Wire up your semaphore reference in and out to the connector pane in the subVI.
2. In your main VI, make sure you use the Create Semaphore function in the initialization part of your code. Use the green reference wire that comes out throughout your code.
3. Wire that green reference wire to each of the Semaphore terminals in all the subVI's that use it.
4. When your code ends, use the Destroy Semaphore function in the cleanup part of your code.
One question I have is if it works without the semaphore, do you really need to use it? Semaphores are designed to prevent 2 or more sections of code from simultaneously accessing the same resource. Often that would be hardware, or a com port, or perhaps opening the same file on disk. It is basically a lock that prevents a section of code from proceeding until another section of code releases that lock. Do you need that functionality in your program? What are you trying to protect and in what portions of code?