That usually means you're trying to lock a record that is already locked. OpenEdge waits for 10 seconds (or the time specified by the -lkwtmo startup parameter) and then gives up, leaving the error in the log.
To find out what records are locked, look in the _Lock table. It's a hidden table; you can view its schema by going into the Data Dictionary and choosing View - Show Hidden Tables. The _Lock records have info such as the record ID, the type of lock (share/exclusive), the user who has it locked, etc. You can use this code to dump the lock table to a file. Hopefully it'll help you track down the locked record.
OUTPUT TO VALUE("locktable.txt").
FOR EACH _Lock WHERE _Lock._Lock-RecID <> ? NO-LOCK:
FIND _File WHERE _File._File-Number = _Lock._Lock-Table NO-LOCK NO-ERROR.
PUT UNFORMATTED
_Lock._Lock-Name " "
_Lock._Lock-Usr " "
_File._File-Name " "
_Lock._Lock-RecID " "
_Lock._Lock-Type " "
_Lock._Lock-Flags
SKIP.
END.
OUTPUT CLOSE.
To catch the lock error, add a NO-WAIT to your FIND statement:
FIND FIRST <TableName> WHERE ... EXCLUSIVE-LOCK NO-WAIT NO-ERROR.
IF LOCKED(<TableName>) THEN ...
You can then add your debugging code in the IF-THEN statement.