создание списка сигналов
Добрый день!
Мне необходимо в большом количестве программ часто проверять различные сигналы и чтобы не переписывать одинаковые строки из программы в программу я пытаюсь написать специальную процедуру которая будет этим заниматься, а от меня потребуется только вызвать её введя соответствующие аргументы. По моей задумке в качестве аргументов в программу отправляются: 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." Вопрос заключается в том как заставить эту штуку работать? В качестве теста я менял список сигналов на один сигнал и он правильно проверял его нужное количество раз, из чего получается что остальная конструкция работает нормально. |
Удалось решить этот вопрос. Теперь вместо списка сигналов я отправляю список строк состоящий из имён сигналов, после чего с помощью 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 |
Цитата:
|
Часовой пояс GMT +2, время: 02:49. |
vBulletin v3.6.2, Copyright ©2000-2024, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co