Пытаюсь разобраться с управление по лан.
 

Пытаюсь разобраться с управление по лан.

Автор Flat, 25 июня 2019, 14:45:34

« назад - далее »

Flat

1. Правильно ли я понял что перед отправкой команд надо авторизоваться на контроллере с помощью CODE_CMD_REQUEST?
2. Что ставить в CMD_IDENTIFICATION? Его задаю я по желанию? к примеру могу использовать всегда 0?
3. Правильно ли я понимаю что контрольная сумма это сумма всех байт методом XOR с начальным байтом FF.
4.  Последовательность байт в структурах пакетов   – обратный,   «от младшего к старшему». Это касается всего запроса или только поля данных ?
     то есть  к примеру пароль (0x01 0x23 0x45 0x67 0x89  0xAB 0xCD 0xEF) надо передавать DATA[1] =  0x01  или 0xEF?

Administrator

1. Да, перед отправкой команд (после подключения сокета) нужно авторизоваться. Авторизация действительна для всей сессии до разрыва подключения.
2. Любое число, лучше использовать random. Идентификатор будет одинаковым для запроса и ответа. В идеальном случае идентификаторы должны быть разными для разных запросов. Но  это уже на усмотрение пользователя.
3. Начальное значение Xor_Temp = $FF, затем побайтовое сложение всех элементов передаваемого пакета Xor_Temp = Xor_Temp + (byte), затем Xor $FF.
4. Это касается каждого поля (структуры) внутри пакета. Например, поле Length состоит из 2 байт - при передаче следует сначала младший, затем старший байт.

Flat

вроде все бегает. но не понятно работает опрос входа in0.

После авторизации на контроллере, посылаю команду 0xD4,0x2,0x2,0x4,0x4,0x0,0x20,0x0,0x0,0x0. На входе in 0 ничего нет.
Приходит ответ  8,2,2,4,7,0,18,226,14,0,231,0,0 (dec)
- на входах ничего нет типа. маска 11100111.
Подаю на вход 5 вольт. повторно шлю команду. ответ   232,2,2,4,7,0,18,226,14,32,231,0,0 (dec)
согласно таблицы включился INT_5
Снимаю 5 вольт со входа. ответ не меняется.
5 вольт беру с выхода контроллера.

А мне нужно програмно отслеживать хотя бы 1 вход контроллера на вкл/выкл.
Set zero и  in1 заняты концевиками.


1 Вопрос почему при снятии напряжения не обновляется ответ ?
2. Соответствие  таблицы выходов в мануале реальным выходам ? не нашел такого в мануале.
В таблице выходов прописаны биты с 0 по 7 и пронумерованы INT_x соответственно битам.


Flat

тоже самое происходит и с опросм in1 и setzero. ответ не меняется от наличия питания.
НО концевые отрабатывают нормально. кроме случая если  так в ноле и его снова туда отправить.
такое ощущение что контроллер то видит нормально ситуацию по входам... но на повторные опросы выдает старую команду

Flat


Administrator

Чтобы повторно ожидать сигнал на вход нужно командой SET_MASK_EVENT отправить 0 на этот вход.

"1 Вопрос почему при снятии напряжения не обновляется ответ ? " - потому что для обработки сигнала в дальнейшем тексте программы может не хватить времени.
Например, импульсный сигнал появился на входе и пропал, а до обработки этого сигнала по программе дело еще не дошло. В этом случае без сохранения значения сигнал пропадет. Т.е. 1 на входе будет сохраняться о тех пор, пока этот сигнал не будет обработан в программе и принудительно не сброшен командой SET_MASK_EVENT.

"2. Соответствие  таблицы выходов в мануале реальным выходам ? не нашел такого в мануале. " - выходов или входов?
Нумерация входов подряд - в том порядке, как они промаркированы на самом блоке.

Roman

Мы тоже пытались разобраться и даже много достигли.
Потеряв две недели нам удалось с контроллера siemens S7-1200 Искать ноль, управлять двигателем старт-стоп, изменять скорость , ускорение, опрашивать состояние и даже считывать входа на драйвере.
Но, стабильной и быстрой работы (нам нужно быстродействие 2 об/сек с остановками после каждого оборота и проверкой входа) достигнуть не удалось. Плохо описаны процедуры, приходилось много тыкаться и пробовать разные варианты. Постоянно возникает ошибка ЕС, на которую уже просто перестали обращать внимание. Писали в поддержку, нам отвечали и пытались помочь, мы правда пытались сделать так, что бы они заработали по сети так, как задумывал производитель, идея то хорошая, но, принято решение, поставить на контроллер плату высокочастотных выходов и управлять в режиме драйвера. А все мытарства с управлением по LAN забыть как страшный сон и неудачный опыт.
Резюме: задумка очень хорошая, но протокол нужно взять из стандартных и популярных, а не выдумывать всякую дичь.
Мы верим в Вас и уверены, что Электропривод в силах сделать удобное в использовании устройство, надеемся, так и будет. Ждём обновлений.

Flat

Цитата: Administrator от 17 июля 2019, 15:49:47
Чтобы повторно ожидать сигнал на вход нужно командой SET_MASK_EVENT отправить 0 на этот вход.

Продолжаем разбираться. На прошлом объекте выкрутились в ручную. На новом уже не получается. необходимо считать вход сет зеро.
Изначально он без проблем прочитывается. пытаюсь сбросить  SET_MASK_EVENT отправить 0 на этот вход. (не на этот а на все входы). Состояние порта обнуляется, но он перестает работать как в режиме скан зерро так и присылать ответ о состоянии входа. Слал и SET_MASK_EVENT 1. результат тот-же. как все таки мне циклически его опрашивать ?

Administrator


Чтобы контроллер реагировал на определенный вход, нужно установить в 1 маску этого входа (команда SET_MASK_EVENT).
Для чтения состояний сигналов и установленных масок используйте команду STATUS_IN_EVENT.

Например, чтобы установить маску на все входы и сбросиь состояние всех входов (т.е. по сути перевесмти контроллер в ожидание по всем входам), нужно отправить команду SET_MASK_EVENT 255.
В этом случае контроллер обработает поступление сигнала на любой из входов. Т.е. если отправить команду поиска начального положения SCAN_ZERO_F (SCAN_ZERO_R), привод начнет непрерывное движение до поступления сигнала на вход SET ZERO.
При поступлении сигнала двигатель остановится, состояние входа SET ZERO (7-й бит) установится в 1 и останется активным даже после снятия сигнала.

При отправке команды движения до поступления сигнала на вход 1 (GO_UNTIL_R или GO_UNTIL_F) двигатель начнет непрерывное вращение до тех пор, пока не получит сигнал на входе IN1.

Состояние сигнала отобразится в 6-м бите при чтении командой STATUS_IN_EVENT и останется равным 1 даже при снятии сигнала с физического входа.

Чтобы привод повторно обработал входящие сигналы необходимо, чтобы бит сигнала был сброшен. Некоторые команды автоматически сбрасывают сигнал (GO_UNTIL, SCAN_ZERO) перед выполнением, так как их работа принципиально связана с поступлением нового сигнала на вход. Но есть команды, которые не изменяют состояние входного сигнала, так как нет определенности, какое поведение требуется пользователю (например, команды условного перехода). Для принудительного сбрасывания сигнала можно использовать команду SET_MASK_EVENT - выполнить сброс сигнала и установку маски требуемого входа.

В любом случае, для обработки входного сигнала при выполнении команды необходимо соблюдение дследующих  условий:
1. Установлена маска соответствующего входа (если маска не установлена, контроллер будет игнорировать все поступающие на этот вход сигналы).
2. Состояние сигнала должно соответствовать команде. Т.е. необходимо убедиться, что для команд ожидания сигнала сброшен бит соответствующего входа. Для команд условного перехода наличие сигнала и его сброс выполняются принудительно.
3. Входной сигнал поступил ПОСЛЕ начала выполнения команды для команд, подразумевающих ожидание сигнала. И наоборот, входной сигнал поступил и остается активным до постепления сигнала, если это сигнал условного перехода.

Попробуйте использовать программу SMC-PROGRAM LAN для тестовых запусков и проверки команд. В этой программе состояние сигналов опрашивается в цикле и отображается в интерфейсе. 

My3blKAnT

Цитата: Roman от 25 мая 2020, 23:01:41
Мы тоже пытались разобраться и даже много достигли.
Потеряв две недели нам удалось с контроллера siemens S7-1200 Искать ноль, управлять двигателем старт-стоп, изменять скорость , ускорение, опрашивать состояние и даже считывать входа на драйвере.

Роман, добрый день. Если можно, хотелось бы перенять ваш опыт по установлению связи между Siemens и SMSD.LAN.