Стартовая страница › Форумы › Взаимодействие с устройствами › Modbus › Помогите разобраться с контроллером Beckhoff
- В этой теме 89 ответов, 4 участника, последнее обновление 1 год, 11 месяцев назад сделано sakhalin_Cat.
-
АвторСообщения
-
16.05.2021 в 16:23 #19460manjey73Участник
Для нулевого бита соответственно.
Если нужно другим битом управлять то для 6-ого например
SetBit(Val(100), 6, Cmd) и так далее17.05.2021 в 12:43 #19468MikhailМодераторДобрый день!
Нужно начать с того, что в шаблоне Модбас добавить свою команду. Выбрать для неё необходимый тип функции Модбас и адрес.Пока не усложняя себе жизнь созданием каналов управления и написанием формул, попробовать отправить команду, нажав кнопку Команда на странице данных КП. Если в результате отправки команды нет результата, найти в журнале линии связи момент отправки команды и скопировать сюда текст из лога.
17.05.2021 в 12:44 #19469MikhailМодераторЖурналы можно найти в виде файлов в C:\SCADA\ScadaComm\Log
26.05.2021 в 13:49 #19563sakhalin_CatУчастникДоброго дня.
Просидел сегодня всю ночь и толку не добился. Где-то что-то не так делаю.
Если не сложно обьясните где именно.
Если включаю формулу то ядро и вебсервер не перезапускаются ну или тупят не знаю.
Без включеной формулы все работает, только команда в никуда улетает.
- Этот ответ был изменен 2 года, 10 месяцев назад от sakhalin_Cat.
- Этот ответ был изменен 2 года, 10 месяцев назад от sakhalin_Cat.
26.05.2021 в 13:58 #19567sakhalin_CatУчастникМодбас работает нормально, я его и читаю и пишу туда спокойно из скады. Проблема именно с выделением бита и перезаписи выделенного бита в слове.
26.05.2021 в 14:05 #19568RomirosУчастникЕсли включаю формулу то ядро и вебсервер не перезапускаются ну или тупят не знаю.
В статистике сервера ошибку не пишет? Типа несовпадение типов bool и double ?
- Этот ответ был изменен 2 года, 10 месяцев назад от Romiros.
26.05.2021 в 14:50 #19570sakhalin_CatУчастникДа вроде есть такое.
Чего сделать нужно?
26.05.2021 в 14:58 #19571sakhalin_CatУчастникФормула эта, как написано выше-
public double SetBit(double n, int index, bool value)
{
long nn = Convert.ToInt64(n);
return value ? nn | (1 << index) : nn & ~(1 << index);
}Сохранена в справочнике как SetBit
26.05.2021 в 15:33 #19573manjey73УчастникЕсли формулу не привязываете к каналу, она есть только в справочнике — сервер перезапускается и работает нормально ?
26.05.2021 в 15:35 #19574sakhalin_CatУчастникДа, если отключить формулу в канале то все работает. В справочнике я её не трогаю
26.05.2021 в 15:44 #19575sakhalin_CatУчастникИ еще один вопрос который меня смущает:
Основной канал «103» имеет тип WORD состоящий из 2х BYTE соответственно из 16bit, если мы меняем один бит, то по идее нужно прочитать полностью WORD изменить в нем нужный бит и отправит полностью WORD с изменениями обратно иначе все остальные биты слетят в FALSE. Мы же не можем изменить один бит не затронув состояния всех остальных.
Тогда почему мы берем для изменения дорасчетный канал с выделенным по формуле битом?
.
Я просто не программист и плаваю в этих вопросах. Потому вопросы могут быть глупыми.26.05.2021 в 15:45 #19576manjey73УчастникSetVal(9, SetBit(Val(9), Convert.ToInt32(Val(10)), Convert.ToBoolean(Cmd)))
Канал управления битом, где
9 — это канал, в котором мы меняем бит, у вас это номер L-10_S3_Word
Convert.ToInt32(Val(10)) — на эту фигню не смотрите 🙂 это я в другом канале задаю бит, который нужно поменять, либо просто укажите 0, либо Convert.ToInt32(0)
То есть формула в канале управления будет такая, если номер канала L-10_S3_Word = 9
SetVal(9, SetBit(Val(9), Convert.ToInt32(0), Convert.ToBoolean(Cmd)))
или
SetVal(9, SetBit(Val(9), 0, Convert.ToBoolean(Cmd)))
или так
SetVal(9, SetBit(Val(9), 0, (bool)Cmd))
- Этот ответ был изменен 2 года, 10 месяцев назад от manjey73.
26.05.2021 в 15:50 #19578manjey73УчастникТут надо запомнить простую вещь — ВСЕ каналы в базе имеют формат double
Если вы делаете формулу для себя и возвращаете из нее Boolean (bool) то системой она будет преобразована в double и записана в БД.
Тут вроде бы все ничего, но есть одно НО. Вы не сможете подобную формулу использовать внутри другой формулы, так как преобразований внутри формул или нет, или они не доступны вам. По этому надо стараться самому возвращать double и иногда приходится писать внутри формул Convert.To’ЧТОТО’ чтобы это правильно заработало. Тут только опытным путем. Скан формул как из справочника, так и из всех каналов происходит при каждом перезапуске сервера, и если он выдает ошибку со ссылкой на формулы, надо понять, что ему не нравится.
26.05.2021 в 15:53 #19579manjey73УчастникНа счет изменения одного бита в числе. Тут и есть сама суть, что мы поменяли (выставили) один бит в существующем числе, не трогая другие биты.
Модуль автоуправления (если можно настроить на изменение) видит и отправляет команду.
Если он изменения не может отследить сам, то можно включить событие на изменение канала и отправлять Модулем команду в устройство.Не думаю, что мы сможем так быстро менять биты, что произойдет наложение.
26.05.2021 в 16:35 #19583sakhalin_CatУчастникКакой-то разговор на Китайском. Я еще раз говорю я не пргорамист и мне эти слова которые вы пишете ни о чем не говорят.
Я же по Русски сказал, что не могу написать формулу так как не знаю языка на котором она пишется.
Какой мне смысл задавать вопросы и просить помощи если бы я знал как сделать?.
.
Если кто может реально помочь то помогите пожалуйста, а метод перебора букв и слов в формуле человеком который не понимает за что отвечают какие слова результата не принесут.
.
Еще раз опишу задачу:
Есть адрес 16387 по которому находится 2х байтовое слово. Этот адрес и пишется и читается.
На чтение этот адрес привязан к каналу — 103 — см фото —
.
.
На канале висит 15 дорасчетных формул которые включают и выключают лампочки на панели в веб-морде — см фото —
.
.
На запись этот адрес привязан к каналу управления- 10499 — см фото —
.
.
И отображается в списке каналов как — см фото—
.
.
Писать мы можем в канал 10499 только полностью «двухбайтовое слово» и читать из канала 103 мы тоже можем только двухбайтовое слово полностью.
.
Требуется по нажатии кнопки на вебморде поменять один бит. Для этого нужно считать «два байта» из канала 103, поменять бит и записать эти «два байта» в канал 10499.
.
Вот такая вот задача. Прошу помощи в решении.
.- Этот ответ был изменен 2 года, 10 месяцев назад от sakhalin_Cat.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.