Как устанавливаются биты?

Инженерное программное обеспечение
Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как устанавливаются биты?

Сообщение Михайло »

Общий смысл: при достижении определенного условия и если это условие задерживается на некоторое время, то производятся некоторые действия. В последнем: если StartSend или StartRecV равны единице в течение 5 секунд, то они оба сбрасываются.
Элементарная логика с таймером.

nicss
Любитель
Сообщения: 71
Зарегистрирован: 28 сен 2016, 13:55

Re: Как устанавливаются биты?

Сообщение nicss »

Не могу понять как запустится SFB14. Кажется, что после завершения SFB15 программа перейдет по метке А1 и пропустит SFB14.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как устанавливаются биты?

Сообщение Михайло »

Переход JC происходит не всегда, а по условию, если RLO = 1.

nicss
Любитель
Сообщения: 71
Зарегистрирован: 28 сен 2016, 13:55

Re: Как устанавливаются биты?

Сообщение nicss »

Давайте так:
Выполнение задания SFB15 установит DONE или М251.2 в 1. Это сбросит "StartSend", установит "StartRecV" и перейдет по метке А1.
Как дальше (в следующем цикле)? У меня получается, что если DONE (М251.2) не изменится назад на 0 - ничего "хорошего" не будет.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как устанавливаются биты?

Сообщение Михайло »

M251.2 включится не мгновенно после активации SFB15. Передача данных может занять некоторое время, поэтому некоторое время M251.2=0 и процессор проскочит переход JC.

nicss
Любитель
Сообщения: 71
Зарегистрирован: 28 сен 2016, 13:55

Re: Как устанавливаются биты?

Сообщение nicss »

Хорошо.
Активируется 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
Мне начинает казаться, что DONE=1 при завершении задания, только в течении того программного цикла, в котором оно завершилось. А при
следующем вызове SFB оно опять 0. (Или я чего-то не могу понять)

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как устанавливаются биты?

Сообщение Михайло »

Тут все довольно запутанно. Дело рук непрофессионала?

Короче, StartRecV включается, но SFB14 не сразу запускается, но рано или поздно она-таки запускается... В общем работают две функции последовательно. 5 секунд таймаут связи, если время превышено, то снова пробуется SFB15 и далее по циклу. Можно упростить алгоритм.

nicss
Любитель
Сообщения: 71
Зарегистрирован: 28 сен 2016, 13:55

Re: Как устанавливаются биты?

Сообщение nicss »

Если только "итальянские непрофессионалы". Программа с итальянской линии. Хотя возможно - сам исправил несколько "косяков" и
дописывал некоторые их простые "недоделки".
Ну суть не в том. А в состоянии сигнала DONE :D .
Ведь если DONE изменяется с 1 на 0 лишь по приходу фронта REQ, то SFB 14 не запустится никогда. А программа работает, и прием и передача. Где-то здесь (в DONE) зарыта собака.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как устанавливаются биты?

Сообщение Михайло »

nicss писал(а):И далее вроде все будет "стоять", ждать завершения SFB15.
В этом нет никакого противоречия. Рано или поздно функция выдаст DONE и эстафета передастся SFB14. Так и должно быть.

nicss
Любитель
Сообщения: 71
Зарегистрирован: 28 сен 2016, 13:55

Re: Как устанавливаются биты?

Сообщение nicss »

Хорошо. Давайте проследим логику программы. (цикл~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.
Вопрос у меня в этом. Или я в чем-то в корне не прав?

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как устанавливаются биты?

Сообщение Михайло »

Меня смущает, что когда DONE таким образом обнулится и это будет означать, что функция занята передачей данных, хотя это не так. А что если процессор в силу неких программных конструкций "проспал" импульс DONE=1?..

В мануалах этот нюанс никак не объясняется...

Еще есть мутная версия, что DONE обнуляется, но только когда обнуляется вход REQ. (В нашем случае REQ обнуляется сразу после DONE=1 -> DONE тоже обнуляется сразу.)

Может провести эксперимент?

Аватара пользователя
mr_Frodo
Профессионал
Сообщения: 588
Зарегистрирован: 22 июл 2016, 20:38

Re: Как устанавливаются биты?

Сообщение mr_Frodo »

Done импульс на время цикла программы по окончании выполнения sfb.
Вот моя подпись...

nicss
Любитель
Сообщения: 71
Зарегистрирован: 28 сен 2016, 13:55

Re: Как устанавливаются биты?

Сообщение nicss »

Михайло писал(а):Меня смущает, что когда DONE таким образом обнулится и это будет означать, что функция занята передачей данных, хотя это не так. А что если процессор в силу неких программных конструкций "проспал" импульс DONE=1?..
Программа работает, и Т122 отсчитывает не более 3-4МS.

Склоняюсь к версии mr_Frodo (которую я предположил выше). Если только он не знает это точно.
Только так все будет работать.
У меня есть еще такая версия: по окончании работы SFB, DONE=1, но при следующем вызове SFB (независимо от сигнала REQ)
DONE обнуляется.
Не зря же в "талмуде" написано, что сигнал DONE = 0, когда задание либо не началось либо выполняется.
Нужен эксперимент, чтобы узнать где обнуляется DONE. Ваши предложения...

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Как устанавливаются биты?

Сообщение Михайло »

Ну если работает, то и эксперимент неохота ставить. :) Сбрасывается, значит, сбрасывается.

nicss
Любитель
Сообщения: 71
Зарегистрирован: 28 сен 2016, 13:55

Re: Как устанавливаются биты?

Сообщение nicss »

Если кому интересно.
Сделал вот так:
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.
Думаю, разобрались подробно. Спасибо.

Ответить