PDA

Просмотр полной версии : Задержка при открытии портов в ПЛК100



stskr
12.11.2014, 16:29
Использую ПЛК100.
В самом начале программы прописано открытие двух COM-портов при помощи ФБ из библиотеки ComService.lib.
Открытие же портов и выдача сигнала готовности происходит через 100-150 сек. после запуска программы.
Хотелось бы понять, из-за чего происходит эта задержка?

capzap
12.11.2014, 16:32
как минимум в неправильном написании кода, без проекта разбираться бессмысленно

lazy
13.11.2014, 10:26
В ComService.lib порты открываются приблизительно так:

Delay := Delay + 1;
IF (Delay MOD 100) = 0 THEN
IF Task = OPEN_TSK THEN
/* открываем
END_IF
IF Task = RESET_TSK THEN
/* настраиваем
END_IF
IF Task = CLOSE_TSK THEN
/* закрываем
END_IF
END_IF

Поэтому порт открывается несколько сот циклов. Два (при условии, что открываются по очереди) это где то 400 циклов (но они могут сначала и закрываться итого 600). И еще, раз в библиотеке написано именно так, то несколько портов все таки стоит открывать по очереди, а не два одновременно (вполне возможно что два сразу будут открывацо дольше).

stskr
13.11.2014, 12:08
Проект - во вложении.

lazy
13.11.2014, 12:31
на вскидку как то так:

(************************************************* ******
Открываем порт
************************************************** *****)

(*Открываем первый порт - для чтения*)

(*
Номер порта (com_number):
0 - RS-485
1 - RS-232
4 - RS-232 DEBUG
*)
com_num1:=0;
(*
Настройки порта (com_settings):
byParity - Режим проверки четности 0 = нет, 1 = нечет, 2 = чет
byStopBits - Кол-во стоповых бит 0 =один, 1=полтора , 2=два
dwBaudRate - Скорость обмена 4800, 9600, 19200, 38400, 57600, 115200 бит/с.
dwBufferSize - Не используется должно быть =0
dwScan - Не используется должно быть =0
dwTimeout - Не используется должно быть =0
Port - Номер порта в формате перечисления PORTS (com_number)
*)
Settings1.Port:=com_num1;
Settings1.dwBaudRate:=19200;
Settings1.byParity:=0;
Settings1.dwTimeout:=1;
Settings1.byStopBits:=0;
Settings1.dwBufferSize:=0;
Settings1.dwScan:=0;
(*
Настройка и открытие порта (COM_SERVICE)
Пока на выходе Ready не будет сигнал TRUE, стучимся в порт
Порт открывается с настройками, указанными в com_settings,
а на вход Task подаются следующие значения:

0 - Открытие и настройка порта в соответствии с настройками в структуре Settings
1 - Изменение настроек уже открытого порта на настройки указанные в Settings
2 - Закрытие порта, номер порта берется из Settings.Port
*)
COM_SERVICE1(Enable:= NOT COM_SERVICE1.ready, Settings:=Settings1 , Task:=OPEN_TSK );
com_ready1 := COM_SERVICE1.ready; (* думаю это лишнее *)


(*Открываем второй порт - для записи*)
IF COM_SERVICE1.ready THEN
(*
Номер порта (com_number):
0 - RS-485
1 - RS-232
4 - RS-232 DEBUG
*)
com_num2:=1;
(*
Настройки порта (com_settings):
byParity - Режим проверки четности 0 = нет, 1 = нечет, 2 = чет
byStopBits - Кол-во стоповых бит 0 =один, 1=полтора , 2=два
dwBaudRate - Скорость обмена 4800, 9600, 19200, 38400, 57600, 115200 бит/с.
dwBufferSize - Не используется должно быть =0
dwScan - Не используется должно быть =0
dwTimeout - Не используется должно быть =0
Port - Номер порта в формате перечисления PORTS (com_number)
*)
Settings2.Port:=com_num2;
Settings2.dwBaudRate:=19200;
Settings2.byParity:=0;
Settings2.dwTimeout:=1;
Settings2.byStopBits:=0;
Settings2.dwBufferSize:=0;
Settings2.dwScan:=0;
(*
Настройка и открытие порта (COM_SERVICE)
Пока на выходе Ready не будет сигнал TRUE, стучимся в порт
Порт открывается с настройками, указанными в com_settings,
а на вход Task подаются следующие значения:

0 - Открытие и настройка порта в соответствии с настройками в структуре Settings
1 - Изменение настроек уже открытого порта на настройки указанные в Settings
2 - Закрытие порта, номер порта берется из Settings.Port
*)
COM_SERVICE2(Enable:= NOT COM_SERVICE2.ready , Settings:=Settings2 , Task:=OPEN_TSK );
com_ready2 := COM_SERVICE2.ready; (* думаю это лишнее *)

END_IF

Trans1 := COM_SERVICE1.ready AND COM_SERVICE2.ready;

stskr
17.11.2014, 10:53
Спасибо, lazy! Теперь открытие портов происходит примерно через 30 секунд.

Хотелось бы понимать, для чего в библиотеке ComService.lib сделана такая задержка?
Может быть, лучше использовать стандартную библиотеку SysLibCom.lib непосредственно?

lazy
17.11.2014, 16:09
Ну это к разработчикам, вероятно, накладные расходы... Еще... У вас минимальное время цикла 50ms. Его можно уменьшить но так чтобы бит %IX8.4 "CPU is overloaded, optimize your programm or increase PLC cycle" в модуле статистики не загорался в TRUE. Вполне возможно порты станут открывацо еще быстрее. Это можно сделать здесь: Конфигурация ПЛК -> PLC100.R -> параметры модуля -> MinCycleLenght ms -> столбец "Значение".

capzap
17.11.2014, 16:50
ComService.lib это всего лишь тюнинг для SysLibCom.lib, пробуйте на прямую если разумения хватит

stskr
19.11.2014, 10:44
Ну это к разработчикам, вероятно, накладные расходы... Еще... У вас минимальное время цикла 50ms. Его можно уменьшить но так чтобы бит %IX8.4 "CPU is overloaded, optimize your programm or increase PLC cycle" в модуле статистики не загорался в TRUE. Вполне возможно порты станут открывацо еще быстрее. Это можно сделать здесь: Конфигурация ПЛК -> PLC100.R -> параметры модуля -> MinCycleLenght ms -> столбец "Значение".
Да, уже было такое. Увеличил время цикла.

lazy
19.11.2014, 11:58
Я думаю 5-10ms вполне, для такой задачи. Открывацо станут за 3-6 сек )

stskr
20.11.2014, 15:22
Да, действительно. Уменьшил время до 10 мсек - порты стали открываться за 7 сек., перегрузки ЦПУ не наблюдается. Спасибо.

Валенок
20.11.2014, 16:10
Что за бред то ? Порты за 7 секунд !!?? Странно что не дней. На порту задвижки с электромеханическим приводом стоят ?:confused:

Выкиньте этот бредовый цикл в комсервис или читайте #8
Максимум - 1 цикл. А цикл можно и 0. cpu overload на порт не влияет. Система работает с портом на прерываниях а не между циклами.

stskr
09.04.2015, 12:58
Выяснилось, что библиотека ComService.lib все-таки не зря написана.
Если просто открывать порты, то возникает проблема с открытием портов.
Видимо, 1-го цикла CPU мало для открытия COM-порта.

Я переписал у себя в проекте блок кода из данной библиотеки, выкинув задержку
Delay := Delay + 1;
IF (Delay MOD 100) = 0 THEN

После этого 2 порта стали открываться за 5 циклов CPU.