Как правильно закрыть сетевое соединение в PMP20?
Для завершения связи служит инструкция S_CLOSE. У неё один операнд — номер закрываемого сокета в диапазоне от K0 до K63, задаётся константой или регистром. Условие выполнения — нарастающий фронт, и применяется она только в паре с инструкцией открытия сокета.
Что происходит после выполнения. Инструкции отправки, приёма и обмена по протоколу, работающие с этим же номером сокета, выполняться больше не могут. Сокет освобождается, и его номер можно открыть заново с другими параметрами.
Когда закрывать соединение обязательно:
- обмен с устройством закончен и в ближайшее время не нужен — держать сокет открытым незачем;
- соединение нарушено, поднят флаг нештатной ситуации: без закрытия сокет останется в неопределённом состоянии, и новое открытие по этому же номеру ничего не даст;
- меняются параметры соединения — адрес удалённого устройства, порт, тип буфера.
Типовая цепочка восстановления связи, которую руководство приводит в примерах: строка закрытия выполняется по совпадению трёх условий — поднят флаг нештатной ситуации, не поднят флаг закрытия, идёт такт от системного импульса; следующая строка снова открывает сокет, когда флаг «подключено» снят. Такая пара работает сама, без вмешательства наладчика: выдернули патч-корд, вставили обратно — связь восстановилась.
Чего делать не стоит: закрывать и открывать сокет в каждом цикле сканирования или по постоянно замкнутому условию. Установление соединения занимает время, и в таком режиме обмен будет постоянно рваться. Обе инструкции работают по фронту именно для того, чтобы каждая срабатывала один раз на событие.
Прикреплённая документация
Георгий Жуков
Ведущий инженер