Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 15 из 15

Тема: Опрос модулей Мх110 по RS485

  1. #11

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Вы уже 2й раз описываете. Напишите сам код. Кто-нибудь и поправит если чего.
    VAR
    COUNT:ARRAY [1..10] OF INT; (*массив количества опросов каждого модуля из 10*)
    COMM_MV110: ARRAY [1..10] OF BOOL; (*массив ошибок связи каждого модуля*)
    (*ошибка = FALSE если в регистре LAST ERROR Значение 81 при опросе модуля*)
    TEAM_MV110_i: BYTE; (*для каждого модуля своя команда - условное объявление, по факту привязана к адресу UnModDev*)
    TMR_TEAM:TP; (*ТАЙМЕР ОПРОСА МОДУЛЯ*)
    TIME_TEAM:TIME := T#50ms; (*ВРЕМЯ ОПРОСА МОДУЛЯ*)
    END_VAR


    IF I < 10 THEN I := I + 1;
    IF NOT COMM_MV110[I] THEN COUNT[I] := COUNT[I] + 1;END_IF
    IF COUNT[I] <= 3 THEN TMR_TEAM(IN := TRUE, PT := TIME_TEAM);
    IF TMR_TEAM.Q THEN TEAM_MV110_i := 255;
    ELSE TEAM_MV110_i := 254; TMR_TEAM(IN := FALSE, PT := TIME_TEAM); END_IF
    ELSE TEAM_MV110_i := 254; END_IF ELSE I := 0; END_IF

    Код набросал очень быстро в блокноте, даже не проверял если честно, но думаю идея должна быть видна. Пока писал понял что можно использовать массивы чем case и такое решение выглядит короче.

  2. #12

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    А что ожидаете от TP ?

    И да, уважайте других - пишите с нормальными уступами. CODE /CODE - есть.
    VAR
    COUNT:ARRAY [1..10] OF INT; (*массив количества опросов каждого модуля из 10*)
    COMM_MV110: ARRAY [1..10] OF BOOL; (*массив ошибок связи каждого модуля*)
    (*ошибка = FALSE если в регистре LAST ERROR Значение 81 при опросе модуля*)
    TEAM_MV110_i: BYTE; (*для каждого модуля своя команда - условное объявление, по факту привязана к адресу UnModDev*)
    TMR_TEAM:TP; (*ТАЙМЕР ОПРОСА МОДУЛЯ*)
    TIME_TEAM:TIME := T#50ms; (*ВРЕМЯ ОПРОСА МОДУЛЯ*)
    END_VAR

    IF I < 10 THEN
    I := I + 1;
    IF NOT COMM_MV110[I] THEN
    COUNT[I] := COUNT[I] + 1; END_IF
    IF COUNT[I] <= 3 THEN
    TMR_TEAM(IN := TRUE, PT := TIME_TEAM);
    IF TMR_TEAM.Q THEN
    TEAM_MV110_i := 255;
    ELSE TEAM_MV110_i := 254; TMR_TEAM(IN := FALSE, PT := TIME_TEAM); END_IF
    ELSE TEAM_MV110_i := 254; TMR_TEAM(IN := FALSE, PT := TIME_TEAM); END_IF ELSE I := 0; END_IF

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

    Таймер, как я предполагал, пока считает происходит опрос модуля, как досчитал - опрос заканчиваем.
    Последний раз редактировалось deniska13; 08.11.2019 в 10:02.

  3. #13

    По умолчанию

    В итоге мне никто так и не помог, ни посетители-специалисты в данной области, ни производители данного оборудования, знающие его вдоль и поперек, по крайней мере мне так кажется...в общем написал код, который в симуляторе делает то что мне нужно было, буду тестировать его на реальном оборудовании через несколько дней, но как мне кажется код должен работать нормально. Суть его такова - есть ПЛК110, есть модули МВ110-16Д в количестве 10шт., находятся на удалении от ПЛК110, в PLC Configutation применена стандартная конфигурация, знаю про библиотеку Modbus, но времени на ее изучение не было, хотя походим способом я реализую чтение\запись на ПЛК BECKHOFF, но сейчас не об этом. ПЛК110 у нас мастер, модули все слэйв, в конфигурации создаем Universal modbus device, настраиваем модули (скорость, адрес, стоп бит итд...) режим работы по команде, адрес управления опросом модуля по команде присваиваем массиву команд для удобства и собственно все. Количество повторов опроса модуля у меня стоит 5, после 5 неудачных попыток (подряд!) модуль убирается из опроса (программно добавлю переменную с выводом крестика на панели на против соотв. модуля что он убран из опроса, тут это не реализовано), если ошибки шли не подряд, например 2 ошибки затем опрос прошел без ошибки, предыдущие неудачные попытки стираются...

    PROGRAM PLC_PRG
    VAR
    COUNT_TEAM: ARRAY [1..10] OF INT; (*МАССИВ КОЛИЧЕСТВА ОШИБОК ПРИ ОПРОСЕ МОДУЛЯ, 1 ИНДЕКС МАССИВА ЭТО КОЛ-ВО
    ОШИБОК ОПРОСА 1 МОДУЛЯ*)
    COM_ERR: ARRAY [1..10] OF BOOL; (*МАССИВ ОШИБОК МОДУЛЕЙ - FALSE ОШИБКА ОПРОСА i - ОГО МОДУЛЯ*)
    CMD_MODULE: ARRAY [1..10] OF BYTE; (*МАССИВ КОМАНД: 1 ИНДЕКС ЭТО КОМАНДА ДЛЯ 1 МОДУЛЯ - итд*)
    TEAM_START:BYTE := 255; (*КОМАНДА НАЧАЛА ОПРОСА МОДУЛЯ*)
    TEAM_STOP:BYTE := 254; (*КОМАНДА ПРЕКРАЩЕНИЯ ОПРОСА МОДУЛЯ*)
    TMR_TEAM:TP; (*ТАЙМЕР ОПРОСА МОДУЛЯ*)
    TIME_TEAM: TIME := T#50ms; (*ВРЕМЯ РАБОТЫ ТАЙМЕРА ОПРОСА МОД*)
    I:INT := 1; (*ИНДЕКС ЦИКЛА*)
    ERR_UNIT:WORD; (*ПЕРЕМЕННАЯ ОШИБКА ПРИВЯЗАННАЯ К АДРЕСУ РЕГИСТРА LAST ERROR*)
    BUTTON_RESET_ALR_MODULE:BOOL; (*КНОПКА СБРОСА НЕУДАЧНЫХ ПОПЫТОК ОПРОСА МОДУЛЯ С ПАНЕЛИ*)
    J:INT; (*ПЕРЕМЕННАЯ ВЫБОРА МОДУЛЯ ДЛЯ СБРОСА НЕУДАЧНЫХ ПОПЫТОК ОПРОСА*)
    TRIG_COM_ERR:R_TRIG; (*ТРИГГЕР*)
    END_VAR

    IF BUTTON_RESET_ALR_MODULE THEN (*ВЫБИРАЕМ НА ПАНЕЛИ АДРЕС МОДУЛЯ J ДЛЯ КОТОРОГО ХОТИМ СДЕЛАТЬ СБРОС КНОПКОЙ*)
    COUNT_TEAM[ J ] := 0; (*СОБСТВЕННО СБРОС*)
    END_IF
    TRIG_COM_ERR(CLK := COM_ERR[ I ]); (*ЕСЛИ ФИКСИРУЕМ ИЗМЕНЕНИЕМ С FALSE НА TRUE*)
    IF TRIG_COM_ERR.Q AND COUNT_TEAM[ I ] < 5 THEN
    COUNT_TEAM[ I ] := 0; (*ОБНУЛЯЕМ СЧЕТЧИК ОШИБОК*)
    END_IF
    IF ERR_UNIT = 81 AND CMD_MODULE[ I ] = TEAM_START THEN (*ЕСЛИ ФИКСИРУЕМ ОШИБКУ ВО ВРЕМЯ ОПРОСА i АДРЕСА МОДУЛЯ ТО*)
    COM_ERR[ I ] := FALSE; (*ВЫСТАВЛЯЕМ БИТ ОШИБКИ*)
    ELSIF ERR_UNIT = 0 THEN (*ЕСЛИ ОШИБКИ ВО ВРЕМЯ ОПРОСА НЕТ ТО*)
    COM_ERR[ I ] := TRUE; (*ВЫСТАВЛЯЕМ БИТ ВСЕ ХОРОШО*)
    END_IF

    IF I <= 10 THEN
    IF NOT COM_ERR[ I ] THEN
    COUNT_TEAM[ I ] := COUNT_TEAM[ I ] + 1;
    END_IF
    IF COUNT_TEAM[ I ] < 5 THEN
    TMR_TEAM(IN := TRUE, PT := TIME_TEAM);
    IF TMR_TEAM.Q THEN
    CMD_MODULE[ I ] := TEAM_START;
    ELSIF NOT TMR_TEAM.Q THEN
    CMD_MODULE[ I ] := TEAM_STOP; TMR_TEAM(IN := FALSE, PT := TIME_TEAM);
    IF I < 10 THEN
    I :=I + 1;
    ELSE I := 1;
    END_IF
    END_IF
    ELSE CMD_MODULE[ I ] := TEAM_STOP; TMR_TEAM(IN := FALSE, PT := TIME_TEAM);
    IF I < 10 THEN
    I :=I + 1;
    ELSE I := 1;
    END_IF
    END_IF
    END_IF


    Если вдруг кому интересно, или есть какие-либо предложения-замечания пишите)
    Заранее извиняюсь если код расположен не наглядно, не знаю как это здесь сделать, TAB не работает..
    Последний раз редактировалось deniska13; 08.11.2019 в 21:38.

  4. #14

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Ну так заработало ?
    в симуляторе -да, в реальности пока не могу сказать, нужно тестировать на объекте, через несколько дней поеду, протестирую, в руках подобного оборудования нет, поэтому не проверить. Если вдруг у кого есть и есть время, может протестирует код раньше чем я доеду до объекта)

  5. #15

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Ну так заработало ?
    программа не работает, при отправке команды FF, обмена данными не происходит...

Страница 2 из 2 ПерваяПервая 12

Похожие темы

  1. Адрес Мх110 в сети RS485
    от DIPHENHYDRAMINE в разделе ПЛК1хх
    Ответов: 22
    Последнее сообщение: 27.04.2018, 13:39
  2. Мапинг переменных из модулей МХ110 в СПК107
    от Serhioromano в разделе СПК1хх
    Ответов: 1
    Последнее сообщение: 05.12.2017, 13:26
  3. Ответов: 163
    Последнее сообщение: 19.04.2016, 17:18
  4. Шаблоны модулей МХ110 для CODESYS 3.5
    от Александр Приходько в разделе СПК2хх
    Ответов: 91
    Последнее сообщение: 24.04.2015, 18:29
  5. Ответов: 4
    Последнее сообщение: 10.02.2015, 16:12

Ваши права

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