Просмотр полной версии : Задержка при открытии портов в ПЛК100
Использую ПЛК100.
В самом начале программы прописано открытие двух COM-портов при помощи ФБ из библиотеки ComService.lib.
Открытие же портов и выдача сигнала готовности происходит через 100-150 сек. после запуска программы.
Хотелось бы понять, из-за чего происходит эта задержка?
как минимум в неправильном написании кода, без проекта разбираться бессмысленно
В 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). И еще, раз в библиотеке написано именно так, то несколько портов все таки стоит открывать по очереди, а не два одновременно (вполне возможно что два сразу будут открывацо дольше).
на вскидку как то так:
(************************************************* ******
Открываем порт
************************************************** *****)
(*Открываем первый порт - для чтения*)
(*
Номер порта (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;
Спасибо, lazy! Теперь открытие портов происходит примерно через 30 секунд.
Хотелось бы понимать, для чего в библиотеке ComService.lib сделана такая задержка?
Может быть, лучше использовать стандартную библиотеку SysLibCom.lib непосредственно?
Ну это к разработчикам, вероятно, накладные расходы... Еще... У вас минимальное время цикла 50ms. Его можно уменьшить но так чтобы бит %IX8.4 "CPU is overloaded, optimize your programm or increase PLC cycle" в модуле статистики не загорался в TRUE. Вполне возможно порты станут открывацо еще быстрее. Это можно сделать здесь: Конфигурация ПЛК -> PLC100.R -> параметры модуля -> MinCycleLenght ms -> столбец "Значение".
ComService.lib это всего лишь тюнинг для SysLibCom.lib, пробуйте на прямую если разумения хватит
Ну это к разработчикам, вероятно, накладные расходы... Еще... У вас минимальное время цикла 50ms. Его можно уменьшить но так чтобы бит %IX8.4 "CPU is overloaded, optimize your programm or increase PLC cycle" в модуле статистики не загорался в TRUE. Вполне возможно порты станут открывацо еще быстрее. Это можно сделать здесь: Конфигурация ПЛК -> PLC100.R -> параметры модуля -> MinCycleLenght ms -> столбец "Значение".
Да, уже было такое. Увеличил время цикла.
Я думаю 5-10ms вполне, для такой задачи. Открывацо станут за 3-6 сек )
Да, действительно. Уменьшил время до 10 мсек - порты стали открываться за 7 сек., перегрузки ЦПУ не наблюдается. Спасибо.
Что за бред то ? Порты за 7 секунд !!?? Странно что не дней. На порту задвижки с электромеханическим приводом стоят ?:confused:
Выкиньте этот бредовый цикл в комсервис или читайте #8
Максимум - 1 цикл. А цикл можно и 0. cpu overload на порт не влияет. Система работает с портом на прерываниях а не между циклами.
Выяснилось, что библиотека ComService.lib все-таки не зря написана.
Если просто открывать порты, то возникает проблема с открытием портов.
Видимо, 1-го цикла CPU мало для открытия COM-порта.
Я переписал у себя в проекте блок кода из данной библиотеки, выкинув задержку
Delay := Delay + 1;
IF (Delay MOD 100) = 0 THEN
После этого 2 порта стали открываться за 5 циклов CPU.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot