PDA

Просмотр полной версии : Помогите разобраться с СПК-207 + устройство на ModBus с Trigger = RISING_EDGE



orensnake
17.01.2016, 12:15
Добрый день коллеги!

Возникла проблема со связью из СПК207 с контроллером сервопривода (ASD-A2) по шине ModBus.
На текущий момент все читается, записывается, КРОМЕ одного адреса. В контроллер сервопривода по адресу 0x050E записывается код внутренней программы (одной из 64) по перемещению.
Циклическую запись по этому смещению вести категорически нельзя из-за особенностей реализации самого контроллера сервопривода - при записи сразу же начинает выполняться подпрограмма. При записи 0, к примеру, контроллер сервопривода выполняет 0 встроенную программу - поиск 0.

Мне же необходимо в определенные моменты выдавать команды на установку необходимой мне в текущей момент "программы перемещения".
Для исключения постоянной записи кода подпрограммы решил использовать RISING_EDGE.
По идее, для передачи нужного значения необходимо:
1) записать в соответствующую переменную необходимое значение
2) в соответствующую переменную Trigger Variable необходимо выставить True

Делаю все по такому принципу - но.. не работает.
Если же выставить для соответствующего ModBus Slave устройства свойство xTrigger в True - то в контроллер сервопривода уходит значение 0, вне зависимости от того, что я выставил.

Вопрос - что я делаю не так, и как исправить ситуацию?

P.S. Готов предоставить скриншоты и прочие необходимые данные по Вашему запросу.

Yegor
17.01.2016, 15:23
P.S. Готов предоставить скриншоты и прочие необходимые данные по Вашему запросу.Ну а что сразу не предоставляете?

Вот мой расклад, где я однократной записью команды вызывал:

21805

21806

Там, правда, конвейер предусмотрен, чтобы команды одну за другой передавать. Он к теме не относится.
Как видите, сначала в выходные переменные Cmd, Arg0 и Arg1 записывается команда с аргументами, а затем tx переводится в TRUE, после чего происходит однократная запись в три регистра слейва. Боевой код уже.

orensnake
17.01.2016, 17:47
Ну а что сразу не предоставляете?


Исправляюсь.

По настройкам аналогично - не могу понять почему именно при выставлении Servo1WR в моем случае не отсылается команда. Пробовал делать задержку и по таймеру и по увеличению счетчика - не уходит по ModBus моя команда. Может надо еще что-то покрутить в настройках канала или самого слейва?

Баловался руками (изменение значений переменных). Ну и в таком режиме тоже должно работать - но не работает почему-то.

Может быть что-то не так с версиями таргета/версий библиотек modbus и какой-то редкий глюк?
Сейчас использую

CoDeSys 3.2 SP5
Owen SPK2xx 03.CS.WEB версия 3.5.4.20
ModBus COM Version: 3.4.0.0
ModBus Master Version: 3.5.4.0
ModBus Slave Version: 3.5.4.0

По идее все компилируется, но не работает. Чудеса.


P.S. Адрес и команда выдраны из софта, идущего вместе с контроллером привода. Опробовал с компа - нужные мне шаги работают. Видимо дело в кодесис/СПК/настройках

Yegor
17.01.2016, 18:59
Код покажите.
Я бы сравнил фактические запросы софта и СПК.

orensnake
17.01.2016, 20:16
Ок.
Вкратце и по порядку.
Есть визуализация. (visu в аттаче).
В настройках реакции на кнопку - выполнение ST кода (ButtonClick в аттаче)
Связка переменных визуализации и переменных в GVL/PLC_PRG - (VisuLink в аттаче - используется фрейм, но это не важно)
Описание переменных в GVL - (GVL в аттаче)

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

Получаем, при нажатии на кнопку в форме выставляется код команды (5) и выставляем триггер в TRUE.
Переменные в форме связаны с объявленными в GVL переменными, которые в конечном счете используются в настройках канала по модбаз.

orensnake
17.01.2016, 20:25
Код покажите.
Я бы сравнил фактические запросы софта и СПК.

Сегодня, к сожалению, нечем промониторить. Смогу только завтра. Проснифил запрос из ПО, используемого для настройки и управления контроллером сервопривода, используя Device Monitoring Studio. Выделил для себя передаваемую по modbus команду:



Packet 58384: MODBUS Request (packet size: 13, data size: 9), 02.01.2016 23:14:48.400 +0.0

Mode: RTU
Address: 1 (Slave)
Function: 16 (Write Multiple Registers)
Starting Address: 1294
Number of Registers: 2
Parsed As:
Registers 41294-41295:
Register0: 5
Register1: 0
CRC:23922 (OK)

То есть
функция 16, адрес - 1294=0x050e, 2 регистра со значениями 5 и 0.

Собственно все то же самое и реализую. Завтра буду снифить трафик с СПК до контроллера сервопривода.

SA104
17.01.2016, 20:38
Если не секрет, каким софтом сниффили?

orensnake
17.01.2016, 21:32
Если не секрет, каким софтом сниффили?

Device Monitoring Studio - http://freeserialanalyzer.com/features
Триальный на 21 день. Но в принципе нормально обрабатывает пакеты, да и расшифровка налету.

Yegor
18.01.2016, 06:03
Когда будете снифить, попробуйте без визуализации лучше. Убедитесь, что нигде в переменные Servo1WR и Servo1Cmd не происходит запись (в т.ч. отцепите их от фрейма), потом подготовьте в них значения для записи и запишите по Ctrl+F7.

orensnake
18.01.2016, 07:02
Когда будете снифить, попробуйте без визуализации лучше. Убедитесь, что нигде в переменные Servo1WR и Servo1Cmd не происходит запись (в т.ч. отцепите их от фрейма), потом подготовьте в них значения для записи и запишите по Ctrl+F7.

Создан новый проект.



PROGRAM PLC_PRG
VAR
ServoWR : BOOL := FALSE;
ServoCMD : WORD;
wZero : WORD := 0;

ReadedCMD : WORD;

tmp : WORD;
tmpCMD : WORD;
tmpWR : BOOL;
END_VAR


tmp := ReadedCMD;

ServoCMD := tmpCMD;
ServoWR := tmpWR;



Добавил соотнесение
21822

Извиняюсь, удалил часть сообщения.
Накосячил с номером регистра - сейчас поправил и с тестового проекта все работает (и чтение, и запись, и устройство отрабатывает). О чудо! Осталось понять что не работало с основном и почему.

Хм. заинтересовала настройка
21823

Указано "Использовать родительскую настройку". Соответственно берется из мастера. У мастера тоже "Использовать родительскую настройку". Соответственно ссылается на ком порт - но там ничего не настраивается.


Поставил в основном проекте "Включено 2 (всегда в задаче цикла шины)" и ... заработало и с визуализациями.


Всем спасибо, особенно Yegor за желание помочь разобраться.
Тему можно закрывать.