Бывают ситуации, когда до выполнения запроса от Master требуются дополнительные действия со стороны Slave. Самая типичная из них это когда необходимо сделать доступным для записи не весь буфер данных Slave, а лишь конкретный регион. Если пытаться подобные нюансы реализовывать внутри вашего ФБ, это сильно усложнит и логику работы блока, и понимание, как этим всем пользоваться. Извиняюсь за свои поспешные вопросы, связанные с процедурами обратного вызова, в среде CoDeSys это можно решить более естесственным способом.
Slave может находиться в следующих длительных состояниях:
- ожидание запроса;
- получение запроса;
- задержка перед отправкой ответа;
- отправка ответа.
Вероятнее всего, в вашем ФБ в том цикле ПЛК, когда вы получаете признак того, что чтение запроса завершено, сперва производится предварительная обработка (свой ли адрес устройства, проверка CRC), и если запрос по адресу, то включается таймер задержки ответа, выполняется запрос, формируется ответ. Предлагаю сделать следующее.
1. Сделать видимой снаружи структуру типа <OMB_SlaveRecievedFrameDescription> (сделать её выходной переменной).
2. Добавить выходную переменную, например, <xReqReady : BOOL>.
3. Добавить входную переменную, например, <eCustomErr : OMB_Slave_SLAVE_BLOCK_ERROR>, которая по-умолчанию имеет значение <NO_FRAME_ERROR>.
4. После того, как сформирована структура (1), выставить флаг (2) и уйти в следующий цикл ПЛК.
5. В следующем цикле ПЛК сбросить флаг (2), проверить значение (3) и в зависимости от него выполнять/не выполнять запрос, формировать ответ.
Такой механизм позволит пользовательской программе, по признаку (2) проверить, возможно ли выполнение поступившего запроса в её частном случае, а также выполнить необходимые действия в буфере Slave непосредственно перед формированием ответа. При этом, если в данных действиях нет необходимости, то вышеуказанные переменные просто не будут им использованы при обращении к ФБ. Никаких изменений в уже написанных программах не потребуется.