PDA

Просмотр полной версии : СПК107 +МК110-4К.4Р нет связи, на СПК пропало отображения кнопок и лампочек



Инженер23
08.02.2016, 23:04
Имею СПК107, МК110-4К.4Р, МДВВ, ТРМ138, 2 ПЧ с возможностью управления по RS485
На данный момент только начинаю разбиратся - накидал визуализацию с кнопочками лампочками - все нормально
Начал подключать модули подключил МК110-4К.4Р нашел пример с программой на языке структурных схем, подключил заработало сразу. Очень много рисовать, решил перейти на язык ST

1. Пропала индикация выключателей
Проблема часть выключателей когда выключена не отображалось на экране, нашел пункт "видимость" в настройках настроил и они пропали совсем.
После этого нарисовал проект с чистого листа выключатели невидимы всегда вне зависимости от состояния пункта видимость, без разницы загружать прошивку во флеш или в ОЗУ
Т.е. на диплее их не видно но если нажать на место где они должны быть срабатывают. Добавлял также лампочки тоже не отображаются, а вот кнопки отображаются

2. Подключение модулей
На диске с СПК есть пример, сделал почти как в примере (там модуль подключали другой) не прописывал только преобразование чисел с фиксированной запятой в плавующую (т.к. модуль не аналоговый)
Создал подключение по com порту присвоил номер 2 (подключается по com1), создал мастера шины, создал слейва, прописал адрес 16, проверил настройки com порта 9600 без проверки на четность 1 стоп бит (на модуле стандартные - не менял) добавил 2 канала на чтение регистра 0x11 и на запись регистра 0x12.
Запускаю программу индикация обмена по rs485 на модуле мигает, а в программе красный треугольник напротив слейва и состояние шина не запущена
(знаю что есть библиотека "модули МК110" упрощающие работу с этим модулем, но мне еще МДВВ, ТРМ138 и 2 ПЧ подключать так что нужно освоить универсальный способ подключения)

(далее 2 вопроса которые возникнут как только я решу вышеупомянутые проблемы)
3. Пока не увидел способа записи регистра по Modbus по команде, т.е. нужно не циклически писать в регистр данные по Modbus а записать только при некотором условии. (Есть данные что ПЧ, данные получаемые по rs485 пишет сразу во флеш, поэтому нужно проверить изменились данные или нет и только если изменились записать)

4. Как на СПК сохранить данные в энергонезависимой памяти или где об этом почитать

krollcbas
08.02.2016, 23:50
3. Связывайте данные, что в мастере, то и в слейве. Вопрос кто и где сбросит значение команды - решается программно. Команда не должна висеть.
4. Retain - общее правило.

Инженер23
10.02.2016, 10:20
Разобрался с 1 и 2 проблемами
1. Удалил антивирус, Переустановил кодесис - иникация не появилась, вспомнил про библиотеки установил библиотеку овен, таргет файлы и репозитарий овен, кнопочки лампочки снова на месте
2. один из каналов slave использовал команду записи 6, а модуль поддерживает только 0х10 команду, удалил этот канал и все заработало.
3. Как же все таки выполнить запись в регистр модбаса из программы на языке ST

Евгений Кислов
10.02.2016, 10:27
3. Как же все таки выполнить запись в регистр модбаса из программы на языке ST

В настройках канала в параметре Триггер поставьте значение RISING_EDGE. На вкладке привязки переменных появится строка для Trigger Variable. Привяжите туда BOOL переменную. Опрос/запись канала будет производится только по переднему фронту триггерной переменной.

22553

Инженер23
12.02.2016, 12:03
В настройках канала в параметре Триггер поставьте значение RISING_EDGE. На вкладке привязки переменных появится строка для Trigger Variable. Привяжите туда BOOL переменную. Опрос/запись канала будет производится только по переднему фронту триггерной переменной.

22553
Спасибо а есть рекомендации как именно нужно дергать тригером
создаю кнопочку по нажатии Выполнить код
bit_triger:=0;
bit_triger:=1;
срабатывает 1 раз из двадцати не успевает заметить этот фронт.

Евгений Кислов
12.02.2016, 12:10
Спасибо а есть рекомендации как именно нужно дергать тригером
создаю кнопочку по нажатии Выполнить код
bit_triger:=0;
bit_triger:=1;
срабатывает 1 раз из двадцати не успевает заметить этот фронт.

В InputConfiguration к параметру Нажать привяжите вашу переменную - при нажатии будет генерироваться единичный импульс.

Number17
16.11.2016, 14:05
В InputConfiguration к параметру Нажать привяжите вашу переменную - при нажатии будет генерироваться единичный импульс.

А если нужно активировать процесс без использования визуальных элементов? Допустим что запуск обмена по каналу происходит непосредственно из кода?

Евгений Кислов
16.11.2016, 14:14
Соответственно, надо обращаться к триггерной переменной из кода программы. Например, с помощью стандартного ФБ R_TRIG.

Number17
16.11.2016, 22:00
Соответственно, надо обращаться к триггерной переменной из кода программы. Например, с помощью стандартного ФБ R_TRIG.

Не получается с R_TRIG. Не ловит её канал Modbus почему то...

Евгений Кислов
17.11.2016, 07:45
Выложите архив проекта, пожалуйста, в котором наблюдается подобное.

Number17
17.11.2016, 20:16
Выложите архив проекта, пожалуйста, в котором наблюдается подобное.

Тестовый проектик где попытался запустить обмен с использованием R_TRIG из кода. Не получается.

Евгений Кислов
17.11.2016, 21:28
Так вы триггер и не вызываете. Сравните 18 строку (вызов ФБ с параметрами) и 28 (задание параметра ФБ без его вызова).

Вызов триггера заменит вам всю конструкцию IF THEN ELSE:


R_TRIG_M16D_CH_WR_COUNT14(CLK:=(M16D_cnt14 >= M16D_cnt14_val_rst));

Тут, правда, стоит подумать о ситуации, когда после срабатывания триггера запись в модуль не произошла (например, в тот момент он был отключен). Возможно, стоит действовать в стиле "если спустя 5 секунд после срабатывания триггера значение счетчика не изменилось, то сбрасываем триггер (и он сработает опять, т.к. условие срабатывания продолжает выполняться) для новой попытки записи".

И советую для Main_task поставить цикл 10 мс - по дефолту обмен привязывается к задаче с наименьшим циклом, 100 мс - не очень хорошее число.

Number17
18.11.2016, 08:03
Так вы триггер и не вызываете. Сравните 18 строку (вызов ФБ с параметрами) и 28 (задание параметра ФБ без его вызова).

Вызов триггера заменит вам всю конструкцию IF THEN ELSE:


R_TRIG_M16D_CH_WR_COUNT14(CLK:=(M16D_cnt14 >= M16D_cnt14_val_rst));

Тут, правда, стоит подумать о ситуации, когда после срабатывания триггера запись в модуль не произошла (например, в тот момент он был отключен). Возможно, стоит действовать в стиле "если спустя 5 секунд после срабатывания триггера значение счетчика не изменилось, то сбрасываем триггер (и он сработает опять, т.к. условие срабатывания продолжает выполняться) для новой попытки записи".

И советую для Main_task поставить цикл 10 мс - по дефолту обмен привязывается к задаче с наименьшим циклом, 100 мс - не очень хорошее число.

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