PDA

Просмотр полной версии : СПК107 - Не открывается порт



ttyUSB0
22.08.2018, 15:26
Друзья, не могу открыть порт Rs485 для связи с ТРМ210.
COM_SERVICE_COM.Opened всегда false.

Ничего не получается, помогите, пожалуйста.

Евгений Кислов
22.08.2018, 15:41
Добрый день. Попробуйте открыть порт именно так, как это демонстрируется в примере.
COM_SERVICE не выполняется синхронно - т.е. вы взводите свой RsComplete до того как порт фактически будет открыт. Можно ориентироваться на выход COM_SERVICE_COM.Ready, но лучше просто скопировать свой код из примера.

ttyUSB0
22.08.2018, 16:10
Ого, как долго открывается порт!..

Я правильно понимаю, что блок кода с инициализацией и открытием порта в примере будет выполняться каждый цикл программы? Это так и должно быть? Отвечаю сам себе - иначе вроде бы не работает (по крайней мере устал ждать). При инициализации порта сначалачерез полминуты поднимается Opened, далее через десяток секунд Ready.

capzap
22.08.2018, 17:05
Ого, какое короткое условие, чтоб сделать запрос, дождаться ответа и закрыть функцию

Евгений Кислов
22.08.2018, 17:18
При инициализации порта сначалачерез полминуты поднимается Opened, далее через десяток секунд Ready.

Какое у вас время цикла задачи, в которой вызывается этот код?

ttyUSB0
22.08.2018, 17:53
Какое у вас время цикла задачи, в которой вызывается этот код?
300мс. Время инициализации порта привязано к периоду цикла?

Евгений Кислов
22.08.2018, 18:04
Время всего выполняемого в программе привязано к времени цикла. Поставьте 10 мс - и, думаю, все станет работать нормально.

ttyUSB0
22.08.2018, 18:29
Ого, какое короткое условие, чтоб сделать запрос, дождаться ответа и закрыть функцию

Надо подождать? А как правильно делать задержку (до поднятия TRM_GetReal.Complete)?

UPD: в TRM_GetReal есть же TimeOut. ФБ не ждет его и сразу выходит?

capzap
22.08.2018, 18:36
как минимум делать Enable:=FALSE в теле условия TRM_GetReal.Complete

ttyUSB0
22.08.2018, 19:04
как минимум делать Enable:=FALSE в теле условия TRM_GetReal.Complete

Спасибо!
Приведу рабочий кусок кода здесь:
IF TRM_GetReal.Complete AND TRM_GetReal.Error=0 THEN
T:=TRM_GetReal.Value; // ...и ошибки отсутствуют, то забираем считанное значение
TRM_GetReal(Enable:=FALSE); // завершаем работу блока
END_IF
По примеру из руководства программа не работала, там TRM_GetReal(Enable:=FALSE) после проверки.

Евгений Кислов
22.08.2018, 19:13
В актуальном руководстве такой же код. Возможно, вы смотрели какую-то раннюю версию.
https://ftp.owen.ru/CoDeSys3/11_Documentation/01_SPK/SPK_TRM212owen_v.1.2.pdf

ttyUSB0
23.08.2018, 11:43
Код в руководстве не такой.
Но после вдумчивого прочтения понял, что надо писать код как в руководстве :) Спасибо!