1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Диагностика S7-400

ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
Ответить

Автор темы
OlgaBraginskaya
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 29 сен 2016, 15:26
Имя: Брагинская Ольга Александровна
Страна: Россия
город/регион: Москва
Благодарил (а): 2 раза

Диагностика S7-400

Сообщение OlgaBraginskaya »

Добрый день!

Подскажите, пожалуйста, как можно из диагностического буфера выводить неисправности контроллера и модулей на панели управления? (панель управления сделана в программе tia portal)

Ibev
здесь недавно
здесь недавно
Сообщения: 36
Зарегистрирован: 11 окт 2016, 08:38
Имя: Владимир
Страна: Россия
город/регион: Новочебоксарск
Благодарил (а): 2 раза
Поблагодарили: 5 раз

Диагностика S7-400

Сообщение Ibev »

Почитай вот этот букварь "Системные и стандартные функции дляS7-300 иS7-400".

Автор темы
OlgaBraginskaya
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 29 сен 2016, 15:26
Имя: Брагинская Ольга Александровна
Страна: Россия
город/регион: Москва
Благодарил (а): 2 раза

Диагностика S7-400

Сообщение OlgaBraginskaya »

Ibev, спасибо!

Автор темы
OlgaBraginskaya
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 29 сен 2016, 15:26
Имя: Брагинская Ольга Александровна
Страна: Россия
город/регион: Москва
Благодарил (а): 2 раза

Диагностика S7-400

Сообщение OlgaBraginskaya »

Подскажите, пожалуйста, при использовании в блоке OB82 функции SFC51 что будет являться результатом работы функции? Данная функция по идее должна считать в каком модуле и какая ошибка произошла. Может эта функция указывает, в каком канале модуле произошла ошибка?
По описанию функции SFC51 в документе "Системные и стандартные функции для S7-300 и S7-400" сложно понять, что выдается в результате работы функции.

leha74ru
здесь недавно
здесь недавно
Сообщения: 6
Зарегистрирован: 14 ноя 2016, 08:44
Имя: Боровской Алексей Владимирович
Страна: Россия
город/регион: Челябинск

Диагностика S7-400

Сообщение leha74ru »

OB82 уже даст вам ответ в каком модуле ошибка произошла. при #OB82_EV_CLASS=B#16#39 в #OB82_MDL_ADDR будет адрес модуля вызвавшего диагностическое прерывание. Вот если его передать в SFC51 то можно получить дополнительную информацию. что вы будете получать и в каком виде зависеть будет от параметра SZL_ID (логичнее конечно в этой связке использовать SZL_ID =W#16#00B3 и в качестве INDEX - #OB82_MDL_ADDR тогда вы получите Все диагностические данные одного модуля)

Ibev
здесь недавно
здесь недавно
Сообщения: 36
Зарегистрирован: 11 окт 2016, 08:38
Имя: Владимир
Страна: Россия
город/регион: Новочебоксарск
Благодарил (а): 2 раза
Поблагодарили: 5 раз

Диагностика S7-400

Сообщение Ibev »

Если грубо, с помощью SFC51 проводите опрос, задавая необходимые SSL-ID и INDEX. Получаете заполненную структуру с данными (грубо говоря DB), распоряжаетесь этими данными по своему усмотрению, вывод через тэги на панели и т.п.

leha74ru
здесь недавно
здесь недавно
Сообщения: 6
Зарегистрирован: 14 ноя 2016, 08:44
Имя: Боровской Алексей Владимирович
Страна: Россия
город/регион: Челябинск

Диагностика S7-400

Сообщение leha74ru »

мы у себя просто подымаем вебморду на 400-ых и эксплуатация имеет возможность смотреть диагностический буфер удалено в качестве странички (судя по всему у вас задача просто отобразить диагностический буфер)

LexSL
осмотрелся
осмотрелся
Сообщения: 192
Зарегистрирован: 16 дек 2011, 15:13
Имя: Алексей
Страна: Россия
Благодарил (а): 65 раз
Поблагодарили: 46 раз

Диагностика S7-400

Сообщение LexSL »

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
В результате: в дата-блоке AIDiag имеется массив структур, каждая структура содержит массив байт диагностической информации по модулю ввода AI и каждому каналу ввода. Далее, этот дата блок "подтягиваю" наверх в WinCC, и уже там рисую картинку по каждому модулю с привязкой к нужной структуре (в WinCC создаю структурный тег, содержащий 16 байт - см. массив aDiagArray, создаю экземпляры структурного тега с адресом блока AIDiagю При этом учитывать надо смещение в блоке - например,
тег 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
b. в прерывании OB82 :

Код: Выделить всё

	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;
c. Функция DiagProcAI

Код: Выделить всё

	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

То есть, при использовании второго варианта чтения диагностической информации, как таковое чтение происходит лишь один раз при возникновении прерывания OB82 с обновлением данных, если они изменились.
Может, использование второго варианта и правильнее было бы, но я не стал заморачиваться и раз в секунду (в OB32) запускаю чтение диагн.информации с использованием первого варианта.
На этом пока все. :)

Автор темы
OlgaBraginskaya
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 29 сен 2016, 15:26
Имя: Брагинская Ольга Александровна
Страна: Россия
город/регион: Москва
Благодарил (а): 2 раза

Диагностика S7-400

Сообщение OlgaBraginskaya »

leha74ru, Ibev, LexSL, спасибо!

Автор темы
OlgaBraginskaya
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 29 сен 2016, 15:26
Имя: Брагинская Ольга Александровна
Страна: Россия
город/регион: Москва
Благодарил (а): 2 раза

Диагностика S7-400

Сообщение OlgaBraginskaya »

У меня проект для контроллера сделан в step 7 v5.5, а панель управления в tia portal v13. Нужно отобразить на панели управления диагностический буфер. Подскажите, пожалуйста, если в tia portal использовать объект System diagnostics view, который отображает буфер диагностики, возможно ли наладить передачу данных между step 7 и tia portal?

LexSL
осмотрелся
осмотрелся
Сообщения: 192
Зарегистрирован: 16 дек 2011, 15:13
Имя: Алексей
Страна: Россия
Благодарил (а): 65 раз
Поблагодарили: 46 раз

Диагностика S7-400

Сообщение LexSL »

OlgaBraginskaya писал(а): панель управления в tia portal v13
К сожалению, не знаю как это
OlgaBraginskaya писал(а): использовать объект System diagnostics view, который отображает буфер диагностики
реализовать, так как TiaPortal для меня пока что темный лес...

Ibev
здесь недавно
здесь недавно
Сообщения: 36
Зарегистрирован: 11 окт 2016, 08:38
Имя: Владимир
Страна: Россия
город/регион: Новочебоксарск
Благодарил (а): 2 раза
Поблагодарили: 5 раз

Диагностика S7-400

Сообщение Ibev »

Вот здесь https://support.industry.siemens.com/cs ... 0&lc=en-DZ пример похожей реализации, доработайте под себя.

Minus
здесь недавно
здесь недавно
Сообщения: 3
Зарегистрирован: 08 июл 2019, 00:22
Имя: Антон

Диагностика S7-400

Сообщение Minus »

Опять про ОВ82. С аналоговыми модулями все понятно. А какой стартовый адрес у модулей в\в в стойке ЕТ200 если 1-й модуль начинается, допустим, с i70.0, а второй с i70.4? Оба модуля начинаются с 70. Ни как не догоню :?: . Как один отличить от второго?
Ответить

Вернуться в «Simatic Step7»