As a short foreword, it was not my intention to start a blog on a frustrating topic. I’m better at complaining about things than writing something with a more cheerful note, so this came natural to me although I tried to fight it. Still, I’m sure I’ll run into this problem again and I’d like to have this experience jotted down somewhere when I need it.
Just when I get a bit of trust in software, users and diagnostic information they provide me, I get kicked swiftly back to reality.
Yesterday I got a report that software which I maintain does not support a specific way of “addressing OPC items”. Since I’m a novice on the subject, I took this as a starting point of my debugging session. I do like when users provide me with as much information on the problem as possible, but this time taking this into account was a mistake. This OPC server (which identifies itself as ABB.AdvHtHistorySrv) provides usual OPC item tree you can browse, but items can also be addressed by an ID which contains two GUIDs and tag name. Something like this:
Problematic software runs as a Windows service and acts as a proxy to OPC and other data sources on behalf of other clients. It uses OPC Foundation .NET API to accomplish connection to the server. When it tied to read values, server kept returning a generic error. E_FAIL. Oooh, scarrryyy! Since this wasn’t helpful, I tried experimenting with splitting the Item ID and using it’s components as ItemName and ItemPath. No luck. Quick call to servers GetStatus() method showed server name, version and state of Down. Ok then, server is down. What’s the problem? Well, the problem is that Matrikon OPC HDA Explorer correctly reads this item.
After fiddling around some more, I decided to ignore this status and pretend I didn’t see it. Perhaps, what I should have done earlier, I called ValidateItems() method. It returned seemingly more helpful E_UNKNOWN_ITEM_NAME error. This was another sidetrack that wasted me few hours.
And then a bulb lit up over my head. Maybe it’s a security issue. Who cares that I can connect to server, that it responds to requests and tells me that item doesn’t exist. So I configured the windows service to run under same account used when testing with Matrikon OPC HDA Explorer, and voilà! It works!
To summarize this experience. Get as much information from user and diagnostics, but don’t trust it. Don’t spend your time brute forcing a solution. Rather think it out and try to solve it through reasoning, and when that inevitably fails, try things you think are unlikely.