Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2021, 12:49   #1
Андрей Косцов
Гуру
 
Регистрация: 24.06.2015
Сообщения: 76
Сказал Спасибо: 11
Сказали Спасибо 11 раз(а) в 10 сообщении
По умолчанию создание списка сигналов

Добрый день!

Мне необходимо в большом количестве программ часто проверять различные сигналы и чтобы не переписывать одинаковые строки из программы в программу я пытаюсь написать специальную процедуру которая будет этим заниматься, а от меня потребуется только вызвать её введя соответствующие аргументы.

По моей задумке в качестве аргументов в программу отправляются:
1. Список сигналов который должен быть проверен
2. Список значений (1 или 0) который я от них ожидаю
3. Список номеров ошибок которые нужно активировать если состояние сигнала не соответствует ожидаемому
Программа поочерёдно сверяет значения и вызывает ошибку если необходимо.

На данный момент это выглядит следующим образом:
PROC WaitModule(VAR signaldi signal_array{*},dionum value_array{*},num alarmcode_array{*})
_Recheck:
_timeout:=FALSE;
_FOR i FROM 1 TO DIM(signal_array,1) DO
__WaitDi signal_array{i},value_array{i}\MaxTime:=max_wait_t ime\TimeFlag:=timeout;
__IF timeout THEN
___ALARM(alarmcode_array{i});
___GOTO Recheck;
__ENDIF
_ENDFOR
ENDPROC

Вызов выглядит так:
PROC test_3()
_WaitModule [DI_signal_1,DI_signal_2],[0,0],[1,1];
ENDPROC

Проблема заключается в том, что на строке вызова программы у меня висит ошибка "Argument error(124): Argument for 'VAR' parameter signal_array is not variable reference or is read only."

Вопрос заключается в том как заставить эту штуку работать? В качестве теста я менял список сигналов на один сигнал и он правильно проверял его нужное количество раз, из чего получается что остальная конструкция работает нормально.
Андрей Косцов вне форума   Ответить с цитированием
Старый 25.06.2021, 14:48   #2
Андрей Косцов
Гуру
 
Регистрация: 24.06.2015
Сообщения: 76
Сказал Спасибо: 11
Сказали Спасибо 11 раз(а) в 10 сообщении
По умолчанию

Удалось решить этот вопрос. Теперь вместо списка сигналов я отправляю список строк состоящий из имён сигналов, после чего с помощью AliasIO привожу их к нужному виду. Выглядит это следующим образом:
PROC WaitSignalDI(string signal_array{*},dionum value_array{*},num alarmcode_array{*})
__Recheck:
__timeout:=FALSE;
__FOR i FROM 1 TO DIM(signal_array,1) DO
____AliasIO signal_array{i},actual_wait_signal;
____WaitDI actual_wait_signal,value_array{i}\MaxTime:=max_wai t_time\TimeFlag:=timeout;
____IF timeout THEN
______ALARM(alarmcode_array{i});
______GOTO Recheck;
____ENDIF
__ENDFOR
ENDPROC

Вызов программы выглядит следующим образом:
WaitSignalDI ["DI_signal_1","DI_signal_2"],[0,1],[101,102];

Надеюсь кому-нибудь это будет полезно ;D
Андрей Косцов вне форума   Ответить с цитированием
cказали "Спасибо" Андрей Косцов за это сообщение:
Орлов Макс (25.06.2021)
Старый 25.06.2021, 21:30   #3
Орлов Макс
Бывалый
 
Регистрация: 04.03.2016
Сообщения: 22
Сказал Спасибо: 2
Сказали Спасибо 1 раз(а) в 1 сообщении
Восклицание

Сообщение от Андрей Косцов Посмотреть сообщение
Удалось решить этот вопрос. Теперь вместо списка сигналов я отправляю список строк состоящий из имён сигналов, после чего с помощью AliasIO привожу их к нужному виду. Выглядит это следующим образом:
PROC WaitSignalDI(string signal_array{*},dionum value_array{*},num alarmcode_array{*})
__Recheck:
__timeout:=FALSE;
__FOR i FROM 1 TO DIM(signal_array,1) DO
____AliasIO signal_array{i},actual_wait_signal;
____WaitDI actual_wait_signal,value_array{i}MaxTime:=max_wait _timeTimeFlag:=timeout;
____IF timeout THEN
______ALARM(alarmcode_array{i});
______GOTO Recheck;
____ENDIF
__ENDFOR
ENDPROC

Вызов программы выглядит следующим образом:
WaitSignalDI ["DI_signal_1","DI_signal_2"],[0,1],[101,102];

Надеюсь кому-нибудь это будет полезно ;D
божественно!
Орлов Макс вне форума   Ответить с цитированием
cказали "Спасибо" Орлов Макс за это сообщение:
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +2, время: 12:24.

vBulletin v3.6.2, Copyright ©2000-2024, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co