Общий смысл: при достижении определенного условия и если это условие задерживается на некоторое время, то производятся некоторые действия. В последнем: если StartSend или StartRecV равны единице в течение 5 секунд, то они оба сбрасываются.
Элементарная логика с таймером.
Как устанавливаются биты?
Re: Как устанавливаются биты?
Не могу понять как запустится SFB14. Кажется, что после завершения SFB15 программа перейдет по метке А1 и пропустит SFB14.
Re: Как устанавливаются биты?
Переход JC происходит не всегда, а по условию, если RLO = 1.
Re: Как устанавливаются биты?
Давайте так:
Выполнение задания SFB15 установит DONE или М251.2 в 1. Это сбросит "StartSend", установит "StartRecV" и перейдет по метке А1.
Как дальше (в следующем цикле)? У меня получается, что если DONE (М251.2) не изменится назад на 0 - ничего "хорошего" не будет.
Выполнение задания SFB15 установит DONE или М251.2 в 1. Это сбросит "StartSend", установит "StartRecV" и перейдет по метке А1.
Как дальше (в следующем цикле)? У меня получается, что если DONE (М251.2) не изменится назад на 0 - ничего "хорошего" не будет.
Re: Как устанавливаются биты?
M251.2 включится не мгновенно после активации SFB15. Передача данных может занять некоторое время, поэтому некоторое время M251.2=0 и процессор проскочит переход JC.
Re: Как устанавливаются биты?
Хорошо.
Активируется SFB15. Пошел процесс передачи данных. M251.2 пока = 0.
Вызывается SFB14. Ничего не делает, так как "StartRecV"=0. Запустится Т122 таймер.
И далее вроде все будет "стоять", ждать завершения SFB15.
Вот весь блок.
Мне начинает казаться, что DONE=1 при завершении задания, только в течении того программного цикла, в котором оно завершилось. А при
следующем вызове SFB оно опять 0. (Или я чего-то не могу понять)
Активируется SFB15. Пошел процесс передачи данных. M251.2 пока = 0.
Вызывается SFB14. Ничего не делает, так как "StartRecV"=0. Запустится Т122 таймер.
И далее вроде все будет "стоять", ждать завершения SFB15.
Вот весь блок.
Код: Выделить всё
AN M 251.0
AN "StartSend"
AN "StartRecV"
L S5T#200MS
SD T 120
A T 120
= M 251.0
S "StartSend"
CALL "PUT" , "Istanza_1"
REQ :="StartSend"
ID :=W#16#3
DONE :=M251.2
ERROR :=M251.3
STATUS:=#status
ADDR_1:=P#DB106.DBX 10.0 WORD 5
ADDR_2:=
ADDR_3:=
ADDR_4:=
SD_1 :=P#DB105.DBX 0.0 WORD 5
SD_2 :=
SD_3 :=
SD_4 :=
O M 251.2
O M 251.3
R "StartSend"
S "StartRecV"
JC A1
CALL "GET" , "Istanza_2"
REQ :="StartRecV"
ID :=W#16#3
NDR :=M251.5
ERROR :=M251.6
STATUS:=#status
ADDR_1:=P#DB106.DBX 0.0 WORD 5
ADDR_2:=
ADDR_3:=
ADDR_4:=
RD_1 :=P#DB105.DBX 10.0 WORD 5
RD_2 :=
RD_3 :=
RD_4 :=
O M 251.5
O M 251.6
R "StartRecV"
A1: O "StartSend"
O "StartRecV"
L S5T#5S
SD T 122 //timeout
A T 122
R "StartSend"
R "StartRecV"
BE
следующем вызове SFB оно опять 0. (Или я чего-то не могу понять)
Re: Как устанавливаются биты?
Тут все довольно запутанно. Дело рук непрофессионала?
Короче, StartRecV включается, но SFB14 не сразу запускается, но рано или поздно она-таки запускается... В общем работают две функции последовательно. 5 секунд таймаут связи, если время превышено, то снова пробуется SFB15 и далее по циклу. Можно упростить алгоритм.
Короче, StartRecV включается, но SFB14 не сразу запускается, но рано или поздно она-таки запускается... В общем работают две функции последовательно. 5 секунд таймаут связи, если время превышено, то снова пробуется SFB15 и далее по циклу. Можно упростить алгоритм.
Re: Как устанавливаются биты?
Если только "итальянские непрофессионалы". Программа с итальянской линии. Хотя возможно - сам исправил несколько "косяков" и
дописывал некоторые их простые "недоделки".
Ну суть не в том. А в состоянии сигнала DONE .
Ведь если DONE изменяется с 1 на 0 лишь по приходу фронта REQ, то SFB 14 не запустится никогда. А программа работает, и прием и передача. Где-то здесь (в DONE) зарыта собака.
дописывал некоторые их простые "недоделки".
Ну суть не в том. А в состоянии сигнала DONE .
Ведь если DONE изменяется с 1 на 0 лишь по приходу фронта REQ, то SFB 14 не запустится никогда. А программа работает, и прием и передача. Где-то здесь (в DONE) зарыта собака.
Re: Как устанавливаются биты?
В этом нет никакого противоречия. Рано или поздно функция выдаст DONE и эстафета передастся SFB14. Так и должно быть.nicss писал(а):И далее вроде все будет "стоять", ждать завершения SFB15.
Re: Как устанавливаются биты?
Хорошо. Давайте проследим логику программы. (цикл~3мs)
Начало работы. Все по нулям. Запустится таймер Т120. Больше ничего существенного не происходит.
Через 200мs установится М251.0 и "StartSend". SFB15 начнет записывать данные. DONE пока =0. Запустится таймер Т122.
В следующем после этого цикле М251.0=1, "StartSend"=1. Сбрасывается М251.0 (для чего он там? он используется только эдесь) т.к. RLO = 0.
Далее "все будет стоять, ждать завершения SFB15", таймер Т122 "тикает".
По окончании SFB15, DONE (М251.2) установится в 1. Сбросится "StartSend", установится "StartRecV" и программа перейдет по метке А1 (т.к. RLO = 1),
пропустив вызов SFB14. Таймер Т122 "тикает".
В следующем после этого цикле М251.0=0, "StartSend"=0, "StartRecV"=1.
Далее, чтобы запустилась SFB14, DONE SFB15 (М251.2) должно быть равно 0. Чтобы пропустить переход к А1, выэвать SFB14 и начать чтение данных, "благо" "StartRecV" в 1.
После завершения задания SFB14, DONE SFB14 (М251.5) установится в 1, сбросит "StartRecV",
таймер Т122 перестанет "тикать". В следующем после этого цикле опять все по нулям и заново.
Вот так, по идее, должно работать, каждые 200мs идет процесс записи/чтения с интервалом между ними в 1 программный цикл.
Но помним, что DONE SFB15 (М251.2) по завершению задания в 1. Так когда оно изменит значение с 1 на 0.
Вопрос у меня в этом. Или я в чем-то в корне не прав?
Начало работы. Все по нулям. Запустится таймер Т120. Больше ничего существенного не происходит.
Через 200мs установится М251.0 и "StartSend". SFB15 начнет записывать данные. DONE пока =0. Запустится таймер Т122.
В следующем после этого цикле М251.0=1, "StartSend"=1. Сбрасывается М251.0 (для чего он там? он используется только эдесь) т.к. RLO = 0.
Далее "все будет стоять, ждать завершения SFB15", таймер Т122 "тикает".
По окончании SFB15, DONE (М251.2) установится в 1. Сбросится "StartSend", установится "StartRecV" и программа перейдет по метке А1 (т.к. RLO = 1),
пропустив вызов SFB14. Таймер Т122 "тикает".
В следующем после этого цикле М251.0=0, "StartSend"=0, "StartRecV"=1.
Далее, чтобы запустилась SFB14, DONE SFB15 (М251.2) должно быть равно 0. Чтобы пропустить переход к А1, выэвать SFB14 и начать чтение данных, "благо" "StartRecV" в 1.
После завершения задания SFB14, DONE SFB14 (М251.5) установится в 1, сбросит "StartRecV",
таймер Т122 перестанет "тикать". В следующем после этого цикле опять все по нулям и заново.
Вот так, по идее, должно работать, каждые 200мs идет процесс записи/чтения с интервалом между ними в 1 программный цикл.
Но помним, что DONE SFB15 (М251.2) по завершению задания в 1. Так когда оно изменит значение с 1 на 0.
Вопрос у меня в этом. Или я в чем-то в корне не прав?
Re: Как устанавливаются биты?
Меня смущает, что когда DONE таким образом обнулится и это будет означать, что функция занята передачей данных, хотя это не так. А что если процессор в силу неких программных конструкций "проспал" импульс DONE=1?..
В мануалах этот нюанс никак не объясняется...
Еще есть мутная версия, что DONE обнуляется, но только когда обнуляется вход REQ. (В нашем случае REQ обнуляется сразу после DONE=1 -> DONE тоже обнуляется сразу.)
Может провести эксперимент?
В мануалах этот нюанс никак не объясняется...
Еще есть мутная версия, что DONE обнуляется, но только когда обнуляется вход REQ. (В нашем случае REQ обнуляется сразу после DONE=1 -> DONE тоже обнуляется сразу.)
Может провести эксперимент?
Re: Как устанавливаются биты?
Done импульс на время цикла программы по окончании выполнения sfb.
Вот моя подпись...
Re: Как устанавливаются биты?
Программа работает, и Т122 отсчитывает не более 3-4МS.Михайло писал(а):Меня смущает, что когда DONE таким образом обнулится и это будет означать, что функция занята передачей данных, хотя это не так. А что если процессор в силу неких программных конструкций "проспал" импульс DONE=1?..
Склоняюсь к версии mr_Frodo (которую я предположил выше). Если только он не знает это точно.
Только так все будет работать.
У меня есть еще такая версия: по окончании работы SFB, DONE=1, но при следующем вызове SFB (независимо от сигнала REQ)
DONE обнуляется.
Не зря же в "талмуде" написано, что сигнал DONE = 0, когда задание либо не началось либо выполняется.
Нужен эксперимент, чтобы узнать где обнуляется DONE. Ваши предложения...
Re: Как устанавливаются биты?
Ну если работает, то и эксперимент неохота ставить. Сбрасывается, значит, сбрасывается.
Re: Как устанавливаются биты?
Если кому интересно.
Сделал вот так:
AN M 251.0
AN "StartSend"
AN "StartRecV"
L S5T#200MS
SD T 120
A T 120
= M 251.0
S "StartSend"
A M 251.2
JC A1
CALL "PUT" , "Istanza_1"
REQ :="StartSend"
Программа всегда переходит по метке после первого выполнения SFB15.
А это значит, что:
1. DONE не сбрасывается с началом нового цикла программы
2. DONE не сбрасывается при обнулении входа REQ
Затем нашел ответ и в документах:
"Параметры состояния справедливы только в одном цикле, а именно в интервале между первой инструкцией вызова SFB/FB до следующего
вызова SFB/FB."
Т.е. DONE сбрасывается при следующем (после выполнения задания) вызове SFB. Причем независимо от состояния входа REQ.
Думаю, разобрались подробно. Спасибо.
Сделал вот так:
AN M 251.0
AN "StartSend"
AN "StartRecV"
L S5T#200MS
SD T 120
A T 120
= M 251.0
S "StartSend"
A M 251.2
JC A1
CALL "PUT" , "Istanza_1"
REQ :="StartSend"
Программа всегда переходит по метке после первого выполнения SFB15.
А это значит, что:
1. DONE не сбрасывается с началом нового цикла программы
2. DONE не сбрасывается при обнулении входа REQ
Затем нашел ответ и в документах:
"Параметры состояния справедливы только в одном цикле, а именно в интервале между первой инструкцией вызова SFB/FB до следующего
вызова SFB/FB."
Т.е. DONE сбрасывается при следующем (после выполнения задания) вызове SFB. Причем независимо от состояния входа REQ.
Думаю, разобрались подробно. Спасибо.