- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Диагностика S7-400
-
- здесь недавно
- Сообщения: 8
- Зарегистрирован: 29 сен 2016, 15:26
- Имя: Брагинская Ольга Александровна
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 2 раза
Диагностика S7-400
Добрый день!
Подскажите, пожалуйста, как можно из диагностического буфера выводить неисправности контроллера и модулей на панели управления? (панель управления сделана в программе tia portal)
Подскажите, пожалуйста, как можно из диагностического буфера выводить неисправности контроллера и модулей на панели управления? (панель управления сделана в программе tia portal)
-
- здесь недавно
- Сообщения: 8
- Зарегистрирован: 29 сен 2016, 15:26
- Имя: Брагинская Ольга Александровна
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 2 раза
-
- здесь недавно
- Сообщения: 8
- Зарегистрирован: 29 сен 2016, 15:26
- Имя: Брагинская Ольга Александровна
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 2 раза
Диагностика S7-400
Подскажите, пожалуйста, при использовании в блоке OB82 функции SFC51 что будет являться результатом работы функции? Данная функция по идее должна считать в каком модуле и какая ошибка произошла. Может эта функция указывает, в каком канале модуле произошла ошибка?
По описанию функции SFC51 в документе "Системные и стандартные функции для S7-300 и S7-400" сложно понять, что выдается в результате работы функции.
По описанию функции SFC51 в документе "Системные и стандартные функции для S7-300 и S7-400" сложно понять, что выдается в результате работы функции.
-
- здесь недавно
- Сообщения: 6
- Зарегистрирован: 14 ноя 2016, 08:44
- Имя: Боровской Алексей Владимирович
- Страна: Россия
- город/регион: Челябинск
Диагностика S7-400
OB82 уже даст вам ответ в каком модуле ошибка произошла. при #OB82_EV_CLASS=B#16#39 в #OB82_MDL_ADDR будет адрес модуля вызвавшего диагностическое прерывание. Вот если его передать в SFC51 то можно получить дополнительную информацию. что вы будете получать и в каком виде зависеть будет от параметра SZL_ID (логичнее конечно в этой связке использовать SZL_ID =W#16#00B3 и в качестве INDEX - #OB82_MDL_ADDR тогда вы получите Все диагностические данные одного модуля)
-
- здесь недавно
- Сообщения: 36
- Зарегистрирован: 11 окт 2016, 08:38
- Имя: Владимир
- Страна: Россия
- город/регион: Новочебоксарск
- Благодарил (а): 2 раза
- Поблагодарили: 5 раз
Диагностика S7-400
Если грубо, с помощью SFC51 проводите опрос, задавая необходимые SSL-ID и INDEX. Получаете заполненную структуру с данными (грубо говоря DB), распоряжаетесь этими данными по своему усмотрению, вывод через тэги на панели и т.п.
-
- здесь недавно
- Сообщения: 6
- Зарегистрирован: 14 ноя 2016, 08:44
- Имя: Боровской Алексей Владимирович
- Страна: Россия
- город/регион: Челябинск
Диагностика S7-400
мы у себя просто подымаем вебморду на 400-ых и эксплуатация имеет возможность смотреть диагностический буфер удалено в качестве странички (судя по всему у вас задача просто отобразить диагностический буфер)
-
- осмотрелся
- Сообщения: 192
- Зарегистрирован: 16 дек 2011, 15:13
- Имя: Алексей
- Страна: Россия
- Благодарил (а): 65 раз
- Поблагодарили: 46 раз
Диагностика S7-400
Я использую два варианта использования диагностики модулей ввода-вывода (покажу на примере модуля аналогового ввода).OlgaBraginskaya писал(а): Данная функция по идее должна считать в каком модуле и какая ошибка произошла. Может эта функция указывает, в каком канале модуле произошла ошибка?
1.Вариант использования функции RD_REC (SFC 59 - Чтение записи данных)
Объявляю в SCL следующую структуру:
Код: Выделить всё
TYPE ModuleAIDiag
STRUCT
iMLOGADDR : INT;//логический адрес модуля (брать из Hardware начальный Input адрес модуля)
iError : INT;
bReq : BOOL;
bBUSY : BOOL;
aDiagArray: ARRAY [0..15] OF BYTE; //массив диагностической записи от модуля AI (расшифровку байтов и длину диагностической записи надо смотреть для каждого типа модуля в его описании, ниже приведено для модуля аналогового ввода)
//b0 : BYTE;//байт состояния модуля (0 байт диагностики)
(*
0 - неисправность модуля
1 - внутренняя ошибка
2 - внешняя ошибка
3 - имеется ошибка канала
4 - отсутсвует внешнее вспомогательное напряжение
5 - отсутствует фронтштекер
6 - модуль не параметризован
7 - модуль параметризован неправильно
*)
//b1 : BYTE;// (1 байт диагностики) - не используем
//b2 : BYTE;//байт состояния модуля (2 байт диагностики)
(*
0 - установлен не тот или отсутствует модуль памяти
1 - неисправность связи
2 - рабочее состояние (0 - RUN, 1 - STOP)
3 - сработал контроль времени цикла
4 - вышел из строя внутренний источник питания
5 - батарея разряжена
6 - вышла из строя вся буферизация
7 - зарезервирован (0)
*)
//b3 : BYTE;//байт состояния модуля (3 байт диагностики)
(*
0 - неисправность стойки
1 - вышел из строя процессор
2 - ошибка СППЗУ
3 - ошибка ОЗУ
4 - ошибка АЦП/ЦАП
5 - сгорел предохранитель
6 - потеряно аппаратное прерывание
7 - зарезервирован (0)
*)
//b4 : BYTE;// (4 байт диагностики) - не используем
//b5 : BYTE;// (5 байт диагностики) - не используем
//b6 : BYTE;// (6 байт диагностики) - не используем
//bGCHSTATUS : BYTE;//байт состояния каналов (7й байт диагностики)
(*
0 - канал 0
1 - канал 1
2 - канал 2
3 - канал 3
4 - канал 4
5 - канал 5
6 - канал 6
7 - канал 7
*)
(*
0 - ошибка проектирования или параметризации
1 - синфазная ошибка
2 - короткое замыкание на L+
3 - короткое замыкание на M
4 - обрыв провода
5 - ошибка опорного канала
6 - отрицательное переполнение
7 - положительное переполнение
*)
//aCHSTATUS : ARRAY [0..7] OF BYTE;//байт состояния группы (8-15й байт диагностики содержат байт диагностики для каждого канала)
END_STRUCT
END_TYPE
Код: Выделить всё
DATA_BLOCK AIDiag
STRUCT
aDiag : ARRAY[0..9] OF ModuleAIDiag;//массив диагностических записей для модулей аналогового ввода (размер массива зависит от кол-ва модулей AI - у меня 10)
iNum : INT;//количество модулей аналогового ввода
END_STRUCT
BEGIN
iNum := 10;
//заполняем начальные данные из Hardware
aDiag[0].iMLOGADDR := 272;
aDiag[1].iMLOGADDR := 288;
//....и так далее для всех оставшихся модулей
END_DATA_BLOCK
Код: Выделить всё
FUNCTION DIAG_PROCESS_AI:VOID
VAR_TEMP
I : INT;//итератор
END_VAR
FOR I := 0 TO AIDiag.iNum DO
//если функция еще не запущена (не занята), то запускаем занового
IF (NOT AIDiag.aDiag[I].bBUSY) THEN
AIDiag.aDiag[I].bReq := TRUE;
ELSE
AIDiag.aDiag[I].bReq := FALSE;
END_IF;
//читаем IOID = B#16#54 (модуль ввода), по адресу iMLOGADDR, запись номер RECNUM := 1 и помещаем результат в массив байтов aDiagArray
AIDiag.aDiag[I].iError := RD_REC(REQ := AIDiag.aDiag[I].bReq ,
IOID := B#16#54,
LADDR := INT_TO_WORD(AIDiag.aDiag[I].iMLOGADDR),
RECNUM := 1,
BUSY := AIDiag.aDiag[I].bBUSY,
RECORD := AIDiag.aDiag[I].aDiagArray);
END_FOR;
END_FUNCTION
тег AI1 с адресом DB10.DBB6
тег AI2 с адресом DB10.DBB30
и так далее
2.Вариант использования функции RDSYSST (SFC 51 - Считывание списка и подсписка состояний системы)
Функция RDSYSST гораздо обширнее и позволяет читать намного больше диагностической информации,
я в своей практике использую 1 вариант диагностики.
Итак, если вызов функции RDSYSST происходит в блоке диагностического прерывания OB82 (с SSL-ID W#16#00B1, или W#16#00B2, или W#16#00B3), то
состояние системы (модуля) читается немедленно. Если вызов функции происходит вне этого прерывания, то вызов функции происходит асинхронно
и нужно учитывать сигнал Busy ("занято").
Вызов функции возвращает максимально 221 байт, это надо учитывать(естественно, например для модуля аналогового ввода используется первые 16 байт).
а. Дата блок диагностической информации
Код: Выделить всё
DATA_BLOCK DiagRecord
STRUCT
iModuleAddr : INT;//логический адрес модуля, инициировавшего прерывание
iIRQCount : INT;//лоличество инициированных прерываний
iIRQProcessed : INT;//количество обработанных прерываний
iLastError : INT;//код ошибки при чтении диагностической информации
SFC51Busy : BOOL;//SFC51 продолжает обработку данных
SSL_HEADER : STRUCT
LENTHDR : WORD;//размер диагностичекой записи в байтах
N_DR : WORD;//номер диагностической записи
END_STRUCT;
aLastDiagRec : ARRAY [0..220] OF BYTE;//последняя зафиксированная диагностическая запись
END_STRUCT
BEGIN
END_DATA_BLOCK
Код: Выделить всё
VAR_TEMP
i : INT;
C_MDL_ADDR : WORD; //адрес модуля для SFC51
END_VAR
DiagRecord.iIRQCount := DiagRecord.iIRQCount + 1;//фиксируем число прерываний
//сброс последней диагностической записи
FOR i := 0 TO 220 DO
DiagRecord.aLastDiagRec[i] := 0;
END_FOR;
//подготовка адреса модуля - модуль входов
IF OB82_IO_FLAG = B#16#54 THEN C_MDL_ADDR := OB82_MDL_ADDR; END_IF;
//подготовка адреса модуля - модуль выходов
IF OB82_IO_FLAG = B#16#55 THEN C_MDL_ADDR := OB82_MDL_ADDR OR w#16#8000; END_IF;
//чтение диагностической информации
//по поводу SZL_ID - обращаться в Help и списку стандартных функции для S7-300 и S7-400
//для 3хх и 4хх они могут отличаться
DiagRecord.iLastError := RDSYSST (REQ := 1, SZL_ID := W#16#00B3, INDEX := C_MDL_ADDR, RET_VAL := DiagRecord.iLastError, BUSY := DiagRecord.SFC51Busy, SZL_HEADER := DiagRecord.SSL_HEADER, DR := DiagRecord.aLastDiagRec);
//Вызов функции чтения диагностики завершился ошибкой
IF DiagRecord.iLastError <> 0 THEN RETURN; END_IF;
DiagRecord.iModuleAddr := WORD_TO_INT(OB82_MDL_ADDR);
//тут тип модуля, вызвавший прерывание
CASE BYTE_TO_INT(DiagRecord.aLastDiagRec[4]) OF
B#16#70 : //модуль цифрового ввода
;
B#16#71 : //модуль аналогового ввода
DiagProcAI();
B#16#72 : //модуль цифрового вывода
;
B#16#73 : //модуль аналогового вывода
;
END_CASE;
Код: Выделить всё
FUNCTION DiagProcAI : VOID
VAR_TEMP
I : INT;//итератор
CH : INT;//итератор
CH_ADDR : INT;//вычисленный адрес канала
CH_FLT : BOOL;//признак отказа канала
END_VAR
//поиск модуля в массиве диагностики аналоговых модулей ввода
FOR I := 0 TO AIDiag.iNum DO
IF AIDiag.aDiag[I].iMLOGADDR <> DiagRecord.iModuleAddr THEN
CONTINUE;
END_IF;
//загрузка обобщенной диагностики по модулю(запись 0)
AIDiag.aDiag[I].aDiagArray[0] := DiagRecord.aLastDiagRec[0];
AIDiag.aDiag[I].aDiagArray[2] := DiagRecord.aLastDiagRec[2];
AIDiag.aDiag[I].aDiagArray[3] := DiagRecord.aLastDiagRec[3];
//данные по каналам не изменились - обработка не требуется
IF (AIDiag.aDiag[I].aDiagArray[7] XOR DiagRecord.aLastDiagRec[7]) = 0 THEN
EXIT;
END_IF;
FOR CH := 0 TO 7 DO
//канал не изменил свое состояние - обработка не требуется
IF (SHR(IN := AIDiag.aDiag[I].aDiagArray[7] XOR DiagRecord.aLastDiagRec[7], N := CH) & 1) = 0 THEN
CONTINUE;
END_IF;
//канал изменил свое состояние - обновление данных
AIDiag.aDiag[I].aDiagArray[8 + CH] := DiagRecord.aLastDiagRec[8 + CH];
//вычисление адреса канала, который изменил состояние
CH_ADDR := DiagRecord.iModuleAddr + CH * 2;
//определение статуса канала(отказ или норма)
IF (SHR(IN := DiagRecord.aLastDiagRec[7], N := CH) & 1) = 1 THEN
//проверка критических ошибок канала
IF DiagRecord.aLastDiagRec[8 + CH] <> 0 THEN
CH_FLT := TRUE;
END_IF;
ELSE
CH_FLT := FALSE;
END_IF;
END_FOR;
//запись обновленной информации по группам
AIDiag.aMAIDiag[I].aDiagArray[7] := DiagRecord.aLastDiagRec[7];
END_FOR;
//Прерываение обработано
DiagRecord.iIRQProcessed := DiagRecord.iIRQProcessed + 1;
END_FUNCTION
Может, использование второго варианта и правильнее было бы, но я не стал заморачиваться и раз в секунду (в OB32) запускаю чтение диагн.информации с использованием первого варианта.
На этом пока все. :)
-
- здесь недавно
- Сообщения: 8
- Зарегистрирован: 29 сен 2016, 15:26
- Имя: Брагинская Ольга Александровна
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 2 раза
-
- здесь недавно
- Сообщения: 8
- Зарегистрирован: 29 сен 2016, 15:26
- Имя: Брагинская Ольга Александровна
- Страна: Россия
- город/регион: Москва
- Благодарил (а): 2 раза
Диагностика S7-400
У меня проект для контроллера сделан в step 7 v5.5, а панель управления в tia portal v13. Нужно отобразить на панели управления диагностический буфер. Подскажите, пожалуйста, если в tia portal использовать объект System diagnostics view, который отображает буфер диагностики, возможно ли наладить передачу данных между step 7 и tia portal?
-
- осмотрелся
- Сообщения: 192
- Зарегистрирован: 16 дек 2011, 15:13
- Имя: Алексей
- Страна: Россия
- Благодарил (а): 65 раз
- Поблагодарили: 46 раз
Диагностика S7-400
К сожалению, не знаю как это
реализовать, так как TiaPortal для меня пока что темный лес...
-
- здесь недавно
- Сообщения: 36
- Зарегистрирован: 11 окт 2016, 08:38
- Имя: Владимир
- Страна: Россия
- город/регион: Новочебоксарск
- Благодарил (а): 2 раза
- Поблагодарили: 5 раз
Диагностика S7-400
Вот здесь https://support.industry.siemens.com/cs ... 0&lc=en-DZ пример похожей реализации, доработайте под себя.
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 08 июл 2019, 00:22
- Имя: Антон
Диагностика S7-400
Опять про ОВ82. С аналоговыми модулями все понятно. А какой стартовый адрес у модулей в\в в стойке ЕТ200 если 1-й модуль начинается, допустим, с i70.0, а второй с i70.4? Оба модуля начинаются с 70. Ни как не догоню . Как один отличить от второго?