is there direct way to make a contract on either the main or test net to communicate with a contract on the other net?
This could be generalized as asking if a contract on private chain can communicate with another one contracts.
test-net are two separate blockchains, therefore they cannot share same contract state.
Technically, its as different as Bitcoin blockchain and Ethereum blockchain. Now btc-relay made it possible to interchange values between them. People made btc-relay because the world needs it.
In your case there is no real reason to communicate with a test-net from a main-net.
Test-netis for testing, and testing only.