/
George_Smith
/
RuSTy
Обзор
Документация
Войти
/
George_Smith
/
RuSTy
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Peter
ZDsection.ResourceProject.st
215 строк
14 KB
Peter Korobeynikov
RuSTy v2.05 (Peter) - Добавлен вывод определения STRING[80] по умолчанию в types.json
05 фев 2026, 16:47
05 фев 2026, 16:47
02d36e2
Код
Авторство
О чём код?
PROGRAM ZDsection VAR ProcUzdFB: ProcUzd; TempCmd: ZdCmd; ZDIvar: ARRAY[1..20] OF ZdNu; ZDDout: ARRAY[1..20] OF ZDDOut1; ZDDvarDop: ARRAY[1..20] OF WORD; ZDStorage: ARRAY[1..20] OF ZDStor; ZDDvar: ARRAY[1..20] OF ZdNu; ZDImitState: ARRAY[1..20] OF ZdImitStorage; ZDMess: Messenger; ZDTimers: ARRAY[1..20] OF ARRAY[1..16] OF Timer; ZDBool: ARRAY[1..20,1..10] OF BOOL; ZDCmd1: WORD; ZDUstPrev: ARRAY[1..20] OF ARRAY[1..16] OF TIME; ZD_RS485: ARRAY[1..20] OF ARRAY[0..2] OF WORD; ZD_RSlink: ARRAY[1..20] OF TOF; END_VAR (* Уставки *) (* Т1 - Время переходных процессов*) (* Т2 - Время ожидания прихода сигнала от МП после команды на открытие/закрытие*) (* Т3 - Время схода с КВЗ/КВО*) (* Т4 - Время хода вала*) (* Т5 - Время на отключение МП в крайних положениях*) (* Т6 - Время на возврат напряжения при стопе по месту*) (* Т7 - Время "выполнения" команды на открытие при имитации задвижки*) (* Т8 - Время на подачу команды "Стоп"*) (* Т9 - Время на ожидание возврата концевиков после команды "Стоп"*) (* Т10 - Время на выполнение команд с БРУ*) (* Т11 - Время на проверку неисправности цепей включения*) (* Т12 - Время на проверку неисправности цепей отключения*) (* Т13 - Время рассогласования между физическими и интерфейсными сигналами*) (* Т14 - Время на задержку при подозрительных переходах*) (* Т15 - Время на подачу команды "Деблокировать аварию БУР"*) ZD_RS485[5][0] :=ZD_RS485_5_0; ZD_RS485[5][1] :=ZD_RS485_5_1; ZD_RS485[5][2] :=ZD_RS485_5_2; ZD_RS485[6][0] :=ZD_RS485_6_0; ZD_RS485[6][1] :=ZD_RS485_6_1; ZD_RS485[6][2] :=ZD_RS485_6_2; ZD_RS485[7][0] :=ZD_RS485_7_0; ZD_RS485[7][1] :=ZD_RS485_7_1; ZD_RS485[7][2] :=ZD_RS485_7_2; ZD_RS485[8][0] :=ZD_RS485_8_0; ZD_RS485[8][1] :=ZD_RS485_8_1; ZD_RS485[8][2] :=ZD_RS485_8_2; ZD_RS485[9][0] :=ZD_RS485_9_0; ZD_RS485[9][1] :=ZD_RS485_9_1; ZD_RS485[9][2] :=ZD_RS485_9_2; ZD_RS485[10][0] :=ZD_RS485_10_0; ZD_RS485[10][1] :=ZD_RS485_10_1; ZD_RS485[10][2] :=ZD_RS485_10_2; (* Данные по интерфейсу *) FOR I := 5 TO 10 DO ZDIvar[I].Kvo := ZD_RS485[I][0].11; ZDIvar[I].Kvz := ZD_RS485[I][0].12; ZDIvar[I].Mpo := ZD_RS485[I][0].8; ZDIvar[I].Mpz := ZD_RS485[I][0].9; ZDIvar[I].Mufta := ZD_RS485[I][0].2; ZDIvar[I].DistKey := ZD_RS485[I][0].7; END_FOR (*ZD_RSlink[5](IN := ZD_437_1.xDone, PT := T#5S); ZD_RSlink[6](IN := ZD_437_1P.xDone, PT := T#5S); ZD_RSlink[7](IN := ZD_437_2P.xDone, PT := T#5S); ZD_RSlink[8](IN := ZD_437_1L.xDone, PT := T#5S); ZD_RSlink[9](IN := ZD_437_2L.xDone, PT := T#5S); ZD_RSlink[10](IN := ZD_437_3L.xDone, PT := T#5S);*) (* Данные по физике *) FOR I := 1 TO 4 DO ZDDvar[I].Kvo := DIn[(I-1)*8 + 9]; ZDDvar[I].Kvz := DIn[(I-1)*8 + 10]; ZDDvar[I].Mpo := DIn[(I-1)*8 + 11]; ZDDvar[I].Mpz := DIn[(I-1)*8 + 12]; ZDDvar[I].Mufta := DIn[(I-1)*8 + 13] AND NOT ZDConfig[I].10; ZDDvar[I].BuCrash := DIn[(I-1)*8 + 14] AND NOT ZDConfig[I].10; ZDDvar[I].Vmmo := DIn[(I-1)*8 + 13] AND ZDConfig[I].10; ZDDvar[I].Vmmz := DIn[(I-1)*8 + 14] AND ZDConfig[I].10; ZDDvar[I].DistKey := DIn[(I-1)*8 + 16]; ZDDvarDop[I].0 := DIn[143]; (* Наличие напряжения на 1СШ ЩСУ *) END_FOR FOR I := 5 TO 10 DO ZDDvar[I].Kvo := DIn[(I+1)*8 + 9]; ZDDvar[I].Kvz := DIn[(I+1)*8 + 10]; ZDDvar[I].Mpo := DIn[(I+1)*8 + 13]; ZDDvar[I].Mpz := DIn[(I+1)*8 + 14]; ZDDvar[I].Mufta := DIn[(I+1)*8 + 11] AND NOT ZDConfig[I].10; ZDDvar[I].BuCrash := DIn[(I+1)*8 + 12] AND NOT ZDConfig[I].10; ZDDvar[I].Vmmo := DIn[(I+1)*8 + 11] AND ZDConfig[I].10; ZDDvar[I].Vmmz := DIn[(I+1)*8 + 12] AND ZDConfig[I].10; ZDDvar[I].DistKey := DIn[(I+1)*8 + 16] AND DIn[(I+1)*8 + 15]; ZDDvarDop[I].0 := DIn[144]; (* Наличие напряжения на 2СШ ЩСУ *) END_FOR FOR I := 1 TO 10 DO (* Обработка таймеров *) FOR J := 1 TO 14 DO ZDTimers[I][J].Ust := LREAL_TO_TIME(ZDUst[I,J]*1000); TimerProcess(Instance := ZDTimers[I][J],ms := CycleTime); END_FOR ZDMess.DeviceId := UINT_TO_BYTE(I); Modbus_VU(); (* Обработка команды с ВУ *) TempCmd := 0; (* Обнуляем код команды *) IF ZDCmd1 > 0 THEN (* Если есть команда оператора *) IF (ZDCmd1 AND 255) = I THEN (* Если команда по данной системе *) TempCmd := SHR(ZDCmd1,8); (* Выделяем код команды *) END_IF; END_IF; (* Настроечные параметры *) ProcUzdFB.Cfg.UseDistKey := ZDConfig[I].0; (* Задвижка имеет переключатель режима управления «Дистанционный»/«Местный» *) ProcUzdFB.Cfg.Use2Stop := ZDConfig[I].1; (* Задвижка имеет раздельные кнопки «Стоп открытия» и «Стоп закрытия» *) ProcUzdFB.Cfg.UseCo := ZDConfig[I].2; (* Задвижка использует сигнал «контроль цепей открытия» *) ProcUzdFB.Cfg.UseCz := ZDConfig[I].3; (* Задвижка использует сигнал «контроль цепей закрытия» *) ProcUzdFB.Cfg.UseEC := ZDConfig[I].4; (* Задвижка использует сигнал контроля напряжения *) ProcUzdFB.Cfg.DeblockBu:= ZDConfig[I].5; (* Задвижка принимает сигнал деблокировки БУ задвижки *) ProcUzdFB.Cfg.slCheckState := ZDConfig[I].6; (* Используется временная задержка на изменение состояния задвижки при получении некорректной информации от оборудования НУ *) ProcUzdFB.Cfg.MpFallIsStop := ZDConfig[I].7; (* Пропадание МП воспринимается как подача команды СТОП по-месту *) ProcUzdFB.Cfg.MuNotAllowStop := ZDConfig[I].8; (* Применяется схема управления, в которой при переключении в местный режим управления команда СТОП от ПЛК не воспринимается *) ProcUzdFB.Cfg.UseRs := ZDConfig[I].9; (* Задвижка имеет интерфейсный канал для передачи сигналов *) ProcUzdFB.AutoCmds.NeedOpen := ZDCtrl[I].1; (* Команда на открытие от других модулей. 0 – нет команды, 1 - есть команда*) ProcUzdFB.AutoCmds.NeedStop := ZDCtrl[I].2; (* Команда на остановку от других модулей. 0 – нет команды, 1 - есть команда *) ProcUzdFB.AutoCmds.NeedClose:= ZDCtrl[I].0; (* Команда на закрытие от других модулей. 0 – нет команды, 1 - есть команда*) ProcUzdFB.AutoCmds.NoOpen := ZDCtrl[I].13; (* Запрет на открытие задвижки, 1 - есть запрет, 0 - нет запрета *) ProcUzdFB.AutoCmds.NoClose := ZDCtrl[I].12; (* Запрет на закрытие задвижки, 1 - есть запрет, 0 - нет запрета *) ProcUzdFB.TmCmds.Open := ZDCtrl[I].5; (* Команда по ТУ на открытие задвижки, 0 – нет команды, 1 - есть команда *) ProcUzdFB.TmCmds.Stop := ZDCtrl[I].6; (* Команда по ТУ на остановку задвижки, 0 – нет команды, 1 - есть команда *) ProcUzdFB.TmCmds.Close := ZDCtrl[I].4; (* Команда по ТУ на закрытие задвижки, 0 – нет команды, 1 - есть команда *) ProcUzdFB.TmCmds.Deblock := ZDCtrl[I].7; (* Команда по ТУ на деблокировку задвижки *) ProcUzdFB.TmCmds.SetImit := ZDCtrl[I].14; (* Команда по ТУ на установку имитации *) ProcUzdFB.TmCmds.DropImit := ZDCtrl[I].15; (* Команда по ТУ на снятие имитации *) ProcUzdFB.TmCmds.CspaOpen := ZDCtrl[I].9; (* Команда от ЦСПА на открытие задвижки, 0 – нет команды, 1 - есть команда *) ProcUzdFB.TmCmds.CspaClose := ZDCtrl[I].8; (* Команда от ЦСПА на закрытие задвижки, 0 – нет команды, 1 - есть команда *) ProcUzdFB.TmCmds.CspaStop := ZDCtrl[I].10; (* Команда от ЦСПА на остановку задвижки, 0 – нет команды, 1 - есть команда*) ProcUzdFB.TmCmds.TmModeDist := ZDCtrl[I].3; (* Флаг дистанционного режима управления (не является командой) *) ProcUzdFB( Cmd:= TempCmd, InterfaceSignals:= ZDIvar[I], DiSignals:= ZDDvar[I], Ssh:= ZDDvarDop[I].0, CorrCo:= ZDDvarDop[I].1, CorrCz:= ZDDvarDop[I].2, BruClosePressed:= ZDDvarDop[I].3, BruStopPressed:= ZDDvarDop[I].4, (* Cfg:= , структура заполняется выше *) (* AutoCmds:= , структура заполняется выше *) (* TmCmds:= , структура заполняется выше *) RsLink:= ZD_RSlink[I].Q, TimeUstsPrev:= ZDStorage[I].TimeUstsPrev, zd:= ZDStorage[I].zd, commands:= ZDStorage[I].commands, zdImit:= ZDImitState[I], isInited:= ZDStorage[I].isInited, (* Флаг инициализации *) channelsDesync:= ZDBool[I,2], (* Рассинхронизация данных между физическим и интерфейсным каналом. *) rsOk:= ZDBool[I,3], (* Наличие связи по интерфейсному каналу *) NeedCrashStop:= ZDBool[I,4], (* Необходимость аварийной остановки *) needUpdateState:= ZDBool[I,5], (* Необходимость обновить состояния *) state:= ZDStorage[I].state, substate:= ZDStorage[I].substate, Messenger:= ZDMess, InternalTimers:= ZDTimers[I]); (* Состояние задвижки *) ZDStateArr[I].0 := ProcUzdFB.CommonData.State.0; (* Состояние задвижки: 000 - Неопределенное (0) 001 - Открывается (1) *) ZDStateArr[I].1 := ProcUzdFB.CommonData.State.1; (* 010 - Открыта (2) 011 - Промежуточное (3) *) ZDStateArr[I].2 := ProcUzdFB.CommonData.State.2; (* 100 - Закрывается (4) 101 - Закрыта (5) *) ZDStateArr[I].3 := 0; (* Резерв *) ZDStateArr[I].4 := ProcUzdFB.Diagnostic.UnpromtedOpen; (* Самопроизвольное открытие *) ZDStateArr[I].5 := ProcUzdFB.Diagnostic.UnpromtedClose; (* Самопроизвольное закрытие *) ZDStateArr[I].6 := ProcUzdFB.Diagnostic.CorrCo; (* Исправность цепей открытия *) ZDStateArr[I].7 := ProcUzdFB.Diagnostic.CorrCz; (* Исправность цепей закрытия *) ZDStateArr[I].8 := ProcUzdFB.Diagnostic.Vmmz; (* Сработала муфта закрытия *) ZDStateArr[I].9 := ProcUzdFB.Diagnostic.Vmmo; (* Сработала муфта открытия *) ZDStateArr[I].10 := ProcUzdFB.Diagnostic.Mufta; (* Сработала муфта *) ZDStateArr[I].11 := ProcUzdFB.Diagnostic.ErrBur; (* Авария БУР *) ZDStateArr[I].12 := ProcUzdFB.CommonData.Crash; (* Авария *) ZDStateArr[I].13 := ProcUzdFB.CommonData.Neisp; (* Неисправность *) ZDStateArr[I].14 := ProcUzdFB.CommonData.Dist; (* Дистанционное управление *) ZDStateArr[I].15 := ProcUzdFB.CommonData.Imit; (* Имитация *) ZDStateArr[I].16 := ProcUzdFB.CommonData.NoEc (*OR NOT (InSelectFB[I].Nu.KVZ OR InSelectFB[I].Nu.KVO)*); (* Отсутствие напряжения *) ZDStateArr[I].17 := ProcUzdFB.Diagnostic.ChannelsDesync; (* Несовпадение интерфейсных и дискретных сигналов *) ZDStateArr[I].18 := ProcUzdFB.Diagnostic.OpenFail; (* Невыполнение команды открытия *) ZDStateArr[I].19 := ProcUzdFB.Diagnostic.CloseFail; (* Невыполнение команды закрытия *) ZDStateArr[I].20 := ProcUzdFB.Diagnostic.StopFail; (* Невыполнение команды остановки *) ZDStateArr[I].21 := NOT ProcUzdFB.Diagnostic.RsFall; (* Наличие связи по интерфейсу *) ZDStateArr[I].22 := ProcUzdFB.Diagnostic.MomentFail; (* Аварийный флаг остановки по моменту *) (* ZDStateArr[I].25 := ZDBlinkErr[I]; (* Флаг мигания индикатора аварии задвижки *)*) ZDStateArr[I].27 := ProcUzdFB.Nu.KVZ; (* Полевой сигнал КВЗ (дискретный или интерфейсный) *) ZDStateArr[I].28 := ProcUzdFB.Nu.KVO; (* Полевой сигнал КВО (дискретный или интерфейсный) *) ZDStateArr[I].29 := ProcUzdFB.Nu.MPO; (* Полевой сигнал МПО (дискретный или интерфейсный) *) ZDStateArr[I].30 := ProcUzdFB.Nu.MPZ; (* Полевой сигнал МПЗ (дискретный или интерфейсный) *) ZDStateArr[I].31 := ProcUzdFB.Nu.BuCrash; (* Полевой сигнал авария БУР (дискретный или интерфейсный) *) (* Команды управления задвижкой *) ZDDOut[I].Open := ProcUzdFB.Open; ZDDOut[I].Close := ProcUzdFB.Close; ZDDOut[I].Stop := ProcUzdFB.Stop; ZDDOut[I].StopOpen := ProcUzdFB.StopOpen; ZDDOut[I].StopClose := ProcUzdFB.StopClose; ZDDOut[I].BuDeblock := ProcUzdFB.BuDeblock; END_FOR; ZDCmd1 := 0; END_PROGRAM