Все что начинается с 0х (0001,0002,0003, ....) - адреса ваших дискретных выходов на модулях вывода, по порядку. По порядку учитываются только дискретные выходы.
Все что с 1х (10001, 10002, 10003, ...) - то же самое но для дискретных входов.
Все что с 3х - аналоговые входы.
Для 0х, 1х - в модбасе единица это 00FF (или FF00, точно не помню), ноль - это 0000. Хотя ОРС-сервер это все сам разруливает. Автоматически. 
Для 3х, 4х - адрес 30001 - адрес двухбайтного регистра, который содержит текущее значение входа (или выхода).
Для 4х внутренних переменных учитывайте длину ваших данных. Например, если в 40003 лежит float (4 байта), то следующий тэг будет с адресом не 40004, а 40005.
A c Share_mem, похоже, что Вы задаете длину 4000 байт (2000 регистров). Или не так?
В share_mem[0] лежит первый регистр из 4х. Поэтому 40001.
Как менять состояние выходов: В ОРС заводим тэг с адресом 0001 (первый по порядку дискретный выход). Далее из клиента просто пишем ему 0 или 1. (или -1?)